From 4c42fb00d5222511a68abfdab0e35f4478119d88 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 8 Apr 2024 21:34:34 +0300 Subject: [PATCH 01/22] Add esp_modem component --- idf_component.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/idf_component.yml b/idf_component.yml index 634d364ba3a..9e7b566ee3b 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -45,6 +45,7 @@ dependencies: idf: ">=5.1" # mdns 1.2.1 is necessary to build H2 with no WiFi mdns: "^1.2.3" + espressif/esp_modem: "^1.1.0" chmorgan/esp-libhelix-mp3: version: "1.0.3" require: public From 20a7102d8fb41206dc0f6935f44ddfe438efab5c Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 8 Apr 2024 21:35:48 +0300 Subject: [PATCH 02/22] Add initial PPP Modem support --- cores/esp32/esp32-hal-periman.c | 9 + cores/esp32/esp32-hal-periman.h | 6 + libraries/Network/src/NetworkEvents.cpp | 14 +- libraries/Network/src/NetworkEvents.h | 15 +- libraries/Network/src/NetworkInterface.cpp | 18 +- libraries/PPP/library.properties | 9 + libraries/PPP/src/PPP.cpp | 397 +++++++++++++++++++++ libraries/PPP/src/PPP.h | 69 ++++ 8 files changed, 514 insertions(+), 23 deletions(-) create mode 100644 libraries/PPP/library.properties create mode 100644 libraries/PPP/src/PPP.cpp create mode 100644 libraries/PPP/src/PPP.h diff --git a/cores/esp32/esp32-hal-periman.c b/cores/esp32/esp32-hal-periman.c index dd3a2f32a21..8b5fa431090 100644 --- a/cores/esp32/esp32-hal-periman.c +++ b/cores/esp32/esp32-hal-periman.c @@ -54,14 +54,17 @@ const char* perimanGetTypeName(peripheral_bus_type_t type) { case ESP32_BUS_TYPE_I2S_STD_WS: return "I2S_STD_WS"; case ESP32_BUS_TYPE_I2S_STD_DOUT: return "I2S_STD_DOUT"; case ESP32_BUS_TYPE_I2S_STD_DIN: return "I2S_STD_DIN"; + case ESP32_BUS_TYPE_I2S_TDM_MCLK: return "I2S_TDM_MCLK"; case ESP32_BUS_TYPE_I2S_TDM_BCLK: return "I2S_TDM_BCLK"; case ESP32_BUS_TYPE_I2S_TDM_WS: return "I2S_TDM_WS"; case ESP32_BUS_TYPE_I2S_TDM_DOUT: return "I2S_TDM_DOUT"; case ESP32_BUS_TYPE_I2S_TDM_DIN: return "I2S_TDM_DIN"; + case ESP32_BUS_TYPE_I2S_PDM_TX_CLK: return "I2S_PDM_TX_CLK"; case ESP32_BUS_TYPE_I2S_PDM_TX_DOUT0: return "I2S_PDM_TX_DOUT0"; case ESP32_BUS_TYPE_I2S_PDM_TX_DOUT1: return "I2S_PDM_TX_DOUT1"; + case ESP32_BUS_TYPE_I2S_PDM_RX_CLK: return "I2S_PDM_RX_CLK"; case ESP32_BUS_TYPE_I2S_PDM_RX_DIN0: return "I2S_PDM_RX_DIN0"; case ESP32_BUS_TYPE_I2S_PDM_RX_DIN1: return "I2S_PDM_RX_DIN1"; @@ -104,6 +107,12 @@ const char* perimanGetTypeName(peripheral_bus_type_t type) { case ESP32_BUS_TYPE_ETHERNET_MCD: return "ETHERNET_MCD"; case ESP32_BUS_TYPE_ETHERNET_MDIO: return "ETHERNET_MDIO"; case ESP32_BUS_TYPE_ETHERNET_PWR: return "ETHERNET_PWR"; +#endif +#if CONFIG_LWIP_PPP_SUPPORT + case ESP32_BUS_TYPE_PPP_TX: return "PPP_MODEM_TX"; + case ESP32_BUS_TYPE_PPP_RX: return "PPP_MODEM_RX"; + case ESP32_BUS_TYPE_PPP_RTS: return "PPP_MODEM_RTS"; + case ESP32_BUS_TYPE_PPP_CTS: return "PPP_MODEM_CTS"; #endif default: return "UNKNOWN"; } diff --git a/cores/esp32/esp32-hal-periman.h b/cores/esp32/esp32-hal-periman.h index aa3de699502..1989ecdb35a 100644 --- a/cores/esp32/esp32-hal-periman.h +++ b/cores/esp32/esp32-hal-periman.h @@ -103,6 +103,12 @@ typedef enum { ESP32_BUS_TYPE_ETHERNET_MCD, // IO is used as ETHERNET MCD pin ESP32_BUS_TYPE_ETHERNET_MDIO, // IO is used as ETHERNET MDIO pin ESP32_BUS_TYPE_ETHERNET_PWR, // IO is used as ETHERNET PWR pin +#endif +#if CONFIG_LWIP_PPP_SUPPORT + ESP32_BUS_TYPE_PPP_TX, // IO is used as PPP Modem TX pin + ESP32_BUS_TYPE_PPP_RX, // IO is used as PPP Modem RX pin + ESP32_BUS_TYPE_PPP_RTS, // IO is used as PPP Modem RTS pin + ESP32_BUS_TYPE_PPP_CTS, // IO is used as PPP Modem CTS pin #endif ESP32_BUS_TYPE_MAX } peripheral_bus_type_t; diff --git a/libraries/Network/src/NetworkEvents.cpp b/libraries/Network/src/NetworkEvents.cpp index 5f24e23a894..5db470f4fce 100644 --- a/libraries/Network/src/NetworkEvents.cpp +++ b/libraries/Network/src/NetworkEvents.cpp @@ -334,13 +334,13 @@ const char * NetworkEvents::eventName(arduino_event_id_t id) { case ARDUINO_EVENT_ETH_LOST_IP: return "ETH_LOST_IP"; case ARDUINO_EVENT_ETH_GOT_IP6: return "ETH_GOT_IP6"; - // case ARDUINO_EVENT_PPP_START: return "PPP_START"; - // case ARDUINO_EVENT_PPP_STOP: return "PPP_STOP"; - // case ARDUINO_EVENT_PPP_CONNECTED: return "PPP_CONNECTED"; - // case ARDUINO_EVENT_PPP_DISCONNECTED: return "PPP_DISCONNECTED"; - // case ARDUINO_EVENT_PPP_GOT_IP: return "PPP_GOT_IP"; - // case ARDUINO_EVENT_PPP_LOST_IP: return "PPP_LOST_IP"; - // case ARDUINO_EVENT_PPP_GOT_IP6: return "PPP_GOT_IP6"; + case ARDUINO_EVENT_PPP_START: return "PPP_START"; + case ARDUINO_EVENT_PPP_STOP: return "PPP_STOP"; + case ARDUINO_EVENT_PPP_CONNECTED: return "PPP_CONNECTED"; + case ARDUINO_EVENT_PPP_DISCONNECTED: return "PPP_DISCONNECTED"; + case ARDUINO_EVENT_PPP_GOT_IP: return "PPP_GOT_IP"; + case ARDUINO_EVENT_PPP_LOST_IP: return "PPP_LOST_IP"; + case ARDUINO_EVENT_PPP_GOT_IP6: return "PPP_GOT_IP6"; #if SOC_WIFI_SUPPORTED case ARDUINO_EVENT_WIFI_OFF: return "WIFI_OFF"; case ARDUINO_EVENT_WIFI_READY: return "WIFI_READY"; diff --git a/libraries/Network/src/NetworkEvents.h b/libraries/Network/src/NetworkEvents.h index eaee117d0fc..5ee4972fdd9 100644 --- a/libraries/Network/src/NetworkEvents.h +++ b/libraries/Network/src/NetworkEvents.h @@ -78,13 +78,13 @@ typedef enum { ARDUINO_EVENT_PROV_CRED_FAIL, ARDUINO_EVENT_PROV_CRED_SUCCESS, #endif - // ARDUINO_EVENT_PPP_START, - // ARDUINO_EVENT_PPP_STOP, - // ARDUINO_EVENT_PPP_CONNECTED, - // ARDUINO_EVENT_PPP_DISCONNECTED, - // ARDUINO_EVENT_PPP_GOT_IP, - // ARDUINO_EVENT_PPP_LOST_IP, - // ARDUINO_EVENT_PPP_GOT_IP6, + ARDUINO_EVENT_PPP_START, + ARDUINO_EVENT_PPP_STOP, + ARDUINO_EVENT_PPP_CONNECTED, + ARDUINO_EVENT_PPP_DISCONNECTED, + ARDUINO_EVENT_PPP_GOT_IP, + ARDUINO_EVENT_PPP_LOST_IP, + ARDUINO_EVENT_PPP_GOT_IP6, ARDUINO_EVENT_MAX } arduino_event_id_t; @@ -146,6 +146,7 @@ class NetworkEvents { friend class ESP_NetworkInterface; friend class ETHClass; + friend class PPPClass; #if SOC_WIFI_SUPPORTED friend class STAClass; friend class APClass; diff --git a/libraries/Network/src/NetworkInterface.cpp b/libraries/Network/src/NetworkInterface.cpp index 01dc53093a9..8800bc69f96 100644 --- a/libraries/Network/src/NetworkInterface.cpp +++ b/libraries/Network/src/NetworkInterface.cpp @@ -71,9 +71,9 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void* event_data){ arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_GOT_IP; } else #endif - // if(_interface_id == ESP_NETIF_ID_PPP){ - // arduino_event.event_id = ARDUINO_EVENT_PPP_GOT_IP; - // } else + if(_interface_id == ESP_NETIF_ID_PPP){ + arduino_event.event_id = ARDUINO_EVENT_PPP_GOT_IP; + } else if(_interface_id >= ESP_NETIF_ID_ETH && _interface_id < ESP_NETIF_ID_MAX){ arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP; } @@ -87,9 +87,9 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void* event_data){ arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_LOST_IP; } else #endif - // if(_interface_id == ESP_NETIF_ID_PPP){ - // arduino_event.event_id = ARDUINO_EVENT_PPP_LOST_IP; - // } else + if(_interface_id == ESP_NETIF_ID_PPP){ + arduino_event.event_id = ARDUINO_EVENT_PPP_LOST_IP; + } else if(_interface_id >= ESP_NETIF_ID_ETH && _interface_id < ESP_NETIF_ID_MAX){ arduino_event.event_id = ARDUINO_EVENT_ETH_LOST_IP; } @@ -115,9 +115,9 @@ void NetworkInterface::_onIpEvent(int32_t event_id, void* event_data){ arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_GOT_IP6; } else #endif - // if(_interface_id == ESP_NETIF_ID_PPP){ - // arduino_event.event_id = ARDUINO_EVENT_PPP_GOT_IP6; - // } else + if(_interface_id == ESP_NETIF_ID_PPP){ + arduino_event.event_id = ARDUINO_EVENT_PPP_GOT_IP6; + } else if(_interface_id >= ESP_NETIF_ID_ETH && _interface_id < ESP_NETIF_ID_MAX){ arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP6; } diff --git a/libraries/PPP/library.properties b/libraries/PPP/library.properties new file mode 100644 index 00000000000..abc4fb21a71 --- /dev/null +++ b/libraries/PPP/library.properties @@ -0,0 +1,9 @@ +name=PPP +version=1.0.0 +author=Hristo Gochkov +maintainer=Hristo Gochkov +sentence=Enables network connection using GSM Modem. +paragraph=With this library you can instantiate Servers, Clients and send/receive UDP packets through GSM Modem. +category=Communication +url= +architectures=esp32 diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp new file mode 100644 index 00000000000..5b11915ce2e --- /dev/null +++ b/libraries/PPP/src/PPP.cpp @@ -0,0 +1,397 @@ +#define ARDUINO_CORE_BUILD +#include "PPP.h" +#if CONFIG_LWIP_PPP_SUPPORT +#include "esp32-hal-periman.h" +#include "esp_netif.h" +#include "esp_netif_ppp.h" +#include + +typedef struct { void * arg; } PdpContext; +#include "esp_modem_api.h" + +static PPPClass * _esp_modem = NULL; +static esp_event_handler_instance_t _ppp_ev_instance = NULL; + +static void _ppp_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { + + if (event_base == NETIF_PPP_STATUS){ + if(_esp_modem != NULL){ + _esp_modem->_onPppEvent(event_id, event_data); + } + } +} + +// This callback needs to be aware of which interface it should match against +static void onPppConnected(arduino_event_id_t event, arduino_event_info_t info) +{ + if(event == ARDUINO_EVENT_PPP_CONNECTED){ + if (_esp_modem->getStatusBits() & ESP_NETIF_WANT_IP6_BIT){ + esp_err_t err = esp_netif_create_ip6_linklocal(_esp_modem->netif()); + if(err != ESP_OK){ + log_e("Failed to enable IPv6 Link Local on PPP: [%d] %s", err, esp_err_to_name(err)); + } else { + log_v("Enabled IPv6 Link Local on %s", _esp_modem->desc()); + } + } + } +} + +esp_modem_dce_t * PPPClass::handle() const { + return _dce; +} + +void PPPClass::_onPppEvent(int32_t event_id, void* event_data){ + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_MAX; + + log_v("PPP EVENT %ld", event_id); + + // if (event_id == ETHERNET_EVENT_CONNECTED) { + // log_v("%s Connected", desc()); + // arduino_event.event_id = ARDUINO_EVENT_ETH_CONNECTED; + // arduino_event.event_info.eth_connected = handle(); + // setStatusBits(ESP_NETIF_CONNECTED_BIT); + // } else if (event_id == ETHERNET_EVENT_DISCONNECTED) { + // log_v("%s Disconnected", desc()); + // arduino_event.event_id = ARDUINO_EVENT_ETH_DISCONNECTED; + // clearStatusBits(ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT); + // } else if (event_id == ETHERNET_EVENT_START) { + // log_v("%s Started", desc()); + // arduino_event.event_id = ARDUINO_EVENT_ETH_START; + // setStatusBits(ESP_NETIF_STARTED_BIT); + // } else if (event_id == ETHERNET_EVENT_STOP) { + // log_v("%s Stopped", desc()); + // arduino_event.event_id = ARDUINO_EVENT_ETH_STOP; + // clearStatusBits(ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT | ESP_NETIF_HAS_STATIC_IP_BIT); + // } + + if(arduino_event.event_id < ARDUINO_EVENT_MAX){ + Network.postEvent(&arduino_event); + } +} + +PPPClass::PPPClass() + :_dce(NULL) + ,_pin_tx(-1) + ,_pin_rx(-1) + ,_pin_rts(-1) + ,_pin_cts(-1) + ,_pin(NULL) + ,_apn(NULL) + ,_rx_buffer_size(1024) + ,_tx_buffer_size(512) + ,_mode(ESP_MODEM_MODE_COMMAND) +{ +} + +PPPClass::~PPPClass() +{} + +bool PPPClass::pppDetachBus(void * bus_pointer){ + PPPClass *bus = (PPPClass *) bus_pointer; + bus->end(); + return true; +} + +bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, int8_t cts, esp_modem_flow_ctrl_t flow_ctrl){ + esp_err_t ret = ESP_OK; + bool pin_ok = false; + + if(_esp_netif != NULL || _dce != NULL){ + log_w("PPP Already Started"); + return true; + } + + if(_apn == NULL){ + log_e("APN is not set. Call 'PPP.setApn()' first"); + return false; + } + + perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_TX, PPPClass::pppDetachBus); + perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_RX, PPPClass::pppDetachBus); + perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_RTS, PPPClass::pppDetachBus); + perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_CTS, PPPClass::pppDetachBus); + + if(_pin_tx != -1){ + if(!perimanClearPinBus(_pin_tx)){ return false; } + } + if(_pin_rx != -1){ + if(!perimanClearPinBus(_pin_rx)){ return false; } + } + if(_pin_rts != -1){ + if(!perimanClearPinBus(_pin_rts)){ return false; } + } + if(_pin_cts != -1){ + if(!perimanClearPinBus(_pin_cts)){ return false; } + } + + _flow_ctrl = flow_ctrl; + _pin_tx = digitalPinToGPIONumber(tx); + _pin_rx = digitalPinToGPIONumber(rx); + _pin_rts = digitalPinToGPIONumber(rts); + _pin_cts = digitalPinToGPIONumber(cts); + + Network.begin(); + _esp_modem = this; + if(_ppp_ev_instance == NULL && esp_event_handler_instance_register(NETIF_PPP_STATUS, ESP_EVENT_ANY_ID, &_ppp_event_cb, NULL, &_ppp_ev_instance)){ + log_e("event_handler_instance_register for NETIF_PPP_STATUS Failed!"); + return false; + } + + /* Configure the PPP netif */ + esp_netif_config_t cfg = ESP_NETIF_DEFAULT_PPP(); + _esp_netif = esp_netif_new(&cfg); + if(_esp_netif == NULL){ + log_e("esp_netif_new failed"); + return false; + } + + /* attach to receive events */ + initNetif(ESP_NETIF_ID_PPP); + + /* Configure the DTE */ + esp_modem_dte_config_t dte_config = ESP_MODEM_DTE_DEFAULT_CONFIG(); + /* setup UART specific configuration based on kconfig options */ + dte_config.uart_config.tx_io_num = _pin_tx; + dte_config.uart_config.rx_io_num = _pin_rx; + dte_config.uart_config.rts_io_num = _pin_rts; + dte_config.uart_config.cts_io_num = _pin_cts; + dte_config.uart_config.flow_control = _flow_ctrl; + dte_config.uart_config.rx_buffer_size = _rx_buffer_size; + dte_config.uart_config.tx_buffer_size = _tx_buffer_size; + dte_config.uart_config.event_queue_size = 20; + dte_config.task_stack_size = 2048; + dte_config.task_priority = 5; + dte_config.dte_buffer_size = _rx_buffer_size / 2; + + /* Configure the DCE */ + esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG(_apn); + _dce = esp_modem_new_dev((esp_modem_dce_device_t)model, &dte_config, &dce_config, _esp_netif); + if(_dce == NULL){ + log_e("esp_modem_new_dev failed"); + goto err; + } + + if (dte_config.uart_config.flow_control == ESP_MODEM_FLOW_CONTROL_HW) { + ret = esp_modem_set_flow_control(_dce, 2, 2); //2/2 means HW Flow Control. + if (ret != ESP_OK) { + log_e("Failed to set the set_flow_control mode: [%d] %s", ret, esp_err_to_name(ret)); + goto err; + } + } + + // check if PIN needed + if (esp_modem_read_pin(_dce, pin_ok) == ESP_OK && pin_ok == false) { + if (_pin == NULL || esp_modem_set_pin(_dce, _pin) != ESP_OK) { + log_e("PIN verification failed!"); + goto err; + } + // delay(1000); + } + + if(_pin_tx != -1){ + if(!perimanSetPinBus(_pin_tx, ESP32_BUS_TYPE_PPP_TX, (void *)(this), -1, -1)){ goto err; } + } + if(_pin_rx != -1){ + if(!perimanSetPinBus(_pin_rx, ESP32_BUS_TYPE_PPP_RX, (void *)(this), -1, -1)){ goto err; } + } + if(_pin_rts != -1){ + if(!perimanSetPinBus(_pin_rts, ESP32_BUS_TYPE_PPP_RTS, (void *)(this), -1, -1)){ goto err; } + } + if(_pin_cts != -1){ + if(!perimanSetPinBus(_pin_cts, ESP32_BUS_TYPE_PPP_CTS, (void *)(this), -1, -1)){ goto err; } + } + + Network.onSysEvent(onPppConnected, ARDUINO_EVENT_PPP_CONNECTED); + + return true; + +err: + log_e("Failed to set all pins bus to ETHERNET"); + PPPClass::pppDetachBus((void *)(this)); + return false; +} + +void PPPClass::end(void) +{ + destroyNetif(); + + if(_ppp_ev_instance != NULL){ + if(esp_event_handler_unregister(NETIF_PPP_STATUS, ESP_EVENT_ANY_ID, &_ppp_event_cb) == ESP_OK){ + _ppp_ev_instance = NULL; + } + } + _esp_modem = NULL; + + Network.removeEvent(onPppConnected, ARDUINO_EVENT_PPP_CONNECTED); + + if(_dce != NULL){ + esp_modem_destroy(_dce); + _dce = NULL; + } + + if(_pin_tx != -1){ + perimanClearPinBus(_pin_tx); + _pin_tx = -1; + } + if(_pin_rx != -1){ + perimanClearPinBus(_pin_rx); + _pin_rx = -1; + } + if(_pin_rts != -1){ + perimanClearPinBus(_pin_rts); + _pin_rts = -1; + } + if(_pin_cts != -1){ + perimanClearPinBus(_pin_cts); + _pin_cts = -1; + } + + _mode = ESP_MODEM_MODE_COMMAND; +} + +bool PPPClass::mode(esp_modem_dce_mode_t m){ + if(_dce == NULL){ + return 0; + } + + if(_mode == m){ + return true; + } + esp_err_t err = esp_modem_set_mode(_dce, m); + if (err != ESP_OK) { + log_e("esp_modem_set_mode failed with %d %s", err, esp_err_to_name(err)); + return false; + } + _mode = m; + return true; +} + +bool PPPClass::setApn(const char * apn){ + if(_apn != NULL){ + free((void *)_apn); + _apn = NULL; + } + if(apn != NULL){ + _apn = strdup(apn); + if(_apn == NULL){ + log_e("Failed to strdup APN"); + return false; + } + } + return true; +} + +bool PPPClass::setPin(const char * pin){ + if(_pin != NULL){ + free((void *)_pin); + _pin = NULL; + } + if(pin != NULL){ + for(int i=0; i 0x39){ + log_e("Bad character '%c' in PIN. Should be only digits", pin[i]); + return false; + } + } + _pin = strdup(pin); + if(_pin == NULL){ + log_e("Failed to strdup PIN"); + return false; + } + } + return true; +} + +int PPPClass::RSSI() const +{ + if(_dce == NULL){ + return 0; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return 0; + } + + int rssi, ber; + esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber); + if (err != ESP_OK) { + log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); + return 0; + } + return rssi; +} + +int PPPClass::BER() const +{ + if(_dce == NULL){ + return 0; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return 0; + } + + int rssi, ber; + esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber); + if (err != ESP_OK) { + log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); + return 0; + } + return ber; +} + +String PPPClass::IMSI() const +{ + if(_dce == NULL){ + return String(); + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return String(); + } + + char imsi[32]; + esp_err_t err = esp_modem_get_imsi(_dce, (std::string&)imsi); + if (err != ESP_OK) { + log_e("esp_modem_get_imsi failed with %d %s", err, esp_err_to_name(err)); + return String(); + } + + return String(imsi); +} + +String PPPClass::getOperator() const +{ + if(_dce == NULL){ + return String(); + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return String(); + } + + char oper[32]; + int act = 0; + esp_err_t err = esp_modem_get_operator_name(_dce, (std::string&)oper, act); + if (err != ESP_OK) { + log_e("esp_modem_get_operator_name failed with %d %s", err, esp_err_to_name(err)); + return String(); + } + + return String(oper); +} + +size_t PPPClass::printDriverInfo(Print & out) const { + size_t bytes = 0; + //bytes += out.print(","); + return bytes; +} + +PPPClass PPP; + +#endif /* CONFIG_LWIP_PPP_SUPPORT */ diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h new file mode 100644 index 00000000000..1a39305264a --- /dev/null +++ b/libraries/PPP/src/PPP.h @@ -0,0 +1,69 @@ +#pragma once + +#include "sdkconfig.h" +#if CONFIG_LWIP_PPP_SUPPORT +#include "Network.h" +#include "esp_modem_c_api_types.h" + +typedef enum { + PPP_MODEM_GENERIC = ESP_MODEM_DCE_GENETIC, + PPP_MODEM_SIM7600 = ESP_MODEM_DCE_SIM7600, + PPP_MODEM_SIM7070 = ESP_MODEM_DCE_SIM7070, + PPP_MODEM_SIM7000 = ESP_MODEM_DCE_SIM7000, + PPP_MODEM_BG96 = ESP_MODEM_DCE_BG96, + PPP_MODEM_SIM800 = ESP_MODEM_DCE_SIM800, +#if CONFIG_ESP_MODEM_ADD_CUSTOM_MODULE + PPP_MODEM_CUSTOM = ESP_MODEM_DCE_CUSTOM, +#endif + PPP_MODEM_MAX +} ppp_modem_model_t; + +class PPPClass: public NetworkInterface { + public: + PPPClass(); + ~PPPClass(); + + bool setApn(const char * apn); + bool setPin(const char * pin); + + bool begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts=-1, int8_t cts=-1, esp_modem_flow_ctrl_t flow_ctrl=ESP_MODEM_FLOW_CONTROL_NONE); + void end(); + + esp_modem_dce_mode_t mode() const { + return _mode; + } + bool mode(esp_modem_dce_mode_t m); + + // Modem DCE APIs + int RSSI() const; + int BER() const; + String IMSI() const; + String getOperator() const; + + esp_modem_dce_t * handle() const; + + protected: + size_t printDriverInfo(Print & out) const; + + public: + void _onPppEvent(int32_t event_id, void* event_data); + + private: + esp_modem_dce_t *_dce; + int8_t _pin_tx; + int8_t _pin_rx; + int8_t _pin_rts; + int8_t _pin_cts; + esp_modem_flow_ctrl_t _flow_ctrl; + const char * _pin; + const char * _apn; + int _rx_buffer_size; + int _tx_buffer_size; + esp_modem_dce_mode_t _mode; + + static bool pppDetachBus(void * bus_pointer); +}; + +extern PPPClass PPP; + +#endif /* CONFIG_LWIP_PPP_SUPPORT */ From 70a74944a67535c531eb94f89b641b53aaa2a47a Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 8 Apr 2024 23:54:45 +0300 Subject: [PATCH 03/22] Add more access methods --- libraries/PPP/src/PPP.cpp | 203 +++++++++++++++++++++++++++++++++++++- libraries/PPP/src/PPP.h | 19 +++- 2 files changed, 215 insertions(+), 7 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 5b11915ce2e..4234f55655c 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -13,7 +13,7 @@ static PPPClass * _esp_modem = NULL; static esp_event_handler_instance_t _ppp_ev_instance = NULL; static void _ppp_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { - + log_v("PPP EVENT %ld::%ld", (int)event_base, event_id); if (event_base == NETIF_PPP_STATUS){ if(_esp_modem != NULL){ _esp_modem->_onPppEvent(event_id, event_data); @@ -21,7 +21,10 @@ static void _ppp_event_cb(void* arg, esp_event_base_t event_base, int32_t event_ } } -// This callback needs to be aware of which interface it should match against +static void _ppp_error_cb(esp_modem_terminal_error_t err){ + +} + static void onPppConnected(arduino_event_id_t event, arduino_event_info_t info) { if(event == ARDUINO_EVENT_PPP_CONNECTED){ @@ -172,6 +175,8 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, goto err; } + esp_modem_set_error_cb(_dce, _ppp_error_cb); + if (dte_config.uart_config.flow_control == ESP_MODEM_FLOW_CONTROL_HW) { ret = esp_modem_set_flow_control(_dce, 2, 2); //2/2 means HW Flow Control. if (ret != ESP_OK) { @@ -364,6 +369,48 @@ String PPPClass::IMSI() const return String(imsi); } +String PPPClass::IMEI() const +{ + if(_dce == NULL){ + return String(); + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return String(); + } + + char imei[32]; + esp_err_t err = esp_modem_get_imei(_dce, (std::string&)imei); + if (err != ESP_OK) { + log_e("esp_modem_get_imei failed with %d %s", err, esp_err_to_name(err)); + return String(); + } + + return String(imei); +} + +String PPPClass::moduleName() const +{ + if(_dce == NULL){ + return String(); + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return String(); + } + + char name[32]; + esp_err_t err = esp_modem_get_module_name(_dce, (std::string&)name); + if (err != ESP_OK) { + log_e("esp_modem_get_module_name failed with %d %s", err, esp_err_to_name(err)); + return String(); + } + + return String(name); +} + String PPPClass::getOperator() const { if(_dce == NULL){ @@ -386,6 +433,158 @@ String PPPClass::getOperator() const return String(oper); } +int PPPClass::networkMode() const +{ + if(_dce == NULL){ + return 0; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return 0; + } + + int m = 0; + esp_err_t err = esp_modem_get_network_system_mode(_dce, m); + if (err != ESP_OK) { + log_e("esp_modem_get_network_system_mode failed with %d %s", err, esp_err_to_name(err)); + return 0; + } + return m; +} + +int PPPClass::radioState() const +{ + if(_dce == NULL){ + return 0; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return 0; + } + + int m = 0; + esp_err_t err = esp_modem_get_radio_state(_dce, m); + if (err != ESP_OK) { + log_e("esp_modem_get_radio_state failed with %d %s", err, esp_err_to_name(err)); + return 0; + } + return m; +} + +bool PPPClass::attached() const +{ + if(_dce == NULL){ + return false; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + int m = 0; + esp_err_t err = esp_modem_get_network_attachment_state(_dce, m); + if (err != ESP_OK) { + // log_e("esp_modem_get_network_attachment_state failed with %d %s", err, esp_err_to_name(err)); + return false; + } + return m != 0; +} + +bool PPPClass::powerDown(){ + if(_dce == NULL){ + return false; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + esp_err_t err = esp_modem_power_down(_dce); + if (err != ESP_OK) { + log_e("esp_modem_power_down failed with %d %s", err, esp_err_to_name(err)); + return false; + } + return true; +} + +bool PPPClass::reset(){ + if(_dce == NULL){ + return false; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + esp_err_t err = esp_modem_reset(_dce); + if (err != ESP_OK) { + log_e("esp_modem_reset failed with %d %s", err, esp_err_to_name(err)); + return false; + } + return true; +} + +bool PPPClass::storeProfile(){ + if(_dce == NULL){ + return false; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + esp_err_t err = esp_modem_store_profile(_dce); + if (err != ESP_OK) { + log_e("esp_modem_store_profile failed with %d %s", err, esp_err_to_name(err)); + return false; + } + return true; +} + + +bool PPPClass::sms(const char * num, const char * message) { + if(_dce == NULL){ + return false; + } + + if(_mode != ESP_MODEM_MODE_COMMAND){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + for(int i=0; i 0x39)){ + log_e("Bad character '%c' in SMS Number. Should be only digits and +, # or *", num[i]); + return false; + } + } + + esp_err_t err = esp_modem_sms_txt_mode(_dce, true); + if (err != ESP_OK) { + log_e("Setting text mode failed %d %s", err, esp_err_to_name(err)); + return false; + } + + err = esp_modem_sms_character_set(_dce); + if (err != ESP_OK) { + log_e("Setting GSM character set failed %d %s", err, esp_err_to_name(err)); + return false; + } + + err = esp_modem_send_sms(_dce, num, message); + if (err != ESP_OK) { + log_e("esp_modem_send_sms() failed with %d %s", err, esp_err_to_name(err)); + return false; + } + return true; +} + size_t PPPClass::printDriverInfo(Print & out) const { size_t bytes = 0; //bytes += out.print(","); diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 1a39305264a..a9bae8d57d4 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -29,16 +29,25 @@ class PPPClass: public NetworkInterface { bool begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts=-1, int8_t cts=-1, esp_modem_flow_ctrl_t flow_ctrl=ESP_MODEM_FLOW_CONTROL_NONE); void end(); - esp_modem_dce_mode_t mode() const { - return _mode; - } - bool mode(esp_modem_dce_mode_t m); - // Modem DCE APIs int RSSI() const; int BER() const; String IMSI() const; + String IMEI() const; + String moduleName() const; String getOperator() const; + int networkMode() const; + int radioState() const; + bool attached() const; + + esp_modem_dce_mode_t mode() const { return _mode; } + bool mode(esp_modem_dce_mode_t m); + + bool powerDown(); + bool reset(); + bool storeProfile(); + + bool sms(const char * num, const char * message); esp_modem_dce_t * handle() const; From bcfa7ae02eec62d9e9b7666db5311185cae7c0e5 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 8 Apr 2024 23:59:03 +0300 Subject: [PATCH 04/22] Rename Method --- libraries/PPP/src/PPP.cpp | 2 +- libraries/PPP/src/PPP.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 4234f55655c..cb26ecc2b07 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -411,7 +411,7 @@ String PPPClass::moduleName() const return String(name); } -String PPPClass::getOperator() const +String PPPClass::operatorName() const { if(_dce == NULL){ return String(); diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index a9bae8d57d4..8c38d386cd8 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -35,7 +35,7 @@ class PPPClass: public NetworkInterface { String IMSI() const; String IMEI() const; String moduleName() const; - String getOperator() const; + String operatorName() const; int networkMode() const; int radioState() const; bool attached() const; From d70ff49f10e370b094dc787a987630f3a991a1de Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 00:55:37 +0300 Subject: [PATCH 05/22] Add PPP to configurations --- CMakeLists.txt | 2 ++ Kconfig.projbuild | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc294494f43..120ed6df967 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,6 +157,8 @@ set(ARDUINO_LIBRARY_LittleFS_SRCS libraries/LittleFS/src/LittleFS.cpp) set(ARDUINO_LIBRARY_NetBIOS_SRCS libraries/NetBIOS/src/NetBIOS.cpp) +set(ARDUINO_LIBRARY_PPP_SRCS libraries/PPP/src/PPP.cpp) + set(ARDUINO_LIBRARY_Preferences_SRCS libraries/Preferences/src/Preferences.cpp) set(ARDUINO_LIBRARY_RainMaker_SRCS diff --git a/Kconfig.projbuild b/Kconfig.projbuild index af772bd4618..3e45e358d55 100644 --- a/Kconfig.projbuild +++ b/Kconfig.projbuild @@ -321,6 +321,16 @@ config ARDUINO_SELECTIVE_Networking depends on ARDUINO_SELECTIVE_COMPILATION default y +config ARDUINO_SELECTIVE_Ethernet + bool "Enable Ethernet" + depends on ARDUINO_SELECTIVE_COMPILATION + default y + +config ARDUINO_SELECTIVE_PPP + bool "Enable PPP" + depends on ARDUINO_SELECTIVE_COMPILATION + default y + config ARDUINO_SELECTIVE_ArduinoOTA bool "Enable ArduinoOTA" depends on ARDUINO_SELECTIVE_COMPILATION && ARDUINO_SELECTIVE_Networking From e2970a8588de53a702facfc121c0c9fd9576b9be Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 01:00:55 +0300 Subject: [PATCH 06/22] Update CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 120ed6df967..eeae7e57104 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,7 @@ set(ARDUINO_ALL_LIBRARIES LittleFS NetBIOS Network + PPP Preferences RainMaker SD_MMC From 4401ef8e0fc60b6e6d918958a3bbf4335cc7c7b5 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 01:25:15 +0300 Subject: [PATCH 07/22] fix(ble): rename esp_ble_gap_ext_adv_report_t --- .../BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino | 2 +- .../BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino | 2 +- libraries/BLE/src/BLEAdvertisedDevice.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino b/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino index ebba036e812..ec0f3965175 100644 --- a/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino +++ b/libraries/BLE/examples/BLE5_extended_scan/BLE5_extended_scan.ino @@ -20,7 +20,7 @@ uint32_t scanTime = 100; //In 10ms (1000ms) BLEScan* pBLEScan; class MyBLEExtAdvertisingCallbacks: public BLEExtAdvertisingCallbacks { - void onResult(esp_ble_gap_ext_adv_reprot_t report) { + void onResult(esp_ble_gap_ext_adv_report_t report) { if(report.event_type & ESP_BLE_GAP_SET_EXT_ADV_PROP_LEGACY){ // here we can receive regular advertising data from BLE4.x devices Serial.println("BLE4.2"); diff --git a/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino b/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino index c3d9eb6cd2b..6be284e2480 100644 --- a/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino +++ b/libraries/BLE/examples/BLE5_periodic_sync/BLE5_periodic_sync.ino @@ -28,7 +28,7 @@ static esp_ble_gap_periodic_adv_sync_params_t periodic_adv_sync_params = { class MyBLEExtAdvertisingCallbacks : public BLEExtAdvertisingCallbacks { - void onResult(esp_ble_gap_ext_adv_reprot_t params) + void onResult(esp_ble_gap_ext_adv_report_t params) { uint8_t *adv_name = NULL; uint8_t adv_name_len = 0; diff --git a/libraries/BLE/src/BLEAdvertisedDevice.h b/libraries/BLE/src/BLEAdvertisedDevice.h index e449a0c0799..9e24156da29 100644 --- a/libraries/BLE/src/BLEAdvertisedDevice.h +++ b/libraries/BLE/src/BLEAdvertisedDevice.h @@ -145,7 +145,7 @@ class BLEExtAdvertisingCallbacks { * As we are scanning, we will find new devices. When found, this call back is invoked with a reference to the * device that was found. During any individual scan, a device will only be detected one time. */ - virtual void onResult(esp_ble_gap_ext_adv_reprot_t report) = 0; + virtual void onResult(esp_ble_gap_ext_adv_report_t report) = 0; }; #endif // SOC_BLE_50_SUPPORTED From c9b038066469a6742e9b2f3b95c7e10994a0e5df Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 00:13:55 +0000 Subject: [PATCH 08/22] IDF d23b7a0361 --- package/package_esp32_index.template.json | 68 +++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 94bb5c1f75f..533798c9896 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -42,7 +42,7 @@ { "packager": "esp32", "name": "esp32-arduino-libs", - "version": "idf-release_v5.1-3662303f31" + "version": "idf--d23b7a0361" }, { "packager": "esp32", @@ -105,63 +105,63 @@ "tools": [ { "name": "esp32-arduino-libs", - "version": "idf-release_v5.1-3662303f31", + "version": "idf--d23b7a0361", "systems": [ { "host": "i686-mingw32", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "x86_64-mingw32", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "arm64-apple-darwin", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "x86_64-apple-darwin", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "i686-pc-linux-gnu", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "aarch64-linux-gnu", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" }, { "host": "arm-linux-gnueabihf", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/2c6907b9e2b6ff8d7d47c93d622827575190b806", - "archiveFileName": "esp32-arduino-libs-2c6907b9e2b6ff8d7d47c93d622827575190b806.zip", - "checksum": "SHA-256:33998f3ba0cf1080ef6a3c70d477b9d535944191a045f9078d427ee5e79afbe1", - "size": "352415499" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", + "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", + "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", + "size": "372302667" } ] }, From 82b3a43c49d7b90486263ea250ab82a3c8ea9231 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 13:17:34 +0300 Subject: [PATCH 09/22] Better event handling --- libraries/Network/src/NetworkInterface.cpp | 10 +- libraries/PPP/src/PPP.cpp | 201 +++++++++++++++------ libraries/PPP/src/PPP.h | 1 + 3 files changed, 151 insertions(+), 61 deletions(-) diff --git a/libraries/Network/src/NetworkInterface.cpp b/libraries/Network/src/NetworkInterface.cpp index 8800bc69f96..2cb9f59415c 100644 --- a/libraries/Network/src/NetworkInterface.cpp +++ b/libraries/Network/src/NetworkInterface.cpp @@ -533,7 +533,7 @@ String NetworkInterface::impl_name(void) const char netif_name[8]; esp_err_t err = esp_netif_get_netif_impl_name(_esp_netif, netif_name); if(err != ESP_OK){ - log_e("Failed to get netif impl_name: %d", err); + log_e("Failed to get netif impl_name: 0x%04x %s", err, esp_err_to_name(err)); return String(""); } return String(netif_name); @@ -562,7 +562,7 @@ bool NetworkInterface::setDefault() } esp_err_t err = esp_netif_set_default_netif(_esp_netif); if(err != ESP_OK){ - log_e("Failed to set default netif: %d", err); + log_e("Failed to set default netif: 0x%04x %s", err, esp_err_to_name(err)); return false; } return true; @@ -578,15 +578,15 @@ bool NetworkInterface::isDefault() const uint8_t * NetworkInterface::macAddress(uint8_t* mac) const { - if(!mac || _esp_netif == NULL){ + if(!mac || _esp_netif == NULL || _interface_id == ESP_NETIF_ID_PPP){ return NULL; } + esp_err_t err = esp_netif_get_mac(_esp_netif, mac); if(err != ESP_OK){ - log_e("Failed to get netif mac: %d", err); + log_e("Failed to get netif mac: 0x%04x %s", err, esp_err_to_name(err)); return NULL; } - // getMac(mac); return mac; } diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index cb26ecc2b07..2a1ec07c313 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -12,8 +12,53 @@ typedef struct { void * arg; } PdpContext; static PPPClass * _esp_modem = NULL; static esp_event_handler_instance_t _ppp_ev_instance = NULL; +static const char * _ppp_event_name(int32_t event_id){ + switch(event_id){ + case NETIF_PPP_ERRORNONE : return "No error."; + case NETIF_PPP_ERRORPARAM : return "Invalid parameter."; + case NETIF_PPP_ERROROPEN : return "Unable to open PPP session."; + case NETIF_PPP_ERRORDEVICE : return "Invalid I/O device for PPP."; + case NETIF_PPP_ERRORALLOC : return "Unable to allocate resources."; + case NETIF_PPP_ERRORUSER : return "User interrupt."; + case NETIF_PPP_ERRORCONNECT : return "Connection lost."; + case NETIF_PPP_ERRORAUTHFAIL : return "Failed authentication challenge."; + case NETIF_PPP_ERRORPROTOCOL : return "Failed to meet protocol."; + case NETIF_PPP_ERRORPEERDEAD : return "Connection timeout"; + case NETIF_PPP_ERRORIDLETIMEOUT : return "Idle Timeout"; + case NETIF_PPP_ERRORCONNECTTIME : return "Max connect time reached"; + case NETIF_PPP_ERRORLOOPBACK : return "Loopback detected"; + case NETIF_PPP_PHASE_DEAD : return "Phase Dead"; + case NETIF_PPP_PHASE_MASTER : return "Phase Master"; + case NETIF_PPP_PHASE_HOLDOFF : return "Phase Hold Off"; + case NETIF_PPP_PHASE_INITIALIZE : return "Phase Initialize"; + case NETIF_PPP_PHASE_SERIALCONN : return "Phase Serial Conn"; + case NETIF_PPP_PHASE_DORMANT : return "Phase Dormant"; + case NETIF_PPP_PHASE_ESTABLISH : return "Phase Establish"; + case NETIF_PPP_PHASE_AUTHENTICATE: return "Phase Authenticate"; + case NETIF_PPP_PHASE_CALLBACK : return "Phase Callback"; + case NETIF_PPP_PHASE_NETWORK : return "Phase Network"; + case NETIF_PPP_PHASE_RUNNING : return "Phase Running"; + case NETIF_PPP_PHASE_TERMINATE : return "Phase Terminate"; + case NETIF_PPP_PHASE_DISCONNECT : return "Phase Disconnect"; + case NETIF_PPP_CONNECT_FAILED : return "Connect Failed"; + default: break; + } + return "UNKNOWN"; +} + +static const char * _ppp_terminal_error_name(esp_modem_terminal_error_t err){ + switch(err){ + case ESP_MODEM_TERMINAL_BUFFER_OVERFLOW: return "Buffer Overflow"; + case ESP_MODEM_TERMINAL_CHECKSUM_ERROR: return "Checksum Error"; + case ESP_MODEM_TERMINAL_UNEXPECTED_CONTROL_FLOW: return "Unexpected Control Flow"; + case ESP_MODEM_TERMINAL_DEVICE_GONE: return "Device Gone"; + case ESP_MODEM_TERMINAL_UNKNOWN_ERROR: return "Unknown Error"; + default: break; + } + return "UNKNOWN"; +} + static void _ppp_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { - log_v("PPP EVENT %ld::%ld", (int)event_base, event_id); if (event_base == NETIF_PPP_STATUS){ if(_esp_modem != NULL){ _esp_modem->_onPppEvent(event_id, event_data); @@ -21,50 +66,62 @@ static void _ppp_event_cb(void* arg, esp_event_base_t event_base, int32_t event_ } } -static void _ppp_error_cb(esp_modem_terminal_error_t err){ +static void onPppArduinoEvent(arduino_event_id_t event, arduino_event_info_t info) +{ + if(event >= ARDUINO_EVENT_PPP_START && event <= ARDUINO_EVENT_PPP_GOT_IP6){ + _esp_modem->_onPppArduinoEvent(event, info); + } +} +// PPP Error Callback +static void _ppp_error_cb(esp_modem_terminal_error_t err){ + log_v("PPP Driver Error %ld: %s", err, _ppp_terminal_error_name(err)); } -static void onPppConnected(arduino_event_id_t event, arduino_event_info_t info) -{ - if(event == ARDUINO_EVENT_PPP_CONNECTED){ - if (_esp_modem->getStatusBits() & ESP_NETIF_WANT_IP6_BIT){ - esp_err_t err = esp_netif_create_ip6_linklocal(_esp_modem->netif()); - if(err != ESP_OK){ - log_e("Failed to enable IPv6 Link Local on PPP: [%d] %s", err, esp_err_to_name(err)); - } else { - log_v("Enabled IPv6 Link Local on %s", _esp_modem->desc()); - } +// PPP Arduino Events Callback +void PPPClass::_onPppArduinoEvent(arduino_event_id_t event, arduino_event_info_t info){ + log_v("PPP Arduino Event %ld: %s", event, Network.eventName(event)); + if(event == ARDUINO_EVENT_PPP_GOT_IP){ + if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) == 0){ + setStatusBits(ESP_NETIF_CONNECTED_BIT); + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_PPP_CONNECTED; + Network.postEvent(&arduino_event); + } + } else + if(event == ARDUINO_EVENT_PPP_LOST_IP){ + if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) != 0){ + clearStatusBits(ESP_NETIF_CONNECTED_BIT); + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_PPP_DISCONNECTED; + Network.postEvent(&arduino_event); } } } -esp_modem_dce_t * PPPClass::handle() const { - return _dce; -} - +// PPP Driver Events Callback void PPPClass::_onPppEvent(int32_t event_id, void* event_data){ arduino_event_t arduino_event; arduino_event.event_id = ARDUINO_EVENT_MAX; - log_v("PPP EVENT %ld", event_id); + log_v("PPP Driver Event %ld: %s", event_id, _ppp_event_name(event_id)); // if (event_id == ETHERNET_EVENT_CONNECTED) { // log_v("%s Connected", desc()); - // arduino_event.event_id = ARDUINO_EVENT_ETH_CONNECTED; + // arduino_event.event_id = ARDUINO_EVENT_PPP_CONNECTED; // arduino_event.event_info.eth_connected = handle(); // setStatusBits(ESP_NETIF_CONNECTED_BIT); // } else if (event_id == ETHERNET_EVENT_DISCONNECTED) { // log_v("%s Disconnected", desc()); - // arduino_event.event_id = ARDUINO_EVENT_ETH_DISCONNECTED; + // arduino_event.event_id = ARDUINO_EVENT_PPP_DISCONNECTED; // clearStatusBits(ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT); // } else if (event_id == ETHERNET_EVENT_START) { // log_v("%s Started", desc()); - // arduino_event.event_id = ARDUINO_EVENT_ETH_START; + // arduino_event.event_id = ARDUINO_EVENT_PPP_START; // setStatusBits(ESP_NETIF_STARTED_BIT); // } else if (event_id == ETHERNET_EVENT_STOP) { // log_v("%s Stopped", desc()); - // arduino_event.event_id = ARDUINO_EVENT_ETH_STOP; + // arduino_event.event_id = ARDUINO_EVENT_PPP_STOP; // clearStatusBits(ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT | ESP_NETIF_HAS_STATIC_IP_BIT); // } @@ -73,6 +130,10 @@ void PPPClass::_onPppEvent(int32_t event_id, void* event_data){ } } +esp_modem_dce_t * PPPClass::handle() const { + return _dce; +} + PPPClass::PPPClass() :_dce(NULL) ,_pin_tx(-1) @@ -207,7 +268,12 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, if(!perimanSetPinBus(_pin_cts, ESP32_BUS_TYPE_PPP_CTS, (void *)(this), -1, -1)){ goto err; } } - Network.onSysEvent(onPppConnected, ARDUINO_EVENT_PPP_CONNECTED); + Network.onSysEvent(onPppArduinoEvent); + + setStatusBits(ESP_NETIF_STARTED_BIT); + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_PPP_START; + Network.postEvent(&arduino_event); return true; @@ -219,6 +285,21 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, void PPPClass::end(void) { + if(_esp_modem && _esp_netif && _dce){ + + if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) != 0){ + clearStatusBits(ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT); + arduino_event_t disconnect_event; + disconnect_event.event_id = ARDUINO_EVENT_PPP_DISCONNECTED; + Network.postEvent(&disconnect_event); + } + + clearStatusBits(ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT | ESP_NETIF_HAS_STATIC_IP_BIT); + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_PPP_STOP; + Network.postEvent(&arduino_event); + } + destroyNetif(); if(_ppp_ev_instance != NULL){ @@ -228,7 +309,7 @@ void PPPClass::end(void) } _esp_modem = NULL; - Network.removeEvent(onPppConnected, ARDUINO_EVENT_PPP_CONNECTED); + Network.removeEvent(onPppArduinoEvent); if(_dce != NULL){ esp_modem_destroy(_dce); @@ -255,6 +336,26 @@ void PPPClass::end(void) _mode = ESP_MODEM_MODE_COMMAND; } +bool PPPClass::attached() const +{ + if(_dce == NULL){ + return false; + } + + if(_mode == ESP_MODEM_MODE_DATA){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + int m = 0; + esp_err_t err = esp_modem_get_network_attachment_state(_dce, m); + if (err != ESP_OK) { + // log_e("esp_modem_get_network_attachment_state failed with %d %s", err, esp_err_to_name(err)); + return false; + } + return m != 0; +} + bool PPPClass::mode(esp_modem_dce_mode_t m){ if(_dce == NULL){ return 0; @@ -314,7 +415,7 @@ int PPPClass::RSSI() const return 0; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return 0; } @@ -334,7 +435,7 @@ int PPPClass::BER() const return 0; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return 0; } @@ -354,7 +455,7 @@ String PPPClass::IMSI() const return String(); } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return String(); } @@ -375,7 +476,7 @@ String PPPClass::IMEI() const return String(); } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return String(); } @@ -396,7 +497,7 @@ String PPPClass::moduleName() const return String(); } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return String(); } @@ -417,7 +518,7 @@ String PPPClass::operatorName() const return String(); } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return String(); } @@ -439,7 +540,7 @@ int PPPClass::networkMode() const return 0; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return 0; } @@ -459,7 +560,7 @@ int PPPClass::radioState() const return 0; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return 0; } @@ -473,32 +574,12 @@ int PPPClass::radioState() const return m; } -bool PPPClass::attached() const -{ - if(_dce == NULL){ - return false; - } - - if(_mode != ESP_MODEM_MODE_COMMAND){ - log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); - return false; - } - - int m = 0; - esp_err_t err = esp_modem_get_network_attachment_state(_dce, m); - if (err != ESP_OK) { - // log_e("esp_modem_get_network_attachment_state failed with %d %s", err, esp_err_to_name(err)); - return false; - } - return m != 0; -} - bool PPPClass::powerDown(){ if(_dce == NULL){ return false; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return false; } @@ -516,7 +597,7 @@ bool PPPClass::reset(){ return false; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return false; } @@ -534,7 +615,7 @@ bool PPPClass::storeProfile(){ return false; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return false; } @@ -553,7 +634,7 @@ bool PPPClass::sms(const char * num, const char * message) { return false; } - if(_mode != ESP_MODEM_MODE_COMMAND){ + if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); return false; } @@ -587,7 +668,15 @@ bool PPPClass::sms(const char * num, const char * message) { size_t PPPClass::printDriverInfo(Print & out) const { size_t bytes = 0; - //bytes += out.print(","); + if(_dce == NULL || _mode == ESP_MODEM_MODE_DATA){ + return bytes; + } + if(attached()){ + bytes += out.print(","); + bytes += out.print(operatorName()); + } + bytes += out.print(", RSSI: "); + bytes += out.print(RSSI()); return bytes; } diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 8c38d386cd8..91b98552f5f 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -56,6 +56,7 @@ class PPPClass: public NetworkInterface { public: void _onPppEvent(int32_t event_id, void* event_data); + void _onPppArduinoEvent(arduino_event_id_t event, arduino_event_info_t info); private: esp_modem_dce_t *_dce; From e2f4d90591edad123c1459d52f291762ab0b023f Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 13:40:47 +0300 Subject: [PATCH 10/22] Change return value on some methods --- libraries/PPP/src/PPP.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 2a1ec07c313..4b7d6358841 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -412,19 +412,19 @@ bool PPPClass::setPin(const char * pin){ int PPPClass::RSSI() const { if(_dce == NULL){ - return 0; + return -1; } if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); - return 0; + return -1; } int rssi, ber; esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber); if (err != ESP_OK) { log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); - return 0; + return -1; } return rssi; } @@ -432,19 +432,19 @@ int PPPClass::RSSI() const int PPPClass::BER() const { if(_dce == NULL){ - return 0; + return -1; } if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); - return 0; + return -1; } int rssi, ber; esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber); if (err != ESP_OK) { log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); - return 0; + return -1; } return ber; } @@ -537,19 +537,19 @@ String PPPClass::operatorName() const int PPPClass::networkMode() const { if(_dce == NULL){ - return 0; + return -1; } if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); - return 0; + return -1; } int m = 0; esp_err_t err = esp_modem_get_network_system_mode(_dce, m); if (err != ESP_OK) { log_e("esp_modem_get_network_system_mode failed with %d %s", err, esp_err_to_name(err)); - return 0; + return -1; } return m; } @@ -557,19 +557,19 @@ int PPPClass::networkMode() const int PPPClass::radioState() const { if(_dce == NULL){ - return 0; + return -1; } if(_mode == ESP_MODEM_MODE_DATA){ log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); - return 0; + return -1; } int m = 0; esp_err_t err = esp_modem_get_radio_state(_dce, m); if (err != ESP_OK) { - log_e("esp_modem_get_radio_state failed with %d %s", err, esp_err_to_name(err)); - return 0; + // log_e("esp_modem_get_radio_state failed with %d %s", err, esp_err_to_name(err)); + return -1; } return m; } From b6bdcbb48c61dac567f1a9278eb4d3b501fee26a Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 16:31:34 +0300 Subject: [PATCH 11/22] Update libs and API --- libraries/PPP/src/PPP.cpp | 116 +++++++++++++++------- libraries/PPP/src/PPP.h | 7 +- package/package_esp32_index.template.json | 64 ++++++------ 3 files changed, 119 insertions(+), 68 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 4b7d6358841..143f0abfecd 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -140,6 +140,9 @@ PPPClass::PPPClass() ,_pin_rx(-1) ,_pin_rts(-1) ,_pin_cts(-1) + ,_flow_ctrl(ESP_MODEM_FLOW_CONTROL_NONE) + ,_pin_rst(-1) + ,_pin_rst_act_low(true) ,_pin(NULL) ,_apn(NULL) ,_rx_buffer_size(1024) @@ -157,35 +160,27 @@ bool PPPClass::pppDetachBus(void * bus_pointer){ return true; } -bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, int8_t cts, esp_modem_flow_ctrl_t flow_ctrl){ - esp_err_t ret = ESP_OK; - bool pin_ok = false; - - if(_esp_netif != NULL || _dce != NULL){ - log_w("PPP Already Started"); - return true; - } - - if(_apn == NULL){ - log_e("APN is not set. Call 'PPP.setApn()' first"); - return false; - } +void PPPClass::setResetPin(int8_t rst, bool active_low){ + _pin_rst = digitalPinToGPIONumber(rst); + _pin_rst_act_low = active_low; +} +bool PPPClass::setPins(int8_t tx, int8_t rx, int8_t rts, int8_t cts, esp_modem_flow_ctrl_t flow_ctrl){ perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_TX, PPPClass::pppDetachBus); perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_RX, PPPClass::pppDetachBus); perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_RTS, PPPClass::pppDetachBus); perimanSetBusDeinit(ESP32_BUS_TYPE_PPP_CTS, PPPClass::pppDetachBus); - if(_pin_tx != -1){ + if(_pin_tx >= 0){ if(!perimanClearPinBus(_pin_tx)){ return false; } } - if(_pin_rx != -1){ + if(_pin_rx >= 0){ if(!perimanClearPinBus(_pin_rx)){ return false; } } - if(_pin_rts != -1){ + if(_pin_rts >= 0){ if(!perimanClearPinBus(_pin_rts)){ return false; } } - if(_pin_cts != -1){ + if(_pin_cts >= 0){ if(!perimanClearPinBus(_pin_cts)){ return false; } } @@ -195,6 +190,58 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, _pin_rts = digitalPinToGPIONumber(rts); _pin_cts = digitalPinToGPIONumber(cts); + if(_pin_tx >= 0){ + if(!perimanSetPinBus(_pin_tx, ESP32_BUS_TYPE_PPP_TX, (void *)(this), -1, -1)){ return false; } + } + if(_pin_rx >= 0){ + if(!perimanSetPinBus(_pin_rx, ESP32_BUS_TYPE_PPP_RX, (void *)(this), -1, -1)){ return false; } + } + if(_pin_rts >= 0){ + if(!perimanSetPinBus(_pin_rts, ESP32_BUS_TYPE_PPP_RTS, (void *)(this), -1, -1)){ return false; } + } + if(_pin_cts >= 0){ + if(!perimanSetPinBus(_pin_cts, ESP32_BUS_TYPE_PPP_CTS, (void *)(this), -1, -1)){ return false; } + } + return true; +} + +bool PPPClass::begin(ppp_modem_model_t model){ + esp_err_t ret = ESP_OK; + bool pin_ok = false; + int trys = 0; + + if(_esp_netif != NULL || _dce != NULL){ + log_w("PPP Already Started"); + return true; + } + + if(_apn == NULL){ + log_e("APN is not set. Call 'PPP.setApn()' first"); + return false; + } + + if(_pin_tx < 0 || _pin_rx < 0){ + log_e("UART pins not set. Call 'PPP.setPins()' first"); + return false; + } + + if((_pin_rts < 0 || _pin_cts < 0) && (_flow_ctrl != ESP_MODEM_FLOW_CONTROL_NONE)){ + log_e("UART CTS/RTS pins not set, but flow control is enabled!"); + return false; + } + + if(_pin_rst >= 0){ + if(_pin_rst_act_low){ + pinMode(_pin_rst, OUTPUT_OPEN_DRAIN); + } else { + pinMode(_pin_rst, OUTPUT); + } + digitalWrite(25, !_pin_rst_act_low); + delay(200); + digitalWrite(25, _pin_rst_act_low); + delay(200); + } + Network.begin(); _esp_modem = this; 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,6 +285,18 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, esp_modem_set_error_cb(_dce, _ppp_error_cb); + // wait to be able to talk to the modem + log_v("Waiting for response from the modem"); + while(esp_modem_read_pin(_dce, pin_ok) != ESP_OK && trys < 50){ + trys++; + delay(500); + } + if(trys >= 50){ + log_e("Failed to wait for communication"); + goto err; + } + + // enable flow control if (dte_config.uart_config.flow_control == ESP_MODEM_FLOW_CONTROL_HW) { ret = esp_modem_set_flow_control(_dce, 2, 2); //2/2 means HW Flow Control. if (ret != ESP_OK) { @@ -252,20 +311,6 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, log_e("PIN verification failed!"); goto err; } - // delay(1000); - } - - if(_pin_tx != -1){ - if(!perimanSetPinBus(_pin_tx, ESP32_BUS_TYPE_PPP_TX, (void *)(this), -1, -1)){ goto err; } - } - if(_pin_rx != -1){ - if(!perimanSetPinBus(_pin_rx, ESP32_BUS_TYPE_PPP_RX, (void *)(this), -1, -1)){ goto err; } - } - if(_pin_rts != -1){ - if(!perimanSetPinBus(_pin_rts, ESP32_BUS_TYPE_PPP_RTS, (void *)(this), -1, -1)){ goto err; } - } - if(_pin_cts != -1){ - if(!perimanSetPinBus(_pin_cts, ESP32_BUS_TYPE_PPP_CTS, (void *)(this), -1, -1)){ goto err; } } Network.onSysEvent(onPppArduinoEvent); @@ -278,7 +323,6 @@ bool PPPClass::begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts, return true; err: - log_e("Failed to set all pins bus to ETHERNET"); PPPClass::pppDetachBus((void *)(this)); return false; } @@ -423,7 +467,7 @@ int PPPClass::RSSI() const int rssi, ber; esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber); if (err != ESP_OK) { - log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); + // log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); return -1; } return rssi; @@ -443,7 +487,7 @@ int PPPClass::BER() const int rssi, ber; esp_err_t err = esp_modem_get_signal_quality(_dce, rssi, ber); if (err != ESP_OK) { - log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); + // log_e("esp_modem_get_signal_quality failed with %d %s", err, esp_err_to_name(err)); return -1; } return ber; @@ -675,8 +719,10 @@ size_t PPPClass::printDriverInfo(Print & out) const { bytes += out.print(","); bytes += out.print(operatorName()); } - bytes += out.print(", RSSI: "); + bytes += out.print(",RSSI:"); bytes += out.print(RSSI()); + bytes += out.print(",BER:"); + bytes += out.print(BER()); return bytes; } diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 91b98552f5f..9e2ebb61d87 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -26,7 +26,10 @@ class PPPClass: public NetworkInterface { bool setApn(const char * apn); bool setPin(const char * pin); - bool begin(ppp_modem_model_t model, int8_t tx, int8_t rx, int8_t rts=-1, int8_t cts=-1, esp_modem_flow_ctrl_t flow_ctrl=ESP_MODEM_FLOW_CONTROL_NONE); + bool setPins(int8_t tx, int8_t rx, int8_t rts=-1, int8_t cts=-1, esp_modem_flow_ctrl_t flow_ctrl=ESP_MODEM_FLOW_CONTROL_NONE); + void setResetPin(int8_t rst, bool active_low=true); + + bool begin(ppp_modem_model_t model); void end(); // Modem DCE APIs @@ -65,6 +68,8 @@ class PPPClass: public NetworkInterface { int8_t _pin_rts; int8_t _pin_cts; esp_modem_flow_ctrl_t _flow_ctrl; + int8_t _pin_rst; + bool _pin_rst_act_low; const char * _pin; const char * _apn; int _rx_buffer_size; diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json index 533798c9896..ced6417798b 100644 --- a/package/package_esp32_index.template.json +++ b/package/package_esp32_index.template.json @@ -109,59 +109,59 @@ "systems": [ { "host": "i686-mingw32", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "x86_64-mingw32", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "arm64-apple-darwin", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "x86_64-apple-darwin", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "x86_64-pc-linux-gnu", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "i686-pc-linux-gnu", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "aarch64-linux-gnu", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" }, { "host": "arm-linux-gnueabihf", - "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/465fde8c3158ea6598a7ae140c05c69a8f37d47a", - "archiveFileName": "esp32-arduino-libs-465fde8c3158ea6598a7ae140c05c69a8f37d47a.zip", - "checksum": "SHA-256:8671cabef12826ce6fabe58d0856dec14508890fa0c517a06b5411b331764baa", - "size": "372302667" + "url": "https://codeload.github.com/espressif/esp32-arduino-libs/zip/5daaf1a26c12b495975a367cf2c73b86ddee5d31", + "archiveFileName": "esp32-arduino-libs-5daaf1a26c12b495975a367cf2c73b86ddee5d31.zip", + "checksum": "SHA-256:6fe9a5643057449bbbe850cd0e7217f3f6753adc8d5da2807f0c071a1ccb44f1", + "size": "372257794" } ] }, From 49872bf5821b4f5ea6942c1a3ae75bbd45758f0d Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 17:24:35 +0300 Subject: [PATCH 12/22] Add example sketch --- .../PPP/examples/PPP_Basic/PPP_Basic.ino | 130 ++++++++++++++++++ libraries/PPP/src/PPP.cpp | 4 +- 2 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 libraries/PPP/examples/PPP_Basic/PPP_Basic.ino diff --git a/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino b/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino new file mode 100644 index 00000000000..a874d14ce9d --- /dev/null +++ b/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino @@ -0,0 +1,130 @@ +#include + +#define PPP_MODEM_APN "internet" +#define PPP_MODEM_PIN "0000" // or NULL + +// WaveShare SIM7600 HW Flow Control +//#define PPP_MODEM_RST 25 +//#define PPP_MODEM_RST_LOW false //active HIGH +//#define PPP_MODEM_TX 21 +//#define PPP_MODEM_RX 22 +//#define PPP_MODEM_RTS 26 +//#define PPP_MODEM_CTS 27 +//#define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_HW +//#define PPP_MODEM_MODEL PPP_MODEM_SIM7600 + +// SIM800 basic module with just TX,RX and RST +#define PPP_MODEM_RST 0 +#define PPP_MODEM_RST_LOW true //active LOW +#define PPP_MODEM_TX 2 +#define PPP_MODEM_RX 19 +#define PPP_MODEM_RTS -1 +#define PPP_MODEM_CTS -1 +#define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_NONE +#define PPP_MODEM_MODEL PPP_MODEM_SIM800 + +static bool ppp_connected = false; + +void onEvent(arduino_event_id_t event, arduino_event_info_t info) +{ + switch (event) { + case ARDUINO_EVENT_PPP_START: + Serial.println("PPP Started"); + break; + case ARDUINO_EVENT_PPP_CONNECTED: + Serial.println("PPP Connected"); + break; + case ARDUINO_EVENT_PPP_GOT_IP: + Serial.println("PPP Got IP"); + Serial.println(PPP); + ppp_connected = true; + break; + case ARDUINO_EVENT_PPP_GOT_IP6: + Serial.println("PPP Got IPv6"); + Serial.println(PPP); + break; + case ARDUINO_EVENT_PPP_LOST_IP: + Serial.println("PPP Lost IP"); + ppp_connected = false; + break; + case ARDUINO_EVENT_PPP_DISCONNECTED: + Serial.println("PPP Disconnected"); + ppp_connected = false; + break; + case ARDUINO_EVENT_PPP_STOP: + Serial.println("PPP Stopped"); + ppp_connected = false; + break; + + default: + break; + } +} + +void testClient(const char * host, uint16_t port) { + NetworkClient client; + if (!client.connect(host, port)) { + Serial.println("Connection Failed"); + return; + } + client.printf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", host); + while (client.connected() && !client.available()); + while (client.available()) { + client.read();//Serial.write(client.read()); + } + + Serial.println("Connection Success"); + client.stop(); +} + +void setup() { + Serial.begin(115200); + Network.onEvent(onEvent); + PPP.setApn(PPP_MODEM_APN); + PPP.setPin(PPP_MODEM_PIN); + PPP.setResetPin(PPP_MODEM_RST, PPP_MODEM_RST_LOW); + PPP.setPins(PPP_MODEM_TX, PPP_MODEM_RX, PPP_MODEM_RTS, PPP_MODEM_CTS, PPP_MODEM_FC); + Serial.println("Starting the modem. It might take a while!"); + PPP.begin(PPP_MODEM_MODEL); + + Serial.print("Name: "); Serial.println(PPP.moduleName()); + Serial.print("IMEI: "); Serial.println(PPP.IMEI()); + + bool attached = PPP.attached(); + if(!attached){ + int i=0; + unsigned int s = millis(); + Serial.print("Waiting to attach "); + while(!attached && ((++i) < 600)){ + Serial.print("."); + delay(100); + attached = PPP.attached(); + } + Serial.print((millis() - s) / 1000.0, 1); + Serial.println("s"); + attached = PPP.attached(); + } + + Serial.print("Attached: "); Serial.println(attached); + Serial.print("State: "); Serial.println(PPP.radioState()); + if(attached){ + Serial.print("Operator: "); Serial.println(PPP.operatorName()); + Serial.print("IMSI: "); Serial.println(PPP.IMSI()); + Serial.print("RSSI: "); Serial.println(PPP.RSSI()); + int ber = PPP.BER(); + Serial.print("BER: "); Serial.println(ber); + if(ber){ + Serial.print("NetMode: "); Serial.println(PPP.networkMode()); + } + +// PPP.mode(ESP_MODEM_MODE_DATA); // Data ONLY mode + PPP.mode(ESP_MODEM_MODE_CMUX); // Data and Commands mode + } +} + +void loop() { + if (ppp_connected) { + testClient("google.com", 80); + } + delay(20000); +} diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 143f0abfecd..e45269a4350 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -236,9 +236,9 @@ bool PPPClass::begin(ppp_modem_model_t model){ } else { pinMode(_pin_rst, OUTPUT); } - digitalWrite(25, !_pin_rst_act_low); + digitalWrite(_pin_rst, !_pin_rst_act_low); delay(200); - digitalWrite(25, _pin_rst_act_low); + digitalWrite(_pin_rst, _pin_rst_act_low); delay(200); } From 35a6293b8dcfd06c5c3deb0a5e1d0d1a2fdc3d78 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 9 Apr 2024 17:52:52 +0300 Subject: [PATCH 13/22] Fix build error --- libraries/PPP/src/PPP.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index e45269a4350..faa971efbea 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -12,6 +12,7 @@ typedef struct { void * arg; } PdpContext; static PPPClass * _esp_modem = NULL; static esp_event_handler_instance_t _ppp_ev_instance = NULL; +#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE static const char * _ppp_event_name(int32_t event_id){ switch(event_id){ case NETIF_PPP_ERRORNONE : return "No error."; @@ -57,6 +58,7 @@ static const char * _ppp_terminal_error_name(esp_modem_terminal_error_t err){ } return "UNKNOWN"; } +#endif static void _ppp_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_base == NETIF_PPP_STATUS){ From b35430a967105f0f743b4303d85030a9626946ad Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 10 Apr 2024 12:00:51 +0300 Subject: [PATCH 14/22] Add sync and update reset and wait logic --- libraries/PPP/src/PPP.cpp | 78 ++++++++++++++++++++++++--------------- libraries/PPP/src/PPP.h | 1 + 2 files changed, 49 insertions(+), 30 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index faa971efbea..faac3ea8cdf 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -147,7 +147,7 @@ PPPClass::PPPClass() ,_pin_rst_act_low(true) ,_pin(NULL) ,_apn(NULL) - ,_rx_buffer_size(1024) + ,_rx_buffer_size(4096) ,_tx_buffer_size(512) ,_mode(ESP_MODEM_MODE_COMMAND) { @@ -232,18 +232,6 @@ bool PPPClass::begin(ppp_modem_model_t model){ return false; } - if(_pin_rst >= 0){ - if(_pin_rst_act_low){ - pinMode(_pin_rst, OUTPUT_OPEN_DRAIN); - } else { - pinMode(_pin_rst, OUTPUT); - } - digitalWrite(_pin_rst, !_pin_rst_act_low); - delay(200); - digitalWrite(_pin_rst, _pin_rst_act_low); - delay(200); - } - Network.begin(); _esp_modem = this; if(_ppp_ev_instance == NULL && esp_event_handler_instance_register(NETIF_PPP_STATUS, ESP_EVENT_ANY_ID, &_ppp_event_cb, NULL, &_ppp_ev_instance)){ @@ -264,7 +252,6 @@ bool PPPClass::begin(ppp_modem_model_t model){ /* Configure the DTE */ esp_modem_dte_config_t dte_config = ESP_MODEM_DTE_DEFAULT_CONFIG(); - /* setup UART specific configuration based on kconfig options */ dte_config.uart_config.tx_io_num = _pin_tx; dte_config.uart_config.rx_io_num = _pin_rx; dte_config.uart_config.rts_io_num = _pin_rts; @@ -272,13 +259,25 @@ bool PPPClass::begin(ppp_modem_model_t model){ dte_config.uart_config.flow_control = _flow_ctrl; dte_config.uart_config.rx_buffer_size = _rx_buffer_size; dte_config.uart_config.tx_buffer_size = _tx_buffer_size; - dte_config.uart_config.event_queue_size = 20; - dte_config.task_stack_size = 2048; - dte_config.task_priority = 5; - dte_config.dte_buffer_size = _rx_buffer_size / 2; /* Configure the DCE */ esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG(_apn); + + /* Reset the Modem */ + if(_pin_rst >= 0){ + log_v("Resetting the modem"); + if(_pin_rst_act_low){ + pinMode(_pin_rst, OUTPUT_OPEN_DRAIN); + } else { + pinMode(_pin_rst, OUTPUT); + } + digitalWrite(_pin_rst, !_pin_rst_act_low); + delay(200); + digitalWrite(_pin_rst, _pin_rst_act_low); + delay(100); + } + + /* Start the DCE */ _dce = esp_modem_new_dev((esp_modem_dce_device_t)model, &dte_config, &dce_config, _esp_netif); if(_dce == NULL){ log_e("esp_modem_new_dev failed"); @@ -287,27 +286,33 @@ bool PPPClass::begin(ppp_modem_model_t model){ esp_modem_set_error_cb(_dce, _ppp_error_cb); - // wait to be able to talk to the modem - log_v("Waiting for response from the modem"); - while(esp_modem_read_pin(_dce, pin_ok) != ESP_OK && trys < 50){ - trys++; - delay(500); - } - if(trys >= 50){ - log_e("Failed to wait for communication"); - goto err; + /* Wait for Modem to respond */ + if(_pin_rst >= 0){ + // wait to be able to talk to the modem + log_v("Waiting for response from the modem"); + while(esp_modem_sync(_dce) != ESP_OK && trys < 50){ + trys++; + delay(500); + } + if(trys >= 50){ + log_e("Failed to wait for communication"); + goto err; + } + } else { + // try to communicate with the modem + } - // enable flow control + /* enable flow control */ if (dte_config.uart_config.flow_control == ESP_MODEM_FLOW_CONTROL_HW) { ret = esp_modem_set_flow_control(_dce, 2, 2); //2/2 means HW Flow Control. if (ret != ESP_OK) { - log_e("Failed to set the set_flow_control mode: [%d] %s", ret, esp_err_to_name(ret)); + log_e("Failed to set the hardware flow control: [%d] %s", ret, esp_err_to_name(ret)); goto err; } } - // check if PIN needed + /* check if PIN needed */ if (esp_modem_read_pin(_dce, pin_ok) == ESP_OK && pin_ok == false) { if (_pin == NULL || esp_modem_set_pin(_dce, _pin) != ESP_OK) { log_e("PIN verification failed!"); @@ -382,6 +387,19 @@ void PPPClass::end(void) _mode = ESP_MODEM_MODE_COMMAND; } +bool PPPClass::sync() const +{ + if(_dce == NULL){ + return false; + } + + if(_mode == ESP_MODEM_MODE_DATA){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + return esp_modem_sync(_dce) == ESP_OK; +} + bool PPPClass::attached() const { if(_dce == NULL){ diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 9e2ebb61d87..461ed2d5a87 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -42,6 +42,7 @@ class PPPClass: public NetworkInterface { int networkMode() const; int radioState() const; bool attached() const; + bool sync() const; esp_modem_dce_mode_t mode() const { return _mode; } bool mode(esp_modem_dce_mode_t m); From d32f7ed8d7dcc435a1f9be31add73c52043a1198 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 10 Apr 2024 18:32:43 +0300 Subject: [PATCH 15/22] Add support for changing baud rate --- libraries/PPP/src/PPP.cpp | 51 ++++++++++++++++++++++++++++++++++++--- libraries/PPP/src/PPP.h | 4 ++- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index faac3ea8cdf..b7c9c2f2435 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -5,6 +5,8 @@ #include "esp_netif.h" #include "esp_netif_ppp.h" #include +#include "driver/uart.h" +#include "hal/uart_ll.h" typedef struct { void * arg; } PdpContext; #include "esp_modem_api.h" @@ -150,6 +152,7 @@ PPPClass::PPPClass() ,_rx_buffer_size(4096) ,_tx_buffer_size(512) ,_mode(ESP_MODEM_MODE_COMMAND) + ,_uart_num(UART_NUM_1) { } @@ -207,7 +210,7 @@ bool PPPClass::setPins(int8_t tx, int8_t rx, int8_t rts, int8_t cts, esp_modem_f return true; } -bool PPPClass::begin(ppp_modem_model_t model){ +bool PPPClass::begin(ppp_modem_model_t model, uint8_t uart_num, int baud_rate){ esp_err_t ret = ESP_OK; bool pin_ok = false; int trys = 0; @@ -232,8 +235,12 @@ bool PPPClass::begin(ppp_modem_model_t model){ return false; } - Network.begin(); + _uart_num = uart_num; _esp_modem = this; + + Network.begin(); + + /* Listen for PPP status events */ if(_ppp_ev_instance == NULL && esp_event_handler_instance_register(NETIF_PPP_STATUS, ESP_EVENT_ANY_ID, &_ppp_event_cb, NULL, &_ppp_ev_instance)){ log_e("event_handler_instance_register for NETIF_PPP_STATUS Failed!"); return false; @@ -247,7 +254,7 @@ bool PPPClass::begin(ppp_modem_model_t model){ return false; } - /* attach to receive events */ + /* Attach to receive IP events */ initNetif(ESP_NETIF_ID_PPP); /* Configure the DTE */ @@ -259,6 +266,8 @@ bool PPPClass::begin(ppp_modem_model_t model){ dte_config.uart_config.flow_control = _flow_ctrl; dte_config.uart_config.rx_buffer_size = _rx_buffer_size; dte_config.uart_config.tx_buffer_size = _tx_buffer_size; + dte_config.uart_config.port_num = _uart_num; + dte_config.uart_config.baud_rate = baud_rate; /* Configure the DCE */ 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){ } } else { // try to communicate with the modem - + if(esp_modem_sync(_dce) != ESP_OK){ + log_v("Modem does not respond to AT, maybe in DATA mode? ...exiting network mode"); + esp_modem_set_mode(_dce, ESP_MODEM_MODE_COMMAND); + if(esp_modem_sync(_dce) != ESP_OK){ + log_e("Modem failed to respond to AT!"); + goto err; + } + } } /* enable flow control */ @@ -692,6 +708,33 @@ bool PPPClass::storeProfile(){ return true; } +bool PPPClass::setBaudrate(int baudrate) { + if(_dce == NULL){ + return false; + } + + if(_mode == ESP_MODEM_MODE_DATA){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return false; + } + + esp_err_t err = esp_modem_set_baud(_dce, baudrate); + if (err != ESP_OK) { + log_e("esp_modem_set_baud failed with %d %s", err, esp_err_to_name(err)); + return false; + } + + uint32_t sclk_freq; + err = uart_get_sclk_freq(UART_SCLK_DEFAULT, &sclk_freq); + if(err != ESP_OK){ + log_e("uart_get_sclk_freq failed with %d %s", err, esp_err_to_name(err)); + return false; + } + uart_ll_set_baudrate(UART_LL_GET_HW(_uart_num), (uint32_t)baudrate, sclk_freq); + + return true; +} + bool PPPClass::sms(const char * num, const char * message) { if(_dce == NULL){ diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 461ed2d5a87..24f66870a79 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -29,7 +29,7 @@ class PPPClass: public NetworkInterface { bool setPins(int8_t tx, int8_t rx, int8_t rts=-1, int8_t cts=-1, esp_modem_flow_ctrl_t flow_ctrl=ESP_MODEM_FLOW_CONTROL_NONE); void setResetPin(int8_t rst, bool active_low=true); - bool begin(ppp_modem_model_t model); + bool begin(ppp_modem_model_t model, uint8_t uart_num=1, int baud_rate=115200); void end(); // Modem DCE APIs @@ -51,6 +51,7 @@ class PPPClass: public NetworkInterface { bool reset(); bool storeProfile(); + bool setBaudrate(int baudrate); bool sms(const char * num, const char * message); esp_modem_dce_t * handle() const; @@ -76,6 +77,7 @@ class PPPClass: public NetworkInterface { int _rx_buffer_size; int _tx_buffer_size; esp_modem_dce_mode_t _mode; + uint8_t _uart_num; static bool pppDetachBus(void * bus_pointer); }; From d5cd990f716058ddde6e42f93224c228ff4370e1 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 11 Apr 2024 01:38:45 +0300 Subject: [PATCH 16/22] Fix string input methods and add direct AT command API --- CMakeLists.txt | 4 ++- libraries/PPP/src/PPP.cpp | 61 ++++++++++++++++++++++----------------- libraries/PPP/src/PPP.h | 1 + libraries/PPP/src/ppp.c | 25 ++++++++++++++++ 4 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 libraries/PPP/src/ppp.c diff --git a/CMakeLists.txt b/CMakeLists.txt index eeae7e57104..00552a77f74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -158,7 +158,9 @@ set(ARDUINO_LIBRARY_LittleFS_SRCS libraries/LittleFS/src/LittleFS.cpp) set(ARDUINO_LIBRARY_NetBIOS_SRCS libraries/NetBIOS/src/NetBIOS.cpp) -set(ARDUINO_LIBRARY_PPP_SRCS libraries/PPP/src/PPP.cpp) +set(ARDUINO_LIBRARY_PPP_SRCS + libraries/PPP/src/PPP.cpp + libraries/PPP/src/ppp.c) set(ARDUINO_LIBRARY_Preferences_SRCS libraries/Preferences/src/Preferences.cpp) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index b7c9c2f2435..3739990e872 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -11,6 +11,17 @@ typedef struct { void * arg; } PdpContext; #include "esp_modem_api.h" +// Because of how esp_modem functions are declared, we need to workaround some APIs that take strings as input (output works OK) +// Following APIs work only when called through this interface +extern "C" { + esp_err_t _esp_modem_at(esp_modem_dce_t *dce_wrap, const char *at, char *p_out, int timeout); + esp_err_t _esp_modem_at_raw(esp_modem_dce_t *dce_wrap, const char *cmd, char *p_out, const char *pass, const char *fail, int timeout); + esp_err_t _esp_modem_send_sms(esp_modem_dce_t *dce_wrap, const char *number, const char *message); + esp_err_t _esp_modem_set_pin(esp_modem_dce_t *dce_wrap, const char *pin); + esp_err_t _esp_modem_set_operator(esp_modem_dce_t *dce_wrap, int mode, int format, const char *oper); + esp_err_t _esp_modem_set_network_bands(esp_modem_dce_t *dce_wrap, const char *mode, const int *bands, int size); +}; + static PPPClass * _esp_modem = NULL; static esp_event_handler_instance_t _ppp_ev_instance = NULL; @@ -105,33 +116,14 @@ void PPPClass::_onPppArduinoEvent(arduino_event_id_t event, arduino_event_info_t // PPP Driver Events Callback void PPPClass::_onPppEvent(int32_t event_id, void* event_data){ - arduino_event_t arduino_event; - arduino_event.event_id = ARDUINO_EVENT_MAX; + // arduino_event_t arduino_event; + // arduino_event.event_id = ARDUINO_EVENT_MAX; log_v("PPP Driver Event %ld: %s", event_id, _ppp_event_name(event_id)); - // if (event_id == ETHERNET_EVENT_CONNECTED) { - // log_v("%s Connected", desc()); - // arduino_event.event_id = ARDUINO_EVENT_PPP_CONNECTED; - // arduino_event.event_info.eth_connected = handle(); - // setStatusBits(ESP_NETIF_CONNECTED_BIT); - // } else if (event_id == ETHERNET_EVENT_DISCONNECTED) { - // log_v("%s Disconnected", desc()); - // arduino_event.event_id = ARDUINO_EVENT_PPP_DISCONNECTED; - // clearStatusBits(ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT); - // } else if (event_id == ETHERNET_EVENT_START) { - // log_v("%s Started", desc()); - // arduino_event.event_id = ARDUINO_EVENT_PPP_START; - // setStatusBits(ESP_NETIF_STARTED_BIT); - // } else if (event_id == ETHERNET_EVENT_STOP) { - // log_v("%s Stopped", desc()); - // arduino_event.event_id = ARDUINO_EVENT_PPP_STOP; - // clearStatusBits(ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT | ESP_NETIF_HAS_STATIC_IP_BIT); + // if(arduino_event.event_id < ARDUINO_EVENT_MAX){ + // Network.postEvent(&arduino_event); // } - - if(arduino_event.event_id < ARDUINO_EVENT_MAX){ - Network.postEvent(&arduino_event); - } } esp_modem_dce_t * PPPClass::handle() const { @@ -330,7 +322,7 @@ bool PPPClass::begin(ppp_modem_model_t model, uint8_t uart_num, int baud_rate){ /* check if PIN needed */ if (esp_modem_read_pin(_dce, pin_ok) == ESP_OK && pin_ok == false) { - if (_pin == NULL || esp_modem_set_pin(_dce, _pin) != ESP_OK) { + if (_pin == NULL || _esp_modem_set_pin(_dce, _pin) != ESP_OK) { log_e("PIN verification failed!"); goto err; } @@ -735,7 +727,6 @@ bool PPPClass::setBaudrate(int baudrate) { return true; } - bool PPPClass::sms(const char * num, const char * message) { if(_dce == NULL){ return false; @@ -765,7 +756,7 @@ bool PPPClass::sms(const char * num, const char * message) { return false; } - err = esp_modem_send_sms(_dce, num, message); + err = _esp_modem_send_sms(_dce, num, message); if (err != ESP_OK) { log_e("esp_modem_send_sms() failed with %d %s", err, esp_err_to_name(err)); return false; @@ -773,6 +764,24 @@ bool PPPClass::sms(const char * num, const char * message) { return true; } +String PPPClass::cmd(const char * at_command, int timeout){ + if(_dce == NULL){ + return String(); + } + + if(_mode == ESP_MODEM_MODE_DATA){ + log_e("Wrong modem mode. Should be ESP_MODEM_MODE_COMMAND"); + return String(); + } + char out[128] = {0}; + esp_err_t err = _esp_modem_at(_dce, at_command, out, timeout); + if (err != ESP_OK) { + log_e("esp_modem_at failed %d %s", err, esp_err_to_name(err)); + return String(); + } + return String(out); +} + size_t PPPClass::printDriverInfo(Print & out) const { size_t bytes = 0; if(_dce == NULL || _mode == ESP_MODEM_MODE_DATA){ diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 24f66870a79..81a1276e532 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -53,6 +53,7 @@ class PPPClass: public NetworkInterface { bool setBaudrate(int baudrate); bool sms(const char * num, const char * message); + String cmd(const char * at_command, int timeout); esp_modem_dce_t * handle() const; diff --git a/libraries/PPP/src/ppp.c b/libraries/PPP/src/ppp.c new file mode 100644 index 00000000000..367091d05ef --- /dev/null +++ b/libraries/PPP/src/ppp.c @@ -0,0 +1,25 @@ +#include "esp_modem_api.h" + +esp_err_t _esp_modem_at(esp_modem_dce_t *dce_wrap, const char *at, char *p_out, int timeout){ + return esp_modem_at(dce_wrap, at, p_out, timeout); +} + +esp_err_t _esp_modem_send_sms(esp_modem_dce_t *dce_wrap, const char *number, const char *message){ + return esp_modem_send_sms(dce_wrap, number, message); +} + +esp_err_t _esp_modem_set_pin(esp_modem_dce_t *dce_wrap, const char *pin){ + return esp_modem_set_pin(dce_wrap, pin); +} + +esp_err_t _esp_modem_at_raw(esp_modem_dce_t *dce_wrap, const char *cmd, char *p_out, const char *pass, const char *fail, int timeout){ + return esp_modem_at_raw(dce_wrap, cmd, p_out, pass, fail, timeout); +} + +esp_err_t _esp_modem_set_operator(esp_modem_dce_t *dce_wrap, int mode, int format, const char *oper){ + return esp_modem_set_operator(dce_wrap, mode, format, oper); +} + +esp_err_t _esp_modem_set_network_bands(esp_modem_dce_t *dce_wrap, const char *mode, const int *bands, int size){ + return esp_modem_set_network_bands(dce_wrap, mode, bands, size); +} From ee0366eff85ccabcf1a8c44ab1b503999765f99c Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 11 Apr 2024 13:28:06 +0300 Subject: [PATCH 17/22] Improve example and add some comments to the header --- .../PPP/examples/PPP_Basic/PPP_Basic.ino | 71 ++++++++++--------- libraries/PPP/src/PPP.h | 49 +++++++++---- 2 files changed, 70 insertions(+), 50 deletions(-) diff --git a/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino b/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino index a874d14ce9d..78fda9d18bf 100644 --- a/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino +++ b/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino @@ -4,26 +4,24 @@ #define PPP_MODEM_PIN "0000" // or NULL // WaveShare SIM7600 HW Flow Control -//#define PPP_MODEM_RST 25 -//#define PPP_MODEM_RST_LOW false //active HIGH -//#define PPP_MODEM_TX 21 -//#define PPP_MODEM_RX 22 -//#define PPP_MODEM_RTS 26 -//#define PPP_MODEM_CTS 27 -//#define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_HW -//#define PPP_MODEM_MODEL PPP_MODEM_SIM7600 +#define PPP_MODEM_RST 25 +#define PPP_MODEM_RST_LOW false //active HIGH +#define PPP_MODEM_TX 21 +#define PPP_MODEM_RX 22 +#define PPP_MODEM_RTS 26 +#define PPP_MODEM_CTS 27 +#define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_HW +#define PPP_MODEM_MODEL PPP_MODEM_SIM7600 // SIM800 basic module with just TX,RX and RST -#define PPP_MODEM_RST 0 -#define PPP_MODEM_RST_LOW true //active LOW -#define PPP_MODEM_TX 2 -#define PPP_MODEM_RX 19 -#define PPP_MODEM_RTS -1 -#define PPP_MODEM_CTS -1 -#define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_NONE -#define PPP_MODEM_MODEL PPP_MODEM_SIM800 - -static bool ppp_connected = false; +// #define PPP_MODEM_RST 0 +// #define PPP_MODEM_RST_LOW true //active LOW +// #define PPP_MODEM_TX 2 +// #define PPP_MODEM_RX 19 +// #define PPP_MODEM_RTS -1 +// #define PPP_MODEM_CTS -1 +// #define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_NONE +// #define PPP_MODEM_MODEL PPP_MODEM_SIM800 void onEvent(arduino_event_id_t event, arduino_event_info_t info) { @@ -36,26 +34,16 @@ void onEvent(arduino_event_id_t event, arduino_event_info_t info) break; case ARDUINO_EVENT_PPP_GOT_IP: Serial.println("PPP Got IP"); - Serial.println(PPP); - ppp_connected = true; - break; - case ARDUINO_EVENT_PPP_GOT_IP6: - Serial.println("PPP Got IPv6"); - Serial.println(PPP); break; case ARDUINO_EVENT_PPP_LOST_IP: Serial.println("PPP Lost IP"); - ppp_connected = false; break; case ARDUINO_EVENT_PPP_DISCONNECTED: Serial.println("PPP Disconnected"); - ppp_connected = false; break; case ARDUINO_EVENT_PPP_STOP: Serial.println("PPP Stopped"); - ppp_connected = false; break; - default: break; } @@ -79,22 +67,28 @@ void testClient(const char * host, uint16_t port) { void setup() { Serial.begin(115200); + + // Listen for modem events Network.onEvent(onEvent); + + // Configure the modem PPP.setApn(PPP_MODEM_APN); PPP.setPin(PPP_MODEM_PIN); PPP.setResetPin(PPP_MODEM_RST, PPP_MODEM_RST_LOW); PPP.setPins(PPP_MODEM_TX, PPP_MODEM_RX, PPP_MODEM_RTS, PPP_MODEM_CTS, PPP_MODEM_FC); + Serial.println("Starting the modem. It might take a while!"); PPP.begin(PPP_MODEM_MODEL); - Serial.print("Name: "); Serial.println(PPP.moduleName()); + Serial.print("Manufacturer: "); Serial.println(PPP.cmd("AT+CGMI", 10000)); + Serial.print("Model: "); Serial.println(PPP.moduleName()); Serial.print("IMEI: "); Serial.println(PPP.IMEI()); bool attached = PPP.attached(); if(!attached){ int i=0; unsigned int s = millis(); - Serial.print("Waiting to attach "); + Serial.print("Waiting to connect to network"); while(!attached && ((++i) < 600)){ Serial.print("."); delay(100); @@ -112,18 +106,25 @@ void setup() { Serial.print("IMSI: "); Serial.println(PPP.IMSI()); Serial.print("RSSI: "); Serial.println(PPP.RSSI()); int ber = PPP.BER(); - Serial.print("BER: "); Serial.println(ber); - if(ber){ + if(ber > 0){ + Serial.print("BER: "); Serial.println(ber); Serial.print("NetMode: "); Serial.println(PPP.networkMode()); } -// PPP.mode(ESP_MODEM_MODE_DATA); // Data ONLY mode - PPP.mode(ESP_MODEM_MODE_CMUX); // Data and Commands mode + Serial.println("Switching to data mode..."); + PPP.mode(ESP_MODEM_MODE_CMUX); // Data and Command mixed mode + if(!PPP.waitStatusBits(ESP_NETIF_CONNECTED_BIT, 1000)){ + Serial.println("Failed to connect to internet!"); + } else { + Serial.println("Connected to internet!"); + } + } else { + Serial.println("Failed to connect to network!"); } } void loop() { - if (ppp_connected) { + if (PPP.connected()) { testClient("google.com", 80); } delay(20000); diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 81a1276e532..97ce62a5945 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -23,37 +23,56 @@ class PPPClass: public NetworkInterface { PPPClass(); ~PPPClass(); + bool begin(ppp_modem_model_t model, uint8_t uart_num=1, int baud_rate=115200); + void end(); + + // Required for connecting to internet bool setApn(const char * apn); + + // Required only if the SIM card is protected by PIN bool setPin(const char * pin); + // If the modem supports hardware flow control, it's best to use it bool setPins(int8_t tx, int8_t rx, int8_t rts=-1, int8_t cts=-1, esp_modem_flow_ctrl_t flow_ctrl=ESP_MODEM_FLOW_CONTROL_NONE); - void setResetPin(int8_t rst, bool active_low=true); - bool begin(ppp_modem_model_t model, uint8_t uart_num=1, int baud_rate=115200); - void end(); + // Using the reset pin of the module ensures that proper communication can be achieved + void setResetPin(int8_t rst, bool active_low=true); // Modem DCE APIs int RSSI() const; int BER() const; String IMSI() const; String IMEI() const; - String moduleName() const; - String operatorName() const; - int networkMode() const; - int radioState() const; - bool attached() const; - bool sync() const; - - esp_modem_dce_mode_t mode() const { return _mode; } + String moduleName() const; // modem module name + String operatorName() const; // network operator name + int networkMode() const; // network type (GSM, LTE, etc.) + int radioState() const; // 0:minimal, 1:full + bool attached() const; // true is attached to network + bool sync() const; // true if responds to 'AT' + + // Switch the communication mode bool mode(esp_modem_dce_mode_t m); + esp_modem_dce_mode_t mode() const { return _mode; } - bool powerDown(); - bool reset(); - bool storeProfile(); - + // Change temporary the baud rate of communication bool setBaudrate(int baudrate); + + // Sens SMS message to a number bool sms(const char * num, const char * message); + bool sms(String num, String message){ + return sms(num.c_str(), message.c_str()); + } + + // Send AT command with timeout in milliseconds String cmd(const char * at_command, int timeout); + String cmd(String at_command, int timeout){ + return cmd(at_command.c_str(), timeout); + } + + // untested + bool powerDown(); + bool reset(); + bool storeProfile(); esp_modem_dce_t * handle() const; From 3120cc2bb3226e21645cb6d8b4203a8f32d0ba3f Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Thu, 11 Apr 2024 13:42:56 +0300 Subject: [PATCH 18/22] Fix PPP.end() --- libraries/PPP/src/PPP.cpp | 56 ++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/libraries/PPP/src/PPP.cpp b/libraries/PPP/src/PPP.cpp index 3739990e872..6227fcf7f12 100644 --- a/libraries/PPP/src/PPP.cpp +++ b/libraries/PPP/src/PPP.cpp @@ -96,14 +96,14 @@ static void _ppp_error_cb(esp_modem_terminal_error_t err){ // PPP Arduino Events Callback void PPPClass::_onPppArduinoEvent(arduino_event_id_t event, arduino_event_info_t info){ log_v("PPP Arduino Event %ld: %s", event, Network.eventName(event)); - if(event == ARDUINO_EVENT_PPP_GOT_IP){ - if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) == 0){ - setStatusBits(ESP_NETIF_CONNECTED_BIT); - arduino_event_t arduino_event; - arduino_event.event_id = ARDUINO_EVENT_PPP_CONNECTED; - Network.postEvent(&arduino_event); - } - } else + // if(event == ARDUINO_EVENT_PPP_GOT_IP){ + // if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) == 0){ + // setStatusBits(ESP_NETIF_CONNECTED_BIT); + // arduino_event_t arduino_event; + // arduino_event.event_id = ARDUINO_EVENT_PPP_CONNECTED; + // Network.postEvent(&arduino_event); + // } + // } else if(event == ARDUINO_EVENT_PPP_LOST_IP){ if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) != 0){ clearStatusBits(ESP_NETIF_CONNECTED_BIT); @@ -115,15 +115,24 @@ void PPPClass::_onPppArduinoEvent(arduino_event_id_t event, arduino_event_info_t } // PPP Driver Events Callback -void PPPClass::_onPppEvent(int32_t event_id, void* event_data){ - // arduino_event_t arduino_event; - // arduino_event.event_id = ARDUINO_EVENT_MAX; +void PPPClass::_onPppEvent(int32_t event, void* event_data){ + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_MAX; - log_v("PPP Driver Event %ld: %s", event_id, _ppp_event_name(event_id)); + log_v("PPP Driver Event %ld: %s", event, _ppp_event_name(event)); + + if(event == NETIF_PPP_ERRORNONE){ + if((getStatusBits() & ESP_NETIF_CONNECTED_BIT) == 0){ + setStatusBits(ESP_NETIF_CONNECTED_BIT); + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_PPP_CONNECTED; + Network.postEvent(&arduino_event); + } + } - // if(arduino_event.event_id < ARDUINO_EVENT_MAX){ - // Network.postEvent(&arduino_event); - // } + if(arduino_event.event_id < ARDUINO_EVENT_MAX){ + Network.postEvent(&arduino_event); + } } esp_modem_dce_t * PPPClass::handle() const { @@ -291,11 +300,11 @@ bool PPPClass::begin(ppp_modem_model_t model, uint8_t uart_num, int baud_rate){ if(_pin_rst >= 0){ // wait to be able to talk to the modem log_v("Waiting for response from the modem"); - while(esp_modem_sync(_dce) != ESP_OK && trys < 50){ + while(esp_modem_sync(_dce) != ESP_OK && trys < 100){ trys++; delay(500); } - if(trys >= 50){ + if(trys >= 100){ log_e("Failed to wait for communication"); goto err; } @@ -375,21 +384,26 @@ void PPPClass::end(void) _dce = NULL; } + int8_t pin = -1; if(_pin_tx != -1){ - perimanClearPinBus(_pin_tx); + pin = _pin_tx; _pin_tx = -1; + perimanClearPinBus(pin); } if(_pin_rx != -1){ - perimanClearPinBus(_pin_rx); + pin = _pin_rx; _pin_rx = -1; + perimanClearPinBus(pin); } if(_pin_rts != -1){ - perimanClearPinBus(_pin_rts); + pin = _pin_rts; _pin_rts = -1; + perimanClearPinBus(pin); } if(_pin_cts != -1){ - perimanClearPinBus(_pin_cts); + pin = _pin_cts; _pin_cts = -1; + perimanClearPinBus(pin); } _mode = ESP_MODEM_MODE_COMMAND; From 40b2b847fe9b1b353f6dbc6607dcc1cc1bbf2776 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 12 Apr 2024 11:27:17 +0200 Subject: [PATCH 19/22] LWIP_PPP: Fix compilation (#9484) * Fix compile * add `#include "sdkconfig.h"` --- libraries/PPP/src/ppp.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/PPP/src/ppp.c b/libraries/PPP/src/ppp.c index 367091d05ef..fafd6cc4525 100644 --- a/libraries/PPP/src/ppp.c +++ b/libraries/PPP/src/ppp.c @@ -1,3 +1,5 @@ +#include "sdkconfig.h" +#if CONFIG_LWIP_PPP_SUPPORT #include "esp_modem_api.h" esp_err_t _esp_modem_at(esp_modem_dce_t *dce_wrap, const char *at, char *p_out, int timeout){ @@ -23,3 +25,4 @@ esp_err_t _esp_modem_set_operator(esp_modem_dce_t *dce_wrap, int mode, int forma esp_err_t _esp_modem_set_network_bands(esp_modem_dce_t *dce_wrap, const char *mode, const int *bands, int size){ return esp_modem_set_network_bands(dce_wrap, mode, bands, size); } +#endif // CONFIG_LWIP_PPP_SUPPORT From 52fec1eef23aec68792ba972a8175a048d3e2ed0 Mon Sep 17 00:00:00 2001 From: Lucas Saavedra Vaz <32426024+lucasssvaz@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:41:51 -0300 Subject: [PATCH 20/22] Style Checker and Pre-commit hook CI (#9132) * Add Config * Add Cache and remove pre-commit action * [pre-commit.ci lite] apply automatic fixes * Remove freeze * Fix * Update action * Use latest stable Python 3 version * Improve caching * Improve cache tag * Improve bot message * Fix flake and make Vale manual * Add filter --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Rodrigo Garcia --- .clang-format | 190 +++++++++++++++++++++++++++++++ .codespellrc | 9 ++ .editorconfig | 60 ++++++++++ .flake8 | 12 ++ .github/workflows/pre-commit.yml | 62 ++++++++++ .gitignore | 8 +- .pre-commit-config.yaml | 66 +++++++++++ .prettierignore | 4 + .vale.ini | 118 +++++++++++++++++++ 9 files changed, 528 insertions(+), 1 deletion(-) create mode 100644 .clang-format create mode 100644 .codespellrc create mode 100644 .editorconfig create mode 100644 .flake8 create mode 100644 .github/workflows/pre-commit.yml create mode 100644 .pre-commit-config.yaml create mode 100644 .prettierignore create mode 100644 .vale.ini diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000000..e608f4ed0b0 --- /dev/null +++ b/.clang-format @@ -0,0 +1,190 @@ +# Source: https://github.com/arduino/tooling-project-assets/tree/main/other/clang-format-configuration +--- +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignConsecutiveMacros: None +AlignEscapedNewlines: DontAlign +AlignOperands: Align +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Empty +AllowShortIfStatementsOnASingleLine: AllIfsAndElse +AllowShortLambdasOnASingleLine: Empty +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: No +AttributeMacros: + - __capability +BasedOnStyle: LLVM +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAfterJavaFieldAnnotations: false +BreakBeforeBinaryOperators: NonAssignment +BreakBeforeBraces: Attach +BreakBeforeConceptDeclarations: false +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakConstructorInitializersBeforeComma: false +BreakInheritanceList: BeforeColon +BreakStringLiterals: false +ColumnLimit: 0 +CommentPragmas: '' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 2 +Cpp11BracedListStyle: false +DeriveLineEnding: true +DerivePointerAlignment: true +DisableFormat: false +EmptyLineAfterAccessModifier: Leave +EmptyLineBeforeAccessModifier: Leave +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: true +IndentCaseLabels: true +IndentExternBlock: Indent +IndentGotoLabels: false +IndentPPDirectives: None +IndentRequires: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +LambdaBodyIndentation: Signature +Language: Cpp +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 100000 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PPIndentWidth: -1 +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 1 +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 1 +PenaltyBreakFirstLessLess: 1 +PenaltyBreakOpenParenthesis: 1 +PenaltyBreakString: 1 +PenaltyBreakTemplateDeclaration: 1 +PenaltyExcessCharacter: 1 +PenaltyIndentedWhitespace: 1 +PenaltyReturnTypeOnItsOwnLine: 1 +PointerAlignment: Right +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: false +RemoveBracesLLVM: false +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 0 +SortIncludes: Never +SortJavaStaticImport: Before +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: Leave +SpacesInCStyleCastParentheses: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false +SpacesInLineCommentPrefix: + Minimum: 0 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Auto +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 2 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 00000000000..690782793dd --- /dev/null +++ b/.codespellrc @@ -0,0 +1,9 @@ +[codespell] +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check/.codespellrc +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = ba,licence,ot,dout,als,exten,acount,totaly,pasttime +skip = ./.git,./.licenses,__pycache__,.clang-format,.codespellrc,.editorconfig,.flake8,.prettierignore,.yamllint.yml,.gitignore,boards.txt,platform.txt,programmers.txt +builtin = clear,informal,en-GB_to_en-US +check-filenames = +check-hidden = +write-changes = diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..eda8544321b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,60 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/general/.editorconfig +# See: https://editorconfig.org/ +# The formatting style defined in this file is the official standardized style to be used in all Arduino Tooling +# projects and should not be modified. +# Note: indent style for each file type is defined even when it matches the universal config in order to make it clear +# that this type has an official style. + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{adoc,asc,asciidoc}] +indent_size = 2 +indent_style = space + +[*.{bash,sh}] +indent_size = 2 +indent_style = space + +[*.{c,cc,cp,cpp,cxx,h,hh,hpp,hxx,ii,inl,ino,ixx,pde,tpl,tpp,txx}] +indent_size = 2 +indent_style = space + +[*.{go,mod}] +indent_style = tab + +[*.java] +indent_size = 2 +indent_style = space + +[*.{js,jsx,json,jsonc,json5,ts,tsx}] +indent_size = 2 +indent_style = space + +[*.{md,mdx,mkdn,mdown,markdown}] +indent_size = unset +indent_style = space + +[*.proto] +indent_size = 2 +indent_style = space + +[*.py] +indent_size = 4 +indent_style = space + +[*.svg] +indent_size = 2 +indent_style = space + +[*.{yaml,yml}] +indent_size = 2 +indent_style = space + +[{.gitconfig,.gitmodules}] +indent_style = tab diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000000..881c4c629c2 --- /dev/null +++ b/.flake8 @@ -0,0 +1,12 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python/.flake8 +# See: https://flake8.pycqa.org/en/latest/user/configuration.html +# The code style defined in this file is the official standardized style to be used in all Arduino tooling projects and +# should not be modified. + +[flake8] +doctests = True +# W503 and W504 are mutually exclusive. PEP 8 recommends line break before. +ignore = W503,E203 +max-complexity = 10 +max-line-length = 120 +select = E,W,F,C,N diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000000..08ae9a0c67c --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,62 @@ +name: Pre-commit check + +on: + pull_request: + types: [opened, reopened, synchronize, labeled] + +jobs: + lint: + if: | + contains(github.event.pull_request.labels.*.name, 'Status: Pending Merge') + name: Checking if any fixes are needed + runs-on: ubuntu-latest + steps: + - name: Checkout latest commit + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Set up Python 3 + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Get Python version hash + run: | + echo "Using $(python -VV)" + echo "PY_HASH=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + + - name: Restore pre-commit cache + uses: actions/cache/restore@v4 + id: restore-cache + with: + path: | + ~/.cache/pre-commit + ~/.cache/pip + key: pre-commit|${{ env.PY_HASH }}|${{ hashFiles('.pre-commit-config.yaml', '.github/workflows/pre-commit.yml') }} + + - name: Install python dependencies + run: python -m pip install pre-commit docutils + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v42.0.2 + + - name: Run pre-commit hooks in changed files + run: pre-commit run --color=always --show-diff-on-failure --files ${{ steps.changed-files.outputs.all_changed_files }} + + - name: Save pre-commit cache + uses: actions/cache/save@v4 + if: ${{ always() && steps.restore-cache.outputs.cache-hit != 'true' }} + continue-on-error: true + with: + path: | + ~/.cache/pre-commit + ~/.cache/pip + key: ${{ steps.restore-cache.outputs.cache-primary-key }} + + - name: Push changes using pre-commit-ci-lite + uses: pre-commit-ci/lite-action@v1.0.2 + if: always() + with: + msg: "ci(pre-commit): Apply automatic fixes" diff --git a/.gitignore b/.gitignore index 2eea4128f55..67ae15c2bf9 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ tools/openocd-esp32 # Ignore build folder /build - + # Ignore files built by Visual Studio/Visual Micro [Dd]ebug/ [Rr]elease/ @@ -44,3 +44,9 @@ debug.cfg debug.svd debug_custom.json libraries/Insights/examples/*/*.ino.zip + +# Vale Style +.vale/styles/* +!.vale/styles/Vocab/ +.vale/styles/Vocab/* +!.vale/styles/Vocab/Espressif/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000..bc187482041 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,66 @@ +exclude: ".github/.*" + +default_language_version: + # force all unspecified python hooks to run python3 + python: python3 + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: "v4.5.0" + hooks: + - id: check-case-conflict + - id: check-symlinks + - id: debug-statements + - id: destroyed-symlinks + - id: detect-private-key + - id: end-of-file-fixer + exclude: ^.*\.(bin|BIN)$ + - id: mixed-line-ending + args: [--fix=lf] + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + - repo: https://github.com/codespell-project/codespell + rev: "v2.2.4" + hooks: + - id: codespell + exclude: ^.*\.(svd|SVD)$ + stages: [manual] + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: "v15.0.7" + hooks: + - id: clang-format + types_or: [c, c++] + - repo: https://github.com/psf/black-pre-commit-mirror + rev: "22.10.0" + hooks: + - id: black + types_or: [python] + args: [--line-length=120] #From the arduino code style. Add as argument rather than creating a new config file. + - repo: https://github.com/PyCQA/flake8 + rev: "7.0.0" + hooks: + - id: flake8 + types_or: [python] + additional_dependencies: + - flake8-bugbear + - flake8-comprehensions + - flake8-simplify + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.1.0" + hooks: + - id: prettier + types_or: [yaml] + - repo: https://github.com/errata-ai/vale + rev: "v3.0.7" + hooks: + - id: vale + name: vale-sync + language_version: "1.21.6" + pass_filenames: false + args: [sync] + types_or: [markdown, rst] + stages: [manual] + - id: vale + language_version: "1.21.6" + types_or: [markdown, rst] + stages: [manual] diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000000..58b8966740f --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +__pycache__/ +.clang-format +.licenses/ +/.git/ diff --git a/.vale.ini b/.vale.ini new file mode 100644 index 00000000000..d51d3016a57 --- /dev/null +++ b/.vale.ini @@ -0,0 +1,118 @@ +################### +### Vale Config ### +################### + +# This is a Vale linter configuration file. +# - Repo: arduino-esp32 +# - Based on Default config: v0-1-1 +# It lists all necessary parameters to configure Vale for your project. +# For official documentation on all config settings, see +# https://vale.sh/docs/topics/config + + +############## +### Global ### +############## + +# This section lists core settings applying to Vale itself. + + +# Specify path to external resources (e.g., styles and vocab files). +# The path value may be absolute or relative to this configuration file. +StylesPath = .vale/styles + + +# Specify the minimum alert severity that Vale will report. +MinAlertLevel = suggestion # "suggestion", "warning", or "error" + + +# Specify vocabulary for special treatment. +# Create a folder in /Vocab//and add its name here +# The folder should contain two files: +# - accept.txt -- lists words with accepted case-sensitive spelling +# - reject.txt -- lists words whose occurrences throw an error +# Vocab = Espressif + + +# Specify the packages to import into your project. +# A package is a zip file containing a number of rules (style) written in YAML. +# For a list of official packages, see Package Hub at https://vale.sh/hub/ +# For official documentation on packages, see +# https://vale.sh/docs/topics/packages/ +# Before linting, navigate to your project and run `vale sync` to download +# the official packages specified below. +# Packages = Package1, Package2, \ +# https://example.com/path/to/package/Package.zip +Packages = Google, Microsoft, RedHat, \ +https://dl.espressif.com/dl/esp-vale-config/Espressif-latest.zip + + +############### +### Formats ### +############### + +# This section enables association of "unknown" formats with the ones +# supported by Vale. For official documentation on supported formats, see +# https://vale.sh/docs/topics/scoping/ +[formats] + +# For example, treat MDX files as Markdown files. +# mdx = md + + +################################ +### Format-specific settings ### +################################ + +# This section lists the settings that apply to specific file formats +# based on their glob pattern. +# Settings provided under a more specific glob pattern, +# such as [*.{md,txt}] will override those in [*]. +[*.{md,rst}] + + +# Enable styles to activate all rules included in them. +# BasedOnStyles = Style1, Style2 +BasedOnStyles = Vale, Espressif-latest + + +### Deactivate individual rules ### +### in enabled styles. +# Style1.Rule1 = NO +Vale.Repetition = NO +Vale.Spelling = NO +Espressif-latest.Admonitions = NO +Espressif-latest.Contractions = NO +Espressif-latest.Monospace = NO + + +### Change default severity level ### +### of an activated rule. +# Choose between "suggestion", "warning", or "error". +# Style1.Rule2 = error + + +### Activate individual rules ### +### in non-enabled styles stored in . +# Style1.Rule = YES +Google.Gender = YES +Google.GenderBias = YES +Google.Slang = YES +Google.Spacing = YES +Microsoft.DateNumbers = YES +Microsoft.Ellipses = YES +Microsoft.FirstPerson = YES +Microsoft.Hyphens = YES +Microsoft.Ordinal = YES +Microsoft.OxfordComma = YES +Microsoft.Percentages = YES +Microsoft.RangeTime = YES +Microsoft.Semicolon = YES +Microsoft.SentenceLength = YES +Microsoft.Suspended = YES +Microsoft.Units = YES +Microsoft.URLFormat = YES +Microsoft.We = YES +Microsoft.Wordiness = YES +RedHat.Contractions = YES +RedHat.RepeatedWords = YES From d8cab9c518ae67744eb9d3fb2326fb151521c97b Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 15 Apr 2024 19:52:52 +0300 Subject: [PATCH 21/22] add change to re-trigger the CI --- libraries/PPP/src/PPP.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 97ce62a5945..5b9768af4c2 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -1,5 +1,4 @@ #pragma once - #include "sdkconfig.h" #if CONFIG_LWIP_PPP_SUPPORT #include "Network.h" From 2fc7462744e5b8a0448707d837eba9500ce54bff Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Mon, 15 Apr 2024 22:27:16 +0300 Subject: [PATCH 22/22] trigger CI --- libraries/PPP/src/PPP.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/PPP/src/PPP.h b/libraries/PPP/src/PPP.h index 5b9768af4c2..97ce62a5945 100644 --- a/libraries/PPP/src/PPP.h +++ b/libraries/PPP/src/PPP.h @@ -1,4 +1,5 @@ #pragma once + #include "sdkconfig.h" #if CONFIG_LWIP_PPP_SUPPORT #include "Network.h"