Skip to content

Commit 7cb2c7a

Browse files
committed
modules: app: Minor fixes
- Fix re-entry of state_running post FOTA - Re-enable CoAP downloads for FOTA images now that nRF Cloud FOTA uses CoAP for downloads via downloader API. Signed-off-by: Simen S. Røstad <simen.rostad@nordicsemi.no>
1 parent 867252c commit 7cb2c7a

File tree

3 files changed

+67
-20
lines changed

3 files changed

+67
-20
lines changed

app/prj.conf

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ CONFIG_NRF_CLOUD_FOTA_POLL=y
116116
CONFIG_NRF_CLOUD_FOTA_POLL_LOG_LEVEL_DBG=y
117117
CONFIG_NRF_CLOUD_FOTA_FULL_MODEM_UPDATE=y
118118
CONFIG_NRF_CLOUD_FOTA_DOWNLOAD_FRAGMENT_SIZE=1700
119+
CONFIG_NRF_CLOUD_COAP_DOWNLOADS=y
119120
CONFIG_FOTA_DOWNLOAD=y
120121
CONFIG_FOTA_DOWNLOAD_PROGRESS_EVT=y
121122
CONFIG_FOTA_DL_TIMEOUT_MIN=30

app/src/modules/app/app.c

+21-2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ static void trigger_work_fn(struct k_work *work);
5151
static K_WORK_DELAYABLE_DEFINE(trigger_work, trigger_work_fn);
5252

5353
/* Forward declarations of state handlers */
54+
static void running_entry(void *o);
5455
static void running_run(void *o);
5556

