@@ -62,6 +62,11 @@ static void idle_run(void *o);
6262static void fota_entry (void * o );
6363static void fota_run (void * o );
6464
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+
6570static void fota_network_disconnect_pending_entry (void * o );
6671static void fota_network_disconnect_pending_run (void * o );
6772
@@ -84,6 +89,8 @@ enum state {
8489 STATE_PERIODIC_TRIGGERING ,
8590 STATE_IDLE ,
8691 STATE_FOTA ,
92+ STATE_FOTA_DOWNLOADING ,
93+ STATE_FOTA_NETWORK_DISCONNECT_AND_REBOOT ,
8794 STATE_FOTA_NETWORK_DISCONNECT_PENDING ,
8895 STATE_FOTA_IMAGE_APPLY_PENDING ,
8996 STATE_FOTA_REBOOTING ,
@@ -148,6 +155,20 @@ static const struct smf_state states[] = {
148155 fota_run ,
149156 NULL ,
150157 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 ],
151172 NULL
152173 ),
153174 [STATE_FOTA_NETWORK_DISCONNECT_PENDING ] = SMF_CREATE_STATE (
@@ -400,11 +421,25 @@ static void fota_run(void *o)
400421 case FOTA_DOWNLOAD_FAILED :
401422 STATE_SET (app_state , STATE_RUNNING );
402423 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 ) {
406438 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 );
408443 return ;
409444 default :
410445 /* Don't care */
@@ -413,6 +448,37 @@ static void fota_run(void *o)
413448 }
414449}
415450
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+
416482/* STATE_FOTA_NETWORK_DISCONNECT_PENDING */
417483
418484static void fota_network_disconnect_pending_entry (void * o )
0 commit comments