diff --git a/CHANGELOG.md b/CHANGELOG.md index 85f9de8b5..af9878076 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,11 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [10.1.0.2] +## [10.1.0.3] +### Added +- Command ``SSerialConfig `` to change Serial Bridge configuration +## [10.1.0.2] 20211225 ### Changed - TasmotaSerial library from v3.3.0 to v3.4.0 - reverted (#14153) - Force initial serial configuration even if no serial GPIO's are enabled (#14153) @@ -14,7 +17,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Serial broken after #14153 - reverted -## [10.1.0.1] +## [10.1.0.1] 20211223 ### Added - PWM Dimmer two button support (#13993) - Device Group Send full status item (#14045) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 17420cb6b..f576311fe 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -100,8 +100,9 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v10.1.0.2 +## Changelog v10.1.0.3 ### Added +- Command ``SSerialConfig `` to change Serial Bridge configuration - PWM Dimmer two button support [#13993](https://github.com/arendst/Tasmota/issues/13993) - Device Group Send full status item [#14045](https://github.com/arendst/Tasmota/issues/14045) - Support for MAX7219 Dot Matrix displays [#14091](https://github.com/arendst/Tasmota/issues/14091) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 387ba8f33..508cd0c29 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -548,6 +548,7 @@ // Commands xdrv_08_serial_bridge.ino #define D_CMND_SSERIALSEND "SSerialSend" #define D_CMND_SBAUDRATE "SBaudrate" +#define D_CMND_SSERIALCONFIG "SSerialConfig" #define D_JSON_SSERIALRECEIVED "SSerialReceived" // Commands xdrv_09_timers.ino diff --git a/tasmota/settings.h b/tasmota/settings.h index 8b7d1a956..b35f15ccc 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -487,8 +487,9 @@ typedef struct { int32_t energy_kWhyesterday_ph[3]; // 320 int32_t energy_kWhtotal_ph[3]; // 32C - uint8_t free_338[7]; // 338 + uint8_t free_338[6]; // 338 + uint8_t sserial_config; // 33E uint8_t tuyamcu_topic; // 33F Manage tuyaSend topic. ex_energy_power_delta on 6.6.0.20, replaced on 8.5.0.1 uint16_t domoticz_update_timer; // 340 uint16_t pwm_range; // 342 @@ -595,10 +596,10 @@ typedef struct { uint16_t influxdb_port; // 4CE power_t interlock[MAX_INTERLOCKS_SET]; // 4D0 MAX_INTERLOCKS = MAX_RELAYS / 2 - int8_t shutter_tilt_config[5][MAX_SHUTTERS]; //508 int8_t shutter_tilt_pos[MAX_SHUTTERS]; //51C uint16_t influxdb_period; // 520 + uint8_t free_522[10]; // 522 uint16_t mqtt_keepalive; // 52C diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 5dfc21424..3f145c564 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -1472,6 +1472,9 @@ void SettingsDelta(void) { #endif } } + if (Settings->version < 0x0A010003) { + Settings->sserial_config = Settings->serial_config; + } Settings->version = VERSION; SettingsSave(1); diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index b01a7f2e2..1666cc661 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0A010002; +const uint32_t VERSION = 0x0A010003; #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/xdrv_08_serial_bridge.ino b/tasmota/xdrv_08_serial_bridge.ino index aac2c1bea..50a457fc5 100644 --- a/tasmota/xdrv_08_serial_bridge.ino +++ b/tasmota/xdrv_08_serial_bridge.ino @@ -28,10 +28,10 @@ const uint8_t SERIAL_BRIDGE_BUFFER_SIZE = 130; const char kSerialBridgeCommands[] PROGMEM = "|" // No prefix - D_CMND_SSERIALSEND "|" D_CMND_SBAUDRATE; + D_CMND_SSERIALSEND "|" D_CMND_SBAUDRATE "|" D_CMND_SSERIALCONFIG; void (* const SerialBridgeCommand[])(void) PROGMEM = { - &CmndSSerialSend, &CmndSBaudrate }; + &CmndSSerialSend, &CmndSBaudrate, &CmndSSerialConfig }; #include @@ -43,8 +43,32 @@ int serial_bridge_in_byte_counter = 0; bool serial_bridge_active = true; bool serial_bridge_raw = false; -void SerialBridgeInput(void) -{ +/********************************************************************************************/ + +bool SetSSerialBegin(void) { + uint32_t config; +#ifdef ESP8266 + config = pgm_read_byte(kTasmotaSerialConfig + Settings->sserial_config); +#endif // ESP8266 +#ifdef ESP32 + config = pgm_read_dword(kTasmotaSerialConfig + Settings->sserial_config); +#endif // ESP32 + return SerialBridgeSerial->begin(Settings->sbaudrate * 300, config); // Reinitialize serial port with new baud rate +} + +void SetSSerialConfig(uint32_t serial_config) { + if (serial_config > TS_SERIAL_8O2) { + serial_config = TS_SERIAL_8N1; + } + if (serial_config != Settings->sserial_config) { + Settings->sserial_config = serial_config; + SetSSerialBegin(); + } +} + +/********************************************************************************************/ + +void SerialBridgeInput(void) { while (SerialBridgeSerial->available()) { yield(); uint8_t serial_in_byte = SerialBridgeSerial->read(); @@ -106,7 +130,7 @@ void SerialBridgeInit(void) serial_bridge_active = false; if (PinUsed(GPIO_SBR_RX) && PinUsed(GPIO_SBR_TX)) { SerialBridgeSerial = new TasmotaSerial(Pin(GPIO_SBR_RX), Pin(GPIO_SBR_TX), HARDWARE_FALLBACK); - if (SerialBridgeSerial->begin(Settings->sbaudrate * 300)) { // Baud rate is stored div 300 so it fits into 16 bits + if (SetSSerialBegin()) { if (SerialBridgeSerial->hardwareSerial()) { ClaimSerial(); serial_bridge_buffer = TasmotaGlobal.serial_in_buffer; // Use idle serial buffer to save RAM @@ -168,16 +192,36 @@ void CmndSSerialSend(void) } } -void CmndSBaudrate(void) -{ +void CmndSBaudrate(void) { if (XdrvMailbox.payload >= 300) { XdrvMailbox.payload /= 300; // Make it a valid baudrate Settings->sbaudrate = XdrvMailbox.payload; - SerialBridgeSerial->begin(Settings->sbaudrate * 300); // Reinitialize serial port with new baud rate + SetSSerialBegin(); } ResponseCmndNumber(Settings->sbaudrate * 300); } +void CmndSSerialConfig(void) { + // See TasmotaSerialConfig for possible options + // SSerialConfig 0..23 where 3 equals 8N1 + // SSerialConfig 8N1 + + if (XdrvMailbox.data_len > 0) { + if (XdrvMailbox.data_len < 3) { // Use 0..23 as serial config option + if ((XdrvMailbox.payload >= TS_SERIAL_5N1) && (XdrvMailbox.payload <= TS_SERIAL_8O2)) { + SetSSerialConfig(XdrvMailbox.payload); + } + } + else if ((XdrvMailbox.payload >= 5) && (XdrvMailbox.payload <= 8)) { + int8_t serial_config = ParseSerialConfig(XdrvMailbox.data); + if (serial_config >= 0) { + SetSSerialConfig(serial_config); + } + } + } + ResponseCmndChar(GetSerialConfig(Settings->sserial_config).c_str()); +} + /*********************************************************************************************\ * Interface \*********************************************************************************************/