add command tcpbridgeconfig

This commit is contained in:
Barbudor 2021-11-04 17:14:34 +01:00
parent 128f7723d1
commit 79f5c1285f
4 changed files with 61 additions and 31 deletions

View File

@ -733,8 +733,9 @@ typedef struct {
uint8_t shd_leading_edge; // F5B uint8_t shd_leading_edge; // F5B
uint16_t shd_warmup_brightness; // F5C uint16_t shd_warmup_brightness; // F5C
uint8_t shd_warmup_time; // F5E uint8_t shd_warmup_time; // F5E
uint8_t tcp_config; // F5F
uint8_t free_f5f[61]; // F5F - Decrement if adding new Setting variables just above and below uint8_t free_f60[60]; // F60 - Decrement if adding new Setting variables just above and below
// Only 32 bit boundary variables below // Only 32 bit boundary variables below

View File

@ -1818,7 +1818,7 @@ uint32_t JsonParsePath(JsonParserObject *jobj, const char *spath, char delim, fl
* Serial * Serial
\*********************************************************************************************/ \*********************************************************************************************/
String GetSerialConfig(void) { String GetSerialConfig(uint8_t serial_config) {
// Settings->serial_config layout // Settings->serial_config layout
// b000000xx - 5, 6, 7 or 8 data bits // b000000xx - 5, 6, 7 or 8 data bits
// b00000x00 - 1 or 2 stop bits // b00000x00 - 1 or 2 stop bits
@ -1827,13 +1827,49 @@ String GetSerialConfig(void) {
const static char kParity[] PROGMEM = "NEOI"; const static char kParity[] PROGMEM = "NEOI";
char config[4]; char config[4];
config[0] = '5' + (Settings->serial_config & 0x3); config[0] = '5' + (serial_config & 0x3);
config[1] = pgm_read_byte(&kParity[(Settings->serial_config >> 3) & 0x3]); config[1] = pgm_read_byte(&kParity[(serial_config >> 3) & 0x3]);
config[2] = '1' + ((Settings->serial_config >> 2) & 0x1); config[2] = '1' + ((serial_config >> 2) & 0x1);
config[3] = '\0'; config[3] = '\0';
return String(config); return String(config);
} }
String GetSerialConfig(void) {
return GetSerialConfig(Settings->serial_config);
}
int8_t ParseSerialConfig(const char *pstr)
{
if (strlen(pstr) < 3)
return -1;
int8_t serial_config = (uint8_t)atoi(pstr);
if (serial_config < 5 || serial_config > 8)
return -1;
serial_config -= 5;
char parity = (pstr[1] & 0xdf);
if ('E' == parity) {
serial_config += 0x08; // Even parity
}
else if ('O' == parity) {
serial_config += 0x10; // Odd parity
}
else if ('N' != parity) {
return -1;
}
if ('2' == pstr[2]) {
serial_config += 0x04; // Stop bits 2
}
else if ('1' != pstr[2]) {
return -1;
}
return serial_config;
}
#if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3 #if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3
// temporary workaround, see https://github.com/espressif/arduino-esp32/issues/5287 // temporary workaround, see https://github.com/espressif/arduino-esp32/issues/5287
#include <driver/uart.h> #include <driver/uart.h>

View File

@ -1525,28 +1525,8 @@ void CmndSerialConfig(void)
} }
} }
else if ((XdrvMailbox.payload >= 5) && (XdrvMailbox.payload <= 8)) { else if ((XdrvMailbox.payload >= 5) && (XdrvMailbox.payload <= 8)) {
uint8_t serial_config = XdrvMailbox.payload -5; // Data bits 5, 6, 7 or 8, No parity and 1 stop bit int8_t serial_config = ParseSerialConfig(XdrvMailbox.data);
if (serial_config >= 0) {
bool valid = true;
char parity = (XdrvMailbox.data[1] & 0xdf);
if ('E' == parity) {
serial_config += 0x08; // Even parity
}
else if ('O' == parity) {
serial_config += 0x10; // Odd parity
}
else if ('N' != parity) {
valid = false;
}
if ('2' == XdrvMailbox.data[2]) {
serial_config += 0x04; // Stop bits 2
}
else if ('1' != XdrvMailbox.data[2]) {
valid = false;
}
if (valid) {
SetSerialConfig(serial_config); SetSerialConfig(serial_config);
} }
} }

View File

