6666#include "driver/gpio.h"
6767
6868#include "pycom_config.h"
69+ #include "modmachine.h"
6970
7071/******************************************************************************
7172 DEFINE TYPES
@@ -92,6 +93,8 @@ uart_config_t lte_uart_config1;
9293
9394static bool lte_legacyattach_flag = true;
9495
96+ static bool lte_ue_is_out_of_coverage = false;
97+
9598extern TaskHandle_t xLTEUpgradeTaskHndl ;
9699extern TaskHandle_t mpTaskHandle ;
97100extern TaskHandle_t svTaskHandle ;
@@ -221,8 +224,16 @@ static bool lte_check_attached(bool legacy) {
221224 attached = true;
222225 }
223226 } else {
224- if ((pos = strstr (modlte_rsp .data , "+CEREG: 2,1," )) || (pos = strstr (modlte_rsp .data , "+CEREG: 2,5," ))) {
227+ if ((pos = strstr (modlte_rsp .data , "+CEREG: 2,1," )) || (pos = strstr (modlte_rsp .data , "+CEREG: 2,5," )) || ( pos = strstr ( modlte_rsp . data , "+CEREG: 2,4" )) ) {
225228 attached = true;
229+ if ((pos = strstr (modlte_rsp .data , "+CEREG: 2,4" )))
230+ {
231+ lte_ue_is_out_of_coverage = true;
232+ }
233+ else
234+ {
235+ lte_ue_is_out_of_coverage = false;
236+ }
226237 } else {
227238 attached = false;
228239 }
@@ -337,7 +348,6 @@ static void TASK_LTE_UPGRADE(void *pvParameters){
337348// Micro Python bindings; LTE class
338349
339350static mp_obj_t lte_init_helper (lte_obj_t * self , const mp_arg_val_t * args ) {
340- //printf("This is lte_init_helper()\n");
341351 char at_cmd [LTE_AT_CMD_SIZE_MAX - 4 ];
342352 mod_network_register_nic (& lte_obj );
343353 connect_lte_uart ();
@@ -363,7 +373,7 @@ static mp_obj_t lte_init_helper(lte_obj_t *self, const mp_arg_val_t *args) {
363373
364374 lte_push_at_command ("AT!=\"setlpm airplane=1 enable=1\"" , LTE_RX_TIMEOUT_MIN_MS );
365375 lte_push_at_command ("AT+CFUN?" , LTE_RX_TIMEOUT_MIN_MS );
366- if (strstr (modlte_rsp .data , "+CFUN: 0" )) {
376+ if (strstr (modlte_rsp .data , "+CFUN: 0" ) || strstr ( modlte_rsp . data , "+CFUN: 4" ) ) {
367377 const char * carrier = "standard" ;
368378 lte_obj .carrier = false;
369379 if (args [0 ].u_obj != mp_const_none ) {
@@ -384,6 +394,11 @@ static mp_obj_t lte_init_helper(lte_obj_t *self, const mp_arg_val_t *args) {
384394 if (!strstr (modlte_rsp .data , carrier )) {
385395 sprintf (at_cmd , "AT+SQNCTM=\"%s\"" , carrier );
386396 lte_push_at_command (at_cmd , LTE_RX_TIMEOUT_MAX_MS );
397+ lteppp_wait_at_rsp ("+S" , LTE_RX_TIMEOUT_MAX_MS , true);
398+ mp_hal_delay_ms (LTE_RX_TIMEOUT_MIN_MS );
399+ if (!lteppp_wait_at_rsp ("+SYSSTART" , LTE_RX_TIMEOUT_MAX_MS , true)) {
400+ lteppp_wait_at_rsp ("+SYSSTART" , LTE_RX_TIMEOUT_MAX_MS , true);
401+ }
387402 lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
388403 lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
389404 }
@@ -473,6 +488,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
473488 lteppp_deinit ();
474489 lte_obj .init = false;
475490 vTaskDelay (100 );
491+ disconnect_lte_uart ();
476492 return mp_const_none ;
477493 }
478494 }
@@ -522,6 +538,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
522538 }
523539 lteppp_deinit ();
524540 mod_network_deregister_nic (& lte_obj );
541+ disconnect_lte_uart ();
525542 return mp_const_none ;
526543
527544error :
@@ -555,46 +572,47 @@ STATIC mp_obj_t lte_attach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
555572 lte_check_attached (lte_legacyattach_flag );
556573
557574 if (lteppp_get_state () < E_LTE_ATTACHING ) {
558- // configuring scanning in all 6 bands
559- lte_push_at_command ("AT!=\"clearscanconfig\"" , LTE_RX_TIMEOUT_MIN_MS );
560- if (args [0 ].u_obj == mp_const_none ) {
561- if (!lte_obj .carrier ) {
562- lte_push_at_command ("AT!=\"RRC::addScanBand band=3\"" , LTE_RX_TIMEOUT_MIN_MS );
563- lte_push_at_command ("AT!=\"RRC::addScanBand band=4\"" , LTE_RX_TIMEOUT_MIN_MS );
564- lte_push_at_command ("AT!=\"RRC::addScanBand band=5\"" , LTE_RX_TIMEOUT_MIN_MS );
565- lte_push_at_command ("AT!=\"RRC::addScanBand band=8\"" , LTE_RX_TIMEOUT_MIN_MS );
566- lte_push_at_command ("AT!=\"RRC::addScanBand band=12\"" , LTE_RX_TIMEOUT_MIN_MS );
567- lte_push_at_command ("AT!=\"RRC::addScanBand band=13\"" , LTE_RX_TIMEOUT_MIN_MS );
568- lte_push_at_command ("AT!=\"RRC::addScanBand band=20\"" , LTE_RX_TIMEOUT_MIN_MS );
569- lte_push_at_command ("AT!=\"RRC::addScanBand band=28\"" , LTE_RX_TIMEOUT_MIN_MS );
570- }
571- } else {
572- uint32_t band = mp_obj_get_int (args [0 ].u_obj );
573- if (band == 3 ) {
575+
576+ if (!lte_obj .carrier ) {
577+ // configuring scanning in all bands
578+ lte_push_at_command ("AT!=\"clearscanconfig\"" , LTE_RX_TIMEOUT_MIN_MS );
579+ if (args [0 ].u_obj == mp_const_none ) {
574580 lte_push_at_command ("AT!=\"RRC::addScanBand band=3\"" , LTE_RX_TIMEOUT_MIN_MS );
575- } else if (band == 4 ) {
576581 lte_push_at_command ("AT!=\"RRC::addScanBand band=4\"" , LTE_RX_TIMEOUT_MIN_MS );
577- } else if (band == 5 ) {
578582 lte_push_at_command ("AT!=\"RRC::addScanBand band=5\"" , LTE_RX_TIMEOUT_MIN_MS );
579- } else if (band == 8 ) {
580583 lte_push_at_command ("AT!=\"RRC::addScanBand band=8\"" , LTE_RX_TIMEOUT_MIN_MS );
581- } else if (band == 12 ) {
582584 lte_push_at_command ("AT!=\"RRC::addScanBand band=12\"" , LTE_RX_TIMEOUT_MIN_MS );
583- } else if (band == 13 ) {
584585 lte_push_at_command ("AT!=\"RRC::addScanBand band=13\"" , LTE_RX_TIMEOUT_MIN_MS );
585- } else if (band == 20 ) {
586586 lte_push_at_command ("AT!=\"RRC::addScanBand band=20\"" , LTE_RX_TIMEOUT_MIN_MS );
587- } else if (band == 28 ) {
588587 lte_push_at_command ("AT!=\"RRC::addScanBand band=28\"" , LTE_RX_TIMEOUT_MIN_MS );
589588 } else {
590- nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "band %d not supported" , band ));
589+ uint32_t band = mp_obj_get_int (args [0 ].u_obj );
590+ if (band == 3 ) {
591+ lte_push_at_command ("AT!=\"RRC::addScanBand band=3\"" , LTE_RX_TIMEOUT_MIN_MS );
592+ } else if (band == 4 ) {
593+ lte_push_at_command ("AT!=\"RRC::addScanBand band=4\"" , LTE_RX_TIMEOUT_MIN_MS );
594+ } else if (band == 5 ) {
595+ lte_push_at_command ("AT!=\"RRC::addScanBand band=5\"" , LTE_RX_TIMEOUT_MIN_MS );
596+ } else if (band == 8 ) {
597+ lte_push_at_command ("AT!=\"RRC::addScanBand band=8\"" , LTE_RX_TIMEOUT_MIN_MS );
598+ } else if (band == 12 ) {
599+ lte_push_at_command ("AT!=\"RRC::addScanBand band=12\"" , LTE_RX_TIMEOUT_MIN_MS );
600+ } else if (band == 13 ) {
601+ lte_push_at_command ("AT!=\"RRC::addScanBand band=13\"" , LTE_RX_TIMEOUT_MIN_MS );
602+ } else if (band == 20 ) {
603+ lte_push_at_command ("AT!=\"RRC::addScanBand band=20\"" , LTE_RX_TIMEOUT_MIN_MS );
604+ } else if (band == 28 ) {
605+ lte_push_at_command ("AT!=\"RRC::addScanBand band=28\"" , LTE_RX_TIMEOUT_MIN_MS );
606+ } else {
607+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "band %d not supported" , band ));
608+ }
591609 }
592610 }
593611 if (args [3 ].u_obj != mp_const_none ) {
594612 lte_obj .cid = args [3 ].u_int ;
595613 }
596614
597- if (args [1 ].u_obj != mp_const_none || args [4 ].u_obj != mp_const_none ) {
615+ if (! lte_obj . carrier && ( args [1 ].u_obj != mp_const_none || args [4 ].u_obj != mp_const_none ) ) {
598616
599617 const char * strapn ;
600618 const char * strtype ;
@@ -833,7 +851,7 @@ STATIC mp_obj_t lte_resume(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
833851 } else if (lteppp_get_state () == E_LTE_PPP ) {
834852 nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "modem already connected" ));
835853 } else {
836- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "modem not attached" ));
854+ // nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "modem not attached"));
837855 }
838856 return mp_const_none ;
839857}
@@ -973,6 +991,20 @@ STATIC mp_obj_t lte_iccid(mp_obj_t self_in) {
973991}
974992STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lte_iccid_obj , lte_iccid );
975993
994+ STATIC mp_obj_t lte_ue_coverage (mp_obj_t self_in ) {
995+ lte_check_init ();
996+ lte_check_inppp ();
997+ if (lte_check_attached (lte_legacyattach_flag ))
998+ {
999+ return lte_ue_is_out_of_coverage ?mp_const_false :mp_const_true ;
1000+ }
1001+ else
1002+ {
1003+ return mp_const_false ;
1004+ }
1005+ }
1006+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lte_ue_coverage_obj , lte_ue_coverage );
1007+
9761008STATIC mp_obj_t lte_reset (mp_obj_t self_in ) {
9771009 lte_check_init ();
9781010 lte_disconnect (self_in );
@@ -990,6 +1022,28 @@ STATIC mp_obj_t lte_reset(mp_obj_t self_in) {
9901022}
9911023STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lte_reset_obj , lte_reset );
9921024
1025+ STATIC mp_obj_t lte_factory_reset (mp_obj_t self_in ) {
1026+ lte_check_init ();
1027+ lte_disconnect (self_in );
1028+ if (!lte_push_at_command ("AT&F" , LTE_RX_TIMEOUT_MAX_MS * 2 )) {
1029+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_operation_failed ));
1030+ }
1031+ lte_obj .init = false;
1032+ lte_push_at_command ("AT^RESET" , LTE_RX_TIMEOUT_MAX_MS );
1033+ lteppp_set_state (E_LTE_IDLE );
1034+ mp_hal_delay_ms (LTE_RX_TIMEOUT_MIN_MS );
1035+ if (!lteppp_wait_at_rsp ("+SYSSTART" , LTE_RX_TIMEOUT_MAX_MS , true)) {
1036+ lteppp_wait_at_rsp ("+SYSSTART" , LTE_RX_TIMEOUT_MAX_MS , true);
1037+ }
1038+ lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
1039+ if (!lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS )) {
1040+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_operation_failed ));
1041+ }
1042+ machine_reset ();
1043+ return mp_const_none ;
1044+ }
1045+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lte_factory_reset_obj , lte_factory_reset );
1046+
9931047STATIC mp_obj_t lte_upgrade_mode (void ) {
9941048
9951049 if (lte_obj .init )
@@ -1094,8 +1148,10 @@ STATIC const mp_map_elem_t lte_locals_dict_table[] = {
10941148 { MP_OBJ_NEW_QSTR (MP_QSTR_iccid ), (mp_obj_t )& lte_iccid_obj },
10951149 { MP_OBJ_NEW_QSTR (MP_QSTR_send_at_cmd ), (mp_obj_t )& lte_send_at_cmd_obj },
10961150 { MP_OBJ_NEW_QSTR (MP_QSTR_reset ), (mp_obj_t )& lte_reset_obj },
1151+ { MP_OBJ_NEW_QSTR (MP_QSTR_factory_reset ), (mp_obj_t )& lte_factory_reset_obj },
10971152 { MP_OBJ_NEW_QSTR (MP_QSTR_modem_upgrade_mode ), (mp_obj_t )& lte_upgrade_mode_obj },
10981153 { MP_OBJ_NEW_QSTR (MP_QSTR_reconnect_uart ), (mp_obj_t )& lte_reconnect_uart_obj },
1154+ { MP_OBJ_NEW_QSTR (MP_QSTR_ue_coverage ), (mp_obj_t )& lte_ue_coverage_obj },
10991155
11001156 // class constants
11011157 { MP_OBJ_NEW_QSTR (MP_QSTR_IP ), MP_OBJ_NEW_QSTR (MP_QSTR_IP ) },
0 commit comments