Skip to content

Commit 6a9f08e

Browse files
committed
app: minor fixes
- Add logic to that tracks the cloud connection status during FOTA to be able to return to the correct state if FOTA fails. - Fix typo in AT command example in documentation. Signed-off-by: Simen S. Røstad <simen.rostad@nordicsemi.no>
1 parent 3d2b71b commit 6a9f08e

4 files changed

Lines changed: 60 additions & 17 deletions

File tree

app/src/main.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,6 @@ static void running_entry(void *o)
416416
smf_set_state(SMF_CTX(state_object), &states[STATE_TRIGGERING]);
417417
return;
418418
}
419-
420-
smf_set_state(SMF_CTX(state_object), &states[STATE_IDLE]);
421419
}
422420

423421
static void running_run(void *o)
@@ -694,7 +692,7 @@ static void fota_entry(void *o)
694692

695693
static void fota_run(void *o)
696694
{
697-
const struct main_state *state_object = (const struct main_state *)o;
695+
struct main_state *state_object = (struct main_state *)o;
698696

699697
if (state_object->chan == &FOTA_CHAN) {
700698
enum fota_msg_type msg = MSG_TO_FOTA_TYPE(state_object->msg_buf);
@@ -705,13 +703,30 @@ static void fota_run(void *o)
705703
case FOTA_DOWNLOAD_TIMED_OUT:
706704
__fallthrough;
707705
case FOTA_DOWNLOAD_FAILED:
708-
smf_set_state(SMF_CTX(state_object), &states[STATE_RUNNING]);
706+
if (state_object->connected) {
707+
smf_set_state(SMF_CTX(state_object), &states[STATE_TRIGGERING]);
708+
} else {
709+
smf_set_state(SMF_CTX(state_object), &states[STATE_IDLE]);
710+
}
709711
return;
710712
default:
711713
/* Don't care */
712714
break;
713715
}
714716
}
717+
718+
/* Update cloud connection status to be able to return to the correct state in case
719+
* cloud connection is lost during FOTA.
720+
*/
721+
if (state_object->chan == &CLOUD_CHAN) {
722+
const struct cloud_msg *msg = MSG_TO_CLOUD_MSG_PTR(state_object->msg_buf);
723+
724+
if (msg->type == CLOUD_DISCONNECTED) {
725+
state_object->connected = false;
726+
} else if (msg->type == CLOUD_CONNECTED) {
727+
state_object->connected = true;
728+
}
729+
}
715730
}
716731

717732
/* STATE_FOTA_DOWNLOADING */

docs/common/provisioning.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Device provisioning establishes credentials for secure communication with nRF Cl
77
1. Get the device attestation token:
88

99
```bash
10-
at at%attesttoken?
10+
at at%attesttoken
1111
```
1212

1313
*Note: Token is printed automatically on first boot of unprovisioned devices.*

tests/module/main/src/main.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ void test_trigger_disconnect_and_connect_when_triggering(void)
346346
expect_no_events(WEEK_IN_SECONDS);
347347
}
348348

349-
void test_fota_downloading(void)
349+
void test_fota_downloading_cancel_to_state_idle(void)
350350
{
351351
/* Transition to STATE_FOTA_DOWNLOADING */
352352
send_fota_msg(FOTA_DOWNLOADING_UPDATE);
@@ -359,12 +359,44 @@ void test_fota_downloading(void)
359359
expect_no_events(7200);
360360

361361
/* Cleanup */
362+
send_cloud_disconnected();
362363
send_fota_msg(FOTA_DOWNLOAD_CANCELED);
363364
expect_fota_event(FOTA_DOWNLOAD_CANCELED);
364365

365366
expect_no_events(7200);
366367
}
367368