@ -41,11 +41,11 @@ IPAddress ip_filter;
TasmotaSerial *TCPSerial = nullptr; TasmotaSerial *TCPSerial = nullptr;
const char kTCPCommands[] PROGMEM = "TCP" "|" // prefix const char kTCPCommands[] PROGMEM = "TCP" "|" // prefix
"Start" "|" "Baudrate" "Start" "|" "Baudrate" "|" "Config"
; ;
void (* const TCPCommand[])(void) PROGMEM = { void (* const TCPCommand[])(void) PROGMEM = {
&CmndTCPStart, &CmndTCPBaudrate &CmndTCPStart, &CmndTCPBaudrate, &CmndTCPConfig
}; };
// //
@ -136,12 +136,14 @@ void TCPLoop(void)
/********************************************************************************************/ /********************************************************************************************/
void TCPInit(void) { void TCPInit(void) {
if (PinUsed(GPIO_TCP_RX) && PinUsed(GPIO_TCP_TX)) { if (PinUsed(GPIO_TCP_RX) && PinUsed(GPIO_TCP_TX)) {
if (0 == (0x80 & Settings->tcp_config)) // !0x80 means unitialized
Settings->tcp_config = 0x80 | ParseSerialConfig("8N1"); // default as 8N1 for backward compatibility
tcp_buf = (uint8_t*) malloc(TCP_BRIDGE_BUF_SIZE); tcp_buf = (uint8_t*) malloc(TCP_BRIDGE_BUF_SIZE);
if (!tcp_buf) { AddLog(LOG_LEVEL_ERROR, PSTR(D_LOG_TCP "could not allocate buffer")); return; } if (!tcp_buf) { AddLog(LOG_LEVEL_ERROR, PSTR(D_LOG_TCP "could not allocate buffer")); return; }
if (!Settings->tcp_baudrate) { Settings->tcp_baudrate = 115200 / 1200; } if (!Settings->tcp_baudrate) { Settings->tcp_baudrate = 115200 / 1200; }
TCPSerial = new TasmotaSerial(Pin(GPIO_TCP_RX), Pin(GPIO_TCP_TX), TasmotaGlobal.seriallog_level ? 1 : 2, 0, TCP_BRIDGE_BUF_SIZE); // set a receive buffer of 256 bytes TCPSerial = new TasmotaSerial(Pin(GPIO_TCP_RX), Pin(GPIO_TCP_TX), TasmotaGlobal.seriallog_level ? 1 : 2, 0, TCP_BRIDGE_BUF_SIZE); // set a receive buffer of 256 bytes
TCPSerial->begin(Settings->tcp_baudrate * 1200); TCPSerial->begin(Settings->tcp_baudrate * 1200, 0x7F & Settings->tcp_config);
if (TCPSerial->hardwareSerial()) { if (TCPSerial->hardwareSerial()) {
ClaimSerial(); ClaimSerial();
} }
@ -197,11 +199,22 @@ void CmndTCPBaudrate(void) {
if ((XdrvMailbox.payload >= 1200) && (XdrvMailbox.payload <= 115200)) { if ((XdrvMailbox.payload >= 1200) && (XdrvMailbox.payload <= 115200)) {
XdrvMailbox.payload /= 1200; // Make it a valid baudrate XdrvMailbox.payload /= 1200; // Make it a valid baudrate
Settings->tcp_baudrate = XdrvMailbox.payload; Settings->tcp_baudrate = XdrvMailbox.payload;
TCPSerial->begin(Settings->tcp_baudrate * 1200); // Reinitialize serial port with new baud rate TCPSerial->begin(Settings->tcp_baudrate * 1200, 0x7F & Settings->tcp_config); // Reinitialize serial port with new baud rate
} }
ResponseCmndNumber(Settings->tcp_baudrate * 1200); ResponseCmndNumber(Settings->tcp_baudrate * 1200);
} }
void CmndTCPConfig(void) {
if (XdrvMailbox.data_len > 0) {
uint8_t serial_config = ParseSerialConfig(XdrvMailbox.data);
if (serial_config >= 0) {
Settings->tcp_config = 0x80 | serial_config; // default 0x00 should be 8N1
TCPSerial->begin(Settings->tcp_baudrate * 1200, 0x7F & Settings->tcp_config); // Reinitialize serial port with new config
}
}
ResponseCmndChar_P(GetSerialConfig(0x7F & Settings->tcp_config).c_str());
}
/*********************************************************************************************\ /*********************************************************************************************\
* Interface * Interface
\*********************************************************************************************/ \*********************************************************************************************/