@@ -103,7 +103,8 @@ static void state_waiting_for_image_apply_run(void *o);
103103
104104static 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
108109static 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
222228static 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