369+
void test_fota_downloading_cancel_to_state_triggering(void)
370+
{
371+
/* Transition to STATE_FOTA_DOWNLOADING */
372+
send_fota_msg(FOTA_DOWNLOADING_UPDATE);
373+
expect_fota_event(FOTA_DOWNLOADING_UPDATE);
374+
375+
/* A cloud ready message and button trigger should now cause no action */
376+
send_cloud_connected();
377+
expect_no_events(7200);
378+
button_handler(DK_BTN1_MSK, DK_BTN1_MSK);
379+
expect_no_events(7200);
380+
381+
/* Cleanup */
382+
send_fota_msg(FOTA_DOWNLOAD_CANCELED);
383+
expect_fota_event(FOTA_DOWNLOAD_CANCELED);
384+
385+
expect_location_event(LOCATION_SEARCH_TRIGGER);
386+
387+
send_location_search_done();
388+
expect_location_event(LOCATION_SEARCH_TRIGGER);
389+
expect_location_event(LOCATION_SEARCH_DONE);
390+
expect_fota_event(FOTA_POLL_REQUEST);
391+
expect_network_event(NETWORK_QUALITY_SAMPLE_REQUEST);
392+
expect_power_event(POWER_BATTERY_PERCENTAGE_SAMPLE_REQUEST);
393+
394+
/* Cleanup */
395+
send_cloud_disconnected();
396+
expect_location_event(LOCATION_SEARCH_CANCEL);
397+
expect_no_events(7200);
398+
}
399+
368400
void test_fota_waiting_for_network_disconnect(void)
369401
{
370402
/* Transition to STATE_FOTA_WAITING_FOR_NETWORK_DISCONNECT */

tests/state_machines/source_of_truth/main.puml

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,14 @@ state STATE_RUNNING {
66
state STATE_WAIT_FOR_TRIGGER
77

88
[*] --> STATE_SAMPLE_DATA
9-
10-
STATE_SAMPLE_DATA --> STATE_WAIT_FOR_TRIGGER: LOCATION_SEARCH_DONE
11-
STATE_WAIT_FOR_TRIGGER --> STATE_SAMPLE_DATA: TIMER_CHAN
12-
STATE_WAIT_FOR_TRIGGER --> STATE_SAMPLE_DATA: BUTTON_CHAN
139
}
14-
[*] --> STATE_IDLE
1510

16-
STATE_RUNNING --> STATE_TRIGGERING: connected
17-
STATE_RUNNING --> STATE_IDLE: not connected
18-
STATE_RUNNING --> STATE_FOTA: FOTA_DOWNLOADING_UPDATE
11+
[*] --> STATE_IDLE
1912

2013
STATE_IDLE --> STATE_TRIGGERING: CLOUD_CONNECTED
2114
STATE_TRIGGERING --> STATE_IDLE: CLOUD_DISCONNECTED
15+
STATE_SAMPLE_DATA --> STATE_WAIT_FOR_TRIGGER: LOCATION_SEARCH_DONE
16+
STATE_WAIT_FOR_TRIGGER --> STATE_SAMPLE_DATA: TIMER || BUTTON
2217
}
2318

2419
state STATE_FOTA {
@@ -32,13 +27,14 @@ state STATE_FOTA {
3227

3328
STATE_FOTA_DOWNLOADING --> STATE_FOTA_WAITING_FOR_NETWORK_DISCONNECT: FOTA_SUCCESS_REBOOT_NEEDED
3429
STATE_FOTA_DOWNLOADING --> STATE_FOTA_WAITING_FOR_NETWORK_DISCONNECT_TO_APPLY_IMAGE: FOTA_IMAGE_APPLY_NEEDED
35-
3630
STATE_FOTA_WAITING_FOR_NETWORK_DISCONNECT --> STATE_FOTA_REBOOTING: NETWORK_DISCONNECTED
3731
STATE_FOTA_WAITING_FOR_NETWORK_DISCONNECT_TO_APPLY_IMAGE --> STATE_FOTA_APPLYING_IMAGE: NETWORK_DISCONNECTED
3832
STATE_FOTA_APPLYING_IMAGE --> STATE_FOTA_REBOOTING: FOTA_SUCCESS_REBOOT_NEEDED
39-
40-
STATE_FOTA --> STATE_RUNNING: FOTA_DOWNLOAD_CANCELED || FOTA_DOWNLOAD_TIMED_OUT || FOTA_DOWNLOAD_FAILED
4133
}
4234

4335
[*] --> STATE_RUNNING
36+
37+
STATE_RUNNING --> STATE_FOTA: FOTA_DOWNLOADING_UPDATE
38+
STATE_FOTA --> STATE_TRIGGERING: FOTA_DOWNLOAD_CANCELED || FOTA_DOWNLOAD_TIMED_OUT || FOTA_DOWNLOAD_FAILED [connected]
39+
STATE_FOTA --> STATE_IDLE: FOTA_DOWNLOAD_CANCELED || FOTA_DOWNLOAD_TIMED_OUT || FOTA_DOWNLOAD_FAILED [!connected]
4440
@enduml

0 commit comments

Comments
 (0)