mirror of https://github.com/arendst/Tasmota.git
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)
This commit is contained in:
parent
69f903618d
commit
783631903d
|
@ -6,11 +6,13 @@ All notable changes to this project will be documented in this file.
|
||||||
## [12.2.0.5]
|
## [12.2.0.5]
|
||||||
### Added
|
### Added
|
||||||
- ESP32 DS18x20 parasitic power usage when defining W1_PARASITE_POWER (#17112)
|
- 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
|
### Breaking Changed
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- Serial Bridge default internal serial rx buffer size from 64 to 256 (#17120)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- ModbusBridge baudrates over 76500 baud (#17106)
|
- ModbusBridge baudrates over 76500 baud (#17106)
|
||||||
|
|
|
@ -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 ``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 ``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 ``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 ``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)
|
- 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 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 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)
|
- 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 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 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)
|
- 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)
|
- 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)
|
- 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)
|
- ADE7953 monitoring from instant power to accumulated energy [#16941](https://github.com/arendst/Tasmota/issues/16941)
|
||||||
|
|
|
@ -780,6 +780,7 @@
|
||||||
#define SR04_MAX_SENSOR_DISTANCE 500 // Set sensor max detection distance
|
#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_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 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 // 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_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)
|
//#define USE_TCP_BRIDGE // Add support for Serial to TCP bridge (+1.3k code)
|
||||||
|
|
|
@ -27,6 +27,16 @@
|
||||||
|
|
||||||
#define USE_SERIAL_BRIDGE_TEE
|
#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
|
const char kSerialBridgeCommands[] PROGMEM = "|" // No prefix
|
||||||
D_CMND_SSERIALSEND "|" D_CMND_SBAUDRATE "|" D_CMND_SSERIALBUFFER "|" D_CMND_SSERIALCONFIG;
|
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 };
|
&CmndSSerialSend, &CmndSBaudrate, &CmndSSerialBuffer, &CmndSSerialConfig };
|
||||||
|
|
||||||
#include <TasmotaSerial.h>
|
#include <TasmotaSerial.h>
|
||||||
|
|
||||||
#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;
|
TasmotaSerial *SerialBridgeSerial = nullptr;
|
||||||
|
|
||||||
unsigned long serial_bridge_polling_window = 0;
|
unsigned long serial_bridge_polling_window = 0;
|
||||||
|
@ -94,7 +95,7 @@ void SerialBridgeInput(void) {
|
||||||
static bool serial_bridge_overrun = false;
|
static bool serial_bridge_overrun = false;
|
||||||
|
|
||||||
if (isprint(serial_in_byte)) { // Any char between 32 and 127
|
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;
|
serial_bridge_buffer[serial_bridge_in_byte_counter++] = serial_in_byte;
|
||||||
} else {
|
} else {
|
||||||
serial_bridge_overrun = true; // Signal overrun but continue reading input to flush until '\n' (EOL)
|
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
|
((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
|
!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
|
!in_byte_is_delimiter) { // Char is not a delimiter
|
||||||
serial_bridge_buffer[serial_bridge_in_byte_counter++] = serial_in_byte;
|
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
|
in_byte_is_delimiter) { // Char is delimiter
|
||||||
serial_bridge_polling_window = 0; // Publish now
|
serial_bridge_polling_window = 0; // Publish now
|
||||||
break;
|
break;
|
||||||
|
@ -182,13 +183,14 @@ void SerialBridgeInput(void) {
|
||||||
|
|
||||||
void SerialBridgeInit(void) {
|
void SerialBridgeInit(void) {
|
||||||
if (PinUsed(GPIO_SBR_RX) && PinUsed(GPIO_SBR_TX)) {
|
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 (SetSSerialBegin()) {
|
||||||
if (SerialBridgeSerial->hardwareSerial()) {
|
if (SerialBridgeSerial->hardwareSerial()) {
|
||||||
ClaimSerial();
|
ClaimSerial();
|
||||||
serial_bridge_buffer = TasmotaGlobal.serial_in_buffer; // Use idle serial buffer to save RAM
|
serial_bridge_buffer = TasmotaGlobal.serial_in_buffer; // Use idle serial buffer to save RAM
|
||||||
} else {
|
} else {
|
||||||
serial_bridge_buffer = (char*)(malloc(SERIAL_BRIDGE_BUFFER_SIZE));
|
serial_bridge_buffer = (char*)(malloc(SERIAL_BRIDGE_BUFSIZE));
|
||||||
}
|
}
|
||||||
SerialBridgeSerial->flush();
|
SerialBridgeSerial->flush();
|
||||||
SerialBridgePrintf("\r\n");
|
SerialBridgePrintf("\r\n");
|
||||||
|
@ -271,15 +273,15 @@ void CmndSSerialBuffer(void) {
|
||||||
// between MIN_INPUT_BUFFER_SIZE and MAX_INPUT_BUFFER_SIZE characters
|
// between MIN_INPUT_BUFFER_SIZE and MAX_INPUT_BUFFER_SIZE characters
|
||||||
CmndSerialBuffer();
|
CmndSerialBuffer();
|
||||||
} else {
|
} 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
|
// ESP32 (hardware serial only): between MIN_INPUT_BUFFER_SIZE and MAX_INPUT_BUFFER_SIZE characters
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
size_t size = XdrvMailbox.payload;
|
size_t size = XdrvMailbox.payload;
|
||||||
if (XdrvMailbox.payload < SERIAL_BRIDGE_BUFFER_MIN_SIZE) {
|
if (XdrvMailbox.payload < MIN_INPUT_BUFFER_SIZE) {
|
||||||
size = SERIAL_BRIDGE_BUFFER_MIN_SIZE; // 64 / 256
|
size = MIN_INPUT_BUFFER_SIZE; // 256 / 256
|
||||||
}
|
}
|
||||||
else if (XdrvMailbox.payload > SERIAL_BRIDGE_BUFFER_SIZE) {
|
else if (XdrvMailbox.payload > SERIAL_BRIDGE_BUFSIZE) {
|
||||||
size = SERIAL_BRIDGE_BUFFER_SIZE; // 256 / 800
|
size = SERIAL_BRIDGE_BUFSIZE; // 256 / 800
|
||||||
}
|
}
|
||||||
SerialBridgeSerial->setRxBufferSize(size);
|
SerialBridgeSerial->setRxBufferSize(size);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue