@@ -62,6 +62,11 @@ static void idle_run(void *o);
62
62
static void fota_entry (void * o );
63
63
static void fota_run (void * o );
64
64
65
+ static void fota_downloading_run (void * o );
66
+
67
+ static void fota_network_disconnect_and_reboot_entry (void * o );
68
+ static void fota_network_disconnect_and_reboot_run (void * o );
69
+
65
70
static void fota_network_disconnect_pending_entry (void * o );
66
71
static void fota_network_disconnect_pending_run (void * o );
67
72
@@ -84,6 +89,8 @@ enum state {
84
89
STATE_PERIODIC_TRIGGERING ,
85
90
STATE_IDLE ,
86
91
STATE_FOTA ,
92
+ STATE_FOTA_DOWNLOADING ,
93
+ STATE_FOTA_NETWORK_DISCONNECT_AND_REBOOT ,
87
94
STATE_FOTA_NETWORK_DISCONNECT_PENDING ,
88
95
STATE_FOTA_IMAGE_APPLY_PENDING ,
89
96
STATE_FOTA_REBOOTING ,
@@ -148,6 +155,20 @@ static const struct smf_state states[] = {
148
155
fota_run ,
149
156
NULL ,
150
157
NULL ,
158
+ & states [STATE_FOTA_DOWNLOADING ]
159
+ ),
160
+ [STATE_FOTA_DOWNLOADING ] = SMF_CREATE_STATE (
161
+ NULL ,
162
+ fota_downloading_run ,
163
+ NULL ,
164
+ & states [STATE_FOTA ],
165
+ NULL
166
+ ),
167
+ [STATE_FOTA_NETWORK_DISCONNECT_AND_REBOOT ] = SMF_CREATE_STATE (
168
+ fota_network_disconnect_and_reboot_entry ,
169
+ fota_network_disconnect_and_reboot_run ,
170
+ NULL ,
171
+ & states [STATE_FOTA ],
151
172
NULL
152
173
),
153
174
[STATE_FOTA_NETWORK_DISCONNECT_PENDING ] = SMF_CREATE_STATE (
@@ -400,11 +421,25 @@ static void fota_run(void *o)
400
421
case FOTA_DOWNLOAD_FAILED :
401
422
STATE_SET (app_state , STATE_RUNNING );
402
423
return ;
403
- case FOTA_NETWORK_DISCONNECT_NEEDED :
404
- STATE_SET (app_state , STATE_FOTA_NETWORK_DISCONNECT_PENDING );
405
- return ;
424
+ default :
425
+ /* Don't care */
426
+ break ;
427
+ }
428
+ }
429
+ }
430
+
431
+ /* STATE_FOTA_DOWNLOADING */
432
+ static void fota_downloading_run (void * o )
433
+ {
434
+ const struct app_state_object * state_object = (const struct app_state_object * )o ;
435
+
436
+ if (state_object -> chan == & FOTA_CHAN ) {
437
+ switch (state_object -> fota_status ) {
406
438
case FOTA_REBOOT_NEEDED :
407
- STATE_SET (app_state , STATE_FOTA_REBOOTING );
439
+ STATE_SET (app_state , STATE_FOTA_NETWORK_DISCONNECT_AND_REBOOT );
440
+ return ;
441
+ case FOTA_NETWORK_DISCONNECT_AND_APPLY_NEEDED :
442
+ STATE_SET (app_state , STATE_FOTA_NETWORK_DISCONNECT_PENDING );
408
443
return ;
409
444
default :
410
445
/* Don't care */
@@ -413,6 +448,37 @@ static void fota_run(void *o)
413
448
}
414
449
}
415
450
451
+ /* STATE_FOTA_NETWORK_DISCONNECT_AND_REBOOT */
452
+
453
+ static void fota_network_disconnect_and_reboot_entry (void * o )
454
+ {
455
+ ARG_UNUSED (o );
456
+
457
+ LOG_DBG ("%s" , __func__ );
458
+
459
+ int err ;
460
+ struct network_msg msg = {
461
+ .type = NETWORK_DISCONNECT
462
+ };
463
+
464
+ err = zbus_chan_pub (& NETWORK_CHAN , & msg , K_SECONDS (1 ));
465
+ if (err ) {
466
+ LOG_ERR ("zbus_chan_pub, error: %d" , err );
467
+ SEND_FATAL_ERROR ();
468
+ }
469
+ }
470
+
471
+ static void fota_network_disconnect_and_reboot_run (void * o )
472
+ {
473
+ const struct app_state_object * state_object = (const struct app_state_object * )o ;
474
+
475
+ if (state_object -> chan == & NETWORK_CHAN &&
476
+ state_object -> network_status == NETWORK_DISCONNECTED ) {
477
+ STATE_SET (app_state , STATE_FOTA_REBOOTING );
478
+ return ;
479
+ }
480
+ }
481
+
416
482
/* STATE_FOTA_NETWORK_DISCONNECT_PENDING */
417
483
418
484
static void fota_network_disconnect_pending_entry (void * o )
0 commit comments