Prep XYZModem support on Serial/USB and telnet

This commit is contained in:
Theo Arends 2025-04-01 23:15:28 +02:00
parent 0cb6a8ba24
commit 2bf67b96a6
4 changed files with 49 additions and 2 deletions

View File

@ -20,6 +20,9 @@ class TASCONSOLE {
virtual size_t printf(const char*, char *, const char*&, const char*&, const char*&) = 0; virtual size_t printf(const char*, char *, const char*&, const char*&, const char*&) = 0;
virtual size_t printf(char *) = 0; virtual size_t printf(char *) = 0;
virtual size_t read() = 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 setRxBufferSize(size_t) = 0;
// virtual size_t setTxBufferSize(size_t) = 0; // virtual size_t setTxBufferSize(size_t) = 0;
}; };
@ -62,6 +65,14 @@ public:
return object->read(); 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) { size_t setRxBufferSize(size_t rx_queue_len) {
return object->setRxBufferSize(rx_queue_len); return object->setRxBufferSize(rx_queue_len);
} }
@ -104,6 +115,14 @@ public:
return object.read(); 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 { size_t setRxBufferSize(size_t size) override {
return object.setRxBufferSize(size); return object.setRxBufferSize(size);
} }

View File

@ -502,6 +502,8 @@ enum SettingsTextIndex { SET_OTAURL,
enum SpiInterfaces { SPI_NONE, SPI_MOSI, SPI_MISO, SPI_MOSI_MISO }; 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 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 }; 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 };

View File

@ -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 uint32_t serial_polling_window = 0;
static bool serial_buffer_overrun = false; static bool serial_buffer_overrun = false;
@ -1811,6 +1814,12 @@ void SerialInput(void)
return; 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 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 = ""; String console_buffer = "";
void TasConsoleInput(void) { void TasConsoleInput(void) {
#ifdef USE_XYZMODEM
if (XYZModemActive(TXMP_TASCONSOLE)) { return; }
#endif // USE_XYZMODEM
static bool console_buffer_overrun = false; static bool console_buffer_overrun = false;
while (TasConsole.available()) { while (TasConsole.available()) {
delay(0); delay(0);
char console_in_byte = TasConsole.read(); 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 (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 if (console_buffer.length() < INPUT_BUFFER_SIZE) { // Add char to string if it still fits
console_buffer += console_in_byte; console_buffer += console_in_byte;

View File

@ -136,6 +136,10 @@ void TelnetGetLog(void) {
/********************************************************************************************/ /********************************************************************************************/
void TelnetLoop(void) { void TelnetLoop(void) {
#ifdef USE_XYZMODEM
if (XYZModemActive(TXMP_TELNET)) { return; }
#endif // USE_XYZMODEM
// check for a new client connection // check for a new client connection
if ((Telnet.server) && (Telnet.server->hasClient())) { if ((Telnet.server) && (Telnet.server->hasClient())) {
WiFiClient new_client = Telnet.server->available(); WiFiClient new_client = Telnet.server->available();
@ -181,6 +185,11 @@ void TelnetLoop(void) {
while (Telnet.client.available()) { while (Telnet.client.available()) {
yield(); yield();
uint8_t in_byte = Telnet.client.read(); 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 (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 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; Telnet.buffer[Telnet.in_byte_counter++] = in_byte;