CAN and SUB correctly abort current sequence, including string. Start of adding PM's
This commit is contained in:
+28
-27
@@ -142,6 +142,13 @@ ansi_parser(char newchar)
|
||||
history[HISTORY_LEN-1] = newchar;
|
||||
#endif
|
||||
|
||||
// THose should work always, even inside a string
|
||||
if (newchar == CAN || newchar == SUB) {
|
||||
// Cancel the active sequence
|
||||
cs = ansi_start;
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle simple characters immediately (bypass parser)
|
||||
if (newchar < ' ' && !inside_string) {
|
||||
switch (newchar) {
|
||||
@@ -183,12 +190,6 @@ ansi_parser(char newchar)
|
||||
apars_handle_enq();
|
||||
return;
|
||||
|
||||
// Cancel the active sequence
|
||||
case CAN:
|
||||
case SUB:
|
||||
cs = ansi_start;
|
||||
return;
|
||||
|
||||
default:
|
||||
// Discard all other control codes
|
||||
return;
|
||||
@@ -208,7 +209,7 @@ ansi_parser(char newchar)
|
||||
|
||||
// The parser
|
||||
|
||||
/* #line 212 "user/ansi_parser.c" */
|
||||
/* #line 213 "user/ansi_parser.c" */
|
||||
{
|
||||
const char *_acts;
|
||||
unsigned int _nacts;
|
||||
@@ -398,7 +399,7 @@ execFuncs:
|
||||
while ( _nacts-- > 0 ) {
|
||||
switch ( *_acts++ ) {
|
||||
case 0:
|
||||
/* #line 188 "user/ansi_parser.rl" */
|
||||
/* #line 189 "user/ansi_parser.rl" */
|
||||
{
|
||||
ansi_warn("Parser error.");
|
||||
apars_show_context();
|
||||
@@ -407,7 +408,7 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
/* #line 197 "user/ansi_parser.rl" */
|
||||
/* #line 198 "user/ansi_parser.rl" */
|
||||
{
|
||||
if ((*p) != 0) {
|
||||
apars_handle_plainchar((*p));
|
||||
@@ -415,7 +416,7 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
/* #line 205 "user/ansi_parser.rl" */
|
||||
/* #line 206 "user/ansi_parser.rl" */
|
||||
{
|
||||
// Reset the CSI builder
|
||||
leadchar = NUL;
|
||||
@@ -432,13 +433,13 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
/* #line 220 "user/ansi_parser.rl" */
|
||||
/* #line 221 "user/ansi_parser.rl" */
|
||||
{
|
||||
leadchar = (*p);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
/* #line 224 "user/ansi_parser.rl" */
|
||||
/* #line 225 "user/ansi_parser.rl" */
|
||||
{
|
||||
if (arg_cnt == 0) arg_cnt = 1;
|
||||
// x10 + digit
|
||||
@@ -448,7 +449,7 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
/* #line 232 "user/ansi_parser.rl" */
|
||||
/* #line 233 "user/ansi_parser.rl" */
|
||||
{
|
||||
if (arg_cnt == 0) arg_cnt = 1; // handle case when first arg is empty
|
||||
arg_cnt++;
|
||||
@@ -456,20 +457,20 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
/* #line 238 "user/ansi_parser.rl" */
|
||||
/* #line 239 "user/ansi_parser.rl" */
|
||||
{
|
||||
interchar = (*p);
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
/* #line 242 "user/ansi_parser.rl" */
|
||||
/* #line 243 "user/ansi_parser.rl" */
|
||||
{
|
||||
apars_handle_csi(leadchar, arg, arg_cnt, interchar, (*p));
|
||||
{cs = 1;goto _again;}
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
/* #line 254 "user/ansi_parser.rl" */
|
||||
/* #line 255 "user/ansi_parser.rl" */
|
||||
{
|
||||
leadchar = (*p);
|
||||
str_ni = 0;
|
||||
@@ -479,13 +480,13 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
/* #line 262 "user/ansi_parser.rl" */
|
||||
/* #line 263 "user/ansi_parser.rl" */
|
||||
{
|
||||
string_buffer[str_ni++] = (*p);
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
/* #line 266 "user/ansi_parser.rl" */
|
||||
/* #line 267 "user/ansi_parser.rl" */
|
||||
{
|
||||
inside_string = false;
|
||||
string_buffer[str_ni++] = '\0';
|
||||
@@ -494,41 +495,41 @@ execFuncs:
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
/* #line 279 "user/ansi_parser.rl" */
|
||||
/* #line 280 "user/ansi_parser.rl" */
|
||||
{
|
||||
apars_handle_hash_cmd((*p));
|
||||
{cs = 1;goto _again;}
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
/* #line 284 "user/ansi_parser.rl" */
|
||||
/* #line 285 "user/ansi_parser.rl" */
|
||||
{
|
||||
apars_handle_short_cmd((*p));
|
||||
{cs = 1;goto _again;}
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
/* #line 289 "user/ansi_parser.rl" */
|
||||
/* #line 290 "user/ansi_parser.rl" */
|
||||
{
|
||||
apars_handle_space_cmd((*p));
|
||||
{cs = 1;goto _again;}
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
/* #line 296 "user/ansi_parser.rl" */
|
||||
/* #line 297 "user/ansi_parser.rl" */
|
||||
{
|
||||
leadchar = (*p);
|
||||
{cs = 10;goto _again;}
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
/* #line 301 "user/ansi_parser.rl" */
|
||||
/* #line 302 "user/ansi_parser.rl" */
|
||||
{
|
||||
apars_handle_chs_designate(leadchar, (*p));
|
||||
{cs = 1;goto _again;}
|
||||
}
|
||||
break;
|
||||
/* #line 532 "user/ansi_parser.c" */
|
||||
/* #line 533 "user/ansi_parser.c" */
|
||||
}
|
||||
}
|
||||
goto _again;
|
||||
@@ -546,7 +547,7 @@ _again:
|
||||
while ( __nacts-- > 0 ) {
|
||||
switch ( *__acts++ ) {
|
||||
case 0:
|
||||
/* #line 188 "user/ansi_parser.rl" */
|
||||
/* #line 189 "user/ansi_parser.rl" */
|
||||
{
|
||||
ansi_warn("Parser error.");
|
||||
apars_show_context();
|
||||
@@ -556,7 +557,7 @@ _again:
|
||||
goto _again;}
|
||||
}
|
||||
break;
|
||||
/* #line 560 "user/ansi_parser.c" */
|
||||
/* #line 561 "user/ansi_parser.c" */
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -564,6 +565,6 @@ goto _again;}
|
||||
_out: {}
|
||||
}
|
||||
|
||||
/* #line 324 "user/ansi_parser.rl" */
|
||||
/* #line 325 "user/ansi_parser.rl" */
|
||||
|
||||
}
|
||||
|
||||
+7
-6
@@ -111,6 +111,13 @@ ansi_parser(char newchar)
|
||||
history[HISTORY_LEN-1] = newchar;
|
||||
#endif
|
||||
|
||||
// THose should work always, even inside a string
|
||||
if (newchar == CAN || newchar == SUB) {
|
||||
// Cancel the active sequence
|
||||
cs = ansi_start;
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle simple characters immediately (bypass parser)
|
||||
if (newchar < ' ' && !inside_string) {
|
||||
switch (newchar) {
|
||||
@@ -152,12 +159,6 @@ ansi_parser(char newchar)
|
||||
apars_handle_enq();
|
||||
return;
|
||||
|
||||
// Cancel the active sequence
|
||||
case CAN:
|
||||
case SUB:
|
||||
cs = ansi_start;
|
||||
return;
|
||||
|
||||
default:
|
||||
// Discard all other control codes
|
||||
return;
|
||||
|
||||
@@ -12,6 +12,13 @@
|
||||
#include "uart_buffer.h"
|
||||
#include "screen.h"
|
||||
|
||||
volatile bool enquiry_suppressed = false;
|
||||
ETSTimer enqTimer;
|
||||
void ICACHE_FLASH_ATTR enqTimerCb(void *unused)
|
||||
{
|
||||
enquiry_suppressed = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a response to UART0
|
||||
* @param str
|
||||
@@ -37,8 +44,16 @@ apars_handle_bel(void)
|
||||
void ICACHE_FLASH_ATTR
|
||||
apars_handle_enq(void)
|
||||
{
|
||||
if (enquiry_suppressed) return;
|
||||
|
||||
// version encased in SOS and ST
|
||||
apars_respond("\x1bXESPTerm " FIRMWARE_VERSION "\x1b\\");
|
||||
|
||||
// Throttle enquiry - this is a single-character-invoked response,
|
||||
// so it tends to happen randomly when throwing garbage at the ESP.
|
||||
// We don't want to fill the output buffer with dozens of enquiry responses
|
||||
enquiry_suppressed = true;
|
||||
TIMER_START(&enqTimer, enqTimerCb, 500, 0);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// Created by MightyPork on 2017/08/20.
|
||||
//
|
||||
// Handle privacy messages
|
||||
// PM Pt ST
|
||||
// (PM = ESC ^)
|
||||
//
|
||||
// Those are used for device-to-device communication.
|
||||
// They were not used for anything in the original VT100 and are not
|
||||
// used by Xterm or any other common emulator, but they should be safely discarded.
|
||||
//
|
||||
|
||||
#include <esp8266.h>
|
||||
#include "apars_pm.h"
|
||||
#include "ansi_parser_callbacks.h"
|
||||
#include "screen.h"
|
||||
#include "apars_logging.h"
|
||||
|
||||
/**
|
||||
* Helper function to parse incoming DCS (Device Control String)
|
||||
* @param buffer - the DCS body (after DCS and before ST)
|
||||
*/
|
||||
void ICACHE_FLASH_ATTR
|
||||
apars_handle_pm(const char *buffer)
|
||||
{
|
||||
size_t len = strlen(buffer);
|
||||
if (false) {
|
||||
//
|
||||
}
|
||||
else {
|
||||
ansi_warn("Bad DCS: %s", buffer);
|
||||
apars_show_context();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
//
|
||||
// Created by MightyPork on 2017/08/20.
|
||||
//
|
||||
|
||||
#ifndef ESP_VT100_FIRMWARE_APARS_PM_H
|
||||
#define ESP_VT100_FIRMWARE_APARS_PM_H
|
||||
|
||||
void apars_handle_pm(const char *buffer);
|
||||
|
||||
#endif //ESP_VT100_FIRMWARE_APARS_PM_H
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "apars_logging.h"
|
||||
#include "ansi_parser_callbacks.h"
|
||||
#include "screen.h"
|
||||
#include "apars_pm.h"
|
||||
|
||||
// ----- Generic String cmd - disambiguation -----
|
||||
|
||||
@@ -37,6 +38,7 @@ apars_handle_string_cmd(char leadchar, char *buffer)
|
||||
break;
|
||||
|
||||
case '^': // PM - Privacy Message
|
||||
apars_handle_pm(buffer);
|
||||
break;
|
||||
|
||||
case '_': // APC - Application Program Command
|
||||
|
||||
Reference in New Issue
Block a user