5657
static void periodic_triggering_entry(void *o);
@@ -125,11 +126,11 @@ static struct app_state_object app_state;
125126
/* Construct state table */
126127
static const struct smf_state states[] = {
127128
[STATE_RUNNING] = SMF_CREATE_STATE(
128-
NULL,
129+
running_entry,
129130
running_run,
130131
NULL,
131132
NULL,
132-
&states[STATE_IDLE]
133+
NULL
133134
),
134135
[STATE_PERIODIC_TRIGGERING] = SMF_CREATE_STATE(
135136
periodic_triggering_entry,
@@ -267,13 +268,31 @@ static void trigger_work_fn(struct k_work *work)
267268

268269
triggers_send();
269270

271+
LOG_DBG("Next trigger in %lld seconds", app_state.interval_sec);
272+
270273
k_work_reschedule(&trigger_work, K_SECONDS(app_state.interval_sec));
271274
}
272275

273276
/* Zephyr State Machine framework handlers */
274277

275278
/* STATE_RUNNING */
276279

280+
static void running_entry(void *o)
281+
{
282+
const struct app_state_object *state_object = (const struct app_state_object *)o;
283+
284+
LOG_DBG("%s", __func__);
285+
286+
if (state_object->status == CLOUD_CONNECTED_READY_TO_SEND ||
287+
state_object->status == CLOUD_PAYLOAD_JSON ||
288+
state_object->status == CLOUD_POLL_SHADOW) {
289+
STATE_SET(app_state, STATE_PERIODIC_TRIGGERING);
290+
return;
291+
}
292+
293+
STATE_SET(app_state, STATE_IDLE);
294+
}
295+
277296
static void running_run(void *o)
278297
{
279298
const struct app_state_object *state_object = (const struct app_state_object *)o;

app/src/modules/fota/fota.c

+45-18
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ static void state_waiting_for_image_apply_run(void *o);
103103

104104
static void state_reboot_needed_entry(void *o);
105105

106-
static void state_canceled_entry(void *o);
106+
static void state_canceling_entry(void *o);
107+
static void state_canceling_run(void *o);
107108

108109
static struct fota_state fota_state = {
109110
.fota_ctx.reboot_fn = fota_reboot,
@@ -148,8 +149,8 @@ static const struct smf_state states[] = {
148149
&states[STATE_RUNNING],
149150
NULL),
150151
[STATE_CANCELED] =
151-
SMF_CREATE_STATE(state_canceled_entry,
152-
NULL,
152+
SMF_CREATE_STATE(state_canceling_entry,
153+
state_canceling_run,
153154
NULL,
154155
&states[STATE_RUNNING],
155156
NULL),
@@ -189,6 +190,11 @@ static void fota_status(enum nrf_cloud_fota_status status, const char *const sta
189190

190191
evt = FOTA_DOWNLOAD_FAILED;
191192
break;
193+
case NRF_CLOUD_FOTA_CANCELED:
194+
LOG_WRN("Firmware download canceled");
195+
196+
evt = FOTA_CANCELED;
197+
break;
192198
case NRF_CLOUD_FOTA_TIMED_OUT:
193199
LOG_WRN("Firmware download timed out");
194200

@@ -214,14 +220,14 @@ static void fota_status(enum nrf_cloud_fota_status status, const char *const sta
214220

215221
err = zbus_chan_pub(&FOTA_CHAN, &evt, K_SECONDS(1));
216222
if (err) {
217-
LOG_DBG("zbus_chan_pub, error: %d", err);
223+
LOG_ERR("zbus_chan_pub, error: %d", err);
218224
SEND_FATAL_ERROR();
219225
}
220226
}
221227

222228
static void task_wdt_callback(int channel_id, void *user_data)
223229
{
224-
LOG_DBG("Watchdog expired, Channel: %d, Thread: %s",
230+
LOG_ERR("Watchdog expired, Channel: %d, Thread: %s",
225231
channel_id, k_thread_name_get((k_tid_t)user_data));
226232

227233
SEND_FATAL_ERROR_WATCHDOG_TIMEOUT();
@@ -239,16 +245,16 @@ static void state_running_entry(void *o)
239245
/* Initialize the FOTA context */
240246
err = nrf_cloud_fota_poll_init(&state_object->fota_ctx);
241247
if (err) {
242-
LOG_DBG("nrf_cloud_fota_poll_init failed: %d", err);
248+
LOG_ERR("nrf_cloud_fota_poll_init failed: %d", err);
243249
SEND_FATAL_ERROR();
244250
}
245251

246252
/* Process pending FOTA job, the FOTA type is returned */
247253
err = nrf_cloud_fota_poll_process_pending(&state_object->fota_ctx);
248254
if (err < 0) {
249-
LOG_DBG("nrf_cloud_fota_poll_process_pending failed: %d", err);
255+
LOG_ERR("nrf_cloud_fota_poll_process_pending failed: %d", err);
250256
} else if (err != NRF_CLOUD_FOTA_TYPE__INVALID) {
251-
LOG_DBG("Processed pending FOTA job type: %d", err);
257+
LOG_ERR("Processed pending FOTA job type: %d", err);
252258
}
253259
}
254260

@@ -306,7 +312,7 @@ static void state_polling_for_update_entry(void *o)
306312

307313
err = zbus_chan_pub(&FOTA_CHAN, &evt, K_SECONDS(1));
308314
if (err) {
309-
LOG_DBG("zbus_chan_pub, error: %d", err);
315+
LOG_ERR("zbus_chan_pub, error: %d", err);
310316
SEND_FATAL_ERROR();
311317
}
312318
break;
@@ -317,7 +323,7 @@ static void state_polling_for_update_entry(void *o)
317323
LOG_DBG("Job available, FOTA processing started");
318324
break;
319325
default:
320-
LOG_DBG("nrf_cloud_fota_poll_process, error: %d", err);
326+
LOG_ERR("nrf_cloud_fota_poll_process, error: %d", err);
321327
SEND_FATAL_ERROR();
322328
break;
323329
}
@@ -337,6 +343,11 @@ static void state_polling_for_update_run(void *o)
337343
case FOTA_NO_AVAILABLE_UPDATE:
338344
STATE_SET(fota_state, STATE_WAITING_FOR_POLL_REQUEST);
339345
break;
346+
case FOTA_CANCEL:
347+
LOG_DBG("No ongoing FOTA update, nothing to cancel");
348+
349+
STATE_EVENT_HANDLED(fota_state);
350+
break;
340351
default:
341352
/* Don't care */
342353
break;
@@ -395,7 +406,7 @@ static void state_waiting_for_image_apply_run(void *o)
395406
int err = nrf_cloud_fota_poll_update_apply(&state_object->fota_ctx);
396407

397408
if (err) {
398-
LOG_DBG("nrf_cloud_fota_poll_update_apply, error: %d", err);
409+
LOG_ERR("nrf_cloud_fota_poll_update_apply, error: %d", err);
399410
SEND_FATAL_ERROR();
400411
}
401412

@@ -417,16 +428,32 @@ static void state_reboot_needed_entry(void *o)
417428
LOG_DBG("Waiting for the application to reboot in order to apply the update");
418429
}
419430

420-
static void state_canceled_entry(void *o)
431+
static void state_canceling_entry(void *o)
421432
{
422433
ARG_UNUSED(o);
423434

424435
LOG_DBG("%s", __func__);
425-
LOG_WRN("Canceling download");
436+
LOG_DBG("Canceling download");
426437

427-
(void)fota_download_cancel();
438+
int err = fota_download_cancel();
428439

429-
STATE_SET(fota_state, STATE_WAITING_FOR_POLL_REQUEST);
440+
if (err) {
441+
LOG_ERR("fota_download_cancel, error: %d", err);
442+
SEND_FATAL_ERROR();
443+
}
444+
}
445+
446+
static void state_canceling_run(void *o)
447+
{
448+
const struct fota_state *state_object = (const struct fota_state *)o;
449+
450+
if (&FOTA_CHAN == state_object->chan) {
451+
const enum fota_msg_type msg = MSG_TO_FOTA_TYPE(state_object->msg_buf);
452+
453+
if (msg == FOTA_CANCELED) {
454+
STATE_SET(fota_state, STATE_WAITING_FOR_POLL_REQUEST);
455+
}
456+
}
430457
}
431458

432459
/* End of state handlers */
@@ -449,7 +476,7 @@ static void fota_task(void)
449476
while (true) {
450477
err = task_wdt_feed(task_wdt_id);
451478
if (err) {
452-
LOG_DBG("task_wdt_feed, error: %d", err);
479+
LOG_ERR("task_wdt_feed, error: %d", err);
453480
SEND_FATAL_ERROR();
454481
return;
455482
}
@@ -458,14 +485,14 @@ static void fota_task(void)
458485
if (err == -ENOMSG) {
459486
continue;
460487
} else if (err) {
461-
LOG_DBG("zbus_sub_wait_msg, error: %d", err);
488+
LOG_ERR("zbus_sub_wait_msg, error: %d", err);
462489
SEND_FATAL_ERROR();
463490
return;
464491
}
465492

466493
err = STATE_RUN(fota_state);
467494
if (err) {
468-
LOG_DBG("handle_message, error: %d", err);
495+
LOG_ERR("handle_message, error: %d", err);
469496
SEND_FATAL_ERROR();
470497
return;
471498
}

0 commit comments

Comments
 (0)