From 2bf67b96a68fd37ebf82966eff43cfbc3b53a109 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 1 Apr 2025 23:15:28 +0200 Subject: [PATCH] Prep XYZModem support on Serial/USB and telnet --- tasmota/include/tasconsole.h | 19 +++++++++++++++++ tasmota/include/tasmota.h | 2 ++ tasmota/tasmota_support/support_tasmota.ino | 21 +++++++++++++++++-- .../tasmota_xdrv_driver/xdrv_78_telnet.ino | 9 ++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/tasmota/include/tasconsole.h b/tasmota/include/tasconsole.h index f3f975752..f42b588eb 100644 --- a/tasmota/include/tasconsole.h +++ b/tasmota/include/tasconsole.h @@ -20,6 +20,9 @@ class TASCONSOLE { virtual size_t printf(const char*, char *, const char*&, const char*&, const char*&) = 0; virtual size_t printf(char *) = 0; virtual size_t read() = 0; + virtual size_t write(uint8_t) = 0; + virtual size_t write(const uint8_t *buf, size_t size) = 0; + virtual size_t setRxBufferSize(size_t) = 0; // virtual size_t setTxBufferSize(size_t) = 0; }; @@ -62,6 +65,14 @@ public: return object->read(); } + size_t write(uint8_t data) { + return object->write(data); + } + + size_t write(const uint8_t *buf, size_t size) { + return object->write(buf, size); + } + size_t setRxBufferSize(size_t rx_queue_len) { return object->setRxBufferSize(rx_queue_len); } @@ -104,6 +115,14 @@ public: return object.read(); } + size_t write(uint8_t data) override { + return object.write(data); + } + + size_t write(const uint8_t *buf, size_t size) override { + return object.write(buf, size); + } + size_t setRxBufferSize(size_t size) override { return object.setRxBufferSize(size); } diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index 8d8182ead..5a73e1628 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -502,6 +502,8 @@ enum SettingsTextIndex { SET_OTAURL, enum SpiInterfaces { SPI_NONE, SPI_MOSI, SPI_MISO, SPI_MOSI_MISO }; +enum XYZModemProtocols { TXMP_NONE, TXMP_SERIAL, TXMP_TASCONSOLE, TXMP_TELNET }; + enum DevGroupMessageType { DGR_MSGTYP_FULL_STATUS, DGR_MSGTYP_PARTIAL_UPDATE, DGR_MSGTYP_UPDATE, DGR_MSGTYP_UPDATE_MORE_TO_COME, DGR_MSGTYP_UPDATE_DIRECT, DGR_MSGTYPE_UPDATE_COMMAND, DGR_MSGTYPFLAG_WITH_LOCAL = 128 }; enum DevGroupMessageFlag { DGR_FLAG_RESET = 1, DGR_FLAG_STATUS_REQUEST = 2, DGR_FLAG_FULL_STATUS = 4, DGR_FLAG_ACK = 8, DGR_FLAG_MORE_TO_COME = 16, DGR_FLAG_DIRECT = 32, DGR_FLAG_ANNOUNCEMENT = 64, DGR_FLAG_LOCAL = 128 }; diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index cdf000360..c810f2664 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1774,8 +1774,11 @@ void ArduinoOtaLoop(void) /********************************************************************************************/ -void SerialInput(void) -{ +void SerialInput(void) { +#ifdef USE_XYZMODEM + if (XYZModemActive(TXMP_TASCONSOLE)) { return; } +#endif // USE_XYZMODEM + static uint32_t serial_polling_window = 0; static bool serial_buffer_overrun = false; @@ -1811,6 +1814,12 @@ void SerialInput(void) return; } +/*-------------------------------------------------------------------------------------------*/ + +#ifdef USE_XYZMODEM + if (XYZModemStart(TXMP_TASCONSOLE, TasmotaGlobal.serial_in_byte)) { return; } +#endif // USE_XYZMODEM + /*-------------------------------------------------------------------------------------------*/ if (TasmotaGlobal.serial_in_byte > 127 && !Settings->flag.mqtt_serial_raw) { // Discard binary data above 127 if no raw reception allowed - CMND_SERIALSEND3 @@ -1923,12 +1932,20 @@ void SerialInput(void) String console_buffer = ""; void TasConsoleInput(void) { +#ifdef USE_XYZMODEM + if (XYZModemActive(TXMP_TASCONSOLE)) { return; } +#endif // USE_XYZMODEM + static bool console_buffer_overrun = false; while (TasConsole.available()) { delay(0); char console_in_byte = TasConsole.read(); +#ifdef USE_XYZMODEM + if (XYZModemStart(TXMP_TASCONSOLE, console_in_byte)) { return; } +#endif // USE_XYZMODEM + if (isprint(console_in_byte)) { // Any char between 32 and 127 if (console_buffer.length() < INPUT_BUFFER_SIZE) { // Add char to string if it still fits console_buffer += console_in_byte; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_78_telnet.ino b/tasmota/tasmota_xdrv_driver/xdrv_78_telnet.ino index a6620d3b0..0c7cfb508 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_78_telnet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_78_telnet.ino @@ -136,6 +136,10 @@ void TelnetGetLog(void) { /********************************************************************************************/ void TelnetLoop(void) { +#ifdef USE_XYZMODEM + if (XYZModemActive(TXMP_TELNET)) { return; } +#endif // USE_XYZMODEM + // check for a new client connection if ((Telnet.server) && (Telnet.server->hasClient())) { WiFiClient new_client = Telnet.server->available(); @@ -181,6 +185,11 @@ void TelnetLoop(void) { while (Telnet.client.available()) { yield(); uint8_t in_byte = Telnet.client.read(); + +#ifdef USE_XYZMODEM + if (XYZModemWifiClientStart(&Telnet.client, in_byte)) { return; } +#endif // USE_XYZMODEM + if (isprint(in_byte)) { // Any char between 32 and 127 if (Telnet.in_byte_counter < Telnet.buffer_size -1) { // Add char to string if it still fits Telnet.buffer[Telnet.in_byte_counter++] = in_byte;