@@ -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,10 @@ 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 );
340350 default :
341351 /* Don't care */
342352 break ;
@@ -395,7 +405,7 @@ static void state_waiting_for_image_apply_run(void *o)
395405 int err = nrf_cloud_fota_poll_update_apply (& state_object -> fota_ctx );
396406
397407 if (err ) {
398- LOG_DBG ("nrf_cloud_fota_poll_update_apply, error: %d" , err );
408+ LOG_ERR ("nrf_cloud_fota_poll_update_apply, error: %d" , err );
399409 SEND_FATAL_ERROR ();
400410 }
401411
@@ -417,16 +427,32 @@ static void state_reboot_needed_entry(void *o)
417427 LOG_DBG ("Waiting for the application to reboot in order to apply the update" );
418428}
419429
420- static void state_canceled_entry (void * o )
430+ static void state_canceling_entry (void * o )
421431{
422432 ARG_UNUSED (o );
423433
424434 LOG_DBG ("%s" , __func__ );
425- LOG_WRN ("Canceling download" );
435+ LOG_DBG ("Canceling download" );
436+
437+ int err = fota_download_cancel ();
438+
439+ if (err ) {
440+ LOG_ERR ("fota_download_cancel, error: %d" , err );
441+ SEND_FATAL_ERROR ();
442+ }
443+ }
444+
445+ static void state_canceling_run (void * o )
446+ {
447+ const struct fota_state * state_object = (const struct fota_state * )o ;
426448
427- (void )fota_download_cancel ();
449+ if (& FOTA_CHAN == state_object -> chan ) {
450+ const enum fota_msg_type msg = MSG_TO_FOTA_TYPE (state_object -> msg_buf );
428451
429- STATE_SET (fota_state , STATE_WAITING_FOR_POLL_REQUEST );
452+ if (msg == FOTA_CANCELED ) {
453+ STATE_SET (fota_state , STATE_WAITING_FOR_POLL_REQUEST );
454+ }
455+ }
430456}
431457
432458/* End of state handlers */
@@ -449,7 +475,7 @@ static void fota_task(void)
449475 while (true) {
450476 err = task_wdt_feed (task_wdt_id );
451477 if (err ) {
452- LOG_DBG ("task_wdt_feed, error: %d" , err );
478+ LOG_ERR ("task_wdt_feed, error: %d" , err );
453479 SEND_FATAL_ERROR ();
454480 return ;
455481 }
@@ -458,14 +484,14 @@ static void fota_task(void)
458484 if (err == - ENOMSG ) {
459485 continue ;
460486 } else if (err ) {
461- LOG_DBG ("zbus_sub_wait_msg, error: %d" , err );
487+ LOG_ERR ("zbus_sub_wait_msg, error: %d" , err );
462488 SEND_FATAL_ERROR ();
463489 return ;
464490 }
465491
466492 err = STATE_RUN (fota_state );
467493 if (err ) {
468- LOG_DBG ("handle_message, error: %d" , err );
494+ LOG_ERR ("handle_message, error: %d" , err );
469495 SEND_FATAL_ERROR ();
470496 return ;
471497 }
0 commit comments