@@ -62,31 +62,33 @@ static void idle_run(void *o);
6262static void fota_entry (void * o );
6363static void fota_run (void * o );
6464
65- static void fota_network_disconnect_pending_entry (void * o );
66- static void fota_network_disconnect_pending_run (void * o );
65+ static void fota_downloading_run (void * o );
6766
68- static void fota_image_apply_pending_entry (void * o );
69- static void fota_image_apply_pending_run (void * o );
67+ static void fota_network_disconnect_entry (void * o );
68+ static void fota_network_disconnect_run (void * o );
69+
70+ static void fota_applying_image_entry (void * o );
71+ static void fota_applying_image_run (void * o );
7072
7173static void fota_rebooting_entry (void * o );
7274
73- /* Defining the hierarchical trigger module states:
74- * STATE_RUNNING: The module is operating normally.
75- * STATE_PERIODIC_TRIGGERING: The module is sending triggers to the rest of the system.
76- * STATE_IDLE: The module is disconnected from the cloud, triggers are blocked.
77- * STATE_FOTA: The module is in the FOTA process, triggers are blocked.
78- * STATE_FOTA_NETWORK_DISCONNECT_PENDING: The module is waiting for the network to disconnect.
79- * STATE_FOTA_IMAGE_APPLY_PENDING: The module is waiting for the FOTA image to be applied.
80- * STATE_FOTA_REBOOTING: The module is rebooting after applying the FOTA image.
81- */
8275enum state {
76+ /* Normal operation */
8377 STATE_RUNNING ,
84- STATE_PERIODIC_TRIGGERING ,
85- STATE_IDLE ,
78+ /* Triggers are periodically sent at a configured interval */
79+ STATE_PERIODIC_TRIGGERING ,
80+ /* Disconnected from the network, no triggers are sent */
81+ STATE_IDLE ,
82+ /* Ongoing FOTA process, triggers are blocked */
8683 STATE_FOTA ,
87- STATE_FOTA_NETWORK_DISCONNECT_PENDING ,
88- STATE_FOTA_IMAGE_APPLY_PENDING ,
89- STATE_FOTA_REBOOTING ,
84+ /* FOTA image is being downloaded */
85+ STATE_FOTA_DOWNLOADING ,
86+ /* Disconnecting from the network */
87+ STATE_FOTA_NETWORK_DISCONNECT ,
88+ /* Applying the image */
89+ STATE_FOTA_APPLYING_IMAGE ,
90+ /* Rebooting */
91+ STATE_FOTA_REBOOTING ,
9092};
9193
9294/* State object for the app module.
@@ -148,18 +150,25 @@ static const struct smf_state states[] = {
148150 fota_run ,
149151 NULL ,
150152 NULL ,
153+ & states [STATE_FOTA_DOWNLOADING ]
154+ ),
155+ [STATE_FOTA_DOWNLOADING ] = SMF_CREATE_STATE (
156+ NULL ,
157+ fota_downloading_run ,
158+ NULL ,
159+ & states [STATE_FOTA ],
151160 NULL
152161 ),
153- [STATE_FOTA_NETWORK_DISCONNECT_PENDING ] = SMF_CREATE_STATE (
154- fota_network_disconnect_pending_entry ,
155- fota_network_disconnect_pending_run ,
162+ [STATE_FOTA_NETWORK_DISCONNECT ] = SMF_CREATE_STATE (
163+ fota_network_disconnect_entry ,
164+ fota_network_disconnect_run ,
156165 NULL ,
157166 & states [STATE_FOTA ],
158167 NULL
159168 ),
160- [STATE_FOTA_IMAGE_APPLY_PENDING ] = SMF_CREATE_STATE (
161- fota_image_apply_pending_entry ,
162- fota_image_apply_pending_run ,
169+ [STATE_FOTA_APPLYING_IMAGE ] = SMF_CREATE_STATE (
170+ fota_applying_image_entry ,
171+ fota_applying_image_run ,
163172 NULL ,
164173 & states [STATE_FOTA ],
165174 NULL
@@ -400,11 +409,26 @@ static void fota_run(void *o)
400409 case FOTA_DOWNLOAD_FAILED :
401410 STATE_SET (app_state , STATE_RUNNING );
402411 return ;
403- case FOTA_NETWORK_DISCONNECT_NEEDED :
404- STATE_SET (app_state , STATE_FOTA_NETWORK_DISCONNECT_PENDING );
412+ default :
413+ /* Don't care */
414+ break ;
415+ }
416+ }
417+ }
418+
419+ /* STATE_FOTA_DOWNLOADING */
420+
421+ static void fota_downloading_run (void * o )
422+ {
423+ const struct app_state_object * state_object = (const struct app_state_object * )o ;
424+
425+ if (state_object -> chan == & FOTA_CHAN ) {
426+ switch (state_object -> fota_status ) {
427+ case FOTA_SUCCESS_REBOOT_NEEDED :
428+ STATE_SET (app_state , STATE_FOTA_NETWORK_DISCONNECT );
405429 return ;
406- case FOTA_REBOOT_NEEDED :
407- STATE_SET (app_state , STATE_FOTA_REBOOTING );
430+ case FOTA_IMAGE_APPLY_NEEDED :
431+ STATE_SET (app_state , STATE_FOTA_APPLYING_IMAGE );
408432 return ;
409433 default :
410434 /* Don't care */
@@ -413,9 +437,9 @@ static void fota_run(void *o)
413437 }
414438}
415439
416- /* STATE_FOTA_NETWORK_DISCONNECT_PENDING */
440+ /* STATE_FOTA_NETWORK_DISCONNECT */
417441
418- static void fota_network_disconnect_pending_entry (void * o )
442+ static void fota_network_disconnect_entry (void * o )
419443{
420444 ARG_UNUSED (o );
421445
@@ -433,40 +457,55 @@ static void fota_network_disconnect_pending_entry(void *o)
433457 }
434458}
435459
436- static void fota_network_disconnect_pending_run (void * o )
460+ static void fota_network_disconnect_run (void * o )
437461{
438462 const struct app_state_object * state_object = (const struct app_state_object * )o ;
439463
440464 if (state_object -> chan == & NETWORK_CHAN &&
441465 state_object -> network_status == NETWORK_DISCONNECTED ) {
442- STATE_SET (app_state , STATE_FOTA_IMAGE_APPLY_PENDING );
466+ STATE_SET (app_state , STATE_FOTA_REBOOTING );
443467 return ;
444468 }
445469}
446470
447- /* STATE_FOTA_IMAGE_APPLY_PENDING */
471+ /* STATE_FOTA_APPLYING_IMAGE, */
448472
449- static void fota_image_apply_pending_entry (void * o )
473+ static void fota_applying_image_entry (void * o )
450474{
451475 ARG_UNUSED (o );
452476
453477 LOG_DBG ("%s" , __func__ );
454478
455479 int err ;
456- enum fota_msg_type msg = FOTA_APPLY_IMAGE ;
480+ struct network_msg msg = {
481+ .type = NETWORK_DISCONNECT
482+ };
457483
458- err = zbus_chan_pub (& FOTA_CHAN , & msg , K_SECONDS (1 ));
484+ err = zbus_chan_pub (& NETWORK_CHAN , & msg , K_SECONDS (1 ));
459485 if (err ) {
460486 LOG_ERR ("zbus_chan_pub, error: %d" , err );
461487 SEND_FATAL_ERROR ();
462488 }
463489}
464490
465- static void fota_image_apply_pending_run (void * o )
491+ static void fota_applying_image_run (void * o )
466492{
467493 const struct app_state_object * state_object = (const struct app_state_object * )o ;
468494
469- if (state_object -> chan == & FOTA_CHAN && state_object -> fota_status == FOTA_REBOOT_NEEDED ) {
495+ if (state_object -> chan == & NETWORK_CHAN &&
496+ state_object -> network_status == NETWORK_DISCONNECTED ) {
497+
498+ int err ;
499+ enum fota_msg_type msg = FOTA_IMAGE_APPLY ;
500+
501+ err = zbus_chan_pub (& FOTA_CHAN , & msg , K_SECONDS (1 ));
502+ if (err ) {
503+ LOG_ERR ("zbus_chan_pub, error: %d" , err );
504+ SEND_FATAL_ERROR ();
505+ }
506+
507+ } else if (state_object -> chan == & FOTA_CHAN &&
508+ state_object -> fota_status == FOTA_SUCCESS_REBOOT_NEEDED ) {
470509 STATE_SET (app_state , STATE_FOTA_REBOOTING );
471510 return ;
472511 }
0 commit comments