mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-27 12:46:34 +00:00
Prep XYZModem support on Serial/USB and telnet
This commit is contained in:
parent
0cb6a8ba24
commit
2bf67b96a6
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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 };
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user