Auto switch telnet mode option on session basis.

ATDTnumber will use the currently defined telnet mode.
ATDT+number will use NET2 for the session and return
to the defined telnet mode when the session ends.
Similarly, ATDT=number will use NET1, and ATDT-number
will use NET0.
This commit is contained in:
mecparts
2020-07-19 00:48:16 -06:00
parent 9a4a0f7b9d
commit c4148f1baf
4 changed files with 26 additions and 5 deletions

View File

@@ -54,6 +54,7 @@ void setup(void) {
// no valid data in EEPROM/NVRAM, populate with defaults
factoryDefaults(NULL);
}
sessionTelnetType = settings.telnet;
Serial.begin(settings.serialSpeed, getSerialConfig());
digitalWrite(TXEN, LOW); // enable the TX output

View File

@@ -144,6 +144,22 @@ char *dialNumber(char *atCmd) {
}
}
sessionTelnetType = settings.telnet;
switch( host[0] ) {
case '-':
++host;
sessionTelnetType = NO_TELNET;
break;
case '=':
++host;
sessionTelnetType = REAL_TELNET;
break;
case '+':
++host;
sessionTelnetType = FAKE_TELNET;
break;
}
yield();
if( settings.extendedCodes ) {
Serial.printf("DIALLING %s:%u\r\n", host, portNum);

View File

@@ -60,4 +60,5 @@
uint8_t passwordTries = 0; // # of unsuccessful tries at incoming password
uint8_t passwordLen = 0;
uint8_t txBuf[TX_BUF_SIZE]; // Transmit Buffer
uint8_t sessionTelnetType;
#endif

View File

@@ -51,7 +51,7 @@ void sendSerialData() {
static unsigned long lastSerialData = 0;
// in telnet mode, we might have to escape every single char,
// so don't use more than half the buffer
size_t maxBufSize = (settings.telnet != NO_TELNET) ? TX_BUF_SIZE / 2 : TX_BUF_SIZE;
size_t maxBufSize = (sessionTelnetType != NO_TELNET) ? TX_BUF_SIZE / 2 : TX_BUF_SIZE;
size_t len = Serial.available();
if( len > maxBufSize) {
len = maxBufSize;
@@ -83,12 +83,12 @@ void sendSerialData() {
//
// also in Telnet mode, escape every CR (0x0D) by inserting a NUL
// after it into the buffer
if( settings.telnet != NO_TELNET ) {
if( sessionTelnetType != NO_TELNET ) {
for( int i = len - 1; i >= 0; --i ) {
if( txBuf[i] == IAC ) {
memmove( txBuf + i + 1, txBuf + i, len - i);
++len;
} else if( txBuf[i] == CR && settings.telnet == REAL_TELNET ) {
} else if( txBuf[i] == CR && sessionTelnetType == REAL_TELNET ) {
memmove( txBuf + i + 1, txBuf + i, len - 1);
txBuf[i + 1] = NUL;
++len;
@@ -113,7 +113,7 @@ int receiveTcpData() {
int rxByte = tcpClient.read();
++bytesIn;
if( settings.telnet != NO_TELNET && rxByte == IAC ) {
if( sessionTelnetType != NO_TELNET && rxByte == IAC ) {
rxByte = tcpClient.read();
++bytesIn;
if( rxByte != IAC ) { // 2 times 0xff is just an escaped real 0xff
@@ -216,7 +216,7 @@ int receiveTcpData() {
}
// Telnet sends <CR> as <CR><NUL>
// We filter out that <NUL> here
if( lastc == CR && (char)rxByte == 0 && settings.telnet == REAL_TELNET ) {
if( lastc == CR && (char)rxByte == 0 && sessionTelnetType == REAL_TELNET ) {
rxByte = -1;
}
lastc = (char)rxByte;
@@ -304,6 +304,9 @@ void sendResult(int resultCode) {
}
}
}
if( resultCode == R_NO_CARRIER || resultCode == R_NO_ANSWER ) {
sessionTelnetType = settings.telnet;
}
}
//