@@ -174,7 +174,7 @@ void lteppp_init(void) {
174174 lteppp_pcb = pppapi_pppos_create (& lteppp_netif , lteppp_output_callback , lteppp_status_cb , NULL );
175175
176176 //wait on connecting modem until it is allowed
177- lteppp_modem_conn_state = E_LTE_MODEM_DISCONNECTED ;
177+ lteppp_set_modem_conn_state ( E_LTE_MODEM_DISCONNECTED ) ;
178178
179179 xTaskCreatePinnedToCore (TASK_LTE , "LTE" , LTE_TASK_STACK_SIZE / sizeof (StackType_t ), NULL , LTE_TASK_PRIORITY , & xLTETaskHndl , 1 );
180180
@@ -211,15 +211,26 @@ char* lteppp_get_log_buff(void)
211211}
212212#endif
213213
214- lte_modem_conn_state_t lteppp_modem_state (void )
214+ lte_modem_conn_state_t lteppp_get_modem_conn_state (void )
215215{
216216 lte_modem_conn_state_t state ;
217+ if (!xLTESem ){
218+ // lte task hasn't been initialized yet, so we don't need to (and can't) protect this read
219+ return lteppp_modem_conn_state ;
220+ }
217221 xSemaphoreTake (xLTESem , portMAX_DELAY );
218222 state = lteppp_modem_conn_state ;
219223 xSemaphoreGive (xLTESem );
220224 return state ;
221225}
222226
227+ void lteppp_set_modem_conn_state (lte_modem_conn_state_t state )
228+ {
229+ xSemaphoreTake (xLTESem , portMAX_DELAY );
230+ lteppp_modem_conn_state = state ;
231+ xSemaphoreGive (xLTESem );
232+ }
233+
223234void lteppp_set_state (lte_state_t state ) {
224235 xSemaphoreTake (xLTESem , portMAX_DELAY );
225236 lteppp_lte_state = state ;
@@ -382,6 +393,10 @@ bool lteppp_wait_at_rsp (const char *expected_rsp, uint32_t timeout, bool from_m
382393
383394lte_state_t lteppp_get_state (void ) {
384395 lte_state_t state ;
396+ if (!xLTESem ){
397+ // lte task hasn't been initialized yet, so we don't need to (and can't) protect this read
398+ return lteppp_lte_state ;
399+ }
385400 xSemaphoreTake (xLTESem , portMAX_DELAY );
386401 state = lteppp_lte_state ;
387402 xSemaphoreGive (xLTESem );
@@ -429,6 +444,35 @@ void lteppp_resume(void) {
429444/******************************************************************************
430445 DEFINE PRIVATE FUNCTIONS
431446 ******************************************************************************/
447+ bool trx_is_ok_or_error (){
448+ if (strstr (lteppp_trx_buffer , "ERROR\r\n" ) != NULL ){
449+ // printf("ok\n");
450+ return true;
451+ } else if (strstr (lteppp_trx_buffer , "OK\r\n" ) != NULL ) {
452+ // printf("error\n");
453+ return true;
454+ }
455+ return false;
456+ }
457+
458+ /** check whether modem is responding at 115200
459+ * this means it is in FFH or RECOVYER mode
460+ */
461+ bool lteppp_check_ffh_mode (){
462+ uart_set_baudrate (LTE_UART_ID , 115200 );
463+ uart_set_hw_flow_ctrl (LTE_UART_ID , UART_HW_FLOWCTRL_CTS_RTS , 64 );
464+ uart_set_rts (LTE_UART_ID , true);
465+
466+ for ( uint8_t attempt = 0 ; attempt < 3 ; attempt ++ ){
467+ lteppp_send_at_cmd ("AT" , LTE_PPP_BACK_OFF_TIME_MS );
468+ if ( trx_is_ok_or_error () ){
469+ // we could check for AT+SMOD / AT+BMOD to get more details
470+ return true;
471+ }
472+ }
473+ return false;
474+ }
475+
432476static void TASK_LTE (void * pvParameters ) {
433477 MSG ("\n" );
434478 bool sim_present ;
@@ -447,9 +491,7 @@ static void TASK_LTE (void *pvParameters) {
447491 {
448492 MSG ("notif\n" );
449493 xSemaphoreTake (xLTE_modem_Conn_Sem , portMAX_DELAY );
450- xSemaphoreTake (xLTESem , portMAX_DELAY );
451- lteppp_modem_conn_state = E_LTE_MODEM_CONNECTING ;
452- xSemaphoreGive (xLTESem );
494+ lteppp_set_modem_conn_state (E_LTE_MODEM_CONNECTING );
453495 uart_set_rts (LTE_UART_ID , true);
454496 vTaskDelay (500 /portTICK_PERIOD_MS );
455497 uart_set_hw_flow_ctrl (LTE_UART_ID , UART_HW_FLOWCTRL_CTS_RTS , 64 );
@@ -463,9 +505,7 @@ static void TASK_LTE (void *pvParameters) {
463505 if (at_trials >= LTE_AT_CMD_TRIALS ) {
464506 uart_set_hw_flow_ctrl (LTE_UART_ID , UART_HW_FLOWCTRL_DISABLE , 0 );
465507 uart_set_rts (LTE_UART_ID , false);
466- xSemaphoreTake (xLTESem , portMAX_DELAY );
467- lteppp_modem_conn_state = E_LTE_MODEM_DISCONNECTED ;
468- xSemaphoreGive (xLTESem );
508+ lteppp_set_modem_conn_state (E_LTE_MODEM_DISCONNECTED );
469509 xSemaphoreGive (xLTE_modem_Conn_Sem );
470510 at_trials = 0 ;
471511 goto modem_init ;
@@ -486,9 +526,7 @@ static void TASK_LTE (void *pvParameters) {
486526 if (at_trials >= LTE_AT_CMD_TRIALS ) {
487527 uart_set_hw_flow_ctrl (LTE_UART_ID , UART_HW_FLOWCTRL_DISABLE , 0 );
488528 uart_set_rts (LTE_UART_ID , false);
489- xSemaphoreTake (xLTESem , portMAX_DELAY );
490- lteppp_modem_conn_state = E_LTE_MODEM_DISCONNECTED ;
491- xSemaphoreGive (xLTESem );
529+ lteppp_set_modem_conn_state (E_LTE_MODEM_DISCONNECTED );
492530 xSemaphoreGive (xLTE_modem_Conn_Sem );
493531 at_trials = 0 ;
494532 goto modem_init ;
@@ -501,11 +539,14 @@ static void TASK_LTE (void *pvParameters) {
501539 while (!lteppp_send_at_cmd ("AT" , LTE_RX_TIMEOUT_MIN_MS ))
502540 {
503541 if (at_trials >= LTE_AT_CMD_TRIALS ) {
504- uart_set_hw_flow_ctrl (LTE_UART_ID , UART_HW_FLOWCTRL_DISABLE , 0 );
505- uart_set_rts (LTE_UART_ID , false);
506- xSemaphoreTake (xLTESem , portMAX_DELAY );
507- lteppp_modem_conn_state = E_LTE_MODEM_DISCONNECTED ;
508- xSemaphoreGive (xLTESem );
542+ if ( lteppp_check_ffh_mode () ){
543+ lteppp_set_modem_conn_state (E_LTE_MODEM_RECOVERY );
544+ } else {
545+ uart_set_baudrate (LTE_UART_ID , MICROPY_LTE_UART_BAUDRATE );
546+ uart_set_hw_flow_ctrl (LTE_UART_ID , UART_HW_FLOWCTRL_DISABLE , 0 );
547+ uart_set_rts (LTE_UART_ID , false);
548+ lteppp_set_modem_conn_state (E_LTE_MODEM_DISCONNECTED );
549+ }
509550 xSemaphoreGive (xLTE_modem_Conn_Sem );
510551 at_trials = 0 ;
511552 goto modem_init ;
@@ -547,22 +588,16 @@ static void TASK_LTE (void *pvParameters) {
547588 {
548589 lteppp_send_at_cmd ("AT+SQNIBRCFG=1,100" , LTE_RX_TIMEOUT_MAX_MS );
549590 }
550- xSemaphoreTake (xLTESem , portMAX_DELAY );
551- lteppp_modem_conn_state = E_LTE_MODEM_CONNECTED ;
552- xSemaphoreGive (xLTESem );
591+ lteppp_set_modem_conn_state (E_LTE_MODEM_CONNECTED );
553592 xSemaphoreGive (xLTE_modem_Conn_Sem );
554593 MSG ("forever\n" );
555594 lte_state_t state ;
556595 for (;;) {
557596 vTaskDelay (LTE_TASK_PERIOD_MS );
558- xSemaphoreTake (xLTESem , portMAX_DELAY );
559- if (E_LTE_MODEM_DISCONNECTED == lteppp_modem_conn_state )
560- {
561- xSemaphoreGive (xLTESem );
597+ if (lteppp_get_modem_conn_state () == E_LTE_MODEM_DISCONNECTED ){
562598 // restart the task
563599 goto modem_init ;
564600 }
565- xSemaphoreGive (xLTESem );
566601 state = lteppp_get_state ();
567602 if (xQueueReceive (xCmdQueue , lteppp_trx_buffer , 0 )) {
568603 MSG ("cmd\n" );
@@ -860,7 +895,7 @@ static void lteppp_print_states(){
860895 if (!xLTESem )
861896 return ;
862897 static lte_modem_conn_state_t last_c = 0xff ;
863- lte_modem_conn_state_t c = lteppp_modem_state ();
898+ lte_modem_conn_state_t c = lteppp_get_modem_conn_state ();
864899 static lte_state_t last_s = 0xff ;
865900 lte_state_t s = lteppp_get_state ();
866901 static bool last_u = false;
0 commit comments