66
66
#include "driver/gpio.h"
67
67
68
68
#include "pycom_config.h"
69
+ #include "modmachine.h"
69
70
70
71
/******************************************************************************
71
72
DEFINE TYPES
@@ -92,6 +93,8 @@ uart_config_t lte_uart_config1;
92
93
93
94
static bool lte_legacyattach_flag = true;
94
95
96
+ static bool lte_ue_is_out_of_coverage = false;
97
+
95
98
extern TaskHandle_t xLTEUpgradeTaskHndl ;
96
99
extern TaskHandle_t mpTaskHandle ;
97
100
extern TaskHandle_t svTaskHandle ;
@@ -221,8 +224,16 @@ static bool lte_check_attached(bool legacy) {
221
224
attached = true;
222
225
}
223
226
} 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" )) ) {
225
228
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
+ }
226
237
} else {
227
238
attached = false;
228
239
}
@@ -337,7 +348,6 @@ static void TASK_LTE_UPGRADE(void *pvParameters){
337
348
// Micro Python bindings; LTE class
338
349
339
350
static mp_obj_t lte_init_helper (lte_obj_t * self , const mp_arg_val_t * args ) {
340
- //printf("This is lte_init_helper()\n");
341
351
char at_cmd [LTE_AT_CMD_SIZE_MAX - 4 ];
342
352
mod_network_register_nic (& lte_obj );
343
353
connect_lte_uart ();
@@ -363,7 +373,7 @@ static mp_obj_t lte_init_helper(lte_obj_t *self, const mp_arg_val_t *args) {
363
373
364
374
lte_push_at_command ("AT!=\"setlpm airplane=1 enable=1\"" , LTE_RX_TIMEOUT_MIN_MS );
365
375
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" ) ) {
367
377
const char * carrier = "standard" ;
368
378
lte_obj .carrier = false;
369
379
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) {
384
394
if (!strstr (modlte_rsp .data , carrier )) {
385
395
sprintf (at_cmd , "AT+SQNCTM=\"%s\"" , carrier );
386
396
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
+ }
387
402
lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
388
403
lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
389
404
}
@@ -473,6 +488,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
473
488
lteppp_deinit ();
474
489
lte_obj .init = false;
475
490
vTaskDelay (100 );
491
+ disconnect_lte_uart ();
476
492
return mp_const_none ;
477
493
}
478
494
}
@@ -522,6 +538,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
522
538
}
523
539
lteppp_deinit ();
524
540
mod_network_deregister_nic (& lte_obj );
541
+ disconnect_lte_uart ();
525
542
return mp_const_none ;
526
543
527
544
error :
@@ -555,46 +572,47 @@ STATIC mp_obj_t lte_attach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
555
572
lte_check_attached (lte_legacyattach_flag );
556
573
557
574
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 ) {
574
580
lte_push_at_command ("AT!=\"RRC::addScanBand band=3\"" , LTE_RX_TIMEOUT_MIN_MS );
575
- } else if (band == 4 ) {
576
581
lte_push_at_command ("AT!=\"RRC::addScanBand band=4\"" , LTE_RX_TIMEOUT_MIN_MS );
577
- } else if (band == 5 ) {
578
582
lte_push_at_command ("AT!=\"RRC::addScanBand band=5\"" , LTE_RX_TIMEOUT_MIN_MS );
579
- } else if (band == 8 ) {
580
583
lte_push_at_command ("AT!=\"RRC::addScanBand band=8\"" , LTE_RX_TIMEOUT_MIN_MS );
581
- } else if (band == 12 ) {
582
584
lte_push_at_command ("AT!=\"RRC::addScanBand band=12\"" , LTE_RX_TIMEOUT_MIN_MS );
583
- } else if (band == 13 ) {
584
585
lte_push_at_command ("AT!=\"RRC::addScanBand band=13\"" , LTE_RX_TIMEOUT_MIN_MS );
585
- } else if (band == 20 ) {
586
586
lte_push_at_command ("AT!=\"RRC::addScanBand band=20\"" , LTE_RX_TIMEOUT_MIN_MS );
587
- } else if (band == 28 ) {
588
587
lte_push_at_command ("AT!=\"RRC::addScanBand band=28\"" , LTE_RX_TIMEOUT_MIN_MS );
589
588
} 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
+ }
591
609
}
592
610
}
593
611
if (args [3 ].u_obj != mp_const_none ) {
594
612
lte_obj .cid = args [3 ].u_int ;
595
613
}
596
614
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 ) ) {
598
616
599
617
const char * strapn ;
600
618
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
833
851
} else if (lteppp_get_state () == E_LTE_PPP ) {
834
852
nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "modem already connected" ));
835
853
} 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"));
837
855
}
838
856
return mp_const_none ;
839
857
}
@@ -973,6 +991,20 @@ STATIC mp_obj_t lte_iccid(mp_obj_t self_in) {
973
991
}
974
992
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lte_iccid_obj , lte_iccid );
975
993
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
+
976
1008
STATIC mp_obj_t lte_reset (mp_obj_t self_in ) {
977
1009
lte_check_init ();
978
1010
lte_disconnect (self_in );
@@ -990,6 +1022,28 @@ STATIC mp_obj_t lte_reset(mp_obj_t self_in) {
990
1022
}
991
1023
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lte_reset_obj , lte_reset );
992
1024
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
+
993
1047
STATIC mp_obj_t lte_upgrade_mode (void ) {
994
1048
995
1049
if (lte_obj .init )
@@ -1094,8 +1148,10 @@ STATIC const mp_map_elem_t lte_locals_dict_table[] = {
7119
1094
1148
{ MP_OBJ_NEW_QSTR (MP_QSTR_iccid ), (mp_obj_t )& lte_iccid_obj },
1095
1149
{ MP_OBJ_NEW_QSTR (MP_QSTR_send_at_cmd ), (mp_obj_t )& lte_send_at_cmd_obj },
1096
1150
{ 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 },
1097
1152
{ MP_OBJ_NEW_QSTR (MP_QSTR_modem_upgrade_mode ), (mp_obj_t )& lte_upgrade_mode_obj },
1098
1153
{ 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 },
1099
1155
1100
1156
// class constants
1101
1157
{ MP_OBJ_NEW_QSTR (MP_QSTR_IP ), MP_OBJ_NEW_QSTR (MP_QSTR_IP ) },
0 commit comments