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(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);
}

View File

@ -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 };

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 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;

View File

@ -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;