Skip to content

Commit 571fc42

Browse files
committed
modules: Update FOTA process
Include more states in app.c to differ between different FOTA scenarios. Signed-off-by: Simen S. Røstad <simen.rostad@nordicsemi.no>
1 parent 334d8f1 commit 571fc42

File tree

4 files changed

+74
-8
lines changed

4 files changed

+74
-8
lines changed

app/src/modules/app/app.c

+70-4
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ static void idle_run(void *o);
6262
static void fota_entry(void *o);
6363
static 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+
6570
static void fota_network_disconnect_pending_entry(void *o);
6671
static 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

418484
static void fota_network_disconnect_pending_entry(void *o)

app/src/modules/fota/fota.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void fota_status(enum nrf_cloud_fota_status status, const char *const sta
200200
case NRF_CLOUD_FOTA_FMFU_VALIDATION_NEEDED:
201201
LOG_DBG("Full Modem FOTA Update validation needed, network disconnect required");
202202

203-
evt = FOTA_NETWORK_DISCONNECT_NEEDED;
203+
evt = FOTA_NETWORK_DISCONNECT_AND_APPLY_NEEDED;
204204
break;
205205
default:
206206
LOG_DBG("Unknown FOTA status: %d", status);
@@ -354,7 +354,7 @@ static void state_downloading_update_run(void *o)
354354
const enum fota_msg_type evt = MSG_TO_FOTA_TYPE(state_object->msg_buf);
355355

356356
switch (evt) {
357-
case FOTA_NETWORK_DISCONNECT_NEEDED:
357+
case FOTA_NETWORK_DISCONNECT_AND_APPLY_NEEDED:
358358
STATE_SET(fota_state, STATE_WAITING_FOR_NETWORK_DISCONNECT);
359359
break;
360360
case FOTA_DOWNLOAD_FAILED:

app/src/modules/fota/fota.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ enum fota_msg_type {
3838
/* Event notified when the module needs the network to disconnect in order to apply
3939
* an update. When network has been disconnect, send the event FOTA_APPLY_IMAGE.
4040
*/
41-
FOTA_NETWORK_DISCONNECT_NEEDED,
41+
FOTA_NETWORK_DISCONNECT_AND_APPLY_NEEDED,
4242

4343
/* Event notified when the FOTA update has been canceled. */
4444
FOTA_CANCELED,

tests/module/fota/src/fota_module_test.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ void test_fota_module_should_succeed(void)
158158

159159
/* 3. Download succeeded, validation needed */
160160
invoke_nrf_cloud_fota_callback_stub_status(NRF_CLOUD_FOTA_FMFU_VALIDATION_NEEDED);
161-
event_expect(FOTA_NETWORK_DISCONNECT_NEEDED);
161+
event_expect(FOTA_NETWORK_DISCONNECT_AND_APPLY_NEEDED);
162162

163163
/* 4. Apply image */
164164
event_send(FOTA_APPLY_IMAGE);

0 commit comments

Comments
 (0)