@@ -62,31 +62,33 @@ 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_network_disconnect_pending_entry (void * o );
66
- static void fota_network_disconnect_pending_run (void * o );
65
+ static void fota_downloading_run (void * o );
67
66
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 );
70
72
71
73
static void fota_rebooting_entry (void * o );
72
74
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
- */
82
75
enum state {
76
+ /* Normal operation */
83
77
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 */
86
83
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 ,
90
92
};
91
93
92
94
/* State object for the app module.
@@ -148,18 +150,25 @@ static const struct smf_state states[] = {
148
150
fota_run ,
149
151
NULL ,
150
152
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 ],
151
160
NULL
152
161
),
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 ,
156
165
NULL ,
157
166
& states [STATE_FOTA ],
158
167
NULL
159
168
),
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 ,
163
172
NULL ,
164
173
& states [STATE_FOTA ],
165
174
NULL
@@ -400,11 +409,26 @@ static void fota_run(void *o)
400
409
case FOTA_DOWNLOAD_FAILED :
401
410
STATE_SET (app_state , STATE_RUNNING );
402
411
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 );
405
429
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 );
408
432
return ;
409
433
default :
410
434
/* Don't care */
@@ -413,9 +437,9 @@ static void fota_run(void *o)
413
437
}
414
438
}
415
439
416
- /* STATE_FOTA_NETWORK_DISCONNECT_PENDING */
440
+ /* STATE_FOTA_NETWORK_DISCONNECT */
417
441
418
- static void fota_network_disconnect_pending_entry (void * o )
442
+ static void fota_network_disconnect_entry (void * o )
419
443
{
420
444
ARG_UNUSED (o );
421
445
@@ -433,40 +457,55 @@ static void fota_network_disconnect_pending_entry(void *o)
433
457
}
434
458
}
435
459
436
- static void fota_network_disconnect_pending_run (void * o )
460
+ static void fota_network_disconnect_run (void * o )
437
461
{
438
462
const struct app_state_object * state_object = (const struct app_state_object * )o ;
439
463
440
464
if (state_object -> chan == & NETWORK_CHAN &&
441
465
state_object -> network_status == NETWORK_DISCONNECTED ) {
442
- STATE_SET (app_state , STATE_FOTA_IMAGE_APPLY_PENDING );
466
+ STATE_SET (app_state , STATE_FOTA_REBOOTING );
443
467
return ;
444
468
}
445
469
}
446
470
447
- /* STATE_FOTA_IMAGE_APPLY_PENDING */
471
+ /* STATE_FOTA_APPLYING_IMAGE, */
448
472
449
- static void fota_image_apply_pending_entry (void * o )
473
+ static void fota_applying_image_entry (void * o )
450
474
{
451
475
ARG_UNUSED (o );
452
476
453
477
LOG_DBG ("%s" , __func__ );
454
478
455
479
int err ;
456
- enum fota_msg_type msg = FOTA_APPLY_IMAGE ;
480
+ struct network_msg msg = {
481
+ .type = NETWORK_DISCONNECT
482
+ };
457
483
458
- err = zbus_chan_pub (& FOTA_CHAN , & msg , K_SECONDS (1 ));
484
+ err = zbus_chan_pub (& NETWORK_CHAN , & msg , K_SECONDS (1 ));
459
485
if (err ) {
460
486
LOG_ERR ("zbus_chan_pub, error: %d" , err );
461
487
SEND_FATAL_ERROR ();
462
488
}
463
489
}
464
490
465
- static void fota_image_apply_pending_run (void * o )
491
+ static void fota_applying_image_run (void * o )
466
492
{
467
493
const struct app_state_object * state_object = (const struct app_state_object * )o ;
468
494
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 ) {
470
509
STATE_SET (app_state , STATE_FOTA_REBOOTING );
471
510
return ;
472
511
}
0 commit comments