ESPTerm - ESP8266 terminal emulator. Branches: [master] patches, [work] next release
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
espterm-firmware/user/apars_short.c

184 lines
4.4 KiB

//
// Created by MightyPork on 2017/08/20.
//
// Short sequences: (* = not implemented)
//
// ESC char
// ESC 6 Back Index (DECBI), VT420 and up.
// ESC 7 Save Cursor (DECSC).
// ESC 8 Restore Cursor (DECRC).
// ESC 9 Forward Index (DECFI), VT420 and up.
// ESC = Application Keypad (DECKPAM).
// ESC > Normal Keypad (DECKPNM).
// ESC F Cursor to lower left corner of screen.
// ESC c Full Reset (RIS).
// *ESC l Memory Lock (per HP terminals). Locks memory above the cursor.
// *ESC m Memory Unlock (per HP terminals).
// ESC n Invoke the G2 Character Set as GL (LS2).
// ESC o Invoke the G3 Character Set as GL (LS3).
// *ESC | Invoke the G3 Character Set as GR (LS3R).
// *ESC } Invoke the G2 Character Set as GR (LS2R).
// *ESC ~ Invoke the G1 Character Set as GR (LS1R).
//
// ESC # Ps
// *ESC # 3 DEC double-height line, top half (DECDHL).
// *ESC # 4 DEC double-height line, bottom half (DECDHL).
// *ESC # 5 DEC single-width line (DECSWL).
// *ESC # 6 DEC double-width line (DECDWL).
// ESC # 8 DEC Screen Alignment Test (DECALN).
//
// ESC SP char
// *ESC SP F 7-bit controls (S7C1T).
// *ESC SP G 8-bit controls (S8C1T).
// *ESC SP L Set ANSI conformance level 1 (dpANS X3.134.1).
// *ESC SP M Set ANSI conformance level 2 (dpANS X3.134.1).
// *ESC SP N Set ANSI conformance level 3 (dpANS X3.134.1).
//
// Charset commands
// ESC ( char Designate G0 character set ('0' = symbols, 'B' = ASCII-US, 'A' = ASCII-UK)
// ESC ) char Designate G1 character set
// SO Switch to G0 character set
// SI Switch to G1 character set
//
#include <esp8266.h>
#include "apars_short.h"
#include "apars_logging.h"
#include "screen.h"
// ----- Character Set ---
/**
* Command to assign G0 or G1
* @param slot - ( or ) for G0 or G1
* @param c - character table ID (0, B etc)
*/
void ICACHE_FLASH_ATTR
apars_handle_chs_designate(char slot, char c)
{
if (slot == '(') screen_set_charset(0, c); // G0
else if (slot == ')') screen_set_charset(1, c); // G1
else {
ansi_noimpl("ESC %c %c", slot, c);
}
// other alternatives * + . - / not implemented
}
/** Select charset slot */
void ICACHE_FLASH_ATTR
apars_handle_chs_switch(int Gx)
{
screen_set_charset_n(Gx);
}
// ----- ESC SP char -----
/**
* ESC SP <c> (this sets 8/7-bit mode and some other archaic options)
* @param c - key character
*/
void ICACHE_FLASH_ATTR
apars_handle_space_cmd(char c)
{
ansi_noimpl("ESC SP %c", c);
}
// ----- ESC # num -----
/**
* Codes in the format ESC # n
* @param c - the trailing symbol (numeric ASCII)
*/
void ICACHE_FLASH_ATTR apars_handle_hash_cmd(char c)
{
switch(c) {
case '3': // Double size, top half
case '4': // Single size, bottom half
case '5': // Single width, single height
case '6': // Double width
ansi_noimpl("Double Size Line");
break;
case '8':
screen_fill_with_E();
break;
default:
ansi_noimpl("ESC # %c", c);
}
}
// ----- ESC char -----
/**
* Single-character escape codes (ESC x)
* @param c - the trailing symbol (ASCII)
*/
void ICACHE_FLASH_ATTR apars_handle_short_cmd(char c)
{
switch(c) {
case 'c': // screen reset
screen_reset();
break;
case '6': // back index
screen_back_index(1);
break;
case '7': // save cursor + attributes
screen_cursor_save(true);
break;
case '8': // restore cursor + attributes
screen_cursor_restore(true);
break;
case 'E': // same as CR LF
screen_cursor_move(1, 0, false);
screen_cursor_set_x(0);
break;
case 'F': // bottom left
screen_cursor_set(termconf_scratch.height-1, 0);
break;
case 'D': // move cursor down, scroll screen up if needed
screen_cursor_move(1, 0, true);
break;
case 'M': // move cursor up, scroll screen down if needed
screen_cursor_move(-1, 0, true);
break;
case 'H':
screen_set_tab();
break;
case '>':
screen_set_numpad_alt_mode(false);
break;
case '<': // "Enter ANSI / VT100 mode" - no-op (we don't support VT52 mode)
break;
case '=':
screen_set_numpad_alt_mode(true);
break;
case '|': // Invoke the G3 Character Set as GR (LS3R).
case '}': // Invoke the G2 Character Set as GR (LS2R).
case '~': // Invoke the G1 Character Set as GR (LS1R).
// Those do not seem to do anything TODO investigate
break;
case '@': // no-op padding char (?)
break;
case '\\': // spurious string terminator
break;
default:
ansi_noimpl("ESC %c", c);
}
}