parent
46320ef4b9
commit
def04042a7
@ -0,0 +1,256 @@ |
||||
/**
|
||||
* ANSI code parser callbacks that do the actual work. |
||||
* Split from the parser itself for easier editing without |
||||
* having to deal with Ragel. |
||||
*/ |
||||
|
||||
#include <esp8266.h> |
||||
#include "ansi_parser_callbacks.h" |
||||
#include "screen.h" |
||||
#include "ansi_parser.h" |
||||
#include "uart_driver.h" |
||||
|
||||
/**
|
||||
* Handle a received plain character |
||||
*/ |
||||
void ICACHE_FLASH_ATTR |
||||
apars_handle_plainchar(char c) |
||||
{ |
||||
screen_putchar(c); |
||||
} |
||||
|
||||
/**
|
||||
* Bad sequence received, show warning |
||||
*/ |
||||
void apars_handle_badseq(void) |
||||
{ |
||||
warn("Invalid escape sequence discarded."); |
||||
} |
||||
|
||||
/**
|
||||
* \brief Handle fully received CSI ANSI sequence |
||||
* \param leadchar - private range leading character, 0 if none |
||||
* \param params - array of CSI_N_MAX ints holding the numeric arguments |
||||
* \param keychar - the char terminating the sequence |
||||
*/ |
||||
void ICACHE_FLASH_ATTR |
||||
apars_handle_CSI(char leadchar, int *params, char keychar) |
||||
{ |
||||
/*
|
||||
Implemented codes (from Wikipedia) |
||||
|
||||
CSI n A CUU – Cursor Up |
||||
CSI n B CUD – Cursor Down |
||||
CSI n C CUF – Cursor Forward |
||||
CSI n D CUB – Cursor Back |
||||
CSI n E CNL – Cursor Next Line |
||||
CSI n F CPL – Cursor Previous Line |
||||
CSI n G CHA – Cursor Horizontal Absolute |
||||
CSI n ; m H CUP – Cursor Position |
||||
CSI n J ED – Erase Display |
||||
CSI n K EL – Erase in Line |
||||
CSI n S SU – Scroll Up |
||||
CSI n T SD – Scroll Down |
||||
CSI n ; m f HVP – Horizontal and Vertical Position |
||||
CSI n m SGR – Select Graphic Rendition (Implemented only some) |
||||
CSI 6n DSR – Device Status Report NOT IMPL |
||||
CSI s SCP – Save Cursor Position |
||||
CSI u RCP – Restore Cursor Position |
||||
CSI ?25l DECTCEM Hides the cursor |
||||
CSI ?25h DECTCEM Shows the cursor |
||||
*/ |
||||
|
||||
int n1 = params[0]; |
||||
int n2 = params[1]; |
||||
// int n3 = params[2];
|
||||
|
||||
// defaults
|
||||
switch (keychar) { |
||||
case 'A': |
||||
case 'B': |
||||
case 'C': |
||||
case 'D': |
||||
case 'E': |
||||
case 'F': |
||||
case 'G': |
||||
case 'S': |
||||
case 'T': |
||||
if (n1 == 0) n1 = 1; |
||||
break; |
||||
|
||||
case 'H': |
||||
case 'f': |
||||
if (n1 == 0) n1 = 1; |
||||
if (n2 == 0) n2 = 1; |
||||
break; |
||||
|
||||
case 'J': |
||||
case 'K': |
||||
if (n1 > 2) n1 = 0; |
||||
break; |
||||
} |
||||
|
||||
switch (keychar) { |
||||
// CUU CUD CUF CUB
|
||||
case 'A': screen_cursor_move(0, -n1); break; |
||||
case 'B': screen_cursor_move(0, n1); break; |
||||
case 'C': screen_cursor_move(n1, 0); break; |
||||
case 'D': screen_cursor_move(-n1, 0); break; |
||||
|
||||
case 'E': // CNL
|
||||
screen_cursor_move(0, n1); |
||||
screen_cursor_set_x(0); |
||||
break; |
||||
|
||||
case 'F': // CPL
|
||||
screen_cursor_move(0, -n1); |
||||
screen_cursor_set_x(0); |
||||
break; |
||||
|
||||
// CHA
|
||||
case 'G': |
||||
screen_cursor_set_x(n1 - 1); break; // 1-based
|
||||
|
||||
// SU, SD
|
||||
case 'S': screen_scroll_up(n1); break; |
||||
case 'T': screen_scroll_down(n1); break; |
||||
|
||||
// CUP,HVP
|
||||
case 'H': |
||||
case 'f': |
||||
screen_cursor_set(n2-1, n1-1); break; // 1-based
|
||||
|
||||
case 'J': // ED
|
||||
if (n1 == 0) { |
||||
screen_clear(CLEAR_TO_CURSOR); |
||||
} else if (n1 == 1) { |
||||
screen_clear(CLEAR_FROM_CURSOR); |
||||
} else { |
||||
screen_clear(CLEAR_ALL); |
||||
screen_cursor_set(0, 0); |
||||
} |
||||
break; |
||||
|
||||
case 'K': // EL
|
||||
if (n1 == 0) { |
||||
screen_clear_line(CLEAR_TO_CURSOR); |
||||
} else if (n1 == 1) { |
||||
screen_clear_line(CLEAR_FROM_CURSOR); |
||||
} else { |
||||
screen_clear_line(CLEAR_ALL); |
||||
screen_cursor_set_x(0); |
||||
} |
||||
break; |
||||
|
||||
// SCP, RCP
|
||||
case 's': screen_cursor_save(); break; |
||||
case 'u': screen_cursor_restore(); break; |
||||
|
||||
// DECTCEM cursor show hide
|
||||
case 'l': |
||||
if (leadchar == '?' && n1 == 25) { |
||||
screen_cursor_enable(1); |
||||
} |
||||
break; |
||||
|
||||
case 'h': |
||||
if (leadchar == '?' && n1 == 25) { |
||||
screen_cursor_enable(0); |
||||
} |
||||
break; |
||||
|
||||
case 'm': // SGR
|
||||
// iterate arguments
|
||||
for (int i = 0; i < CSI_N_MAX; i++) { |
||||
int n = params[i]; |
||||
|
||||
if (i == 0 && n == 0) { // reset SGR
|
||||
screen_set_fg(7); |
||||
screen_set_bg(0); |
||||
break; // cannot combine reset with others
|
||||
} |
||||
else if (n >= 30 && n <= 37) screen_set_fg(n-30); // ANSI normal fg
|
||||
else if (n >= 40 && n <= 47) screen_set_bg(n-40); // ANSI normal bg
|
||||
else if (n == 39) screen_set_fg(7); // default fg
|
||||
else if (n == 49) screen_set_bg(0); // default bg
|
||||
else if (n == 7) screen_inverse(1); // inverse
|
||||
else if (n == 27) screen_inverse(0); // positive
|
||||
else if (n == 1) screen_set_bright_fg(); // ANSI bold = bright fg
|
||||
else if (n >= 90 && n <= 97) screen_set_fg(n-90+8); // AIX bright fg
|
||||
else if (n >= 100 && n <= 107) screen_set_bg(n-100+8); // AIX bright bg
|
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/**
|
||||
* \brief Handle a request to reset the display device |
||||
*/ |
||||
void ICACHE_FLASH_ATTR |
||||
apars_handle_RESET_cmd(void) |
||||
{ |
||||
// XXX maybe user wanted to reset the module instead?
|
||||
screen_reset(); |
||||
} |
||||
|
||||
/**
|
||||
* Handle a factory reset request |
||||
*/ |
||||
void ICACHE_FLASH_ATTR |
||||
apars_handle_OSC_FactoryReset(void) |
||||
{ |
||||
info("OSC: Factory reset"); |
||||
|
||||
// Send acknowledgement message to UART0
|
||||
// User is performing this manually, so we can just print it as string
|
||||
UART_WriteString(UART0, "\r\nFACTORY RESET\r\n", UART_TIMEOUT_US); |
||||
|
||||
// Disconnect from AP if connected
|
||||
int opmode = wifi_get_opmode(); |
||||
if (opmode != SOFTAP_MODE) { |
||||
wifi_station_disconnect(); |
||||
} |
||||
|
||||
// Both must be enabled so we can manipulate their settings
|
||||
wifi_set_opmode(STATIONAP_MODE); |
||||
|
||||
// --- AP config ---
|
||||
struct softap_config apconf; |
||||
wifi_softap_get_config(&apconf); |
||||
apconf.authmode=AUTH_OPEN; // Disable access protection
|
||||
apconf.channel=1; // Reset channel; user may have set bad channel in the UI
|
||||
|
||||
// generate unique AP name
|
||||
u8 mac[6]; |
||||
wifi_get_macaddr(SOFTAP_IF, mac); |
||||
sprintf((char*)apconf.ssid, "TERM-%02X%02X%02X", mac[3], mac[4], mac[5]); |
||||
apconf.ssid_len = (u8)strlen((char*)apconf.ssid); |
||||
|
||||
// --- Station ---
|
||||
struct station_config staconf; |
||||
wifi_station_get_config(&staconf); |
||||
|
||||
// clear info about SSID
|
||||
staconf.ssid[0]=0; |
||||
staconf.bssid_set=0; |
||||
staconf.password[0]=0; |
||||
|
||||
wifi_softap_set_config(&apconf); |
||||
wifi_station_set_config(&staconf); |
||||
|
||||
UART_WriteString(UART0, "Factory Reset complete, device reset.\r\n\r\n", UART_TIMEOUT_US); |
||||
|
||||
// Reboot to clean STA+AP mode with Channel 1 & reset AP SSID.
|
||||
system_restart(); |
||||
} |
||||
|
||||
/**
|
||||
* Handle a screen resize request |
||||
*/ |
||||
void ICACHE_FLASH_ATTR |
||||
apars_handle_OSC_SetScreenSize(int rows, int cols) |
||||
{ |
||||
info("OSC: Set screen size to %d x %d", rows, cols); |
||||
|
||||
screen_resize(rows, cols); |
||||
} |
@ -0,0 +1,11 @@ |
||||
#ifndef ANSI_PARSER_CALLBACKS_H |
||||
#define ANSI_PARSER_CALLBACKS_H |
||||
|
||||
void apars_handle_badseq(void); |
||||
void apars_handle_CSI(char leadchar, int *params, char keychar); |
||||
void apars_handle_RESET_cmd(void); |
||||
void apars_handle_plainchar(char c); |
||||
void apars_handle_OSC_FactoryReset(void); |
||||
void apars_handle_OSC_SetScreenSize(int rows, int cols); |
||||
|
||||
#endif //ESP_VT100_FIRMWARE_ANSI_PARSER_CALLBACKS_H
|
Loading…
Reference in new issue