27
27
28
28
#if defined(CONFIG_APP_POWER )
29
29
#include "power.h"
30
- #define BAT_MSG_SIZE sizeof(struct power_msg)
30
+ #define POWER_MSG_SIZE sizeof(struct power_msg)
31
31
#else
32
- #define BAT_MSG_SIZE 0
32
+ #define POWER_MSG_SIZE 0
33
33
#endif /* CONFIG_APP_POWER */
34
34
35
35
/* Register log module */
36
36
LOG_MODULE_REGISTER (main , CONFIG_APP_LOG_LEVEL );
37
37
38
38
#define MAX_MSG_SIZE (MAX(sizeof(struct configuration), \
39
39
MAX(sizeof(struct cloud_payload), \
40
- MAX(sizeof(struct network_msg), BAT_MSG_SIZE))))
40
+ /* Button channel payload size */ \
41
+ MAX (sizeof (uint8_t ), \
42
+ /* Timer channel payload size */ \
43
+ MAX (sizeof (int ), \
44
+ MAX (sizeof (enum fota_msg_type ), \
45
+ MAX (sizeof (enum location_msg_type ), \
46
+ MAX (sizeof (struct network_msg ), POWER_MSG_SIZE ))))))))
41
47
42
48
/* Register subscriber */
43
49
ZBUS_MSG_SUBSCRIBER_DEFINE (main_subscriber );
@@ -134,23 +140,8 @@ struct main_state {
134
140
/* Trigger interval */
135
141
uint64_t interval_sec ;
136
142
137
- /* Button number */
138
- uint8_t button_number ;
139
-
140
- /* Time available */
141
- enum time_status time_status ;
142
-
143
- /* Cloud status */
144
- enum cloud_msg_type status ;
145
-
146
- /* FOTA status */
147
- enum fota_msg_type fota_status ;
148
-
149
- /* Network status */
150
- enum network_msg_type network_status ;
151
-
152
- /* Location status */
153
- enum location_msg_type location_status ;
143
+ /* Cloud connection status */
144
+ bool connected ;
154
145
};
155
146
156
147
/* Construct state table */
@@ -327,9 +318,7 @@ static void running_entry(void *o)
327
318
328
319
LOG_DBG ("%s" , __func__ );
329
320
330
- if (state_object -> status == CLOUD_CONNECTED_READY_TO_SEND ||
331
- state_object -> status == CLOUD_PAYLOAD_JSON ||
332
- state_object -> status == CLOUD_POLL_SHADOW ) {
321
+ if (state_object -> connected ) {
333
322
smf_set_state (SMF_CTX (state_object ), & states [STATE_TRIGGERING ]);
334
323
return ;
335
324
}
@@ -341,10 +330,13 @@ static void running_run(void *o)
341
330
{
342
331
const struct main_state * state_object = (const struct main_state * )o ;
343
332
344
- if (state_object -> chan == & FOTA_CHAN &&
345
- state_object -> fota_status == FOTA_DOWNLOADING_UPDATE ) {
346
- smf_set_state (SMF_CTX (state_object ), & states [STATE_FOTA ]);
347
- return ;
333
+ if (state_object -> chan == & FOTA_CHAN ) {
334
+ enum fota_msg_type msg = MSG_TO_FOTA_TYPE (state_object -> msg_buf );
335
+
336
+ if (msg == FOTA_DOWNLOADING_UPDATE ) {
337
+ smf_set_state (SMF_CTX (state_object ), & states [STATE_FOTA ]);
338
+ return ;
339
+ }
348
340
}
349
341
}
350
342
@@ -382,12 +374,16 @@ static void idle_entry(void *o)
382
374
383
375
static void idle_run (void * o )
384
376
{
385
- const struct main_state * state_object = ( const struct main_state * ) o ;
377
+ struct main_state * state_object = o ;
386
378
387
- if ((state_object -> chan == & CLOUD_CHAN ) &&
388
- (state_object -> status == CLOUD_CONNECTED_READY_TO_SEND )) {
389
- smf_set_state (SMF_CTX (state_object ), & states [STATE_TRIGGERING ]);
390
- return ;
379
+ if (state_object -> chan == & CLOUD_CHAN ) {
380
+ struct cloud_msg msg = MSG_TO_CLOUD_MSG (state_object -> msg_buf );
381
+
382
+ if (msg .type == CLOUD_CONNECTED_READY_TO_SEND ) {
383
+ state_object -> connected = true;
384
+ smf_set_state (SMF_CTX (state_object ), & states [STATE_TRIGGERING ]);
385
+ return ;
386
+ }
391
387
}
392
388
}
393
389
@@ -425,19 +421,30 @@ static void triggering_entry(void *o)
425
421
426
422
static void triggering_run (void * o )
427
423
{
428
- const struct main_state * state_object = ( const struct main_state * ) o ;
424
+ struct main_state * state_object = o ;
429
425
430
- if ((state_object -> chan == & CLOUD_CHAN ) &&
431
- ((state_object -> status == CLOUD_CONNECTED_PAUSED ) ||
432
- (state_object -> status == CLOUD_DISCONNECTED ))) {
433
- smf_set_state (SMF_CTX (state_object ), & states [STATE_IDLE ]);
434
- return ;
426
+ if ((state_object -> chan == & CLOUD_CHAN )) {
427
+ struct cloud_msg msg = MSG_TO_CLOUD_MSG (state_object -> msg_buf );
428
+
429
+ if ((msg .type == CLOUD_CONNECTED_PAUSED ) ||
430
+ (msg .type == CLOUD_DISCONNECTED )) {
431
+ state_object -> connected = false;
432
+ smf_set_state (SMF_CTX (state_object ), & states [STATE_IDLE ]);
433
+ return ;
434
+ }
435
435
}
436
436
437
437
if (state_object -> chan == & CONFIG_CHAN ) {
438
- LOG_DBG ("Configuration update, new interval: %lld" , state_object -> interval_sec );
439
- k_work_reschedule (& trigger_work , K_SECONDS (state_object -> interval_sec ));
440
- return ;
438
+ struct configuration config = MSG_TO_CONFIGURATION (state_object -> msg_buf );
439
+
440
+ if (config .config_present ) {
441
+ LOG_DBG ("Configuration update, new interval: %lld" , config .update_interval );
442
+
443
+ state_object -> interval_sec = config .update_interval ;
444
+
445
+ k_work_reschedule (& trigger_work , K_SECONDS (state_object -> interval_sec ));
446
+ return ;
447
+ }
441
448
}
442
449
}
443
450
@@ -464,10 +471,13 @@ static void requesting_location_run(void *o)
464
471
{
465
472
const struct main_state * state_object = (const struct main_state * )o ;
466
473
467
- if (state_object -> chan == & LOCATION_CHAN &&
468
- (state_object -> location_status == LOCATION_SEARCH_DONE )) {
469
- smf_set_state (SMF_CTX (state_object ), & states [STATE_REQUESTING_SENSORS_AND_POLLING ]);
470
- return ;
474
+ if (state_object -> chan == & LOCATION_CHAN ) {
475
+ enum location_msg_type msg = MSG_TO_LOCATION_TYPE (state_object -> msg_buf );
476
+
477
+ if (msg == LOCATION_SEARCH_DONE ) {
478
+ smf_set_state (SMF_CTX (state_object ), & states [STATE_REQUESTING_SENSORS_AND_POLLING ]);
479
+ return ;
480
+ }
471
481
}
472
482
473
483
if (state_object -> chan == & BUTTON_CHAN ) {
@@ -531,7 +541,9 @@ static void fota_run(void *o)
531
541
const struct main_state * state_object = (const struct main_state * )o ;
532
542
533
543
if (state_object -> chan == & FOTA_CHAN ) {
534
- switch (state_object -> fota_status ) {
544
+ enum fota_msg_type msg = MSG_TO_FOTA_TYPE (state_object -> msg_buf );
545
+
546
+ switch (msg ) {
535
547
case FOTA_DOWNLOAD_CANCELED :
536
548
__fallthrough ;
537
549
case FOTA_DOWNLOAD_TIMED_OUT :
@@ -553,7 +565,9 @@ static void fota_downloading_run(void *o)
553
565
const struct main_state * state_object = (const struct main_state * )o ;
554
566
555
567
if (state_object -> chan == & FOTA_CHAN ) {
556
- switch (state_object -> fota_status ) {
568
+ enum fota_msg_type msg = MSG_TO_FOTA_TYPE (state_object -> msg_buf );
569
+
570
+ switch (msg ) {
557
571
case FOTA_SUCCESS_REBOOT_NEEDED :
558
572
smf_set_state (SMF_CTX (state_object ),
559
573
& states [STATE_FOTA_NETWORK_DISCONNECT ]);
@@ -592,10 +606,13 @@ static void fota_network_disconnect_run(void *o)
592
606
{
593
607
const struct main_state * state_object = (const struct main_state * )o ;
594
608
595
- if (state_object -> chan == & NETWORK_CHAN &&
596
- state_object -> network_status == NETWORK_DISCONNECTED ) {
597
- smf_set_state (SMF_CTX (state_object ), & states [STATE_FOTA_REBOOTING ]);
598
- return ;
609
+ if (state_object -> chan == & NETWORK_CHAN ) {
610
+ struct network_msg msg = MSG_TO_NETWORK_MSG (state_object -> msg_buf );
611
+
612
+ if (msg .type == NETWORK_DISCONNECTED ) {
613
+ smf_set_state (SMF_CTX (state_object ), & states [STATE_FOTA_REBOOTING ]);
614
+ return ;
615
+ }
599
616
}
600
617
}
601
618
@@ -623,22 +640,28 @@ static void fota_applying_image_run(void *o)
623
640
{
624
641
const struct main_state * state_object = (const struct main_state * )o ;
625
642
626
- if (state_object -> chan == & NETWORK_CHAN &&
627
- state_object -> network_status == NETWORK_DISCONNECTED ) {
643
+ if (state_object -> chan == & NETWORK_CHAN ) {
644
+ struct network_msg msg = MSG_TO_NETWORK_MSG ( state_object -> msg_buf );
628
645
629
- int err ;
630
- enum fota_msg_type msg = FOTA_IMAGE_APPLY ;
646
+ if (msg .type == NETWORK_DISCONNECTED ) {
631
647
632
- err = zbus_chan_pub (& FOTA_CHAN , & msg , K_SECONDS (1 ));
633
- if (err ) {
634
- LOG_ERR ("zbus_chan_pub, error: %d" , err );
635
- SEND_FATAL_ERROR ();
648
+ int err ;
649
+ enum fota_msg_type msg = FOTA_IMAGE_APPLY ;
650
+
651
+ err = zbus_chan_pub (& FOTA_CHAN , & msg , K_SECONDS (1 ));
652
+ if (err ) {
653
+ LOG_ERR ("zbus_chan_pub, error: %d" , err );
654
+ SEND_FATAL_ERROR ();
655
+ }
636
656
}
637
657
638
- } else if (state_object -> chan == & FOTA_CHAN &&
639
- state_object -> fota_status == FOTA_SUCCESS_REBOOT_NEEDED ) {
640
- smf_set_state (SMF_CTX (state_object ), & states [STATE_FOTA_REBOOTING ]);
641
- return ;
658
+ } else if (state_object -> chan == & FOTA_CHAN ) {
659
+ enum fota_msg_type msg = MSG_TO_FOTA_TYPE (state_object -> msg_buf );
660
+
661
+ if (msg == FOTA_SUCCESS_REBOOT_NEEDED ) {
662
+ smf_set_state (SMF_CTX (state_object ), & states [STATE_FOTA_REBOOTING ]);
663
+ return ;
664
+ }
642
665
}
643
666
}
644
667
@@ -669,7 +692,7 @@ int main(void)
669
692
const uint32_t execution_time_ms =
670
693
(CONFIG_APP_MSG_PROCESSING_TIMEOUT_SECONDS * MSEC_PER_SEC );
671
694
const k_timeout_t zbus_wait_ms = K_MSEC (wdt_timeout_ms - execution_time_ms );
672
- struct main_state main_state ;
695
+ struct main_state main_state = { 0 } ;
673
696
674
697
main_state .interval_sec = CONFIG_APP_MODULE_TRIGGER_TIMEOUT_SECONDS ;
675
698
@@ -699,32 +722,6 @@ int main(void)
699
722
return err ;
700
723
}
701
724
702
- /* Copy corresponding data to the state object depending on the incoming channel */
703
- if (& CONFIG_CHAN == main_state .chan ) {
704
- const struct configuration * config = zbus_chan_const_msg (main_state .chan );
705
-
706
- if (config -> update_interval_present ) {
707
- main_state .interval_sec = config -> update_interval ;
708
- }
709
- } else if (& CLOUD_CHAN == main_state .chan ) {
710
- const struct cloud_msg * cloud_msg = zbus_chan_const_msg (main_state .chan );
711
-
712
- main_state .status = cloud_msg -> type ;
713
- } else if (& FOTA_CHAN == main_state .chan ) {
714
- const enum fota_msg_type * status = zbus_chan_const_msg (main_state .chan );
715
-
716
- main_state .fota_status = * status ;
717
- } else if (& NETWORK_CHAN == main_state .chan ) {
718
- const struct network_msg * msg = zbus_chan_const_msg (main_state .chan );
719
-
720
- main_state .network_status = msg -> type ;
721
- } else if (& LOCATION_CHAN == main_state .chan ) {
722
- const enum location_msg_type * msg = zbus_chan_const_msg (main_state .chan );
723
-
724
- main_state .location_status = * msg ;
725
- }
726
-
727
- /* State object updated, run SMF */
728
725
err = smf_run_state (SMF_CTX (& main_state ));
729
726
if (err ) {
730
727
LOG_ERR ("smf_run_state(), error: %d" , err );
0 commit comments