moving some stuff around, removed "soft reset" seq, added server-side support for control key remaps
This commit is contained in:
@@ -251,13 +251,13 @@ apars_handle_CSI(char leadchar, int *params, int count, char keychar)
|
|||||||
int n = params[i];
|
int n = params[i];
|
||||||
if (leadchar == '?') {
|
if (leadchar == '?') {
|
||||||
if (n == 25) {
|
if (n == 25) {
|
||||||
screen_cursor_enable(yn);
|
screen_cursor_visible(yn);
|
||||||
}
|
}
|
||||||
else if (n == 7) {
|
else if (n == 7) {
|
||||||
screen_wrap_enable(yn);
|
screen_wrap_enable(yn);
|
||||||
}
|
}
|
||||||
else if (n == 1) {
|
else if (n == 1) {
|
||||||
screen_set_cursor_application_mode(yn);
|
screen_set_cursors_alt_mode(yn);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ansi_warn("NOIMPL DEC opt %d", n);
|
ansi_warn("NOIMPL DEC opt %d", n);
|
||||||
@@ -370,13 +370,6 @@ apars_handle_CSI(char leadchar, int *params, int count, char keychar)
|
|||||||
ansi_warn("NOIMPL cursor back tab");
|
ansi_warn("NOIMPL cursor back tab");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'p':
|
|
||||||
if (leadchar == '!') {
|
|
||||||
info("SOFT RESET!");
|
|
||||||
screen_reset(); // TODO do soft reset
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'c': // CSI-c
|
case 'c': // CSI-c
|
||||||
// report capabilities (pretend we're vt4xx)
|
// report capabilities (pretend we're vt4xx)
|
||||||
UART_WriteString(UART0, "\033[?64;22;c", UART_TIMEOUT_US);
|
UART_WriteString(UART0, "\033[?64;22;c", UART_TIMEOUT_US);
|
||||||
@@ -436,7 +429,7 @@ void ICACHE_FLASH_ATTR apars_handle_shortCode(char c)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '>':
|
case '>':
|
||||||
screen_set_keypad_application_mode(false);
|
screen_set_numpad_alt_mode(false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '<':
|
case '<':
|
||||||
@@ -444,7 +437,7 @@ void ICACHE_FLASH_ATTR apars_handle_shortCode(char c)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '=':
|
case '=':
|
||||||
screen_set_keypad_application_mode(true);
|
screen_set_numpad_alt_mode(true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
+157
-206
@@ -3,8 +3,6 @@
|
|||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "persist.h"
|
#include "persist.h"
|
||||||
|
|
||||||
//region Data structures
|
|
||||||
|
|
||||||
TerminalConfigBundle * const termconf = &persist.current.termconf;
|
TerminalConfigBundle * const termconf = &persist.current.termconf;
|
||||||
TerminalConfigBundle termconf_scratch;
|
TerminalConfigBundle termconf_scratch;
|
||||||
|
|
||||||
@@ -35,55 +33,52 @@ typedef struct __attribute__((packed)){
|
|||||||
static Cell screen[MAX_SCREEN_SIZE];
|
static Cell screen[MAX_SCREEN_SIZE];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cursor position and attributes
|
* Screen state structure
|
||||||
*/
|
*/
|
||||||
static struct {
|
static struct {
|
||||||
int x; //!< X coordinate
|
bool numpad_alt_mode; //!< Application Mode - affects how user input of control keys is sent
|
||||||
int y; //!< Y coordinate
|
bool cursors_alt_mode; //!< Application mode for cursor keys
|
||||||
bool hanging; //!< xenl state
|
|
||||||
|
|
||||||
bool autowrap; //!< Wrapping when EOL
|
|
||||||
bool insert_mode; //!< Insert mode (move rest of the line to the right)
|
|
||||||
|
|
||||||
// TODO use those for input processing
|
|
||||||
bool kp_alternate; //!< Application Mode - affects how user input of control keys is sent
|
|
||||||
bool curs_alternate; //!< Application mode for cursor keys
|
|
||||||
|
|
||||||
bool visible; //!< Visible (not attribute, DEC special)
|
|
||||||
bool inverse;
|
|
||||||
u8 attrs;
|
|
||||||
|
|
||||||
char charset0;
|
char charset0;
|
||||||
char charset1;
|
char charset1;
|
||||||
int charsetN;
|
} scr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int x; //!< X coordinate
|
||||||
|
int y; //!< Y coordinate
|
||||||
|
bool hanging; //!< xenl state - cursor half-wrapped
|
||||||
|
|
||||||
|
// SGR
|
||||||
|
bool inverse; //!< not in attrs bc it's applied server-side (not sent to browser)
|
||||||
|
u8 attrs;
|
||||||
Color fg; //!< Foreground color for writing
|
Color fg; //!< Foreground color for writing
|
||||||
Color bg; //!< Background color for writing
|
Color bg; //!< Background color for writing
|
||||||
} cursor;
|
|
||||||
|
// Other attribs
|
||||||
|
int charsetN;
|
||||||
|
bool wraparound; //!< Wrapping when EOL
|
||||||
|
|
||||||
|
// Not saved/restored
|
||||||
|
bool insert_mode; //!< Insert mode (move rest of the line to the right)
|
||||||
|
bool visible; //!< Visible (not attribute, DEC special)
|
||||||
|
} CursorTypeDef;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cursor position and attributes
|
||||||
|
*/
|
||||||
|
static CursorTypeDef cursor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saved cursor position, used with the SCP RCP commands
|
* Saved cursor position, used with the SCP RCP commands
|
||||||
*/
|
*/
|
||||||
static struct {
|
static CursorTypeDef cursor_sav;
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
bool hanging; //!< xenl state
|
|
||||||
|
|
||||||
// mark that attrs are saved
|
/**
|
||||||
bool withAttrs;
|
* This is used to prevent premature change notifications
|
||||||
u8 attrs;
|
* (from nested calls)
|
||||||
bool inverse; // attribute that's not in the bitfield
|
*/
|
||||||
Color fg;
|
|
||||||
Color bg;
|
|
||||||
} cursor_sav;
|
|
||||||
|
|
||||||
// XXX volatile is probably not needed
|
|
||||||
static volatile int notifyLock = 0;
|
static volatile int notifyLock = 0;
|
||||||
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
//region Helpers
|
|
||||||
|
|
||||||
#define NOTIFY_LOCK() do { \
|
#define NOTIFY_LOCK() do { \
|
||||||
notifyLock++; \
|
notifyLock++; \
|
||||||
} while(0)
|
} while(0)
|
||||||
@@ -93,7 +88,12 @@ static volatile int notifyLock = 0;
|
|||||||
if (notifyLock == 0) screen_notifyChange(CHANGE_CONTENT); \
|
if (notifyLock == 0) screen_notifyChange(CHANGE_CONTENT); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define clear_invalid_hanging() do { if (cursor.hanging && cursor.x != W-1) cursor.hanging = false; } while(false)
|
/** Clear the hanging attribute if the cursor is no longer >= W */
|
||||||
|
#define clear_invalid_hanging() do { \
|
||||||
|
if (cursor.hanging && cursor.x != W-1) cursor.hanging = false; \
|
||||||
|
} while(false)
|
||||||
|
|
||||||
|
//region --- Settings ---
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restore hard defaults
|
* Restore hard defaults
|
||||||
@@ -133,6 +133,75 @@ void terminal_apply_settings_noclear(void)
|
|||||||
screen_init();
|
screen_init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
//region --- Reset / Init ---
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init the screen (entire mappable area - for consistency)
|
||||||
|
*/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
screen_init(void)
|
||||||
|
{
|
||||||
|
NOTIFY_LOCK();
|
||||||
|
screen_reset();
|
||||||
|
NOTIFY_DONE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the cursor position & colors
|
||||||
|
*/
|
||||||
|
static void ICACHE_FLASH_ATTR
|
||||||
|
cursor_reset(void)
|
||||||
|
{
|
||||||
|
cursor.x = 0;
|
||||||
|
cursor.y = 0;
|
||||||
|
cursor.hanging = false;
|
||||||
|
cursor.visible = true;
|
||||||
|
cursor.insert_mode = false;
|
||||||
|
|
||||||
|
cursor.charsetN = 0;
|
||||||
|
cursor.wraparound = true;
|
||||||
|
|
||||||
|
screen_reset_sgr();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the cursor (\e[0m)
|
||||||
|
*/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
screen_reset_sgr(void)
|
||||||
|
{
|
||||||
|
cursor.fg = termconf_scratch.default_fg;
|
||||||
|
cursor.bg = termconf_scratch.default_bg;
|
||||||
|
cursor.attrs = 0;
|
||||||
|
cursor.inverse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the screen - called by ESC c
|
||||||
|
*/
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
screen_reset(void)
|
||||||
|
{
|
||||||
|
NOTIFY_LOCK();
|
||||||
|
|
||||||
|
cursor_reset();
|
||||||
|
|
||||||
|
scr.numpad_alt_mode = false;
|
||||||
|
scr.cursors_alt_mode = false;
|
||||||
|
|
||||||
|
scr.charset0 = 'B';
|
||||||
|
scr.charset1 = '0';
|
||||||
|
|
||||||
|
// size is left unchanged
|
||||||
|
screen_clear(CLEAR_ALL);
|
||||||
|
|
||||||
|
NOTIFY_DONE();
|
||||||
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
//region --- Clearing & inserting ---
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear range, inclusive
|
* Clear range, inclusive
|
||||||
@@ -158,71 +227,6 @@ clear_range(unsigned int from, unsigned int to)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the cursor position & colors
|
|
||||||
*/
|
|
||||||
static void ICACHE_FLASH_ATTR
|
|
||||||
cursor_reset(void)
|
|
||||||
{
|
|
||||||
// TODO this should probably be public and invoked by "soft reset"
|
|
||||||
|
|
||||||
cursor.x = 0;
|
|
||||||
cursor.y = 0;
|
|
||||||
cursor.hanging = false;
|
|
||||||
cursor.fg = termconf_scratch.default_fg;
|
|
||||||
cursor.bg = termconf_scratch.default_bg;
|
|
||||||
cursor.visible = true;
|
|
||||||
cursor.autowrap = true;
|
|
||||||
cursor.attrs = false;
|
|
||||||
cursor.insert_mode = false;
|
|
||||||
|
|
||||||
cursor.kp_alternate = false;
|
|
||||||
cursor.curs_alternate = false;
|
|
||||||
|
|
||||||
cursor.charset0 = 'B';
|
|
||||||
cursor.charset1 = '0';
|
|
||||||
cursor.charsetN = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
//region Screen clearing
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Init the screen (entire mappable area - for consistency)
|
|
||||||
*/
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
screen_init(void)
|
|
||||||
{
|
|
||||||
NOTIFY_LOCK();
|
|
||||||
screen_reset();
|
|
||||||
NOTIFY_DONE();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the screen (only the visible area)
|
|
||||||
*/
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
screen_reset(void)
|
|
||||||
{
|
|
||||||
NOTIFY_LOCK();
|
|
||||||
cursor_reset();
|
|
||||||
screen_clear(CLEAR_ALL);
|
|
||||||
NOTIFY_DONE();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the cursor
|
|
||||||
*/
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
screen_reset_sgr(void)
|
|
||||||
{
|
|
||||||
cursor.fg = termconf_scratch.default_fg;
|
|
||||||
cursor.bg = termconf_scratch.default_bg;
|
|
||||||
cursor.attrs = 0;
|
|
||||||
cursor.inverse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear screen area
|
* Clear screen area
|
||||||
*/
|
*/
|
||||||
@@ -282,29 +286,6 @@ screen_clear_in_line(unsigned int count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
|
||||||
screen_fill_with_E(void)
|
|
||||||
{
|
|
||||||
NOTIFY_LOCK();
|
|
||||||
Cell sample;
|
|
||||||
sample.c[0] = 'E';
|
|
||||||
sample.c[1] = 0;
|
|
||||||
sample.c[2] = 0;
|
|
||||||
sample.c[3] = 0;
|
|
||||||
sample.fg = termconf_scratch.default_fg;
|
|
||||||
sample.bg = termconf_scratch.default_bg;
|
|
||||||
sample.attrs = 0;
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i <= W*H-1; i++) {
|
|
||||||
memcpy(&screen[i], &sample, sizeof(Cell));
|
|
||||||
}
|
|
||||||
NOTIFY_DONE();
|
|
||||||
}
|
|
||||||
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
//region Screen manipulation
|
|
||||||
|
|
||||||
void screen_insert_lines(unsigned int lines)
|
void screen_insert_lines(unsigned int lines)
|
||||||
{
|
{
|
||||||
NOTIFY_LOCK();
|
NOTIFY_LOCK();
|
||||||
@@ -383,6 +364,28 @@ void screen_delete_characters(unsigned int count)
|
|||||||
}
|
}
|
||||||
NOTIFY_DONE();
|
NOTIFY_DONE();
|
||||||
}
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
//region --- Entire screen manipulation ---
|
||||||
|
|
||||||
|
void ICACHE_FLASH_ATTR
|
||||||
|
screen_fill_with_E(void)
|
||||||
|
{
|
||||||
|
NOTIFY_LOCK();
|
||||||
|
Cell sample;
|
||||||
|
sample.c[0] = 'E';
|
||||||
|
sample.c[1] = 0;
|
||||||
|
sample.c[2] = 0;
|
||||||
|
sample.c[3] = 0;
|
||||||
|
sample.fg = termconf_scratch.default_fg;
|
||||||
|
sample.bg = termconf_scratch.default_bg;
|
||||||
|
sample.attrs = 0;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i <= W*H-1; i++) {
|
||||||
|
memcpy(&screen[i], &sample, sizeof(Cell));
|
||||||
|
}
|
||||||
|
NOTIFY_DONE();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the screen size
|
* Change the screen size
|
||||||
@@ -466,10 +469,9 @@ screen_scroll_down(unsigned int lines)
|
|||||||
done:
|
done:
|
||||||
NOTIFY_DONE();
|
NOTIFY_DONE();
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
//region Cursor manipulation
|
//region --- Cursor manipulation ---
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set cursor position
|
* Set cursor position
|
||||||
@@ -563,21 +565,8 @@ screen_cursor_move(int dy, int dx, bool scroll)
|
|||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
screen_cursor_save(bool withAttrs)
|
screen_cursor_save(bool withAttrs)
|
||||||
{
|
{
|
||||||
cursor_sav.x = cursor.x;
|
// always save with attribs
|
||||||
cursor_sav.y = cursor.y;
|
memcpy(&cursor_sav, &cursor, sizeof(CursorTypeDef));
|
||||||
cursor_sav.hanging = cursor.hanging;
|
|
||||||
|
|
||||||
cursor_sav.withAttrs = withAttrs;
|
|
||||||
|
|
||||||
if (withAttrs) {
|
|
||||||
cursor_sav.fg = cursor.fg;
|
|
||||||
cursor_sav.bg = cursor.bg;
|
|
||||||
cursor_sav.attrs = cursor.attrs;
|
|
||||||
} else {
|
|
||||||
cursor_sav.fg = termconf_scratch.default_fg;
|
|
||||||
cursor_sav.bg = termconf_scratch.default_bg;
|
|
||||||
cursor_sav.attrs = 0; // avoid leftovers if the wrong restore is used
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -587,27 +576,29 @@ void ICACHE_FLASH_ATTR
|
|||||||
screen_cursor_restore(bool withAttrs)
|
screen_cursor_restore(bool withAttrs)
|
||||||
{
|
{
|
||||||
NOTIFY_LOCK();
|
NOTIFY_LOCK();
|
||||||
|
|
||||||
|
if (withAttrs) {
|
||||||
|
memcpy(&cursor_sav, &cursor, sizeof(CursorTypeDef));
|
||||||
|
} else {
|
||||||
cursor.x = cursor_sav.x;
|
cursor.x = cursor_sav.x;
|
||||||
cursor.y = cursor_sav.y;
|
cursor.y = cursor_sav.y;
|
||||||
cursor.hanging = cursor_sav.hanging;
|
cursor.hanging = cursor_sav.hanging;
|
||||||
|
|
||||||
if (withAttrs) {
|
|
||||||
cursor.fg = cursor_sav.fg;
|
|
||||||
cursor.bg = cursor_sav.bg;
|
|
||||||
cursor.attrs = cursor_sav.attrs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTIFY_DONE();
|
NOTIFY_DONE();
|
||||||
}
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
//region --- Attribute setting ---
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable cursor display
|
* Enable cursor display
|
||||||
*/
|
*/
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
screen_cursor_enable(bool enable)
|
screen_cursor_visible(bool visible)
|
||||||
{
|
{
|
||||||
NOTIFY_LOCK();
|
NOTIFY_LOCK();
|
||||||
cursor.visible = enable;
|
cursor.visible = visible;
|
||||||
NOTIFY_DONE();
|
NOTIFY_DONE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,15 +608,9 @@ screen_cursor_enable(bool enable)
|
|||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
screen_wrap_enable(bool enable)
|
screen_wrap_enable(bool enable)
|
||||||
{
|
{
|
||||||
NOTIFY_LOCK();
|
cursor.wraparound = enable;
|
||||||
cursor.autowrap = enable;
|
|
||||||
NOTIFY_DONE();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
//region Colors
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set cursor foreground color
|
* Set cursor foreground color
|
||||||
*/
|
*/
|
||||||
@@ -664,8 +649,6 @@ screen_inverse_enable(bool ena)
|
|||||||
cursor.inverse = ena;
|
cursor.inverse = ena;
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if coords are in range
|
* Check if coords are in range
|
||||||
*
|
*
|
||||||
@@ -689,8 +672,8 @@ screen_set_charset_n(int Gx)
|
|||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
screen_set_charset(int Gx, char charset)
|
screen_set_charset(int Gx, char charset)
|
||||||
{
|
{
|
||||||
if (Gx == 0) cursor.charset0 = charset;
|
if (Gx == 0) scr.charset0 = charset;
|
||||||
if (Gx == 1) cursor.charset1 = charset;
|
if (Gx == 1) scr.charset1 = charset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
@@ -700,16 +683,19 @@ screen_set_insert_mode(bool insert)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
screen_set_keypad_application_mode(bool app_mode)
|
screen_set_numpad_alt_mode(bool alt_mode)
|
||||||
{
|
{
|
||||||
cursor.kp_alternate = app_mode;
|
scr.numpad_alt_mode = alt_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR
|
void ICACHE_FLASH_ATTR
|
||||||
screen_set_cursor_application_mode(bool app_mode)
|
screen_set_cursors_alt_mode(bool alt_mode)
|
||||||
{
|
{
|
||||||
cursor.curs_alternate = app_mode;
|
scr.cursors_alt_mode = alt_mode;
|
||||||
}
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
//region --- Printing ---
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a character in the cursor color, move to right with wrap.
|
* Set a character in the cursor color, move to right with wrap.
|
||||||
@@ -768,7 +754,7 @@ screen_putchar(const char *ch)
|
|||||||
if (cursor.hanging) {
|
if (cursor.hanging) {
|
||||||
// perform the scheduled wrap if hanging
|
// perform the scheduled wrap if hanging
|
||||||
// if autowrap = off, it overwrites the last char
|
// if autowrap = off, it overwrites the last char
|
||||||
if (cursor.autowrap) {
|
if (cursor.wraparound) {
|
||||||
cursor.x = 0;
|
cursor.x = 0;
|
||||||
cursor.y++;
|
cursor.y++;
|
||||||
// Y wrap
|
// Y wrap
|
||||||
@@ -789,7 +775,7 @@ screen_putchar(const char *ch)
|
|||||||
|
|
||||||
if (ch[1] == 0 && ch[0] <= 0x7f) {
|
if (ch[1] == 0 && ch[0] <= 0x7f) {
|
||||||
// we have len=1 and ASCII
|
// we have len=1 and ASCII
|
||||||
utf8_remap(c->c, ch[0], (cursor.charsetN == 0) ? cursor.charset0 : cursor.charset1);
|
utf8_remap(c->c, ch[0], (cursor.charsetN == 0) ? scr.charset0 : scr.charset1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// copy unicode char
|
// copy unicode char
|
||||||
@@ -899,45 +885,9 @@ utf8_remap(char *out, char g, char table)
|
|||||||
out[1] = 0;
|
out[1] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
//region --- Serialization ---
|
||||||
|
|
||||||
//region Serialization
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
* Debug dump
|
|
||||||
*/
|
|
||||||
void screen_dd(void)
|
|
||||||
{
|
|
||||||
for (int y = 0; y < H; y++) {
|
|
||||||
for (int x = 0; x < W; x++) {
|
|
||||||
Cell *cell = &screen[y * W + x];
|
|
||||||
|
|
||||||
// FG
|
|
||||||
printf("\033[");
|
|
||||||
if (cell->fg > 7) {
|
|
||||||
printf("%d", 90 + cell->fg - 8);
|
|
||||||
} else {
|
|
||||||
printf("%d", 30 + cell->fg);
|
|
||||||
}
|
|
||||||
printf("m");
|
|
||||||
|
|
||||||
// BG
|
|
||||||
printf("\033[");
|
|
||||||
if (cell->bg > 7) {
|
|
||||||
printf("%d", 100 + cell->bg - 8);
|
|
||||||
} else {
|
|
||||||
printf("%d", 40 + cell->bg);
|
|
||||||
}
|
|
||||||
printf("m");
|
|
||||||
|
|
||||||
printf("%c", cell->c);
|
|
||||||
}
|
|
||||||
printf("\033[0m\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct ScreenSerializeState {
|
struct ScreenSerializeState {
|
||||||
Color lastFg;
|
Color lastFg;
|
||||||
@@ -1041,7 +991,9 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
|
|||||||
cursor.fg |
|
cursor.fg |
|
||||||
(cursor.bg<<4) |
|
(cursor.bg<<4) |
|
||||||
(cursor.visible ? 1<<8 : 0) |
|
(cursor.visible ? 1<<8 : 0) |
|
||||||
(cursor.hanging ? 1<<9 : 0)
|
(cursor.hanging ? 1<<9 : 0) |
|
||||||
|
(scr.cursors_alt_mode ? 1<<10 : 0) |
|
||||||
|
(scr.numpad_alt_mode ? 1<<11 : 0)
|
||||||
)
|
)
|
||||||
, &w5);
|
, &w5);
|
||||||
|
|
||||||
@@ -1116,5 +1068,4 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
|
|||||||
|
|
||||||
return HTTPD_CGI_DONE;
|
return HTTPD_CGI_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|||||||
+4
-9
@@ -80,12 +80,7 @@ void terminal_restore_defaults(void);
|
|||||||
void terminal_apply_settings(void);
|
void terminal_apply_settings(void);
|
||||||
void terminal_apply_settings_noclear(void); // the same, but with no screen reset / init
|
void terminal_apply_settings_noclear(void); // the same, but with no screen reset / init
|
||||||
|
|
||||||
/**
|
/** Maximum screen size (determines size of the static data array) */
|
||||||
* Maximum screen size (determines size of the static data array)
|
|
||||||
*
|
|
||||||
* TODO May need adjusting if there are size problems when flashing the ESP.
|
|
||||||
* We could also try to pack the Cell struct to a single 32bit word.
|
|
||||||
*/
|
|
||||||
#define MAX_SCREEN_SIZE (80*30)
|
#define MAX_SCREEN_SIZE (80*30)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -161,7 +156,7 @@ void screen_cursor_save(bool withAttrs);
|
|||||||
/** Restore the cursor pos */
|
/** Restore the cursor pos */
|
||||||
void screen_cursor_restore(bool withAttrs);
|
void screen_cursor_restore(bool withAttrs);
|
||||||
/** Enable cursor display */
|
/** Enable cursor display */
|
||||||
void screen_cursor_enable(bool enable);
|
void screen_cursor_visible(bool visible);
|
||||||
/** Enable auto wrap */
|
/** Enable auto wrap */
|
||||||
void screen_wrap_enable(bool enable);
|
void screen_wrap_enable(bool enable);
|
||||||
|
|
||||||
@@ -181,9 +176,9 @@ void screen_inverse_enable(bool ena);
|
|||||||
/** Toggle INSERT / REPLACE */
|
/** Toggle INSERT / REPLACE */
|
||||||
void screen_set_insert_mode(bool insert);
|
void screen_set_insert_mode(bool insert);
|
||||||
/** Toggle application keypad mode */
|
/** Toggle application keypad mode */
|
||||||
void screen_set_keypad_application_mode(bool app_mode);
|
void screen_set_numpad_alt_mode(bool app_mode);
|
||||||
/** Toggle application cursor mode */
|
/** Toggle application cursor mode */
|
||||||
void screen_set_cursor_application_mode(bool app_mode);
|
void screen_set_cursors_alt_mode(bool app_mode);
|
||||||
|
|
||||||
void screen_set_charset_n(int Gx);
|
void screen_set_charset_n(int Gx);
|
||||||
void screen_set_charset(int Gx, char charset);
|
void screen_set_charset(int Gx, char charset);
|
||||||
|
|||||||
@@ -43,11 +43,6 @@ wifimgr_restore_defaults(void)
|
|||||||
IP4_ADDR(&wificonf->sta_addr.ip, 192, 168, 0, (mac[5] == 1 ? 2 : mac[5])); // avoid being the same as "default gw"
|
IP4_ADDR(&wificonf->sta_addr.ip, 192, 168, 0, (mac[5] == 1 ? 2 : mac[5])); // avoid being the same as "default gw"
|
||||||
IP4_ADDR(&wificonf->sta_addr.netmask, 255, 255, 255, 0);
|
IP4_ADDR(&wificonf->sta_addr.netmask, 255, 255, 255, 0);
|
||||||
IP4_ADDR(&wificonf->sta_addr.gw, 192, 168, 0, 1);
|
IP4_ADDR(&wificonf->sta_addr.gw, 192, 168, 0, 1);
|
||||||
|
|
||||||
// DEBUG ONLY - TODO remove for release
|
|
||||||
// wificonf->opmode = STATION_MODE;
|
|
||||||
// sprintf((char*)wificonf->sta_ssid, "Chlivek");
|
|
||||||
// sprintf((char*)wificonf->sta_password, "prase chrochta");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ICACHE_FLASH_ATTR
|
static void ICACHE_FLASH_ATTR
|
||||||
|
|||||||
Reference in New Issue
Block a user