5
5
#include " esp_netif.h"
6
6
#include " esp_netif_ppp.h"
7
7
#include < string>
8
+ #include " driver/uart.h"
9
+ #include " hal/uart_ll.h"
8
10
9
11
typedef struct { void * arg; } PdpContext;
10
12
#include " esp_modem_api.h"
@@ -150,6 +152,7 @@ PPPClass::PPPClass()
150
152
,_rx_buffer_size(4096 )
151
153
,_tx_buffer_size(512 )
152
154
,_mode(ESP_MODEM_MODE_COMMAND)
155
+ ,_uart_num(UART_NUM_1)
153
156
{
154
157
}
155
158
@@ -207,7 +210,7 @@ bool PPPClass::setPins(int8_t tx, int8_t rx, int8_t rts, int8_t cts, esp_modem_f
207
210
return true ;
208
211
}
209
212
210
- bool PPPClass::begin (ppp_modem_model_t model){
213
+ bool PPPClass::begin (ppp_modem_model_t model, uint8_t uart_num, int baud_rate ){
211
214
esp_err_t ret = ESP_OK;
212
215
bool pin_ok = false ;
213
216
int trys = 0 ;
@@ -232,8 +235,12 @@ bool PPPClass::begin(ppp_modem_model_t model){
232
235
return false ;
233
236
}
234
237
235
- Network. begin () ;
238
+ _uart_num = uart_num ;
236
239
_esp_modem = this ;
240
+
241
+ Network.begin ();
242
+
243
+ /* Listen for PPP status events */
237
244
if (_ppp_ev_instance == NULL && esp_event_handler_instance_register (NETIF_PPP_STATUS, ESP_EVENT_ANY_ID, &_ppp_event_cb, NULL , &_ppp_ev_instance)){
238
245
log_e (" event_handler_instance_register for NETIF_PPP_STATUS Failed!" );
239
246
return false ;
@@ -247,7 +254,7 @@ bool PPPClass::begin(ppp_modem_model_t model){
247
254
return false ;
248
255
}
249
256
250
- /* attach to receive events */
257
+ /* Attach to receive IP events */
251
258
initNetif (ESP_NETIF_ID_PPP);
252
259
253
260
/* Configure the DTE */
@@ -259,6 +266,8 @@ bool PPPClass::begin(ppp_modem_model_t model){
259
266
dte_config.uart_config .flow_control = _flow_ctrl;
260
267
dte_config.uart_config .rx_buffer_size = _rx_buffer_size;
261
268
dte_config.uart_config .tx_buffer_size = _tx_buffer_size;
269
+ dte_config.uart_config .port_num = _uart_num;
270
+ dte_config.uart_config .baud_rate = baud_rate;
262
271
263
272
/* Configure the DCE */
264
273
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG (_apn);
@@ -300,7 +309,14 @@ bool PPPClass::begin(ppp_modem_model_t model){
300
309
}
301
310
} else {
302
311
// try to communicate with the modem
303
-
312
+ if (esp_modem_sync (_dce) != ESP_OK){
313
+ log_v (" Modem does not respond to AT, maybe in DATA mode? ...exiting network mode" );
314
+ esp_modem_set_mode (_dce, ESP_MODEM_MODE_COMMAND);
315
+ if (esp_modem_sync (_dce) != ESP_OK){
316
+ log_e (" Modem failed to respond to AT!" );
317
+ goto err;
318
+ }
319
+ }
304
320
}
305
321
306
322
/* enable flow control */
@@ -692,6 +708,33 @@ bool PPPClass::storeProfile(){
692
708
return true ;
693
709
}
694
710
711
+ bool PPPClass::setBaudrate (int baudrate) {
712
+ if (_dce == NULL ){
713
+ return false ;
714
+ }
715
+
716
+ if (_mode == ESP_MODEM_MODE_DATA){
717
+ log_e (" Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND" );
718
+ return false ;
719
+ }
720
+
721
+ esp_err_t err = esp_modem_set_baud (_dce, baudrate);
722
+ if (err != ESP_OK) {
723
+ log_e (" esp_modem_set_baud failed with %d %s" , err, esp_err_to_name (err));
724
+ return false ;
725
+ }
726
+
727
+ uint32_t sclk_freq;
728
+ err = uart_get_sclk_freq (UART_SCLK_DEFAULT, &sclk_freq);
729
+ if (err != ESP_OK){
730
+ log_e (" uart_get_sclk_freq failed with %d %s" , err, esp_err_to_name (err));
731
+ return false ;
732
+ }
733
+ uart_ll_set_baudrate (UART_LL_GET_HW (_uart_num), (uint32_t )baudrate, sclk_freq);
734
+
735
+ return true ;
736
+ }
737
+
695
738
696
739
bool PPPClass::sms (const char * num, const char * message) {
697
740
if (_dce == NULL ){
0 commit comments