1717#include <zephyr/net/coap.h>
1818#include <app_version.h>
1919#include <date_time.h>
20+ #include <modem/lte_lc.h>
2021
2122#if defined(CONFIG_MEMFAULT )
2223#include <memfault/ports/zephyr/http.h>
@@ -358,6 +359,60 @@ static void send_request_failed(void)
358359 }
359360}
360361
362+ static void print_lte_functional_mode (void )
363+ {
364+ int err ;
365+ enum lte_lc_func_mode mode ;
366+
367+ err = lte_lc_func_mode_get (& mode );
368+ if (err ) {
369+ LOG_ERR ("Failed to get LTE functional mode, error: %d" , err );
370+ return ;
371+ }
372+
373+ const char * mode_str ;
374+ switch (mode ) {
375+ case LTE_LC_FUNC_MODE_POWER_OFF :
376+ mode_str = "POWER_OFF" ;
377+ break ;
378+ case LTE_LC_FUNC_MODE_NORMAL :
379+ mode_str = "NORMAL" ;
380+ break ;
381+ case LTE_LC_FUNC_MODE_RX_ONLY :
382+ mode_str = "RX_ONLY" ;
383+ break ;
384+ case LTE_LC_FUNC_MODE_OFFLINE :
385+ mode_str = "OFFLINE" ;
386+ break ;
387+ case LTE_LC_FUNC_MODE_DEACTIVATE_LTE :
388+ mode_str = "DEACTIVATE_LTE" ;
389+ break ;
390+ case LTE_LC_FUNC_MODE_ACTIVATE_LTE :
391+ mode_str = "ACTIVATE_LTE" ;
392+ break ;
393+ case LTE_LC_FUNC_MODE_DEACTIVATE_GNSS :
394+ mode_str = "DEACTIVATE_GNSS" ;
395+ break ;
396+ case LTE_LC_FUNC_MODE_ACTIVATE_GNSS :
397+ mode_str = "ACTIVATE_GNSS" ;
398+ break ;
399+ case LTE_LC_FUNC_MODE_DEACTIVATE_UICC :
400+ mode_str = "DEACTIVATE_UICC" ;
401+ break ;
402+ case LTE_LC_FUNC_MODE_ACTIVATE_UICC :
403+ mode_str = "ACTIVATE_UICC" ;
404+ break ;
405+ case LTE_LC_FUNC_MODE_OFFLINE_UICC_ON :
406+ mode_str = "OFFLINE_UICC_ON" ;
407+ break ;
408+ default :
409+ mode_str = "UNKNOWN" ;
410+ break ;
411+ }
412+
413+ LOG_ERR ("Current LTE functional mode: %s (%d)" , mode_str , mode );
414+ }
415+
361416static void nrf_provisioning_callback (const struct nrf_provisioning_callback_data * event )
362417{
363418 int err ;
@@ -425,11 +480,13 @@ static void nrf_provisioning_callback(const struct nrf_provisioning_callback_dat
425480 return ;
426481 case NRF_PROVISIONING_EVENT_FAILED :
427482 LOG_ERR ("Provisioning failed" );
483+ print_lte_functional_mode ();
428484
429485 msg = CLOUD_PROVISIONING_FAILED ;
430486 break ;
431487 case NRF_PROVISIONING_EVENT_FAILED_NO_VALID_DATETIME :
432488 LOG_ERR ("Provisioning failed, no valid datetime reference" );
489+ print_lte_functional_mode ();
433490
434491 msg = CLOUD_PROVISIONING_FAILED ;
435492 break ;
@@ -438,6 +495,7 @@ static void nrf_provisioning_callback(const struct nrf_provisioning_callback_dat
438495 LOG_WRN ("Claim the device using the device's attestation token on nrfcloud.com" );
439496 LOG_WRN ("\r\n\n%.*s.%.*s\r\n" , event -> token -> attest_sz , event -> token -> attest ,
440497 event -> token -> cose_sz , event -> token -> cose );
498+ print_lte_functional_mode ();
441499 msg = CLOUD_PROVISIONING_FAILED ;
442500 break ;
443501 case NRF_PROVISIONING_EVENT_FAILED_WRONG_ROOT_CA :
@@ -837,11 +895,24 @@ static void state_connecting_provisioned_run(void *obj)
837895static void state_connecting_provisioning_entry (void * obj )
838896{
839897 int err ;
840-
841898 struct cloud_state_object * state_object = obj ;
899+ struct location_msg location_msg = {
900+ .type = LOCATION_SEARCH_CANCEL ,
901+ };
842902
843903 LOG_DBG ("%s" , __func__ );
844904
905+ /* Cancel any ongoing location search during provisioning to allow writing credentials,
906+ * which requires offline LTE functional mode.
907+ */
908+ err = zbus_chan_pub (& LOCATION_CHAN , & location_msg , K_SECONDS (1 ));
909+ if (err ) {
910+ LOG_ERR ("zbus_chan_pub, error: %d" , err );
911+
912+ SEND_FATAL_ERROR ();
913+ return ;
914+ }
915+
845916 state_object -> provisioning_ongoing = true;
846917
847918 err = nrf_provisioning_trigger_manually ();
0 commit comments