76
76
******************************************************************************/
77
77
#define LTE_NUM_UARTS 2
78
78
#define UART_TRANSFER_MAX_LEN 1
79
+
80
+ #define DEFAULT_PROTO_TYPE (const char*)"IP"
81
+ #define DEFAULT_APN (const char*)""
79
82
/******************************************************************************
80
83
DECLARE PRIVATE DATA
81
84
******************************************************************************/
@@ -100,7 +103,6 @@ extern TaskHandle_t xLTETaskHndl;
100
103
/******************************************************************************
101
104
DECLARE PUBLIC DATA
102
105
******************************************************************************/
103
-
104
106
/******************************************************************************
105
107
DECLARE PRIVATE FUNCTIONS
106
108
******************************************************************************/
@@ -147,13 +149,13 @@ static bool lte_push_at_command_delay_ext (char *cmd_str, uint32_t timeout, cons
147
149
.timeout = timeout
148
150
};
149
151
memcpy (cmd .data , cmd_str , strlen (cmd_str ));
150
- //printf("%s\n", cmd_str);
152
+ //printf("[CMD] %s\n", cmd_str);
151
153
lteppp_send_at_command_delay (& cmd , & modlte_rsp , delay );
152
154
if (strstr (modlte_rsp .data , expected_rsp ) != NULL ) {
153
- //printf("%s\n", modlte_rsp.data);
155
+ //printf("[OK] %s\n", modlte_rsp.data);
154
156
return true;
155
157
}
156
- //printf("%s\n", modlte_rsp.data);
158
+ //printf("[FAIL] %s\n", modlte_rsp.data);
157
159
return false;
158
160
}
159
161
@@ -265,12 +267,6 @@ static void lte_check_inppp(void) {
265
267
}
266
268
}
267
269
268
- static void lte_check_connected (void ) {
269
- if (lteppp_get_state () == E_LTE_PPP ) {
270
- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "LTE modem is already connected!" ));
271
- }
272
- }
273
-
274
270
static bool lte_check_sim_present (void ) {
275
271
lte_push_at_command ("AT+CPIN?" , LTE_RX_TIMEOUT_MAX_MS );
276
272
if (strstr (modlte_rsp .data , "ERROR" )) {
@@ -334,6 +330,7 @@ static mp_obj_t lte_init_helper(lte_obj_t *self, const mp_arg_val_t *args) {
334
330
//printf("All done since we were already initialised.\n");
335
331
return mp_const_none ;
336
332
}
333
+ lte_obj .cid = args [1 ].u_int ;
337
334
vTaskDelay (1500 );
338
335
lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
339
336
if (!lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS )) {
@@ -381,8 +378,9 @@ static mp_obj_t lte_init_helper(lte_obj_t *self, const mp_arg_val_t *args) {
381
378
}
382
379
383
380
static const mp_arg_t lte_init_args [] = {
384
- { MP_QSTR_id , MP_ARG_INT , {.u_int = 0 } },
385
- { MP_QSTR_carrier , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } }
381
+ { MP_QSTR_id , MP_ARG_INT , {.u_int = 0 } },
382
+ { MP_QSTR_carrier , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
383
+ { MP_QSTR_cid , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 1 } }
386
384
};
387
385
388
386
static mp_obj_t lte_make_new (const mp_obj_type_t * type , mp_uint_t n_args , mp_uint_t n_kw , const mp_obj_t * all_args ) {
@@ -429,8 +427,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(lte_init_obj, 1, lte_init);
429
427
STATIC mp_obj_t lte_deinit (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
430
428
431
429
STATIC const mp_arg_t allowed_args [] = {
432
- { MP_QSTR_dettach , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = true}},
433
- { MP_QSTR_reset , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false}},
430
+ { MP_QSTR_detach , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = true}},
431
+ { MP_QSTR_reset , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false}},
432
+ { MP_QSTR_dettach , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = true}}, /* backward compatibility for dettach method FIXME */
434
433
};
435
434
436
435
// parse args
@@ -445,7 +444,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
445
444
if (lteppp_get_state () == E_LTE_PPP ) {
446
445
lte_suspend (self );
447
446
}
448
- if (!args [0 ].u_bool ) {
447
+ if (!args [0 ].u_bool || ! args [ 2 ]. u_bool ) { /* backward compatibility for dettach method FIXME */
449
448
vTaskDelay (100 );
450
449
lte_push_at_command ("AT!=\"setlpm airplane=1 enable=1\"" , LTE_RX_TIMEOUT_MAX_MS );
451
450
lteppp_deinit ();
@@ -516,6 +515,9 @@ STATIC mp_obj_t lte_attach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
516
515
{ MP_QSTR_band , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
517
516
{ MP_QSTR_apn , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
518
517
{ MP_QSTR_log , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_false } },
518
+ { MP_QSTR_cid , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_obj = mp_const_none } },
519
+ { MP_QSTR_type , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
520
+
519
521
};
520
522
521
523
// parse args
@@ -560,16 +562,41 @@ STATIC mp_obj_t lte_attach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
560
562
nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "band %d not supported" , band ));
561
563
}
562
564
}
563
- if (args [1 ].u_obj != mp_const_none ) {
564
- const char * apn = mp_obj_str_get_str (args [1 ].u_obj );
565
+ if (args [3 ].u_obj != mp_const_none ) {
566
+ lte_obj .cid = args [3 ].u_int ;
567
+ }
568
+
569
+ if (args [1 ].u_obj != mp_const_none || args [4 ].u_obj != mp_const_none ) {
570
+
571
+ const char * strapn ;
572
+ const char * strtype ;
573
+
574
+ if (args [1 ].u_obj == mp_const_none ) {
575
+ strapn = DEFAULT_APN ;
576
+ }
577
+ else
578
+ {
579
+ strapn = mp_obj_str_get_str (args [1 ].u_obj );
580
+ }
581
+
582
+ if (args [4 ].u_obj == mp_const_none ) {
583
+ strtype = DEFAULT_PROTO_TYPE ;
584
+ }
585
+ else
586
+ {
587
+ strtype = mp_obj_str_get_str (args [4 ].u_obj );
588
+ }
589
+
565
590
char at_cmd [LTE_AT_CMD_SIZE_MAX - 4 ];
566
- sprintf (at_cmd , "AT+CGDCONT=1,\"IP\",\"%s\"" , apn );
567
- lte_push_at_command (at_cmd , LTE_RX_TIMEOUT_MIN_MS );
591
+ sprintf (at_cmd , "AT+CGDCONT=%d,\"%s\",\"%s\"" , lte_obj .cid , strtype , strapn );
592
+ if (!lte_push_at_command (at_cmd , LTE_RX_TIMEOUT_MAX_MS )) {
593
+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_operation_failed ));
594
+ }
568
595
}
569
596
if (args [2 ].u_obj == mp_const_false ) {
570
- lte_push_at_command ("AT!=\"disablelog 1\"" , LTE_RX_TIMEOUT_MIN_MS );
597
+ lte_push_at_command ("AT!=\"disablelog 1\"" , LTE_RX_TIMEOUT_MAX_MS );
571
598
} else {
572
- lte_push_at_command ("AT!=\"disablelog 0\"" , LTE_RX_TIMEOUT_MIN_MS );
599
+ lte_push_at_command ("AT!=\"disablelog 0\"" , LTE_RX_TIMEOUT_MAX_MS );
573
600
}
574
601
lteppp_set_state (E_LTE_ATTACHING );
575
602
if (!lte_push_at_command ("AT+CFUN=1" , LTE_RX_TIMEOUT_MAX_MS )) {
@@ -580,7 +607,7 @@ STATIC mp_obj_t lte_attach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
580
607
}
581
608
STATIC MP_DEFINE_CONST_FUN_OBJ_KW (lte_attach_obj , 1 , lte_attach );
582
609
583
- mp_obj_t lte_dettach (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
610
+ mp_obj_t lte_detach (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
584
611
lte_check_init ();
585
612
586
613
STATIC const mp_arg_t allowed_args [] = {
@@ -627,8 +654,6 @@ mp_obj_t lte_dettach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
627
654
lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS );
628
655
if (!lte_push_at_command ("AT" , LTE_RX_TIMEOUT_MAX_MS )) {
629
656
nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_operation_failed ));
630
- } else {
631
- lte_push_at_command ("AT!=\"setlpm airplane=1 enable=1\"" , LTE_RX_TIMEOUT_MAX_MS );
632
657
}
633
658
}
634
659
} else {
@@ -644,7 +669,7 @@ mp_obj_t lte_dettach(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
644
669
nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_operation_failed ));
645
670
return mp_const_none ;
646
671
}
647
- STATIC MP_DEFINE_CONST_FUN_OBJ_KW (lte_dettach_obj , 1 , lte_dettach );
672
+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (lte_detach_obj , 1 , lte_detach );
648
673
649
674
STATIC mp_obj_t lte_suspend (mp_obj_t self_in ) {
650
675
@@ -684,9 +709,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(lte_isattached_obj, lte_isattached);
684
709
685
710
STATIC mp_obj_t lte_connect (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
686
711
lte_check_init ();
687
- lte_check_connected ();
712
+ if (lteppp_get_state () == E_LTE_PPP && lteppp_ipv4 () > 0 ) {
713
+ return mp_const_none ;
714
+ }
688
715
STATIC const mp_arg_t allowed_args [] = {
689
- { MP_QSTR_cid , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 1 } },
716
+ { MP_QSTR_cid , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_obj = mp_const_none } },
690
717
{ MP_QSTR_legacy , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_obj = mp_const_none } },
691
718
692
719
};
@@ -715,7 +742,9 @@ STATIC mp_obj_t lte_connect(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
715
742
if (lteppp_get_state () == E_LTE_ATTACHED || (args [1 ].u_bool && lteppp_get_state () == E_LTE_SUSPENDED )) {
716
743
if (args [1 ].u_bool || !lte_push_at_command_ext ("ATO" , LTE_RX_TIMEOUT_MAX_MS , LTE_CONNECT_RSP )) {
717
744
char at_cmd [LTE_AT_CMD_SIZE_MAX - 4 ];
718
- lte_obj .cid = args [0 ].u_int ;
745
+ if (args [0 ].u_obj != mp_const_none ) {
746
+ lte_obj .cid = args [0 ].u_int ;
747
+ }
719
748
sprintf (at_cmd , "AT+CGDATA=\"PPP\",%d" , lte_obj .cid );
720
749
// set the PPP state in advance, to avoid CEREG? to be sent right after PPP is entered
721
750
if (!lte_push_at_command_ext (at_cmd , LTE_RX_TIMEOUT_MAX_MS , LTE_CONNECT_RSP )) {
@@ -739,7 +768,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(lte_connect_obj, 1, lte_connect);
739
768
STATIC mp_obj_t lte_resume (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
740
769
lte_check_init ();
741
770
STATIC const mp_arg_t allowed_args [] = {
742
- { MP_QSTR_cid , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 1 } },
771
+ { MP_QSTR_cid , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_obj = mp_const_none } },
743
772
};
744
773
745
774
// parse args<
EE05
/span>
@@ -756,7 +785,10 @@ STATIC mp_obj_t lte_resume(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
756
785
nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , mpexception_os_request_not_possible ));
757
786
}
758
787
// char at_cmd[LTE_AT_CMD_SIZE_MAX - 4];
759
- lte_obj .cid = args [0 ].u_int ;
788
+ if (args [0 ].u_obj != mp_const_none ) {
789
+ lte_obj .cid = args [0 ].u_int ;
790
+ }
791
+
760
792
if (lte_push_at_command_ext ("ATO" , LTE_RX_TIMEOUT_MAX_MS , LTE_CONNECT_RSP )) {
761
793
lteppp_connect ();
762
794
lteppp_set_state (E_LTE_PPP );
@@ -1015,7 +1047,8 @@ STATIC const mp_map_elem_t lte_locals_dict_table[] = {
1015
1047
{ MP_OBJ_NEW_QSTR (MP_QSTR_init ), (mp_obj_t )& lte_init_obj },
1016
1048
{ MP_OBJ_NEW_QSTR (MP_QSTR_deinit ), (mp_obj_t )& lte_deinit_obj },
1017
1049
{ MP_OBJ_NEW_QSTR (MP_QSTR_attach ), (mp_obj_t )& lte_attach_obj },
1018
- { MP_OBJ_NEW_QSTR (MP_QSTR_dettach ), (mp_obj_t )& lte_dettach_obj },
1050
+ { MP_OBJ_NEW_QSTR (MP_QSTR_dettach ), (mp_obj_t )& lte_detach_obj },
1051
+ { MP_OBJ_NEW_QSTR (MP_QSTR_detach ), (mp_obj_t )& lte_detach_obj }, /* backward compatibility for dettach method FIXME */
1019
1052
{ MP_OBJ_NEW_QSTR (MP_QSTR_isattached ), (mp_obj_t )& lte_isattached_obj },
1020
1053
{ MP_OBJ_NEW_QSTR (MP_QSTR_connect ), (mp_obj_t )& lte_connect_obj },
1021
1054
{ MP_OBJ_NEW_QSTR (MP_QSTR_disconnect ), (mp_obj_t )& lte_disconnect_obj },
@@ -1031,6 +1064,8 @@ STATIC const mp_map_elem_t lte_locals_dict_table[] = {
1031
1064
{ MP_OBJ_NEW_QSTR (MP_QSTR_reconnect_uart ), (mp_obj_t )& lte_reconnect_uart_obj },
1032
1065
1033
1066
// class constants
1067
+ { MP_OBJ_NEW_QSTR (MP_QSTR_IP ), MP_OBJ_NEW_QSTR (MP_QSTR_IP ) },
1068
+ { MP_OBJ_NEW_QSTR (MP_QSTR_IPV4V6 ), MP_OBJ_NEW_QSTR (MP_QSTR_IPV4V6 ) },
1034
1069
};
1035
1070
STATIC MP_DEFINE_CONST_DICT (lte_locals_dict , lte_locals_dict_table );
1036
1071
0 commit comments