From 783631903dfa742f2a66c42f8a8fab5e341239ca Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 18 Nov 2022 16:21:54 +0100 Subject: [PATCH] Add user control over Serial Bridge buffers - Add optional define ``SERIAL_BRIDGE_BUFFER_SIZE`` to set Serial Bridge internal buffer size (Default ESP8266 = 256, ESP32 = 800) - Add command ``SSerialBuffer 256..SERIAL_BRIDGE_BUFFER_SIZE`` to change serial bridge rx buffer size (#17120) --- CHANGELOG.md | 4 +- RELEASENOTES.md | 4 +- tasmota/my_user_config.h | 1 + .../xdrv_08_serial_bridge.ino | 40 ++++++++++--------- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbc9cc693..742e3e45d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,13 @@ All notable changes to this project will be documented in this file. ## [12.2.0.5] ### Added - ESP32 DS18x20 parasitic power usage when defining W1_PARASITE_POWER (#17112) -- Command ``SSerialBuffer 64..256`` to change software serial bridge receive buffer size from default (64) to max local buffer size (256) (#17120) +- Optional define ``SERIAL_BRIDGE_BUFFER_SIZE`` to set Serial Bridge internal buffer size (Default ESP8266 = 256, ESP32 = 800) +- Command ``SSerialBuffer 256..SERIAL_BRIDGE_BUFFER_SIZE`` to change serial bridge rx buffer size (#17120) ### Breaking Changed ### Changed +- Serial Bridge default internal serial rx buffer size from 64 to 256 (#17120) ### Fixed - ModbusBridge baudrates over 76500 baud (#17106) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7d52cd8f2..230f65435 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,9 +112,10 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``SetOption47 1..255`` to delay power on relay state in seconds reducing power surge. ``SO47 1`` delays until network connected. ``SO47 2`` delays until mqtt connected - Command ``RgxClients`` for range extender clients list [#17048](https://github.com/arendst/Tasmota/issues/17048) - Command ``RgxPort [tcp|udp], gateway_port, client_mac, client_port`` for range extender port forwardings [#17092](https://github.com/arendst/Tasmota/issues/17092) -- Command ``SSerialBuffer 64..256`` to change software serial bridge receive buffer size from default (64) to max local buffer size (256) [#17120](https://github.com/arendst/Tasmota/issues/17120) +- Command ``SSerialBuffer 256..SERIAL_BRIDGE_BUFFER_SIZE`` to change serial bridge rx buffer size [#17120](https://github.com/arendst/Tasmota/issues/17120) - Command ``SwitchMode 16`` sending only MQTT message on inverted switch change [#17028](https://github.com/arendst/Tasmota/issues/17028) - Command NeoPool ``NPFiltration 2`` toggle [#16859](https://github.com/arendst/Tasmota/issues/16859) +- Optional define ``SERIAL_BRIDGE_BUFFER_SIZE`` to set Serial Bridge internal buffer size (Default ESP8266 = 256, ESP32 = 800) - Support for two phase power calibration using commands ``PowerSet2``, ``VoltageSet2`` and ``CurrentSet2`` - Support for Shelly Pro 1/1PM and 2/2PM [#16773](https://github.com/arendst/Tasmota/issues/16773) - Support for up to four DS18x20 GPIOs by md5sum-as [#16833](https://github.com/arendst/Tasmota/issues/16833) @@ -138,6 +139,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - ESP32 Framework (Core) from v2.0.5 to v2.0.5.3 - ESP32 LVGL library from v8.3.2 to v8.3.3 (no functional change) - ESP32 NimBLE library from v1.4.0 to v1.4.1 [#16775](https://github.com/arendst/Tasmota/issues/16775) +- Serial Bridge default internal serial rx buffer size from 64 to 256 [#17120](https://github.com/arendst/Tasmota/issues/17120) - DS18x20 ``DS18Alias`` to ``DS18Sens`` [#16833](https://github.com/arendst/Tasmota/issues/16833) - Compiling with reduced boards manifests in favour of Autoconfig [#16848](https://github.com/arendst/Tasmota/issues/16848) - ADE7953 monitoring from instant power to accumulated energy [#16941](https://github.com/arendst/Tasmota/issues/16941) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 725c55d9b..f5d80c0f1 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -780,6 +780,7 @@ #define SR04_MAX_SENSOR_DISTANCE 500 // Set sensor max detection distance //#define USE_DYP // Add support for DYP ME-007 ultrasonic distance sensor, serial port version (+0k5 code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) +// #define SERIAL_BRIDGE_BUFFER_SIZE 256 // Serial Bridge receive buffer size (Default ESP8266 = 256, ESP32 = 800) //#define USE_MODBUS_BRIDGE // Add support for software Modbus Bridge (+4.5k code) //#define USE_MODBUS_BRIDGE_TCP // Add support for software Modbus TCP Bridge (also enable Modbus TCP Bridge) (+2k code) //#define USE_TCP_BRIDGE // Add support for Serial to TCP bridge (+1.3k code) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_08_serial_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_08_serial_bridge.ino index aae239e10..92bbeceb5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_08_serial_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_08_serial_bridge.ino @@ -27,6 +27,16 @@ #define USE_SERIAL_BRIDGE_TEE +#ifdef SERIAL_BRIDGE_BUFFER_SIZE +const uint16_t SERIAL_BRIDGE_BUFSIZE = SERIAL_BRIDGE_BUFFER_SIZE; +#else +#ifdef ESP8266 +const uint16_t SERIAL_BRIDGE_BUFSIZE = MIN_INPUT_BUFFER_SIZE; // 256 +#else +const uint16_t SERIAL_BRIDGE_BUFSIZE = INPUT_BUFFER_SIZE; // 800 +#endif // ESP32 +#endif // SERIAL_BRIDGE_BUFFER_SIZE + const char kSerialBridgeCommands[] PROGMEM = "|" // No prefix D_CMND_SSERIALSEND "|" D_CMND_SBAUDRATE "|" D_CMND_SSERIALBUFFER "|" D_CMND_SSERIALCONFIG; @@ -34,15 +44,6 @@ void (* const SerialBridgeCommand[])(void) PROGMEM = { &CmndSSerialSend, &CmndSBaudrate, &CmndSSerialBuffer, &CmndSSerialConfig }; #include - -#ifdef ESP8266 -const uint16_t SERIAL_BRIDGE_BUFFER_MIN_SIZE = TM_SERIAL_BUFFER_SIZE; // 64 (TasmotaSerial.h) -const uint16_t SERIAL_BRIDGE_BUFFER_SIZE = MIN_INPUT_BUFFER_SIZE; // 256 -#else -const uint16_t SERIAL_BRIDGE_BUFFER_MIN_SIZE = MIN_INPUT_BUFFER_SIZE; // 256 -const uint16_t SERIAL_BRIDGE_BUFFER_SIZE = INPUT_BUFFER_SIZE; // 800 -#endif - TasmotaSerial *SerialBridgeSerial = nullptr; unsigned long serial_bridge_polling_window = 0; @@ -94,7 +95,7 @@ void SerialBridgeInput(void) { static bool serial_bridge_overrun = false; if (isprint(serial_in_byte)) { // Any char between 32 and 127 - if (serial_bridge_in_byte_counter < SERIAL_BRIDGE_BUFFER_SIZE -1) { // Add char to string if it still fits + if (serial_bridge_in_byte_counter < SERIAL_BRIDGE_BUFSIZE -1) { // Add char to string if it still fits serial_bridge_buffer[serial_bridge_in_byte_counter++] = serial_in_byte; } else { serial_bridge_overrun = true; // Signal overrun but continue reading input to flush until '\n' (EOL) @@ -128,12 +129,12 @@ void SerialBridgeInput(void) { ((Settings->serial_delimiter == 128) && !isprint(serial_in_byte))) && // Any char not between 32 and 127 !serial_bridge_raw; // In raw mode (CMND_SERIALSEND3) there is never a delimiter - if ((serial_bridge_in_byte_counter < SERIAL_BRIDGE_BUFFER_SIZE -1) && // Add char to string if it still fits and ... + if ((serial_bridge_in_byte_counter < SERIAL_BRIDGE_BUFSIZE -1) && // Add char to string if it still fits and ... !in_byte_is_delimiter) { // Char is not a delimiter serial_bridge_buffer[serial_bridge_in_byte_counter++] = serial_in_byte; } - if ((serial_bridge_in_byte_counter >= SERIAL_BRIDGE_BUFFER_SIZE -1) || // Send message when buffer is full or ... + if ((serial_bridge_in_byte_counter >= SERIAL_BRIDGE_BUFSIZE -1) || // Send message when buffer is full or ... in_byte_is_delimiter) { // Char is delimiter serial_bridge_polling_window = 0; // Publish now break; @@ -182,13 +183,14 @@ void SerialBridgeInput(void) { void SerialBridgeInit(void) { if (PinUsed(GPIO_SBR_RX) && PinUsed(GPIO_SBR_TX)) { - SerialBridgeSerial = new TasmotaSerial(Pin(GPIO_SBR_RX), Pin(GPIO_SBR_TX), HARDWARE_FALLBACK); +// SerialBridgeSerial = new TasmotaSerial(Pin(GPIO_SBR_RX), Pin(GPIO_SBR_TX), HARDWARE_FALLBACK); // Default TM_SERIAL_BUFFER_SIZE (=64) size + SerialBridgeSerial = new TasmotaSerial(Pin(GPIO_SBR_RX), Pin(GPIO_SBR_TX), HARDWARE_FALLBACK, 0, MIN_INPUT_BUFFER_SIZE); // 256 if (SetSSerialBegin()) { if (SerialBridgeSerial->hardwareSerial()) { ClaimSerial(); serial_bridge_buffer = TasmotaGlobal.serial_in_buffer; // Use idle serial buffer to save RAM } else { - serial_bridge_buffer = (char*)(malloc(SERIAL_BRIDGE_BUFFER_SIZE)); + serial_bridge_buffer = (char*)(malloc(SERIAL_BRIDGE_BUFSIZE)); } SerialBridgeSerial->flush(); SerialBridgePrintf("\r\n"); @@ -271,15 +273,15 @@ void CmndSSerialBuffer(void) { // between MIN_INPUT_BUFFER_SIZE and MAX_INPUT_BUFFER_SIZE characters CmndSerialBuffer(); } else { - // ESP8266 (software serial): between TM_SERIAL_BUFFER_SIZE and SERIAL_BRIDGE_BUFFER_SIZE characters + // ESP8266 (software serial): between MIN_INPUT_BUFFER_SIZE and SERIAL_BRIDGE_BUFSIZE characters // ESP32 (hardware serial only): between MIN_INPUT_BUFFER_SIZE and MAX_INPUT_BUFFER_SIZE characters if (XdrvMailbox.data_len > 0) { size_t size = XdrvMailbox.payload; - if (XdrvMailbox.payload < SERIAL_BRIDGE_BUFFER_MIN_SIZE) { - size = SERIAL_BRIDGE_BUFFER_MIN_SIZE; // 64 / 256 + if (XdrvMailbox.payload < MIN_INPUT_BUFFER_SIZE) { + size = MIN_INPUT_BUFFER_SIZE; // 256 / 256 } - else if (XdrvMailbox.payload > SERIAL_BRIDGE_BUFFER_SIZE) { - size = SERIAL_BRIDGE_BUFFER_SIZE; // 256 / 800 + else if (XdrvMailbox.payload > SERIAL_BRIDGE_BUFSIZE) { + size = SERIAL_BRIDGE_BUFSIZE; // 256 / 800 } SerialBridgeSerial->setRxBufferSize(size); }