help page improvements, opt to hide botnav and buttons, DECOPT for those: 800 and 801, charset tables added to help page, terminal css overhaul to avoid Black Lines
	
		
	
				
					
				
			
							parent
							
								
									d2b2b89593
								
							
						
					
					
						commit
						ba9c757cdc
					
				| 
		 Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB  | 
| 
		 Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 11 KiB  | 
| 
		 After Width: | Height: | Size: 18 KiB  | 
@ -1,865 +1,20 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Tips & Troubleshooting</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<img src="/img/adapter.jpg" class="aside" alt="ESPTerm v2"> | 
				
			||||
		<ul> | 
				
			||||
			<li>*Communication UART (Rx, Tx)* can be configured in the <a href="<?= url('cfg_system') ?>">System Settings</a>.
 | 
				
			||||
 | 
				
			||||
			<li>*Boot log and debug messages* are available on pin *GPIO2* (P2) at 115200\,baud, 1 stop bit, no parity. | 
				
			||||
				Those messages may be disabled through compile flags. | 
				
			||||
 | 
				
			||||
			<li>*Loopback test*: Connect the Rx and Tx pins with a piece of wire. Anything you type in the browser should | 
				
			||||
				appear on the screen. Set _Parser Timeout = 0_ in <a href="<?= url('cfg_term') ?>">Terminal Settings</a>
 | 
				
			||||
				to be able to manually enter escape sequences. | 
				
			||||
 | 
				
			||||
			<li>There is very little RAM available to the webserver, and it can support at most 4 connections at the same time. | 
				
			||||
				Each terminal session (open window with the terminal screen) uses one persistent connection for screen updates. | 
				
			||||
				*Avoid leaving unused windows open*, or either the RAM or connections may be exhausted. | 
				
			||||
 | 
				
			||||
			<li>*For best performance*, use the module in Client mode (connected to external network) and minimize the number | 
				
			||||
				of simultaneous connections. Enabling AP consumes extra RAM because the DHCP server and Captive Portal | 
				
			||||
				DNS server are started. | 
				
			||||
 | 
				
			||||
			<li>In AP mode, *check that the WiFi channel used is clear*; interference may cause flaky connection. | 
				
			||||
				A good mobile app to use for this is | 
				
			||||
				<a href="https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer">WiFi Analyzer (Google Play)</a>. | 
				
			||||
				Adjust the hotspot strength and range using the _Tx Power setting_. | 
				
			||||
 | 
				
			||||
			<li>Hold the BOOT button (GPIO0 to GND) for ~1 second to force enable AP. Hold it for ~6 seconds to restore default settings. | 
				
			||||
				(This is indicated by the blue LED rapidly flashing). Default settings can be overwritten in the | 
				
			||||
				<a href="<?= url('cfg_system') ?>">System Settings</a>.
 | 
				
			||||
		</ul> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Basic Intro & Nomenclature</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<img src="/img/vt100.jpg" class="aside" alt="VT102"> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			ESPTerm emulates VT102 (pictured) with some additions from later VT models and Xterm. | 
				
			||||
			All commonly used attributes and commands are supported. | 
				
			||||
			ESPTerm is capable of displaying ncurses applications such as _Midnight Commander_ using _agetty_. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			ESPTerm accepts UTF-8 characters received on the communication UART and displays them on the screen, | 
				
			||||
			interpreting some codes as Control Characters. Those are e.g. _Carriage Return_ (13), _Line Feed_ (10), | 
				
			||||
			_Tab_ (9), _Backspace_ (8) and _Bell_ (7). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Escape sequences start with the control character _ESC_ (27), | 
				
			||||
			followed by any number of ASCII characters forming the body of the command. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Nomenclature & Command Types</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Examples on this help page use the following symbols for special characters and command types:\\ | 
				
			||||
			(spaces are for clarity only, _DO NOT_ include them in the commands!) | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<div class="tscroll"> | 
				
			||||
		<table class="nomen"> | 
				
			||||
			<thead><tr><th>Name</th><th>Symbol</th><th>ASCII</th><th>C string</th><th>Function</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td>*ESC*</td> | 
				
			||||
				<td>`\e`</td> | 
				
			||||
				<td>`ESC` (27)</td> | 
				
			||||
				<td>`"\e"`, `"\x1b"`, `"\033"`</td> | 
				
			||||
				<td>Introduces an escape sequence. _(Note: `\e` is a GCC extension)_</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>*Bell*</td> | 
				
			||||
				<td>`\a`</td> | 
				
			||||
				<td>`BEL`~(7)</td> | 
				
			||||
				<td>`"\a"`, `"\x7"`, `"\07"`</td> | 
				
			||||
				<td>Audible beep</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>*String Terminator*</td> | 
				
			||||
				<td>`ST`</td> | 
				
			||||
				<td>`ESC \`~(27~92)<br>_or_~`\a`~(7)</td> | 
				
			||||
				<td>`"\x1b\\"`, `"\a"`</td> | 
				
			||||
				<td>Terminates a string command (`\a` can be used as an alternative)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>*Control Sequence Introducer*</td> | 
				
			||||
				<td>`CSI`</td> | 
				
			||||
				<td>`ESC [`</td> | 
				
			||||
				<td>`"\x1b["`</td> | 
				
			||||
				<td>Starts a CSI command. Examples: `\e[?7;10h`, `\e[2J`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>*Operating System Command*</td> | 
				
			||||
				<td>`OSC`</td> | 
				
			||||
				<td>`ESC ]`</td> | 
				
			||||
				<td>`"\x1b]"`</td> | 
				
			||||
				<td>Starts an OSC command. Is followed by a command string terminated by `ST`. Example: `\e]0;My Screen Title\a`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>*Select Graphic Rendition*</td> | 
				
			||||
				<td>`SGR`</td> | 
				
			||||
				<td>`CSI <i>n</i>;<i>n</i>;<i>n</i>m`</td> | 
				
			||||
				<td>`"\x1b[1;2;3m"`</td> | 
				
			||||
				<td>Set text attributes, like color or style. 0 to 10 numbers can be used, `\e[m` is treated as `\e[0m`</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<p>There are also some other commands that don't follow the CSI, SGR or OSC pattern, such as `\e7` or | 
				
			||||
			`\e#8`. A list of the most important escape sequences is presented in the following sections.</p> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Screen Behavior & Refreshing</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			The initial screen size, title text and button labels can be configured in <a href="<?= url('cfg_term') ?>">Terminal Settings</a>.
 | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Screen updates are sent to the browser through a WebSocket after some time of inactivity on the communication UART | 
				
			||||
			(called "Redraw Delay"). After an update is sent, at least a time of "Redraw Cooldown" must elapse before the next | 
				
			||||
			update can be sent. Those delays are used is to avoid burdening the server with tiny updates during a large screen | 
				
			||||
			repaint. If you experience issues (broken image due to dropped bytes), try adjusting those config options. It may also | 
				
			||||
			be useful to try different baud rates. | 
				
			||||
		</p> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Text Attributes</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			All text attributes are set using SGR commands like `\e[10;20;30m`, with up to 10 numbers separated by semicolons. | 
				
			||||
			To restore all attributes to their default states, use SGR 0: `\e[0m` or `\e[m`. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>Those are the supported text attributes SGR codes:</p> | 
				
			||||
 | 
				
			||||
		<table> | 
				
			||||
			<thead><tr><th>Style</th><th>Enable</th><th>Disable</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr><td><b>Bold</b></td><td>1</td><td>21, 22</td></tr> | 
				
			||||
			<tr><td style="opacity:.6">Faint</td><td>2</td><td>22</td></tr> | 
				
			||||
			<tr><td><i>Italic</i></td><td>3</td><td>23</td></tr> | 
				
			||||
			<tr><td><u>Underlined</u></td><td>4</td><td>24</td></tr> | 
				
			||||
			<tr><td>Blink</td><td>5</td><td>25</td></tr> | 
				
			||||
			<tr><td><span style="color:black;background:#ccc;">Inverse</span></td><td>7</td><td>27</td></tr> | 
				
			||||
			<tr><td><s>Striked</s></td><td>9</td><td>29</td></tr> | 
				
			||||
			<tr><td>𝔉𝔯𝔞𝔨𝔱𝔲𝔯</td><td>20</td><td>23</td></tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold theme-0"> | 
				
			||||
	<h2>Colors</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			Colors are set using SGR commands (like `\e[10;20;30m`). The following tables list the SGR codes to use. | 
				
			||||
			Selected colors are used for any new text entered, as well as for empty space when using line and screen clearing commands. | 
				
			||||
			The configured default colors can be restored using SGR 39 for foreground and SGR 49 for background. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The actual color representation depends on a color theme which | 
				
			||||
			can be selected in <a href="<?= url('cfg_term') ?>">Terminal Settings</a>.
 | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Foreground colors</h3> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg7 fg0">30</span> | 
				
			||||
			<span class="bg0 fg1">31</span> | 
				
			||||
			<span class="bg0 fg2">32</span> | 
				
			||||
			<span class="bg0 fg3">33</span> | 
				
			||||
			<span class="bg0 fg4">34</span> | 
				
			||||
			<span class="bg0 fg5">35</span> | 
				
			||||
			<span class="bg0 fg6">36</span> | 
				
			||||
			<span class="bg0 fg7">37</span> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg0 fg8">90</span> | 
				
			||||
			<span class="bg0 fg9">91</span> | 
				
			||||
			<span class="bg0 fg10">92</span> | 
				
			||||
			<span class="bg0 fg11">93</span> | 
				
			||||
			<span class="bg0 fg12">94</span> | 
				
			||||
			<span class="bg0 fg13">95</span> | 
				
			||||
			<span class="bg0 fg14">96</span> | 
				
			||||
			<span class="bg0 fg15">97</span> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<h3>Background colors</h3> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg0 fg15">40</span> | 
				
			||||
			<span class="bg1 fg15">41</span> | 
				
			||||
			<span class="bg2 fg15">42</span> | 
				
			||||
			<span class="bg3 fg0">43</span> | 
				
			||||
			<span class="bg4 fg15">44</span> | 
				
			||||
			<span class="bg5 fg15">45</span> | 
				
			||||
			<span class="bg6 fg15">46</span> | 
				
			||||
			<span class="bg7 fg0">47</span> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg8 fg15">100</span> | 
				
			||||
			<span class="bg9 fg0">101</span> | 
				
			||||
			<span class="bg10 fg0">102</span> | 
				
			||||
			<span class="bg11 fg0">103</span> | 
				
			||||
			<span class="bg12 fg0">104</span> | 
				
			||||
			<span class="bg13 fg0">105</span> | 
				
			||||
			<span class="bg14 fg0">106</span> | 
				
			||||
			<span class="bg15 fg0">107</span> | 
				
			||||
		</div> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>User Input: Keyboard, Mouse</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<h3>Keyboard</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The user can input text using their keyboard, or on Android, using the on-screen keyboard which is open using | 
				
			||||
			a button beneath the screen. Supported are all printable characters, as well as many control keys, such as arrows, _Ctrl+letters_ | 
				
			||||
			and function keys. Sequences sent by function keys are based on VT102 and Xterm. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The codes sent by _Home_, _End_, _F1-F4_ and cursor keys are affected by various keyboard modes (_Application Cursor Keys_, | 
				
			||||
			_Application Numpad Mode_, _SS3 Fn Keys Mode_). | 
				
			||||
			Some can be set in the <a href="<?= url('cfg_term') ?>">Terminal Settings</a>, others via commands.
 | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Here are some examples of control key codes: | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<table> | 
				
			||||
			<thead><tr><th>Key</th><th>Code</th><th>Key</th><th>Code</th></tr></thead> | 
				
			||||
			<tr> | 
				
			||||
				<td>Up</td> | 
				
			||||
				<td>`\e[A`</td> | 
				
			||||
				<td>F1</td> | 
				
			||||
				<td>`\eOP`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Down</td> | 
				
			||||
				<td>`\e[B`</td> | 
				
			||||
				<td>F2</td> | 
				
			||||
				<td>`\eOQ`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Right</td> | 
				
			||||
				<td>`\e[C`</td> | 
				
			||||
				<td>F3</td> | 
				
			||||
				<td>`\eOR`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Left</td> | 
				
			||||
				<td>`\e[D`</td> | 
				
			||||
				<td>F4</td> | 
				
			||||
				<td>`\eOS`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Home</td> | 
				
			||||
				<td>`\eOH`</td> | 
				
			||||
				<td>F5</td> | 
				
			||||
				<td>`\e[15~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>End</td> | 
				
			||||
				<td>`\eOF`</td> | 
				
			||||
				<td>F6</td> | 
				
			||||
				<td>`\e[17~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Insert</td> | 
				
			||||
				<td>`\e[2~`</td> | 
				
			||||
				<td>F7</td> | 
				
			||||
				<td>`\e[18~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Delete</td> | 
				
			||||
				<td>`\e[3~`</td> | 
				
			||||
				<td>F8</td> | 
				
			||||
				<td>`\e[19~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Page Up</td> | 
				
			||||
				<td>`\e[5~`</td> | 
				
			||||
				<td>F9</td> | 
				
			||||
				<td>`\e[20~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Page Down</td> | 
				
			||||
				<td>`\e[6~`</td> | 
				
			||||
				<td>F10</td> | 
				
			||||
				<td>`\e[21~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Enter</td> | 
				
			||||
				<td>`\r` (13)</td> | 
				
			||||
				<td>F11</td> | 
				
			||||
				<td>`\e[23~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Ctrl+Enter</td> | 
				
			||||
				<td>`\n` (10)</td> | 
				
			||||
				<td>F12</td> | 
				
			||||
				<td>`\e[24~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Tab</td> | 
				
			||||
				<td>`\t` (9)</td> | 
				
			||||
				<td>ESC</td> | 
				
			||||
				<td>`\e` (27)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Backspace</td> | 
				
			||||
				<td>`\b` (8)</td> | 
				
			||||
				<td>Ctrl+A..Z</td> | 
				
			||||
				<td>ASCII 1-26</td> | 
				
			||||
			</tr> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Action buttons</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The blue buttons under the screen send ASCII codes 1, 2, 3, 4, 5, which incidentally | 
				
			||||
			correspond to _Ctrl+A,B,C,D,E_. This choice was made to make button press parsing as simple as possible. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Mouse</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			ESPTerm implements standard mouse tracking modes based on Xterm. Mouse tracking can be used to implement | 
				
			||||
			powerful user interactions such as on-screen buttons, draggable sliders or dials, menus etc. ESPTerm's | 
				
			||||
			mouse tracking was tested using VTTest and should be compatible with all terminal applications | 
				
			||||
			that request mouse tracking. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Mouse can be tracked in different ways; some are easier to parse, others more powerful. The coordinates | 
				
			||||
			can also be encoded in different ways. All mouse tracking options are set using option commands: | 
				
			||||
			`CSI ? _n_ h` to enable, `CSI ? _n_ l` to disable option _n_. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h4>Mouse Tracking Modes</h4> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			All tracking modes produce three numbers which are then encoded and send to the application. | 
				
			||||
			First is the _event number_ N, then the _X and Y coordinates_, 1-based. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Mouse buttons are numbered: 1=left, 2=middle, 3=right. | 
				
			||||
			Wheel works as two buttons (4 and 5) which generate only press events (no release). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<div class="tscroll"> | 
				
			||||
		<table class="nomen"> | 
				
			||||
			<thead><tr><th>Option</th><th>Name</th><th>Description</th></tr></thead> | 
				
			||||
			<tr> | 
				
			||||
				<td>`9`</td> | 
				
			||||
				<td>*X10~mode*</td> | 
				
			||||
				<td> | 
				
			||||
					This is the most basic tracking mode, in which <b>only button presses</b> are reported. | 
				
			||||
					N = button - 1: (0 left, 1 middle, 2 right, 3, 4 wheel). | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1000`</td> | 
				
			||||
				<td>*Normal~mode*</td> | 
				
			||||
				<td> | 
				
			||||
					In Normal mode, both button presses and releases are reported. | 
				
			||||
					The lower two bits of N indicate the button pressed: | 
				
			||||
					`00b` (0) left, `01b` (1) middle, `10b` (2) right, `11b` (3) button release. | 
				
			||||
					Wheel buttons are reported as 0 and 1 with added 64 (e.g. 64 and 65). | 
				
			||||
					Normal mode also supports tracking of modifier keys, which are added to N as bit masks: | 
				
			||||
					4=_Shift_, 8=_Meta/Alt_, 16=_Control/Cmd_. Example: middle button with _Shift_ = 1 + 4 = `101b` (5). | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1002`</td> | 
				
			||||
				<td>*Button-Event tracking*</td> | 
				
			||||
				<td> | 
				
			||||
					This is similar to Normal mode (`1000`), but mouse motion with a button held is also reported. | 
				
			||||
					A motion event is generated when the mouse cursor moves between screen character cells. | 
				
			||||
					A motion event has the same N as a press event, but 32 is added. | 
				
			||||
					For example, drag-drop event with the middle button will produce N = 1 (press), 33 (dragging) and 3 (release). | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1003`</td> | 
				
			||||
				<td>*Any-Event tracking*</td> | 
				
			||||
				<td> | 
				
			||||
					This mode is almost identical to Button Event tracking (1002), but motion events | 
				
			||||
					are sent even when no mouse buttons are held. This could be used to draw on-screen mouse cursor, for example. | 
				
			||||
					Motion events with no buttons will use N = 32 + _11b_ (35). | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1004`</td> | 
				
			||||
				<td>*Focus~tracking*</td> | 
				
			||||
				<td> | 
				
			||||
					Focus tracking is a separate function from the other mouse tracking modes, therefore they can be enabled together. | 
				
			||||
					Focus tracking reports when the terminal window (in Xterm) gets or loses focus, or in ESPTerm's case, when any | 
				
			||||
					user is connected. This can be used to pause/resume a game or on-screen animations. | 
				
			||||
					Focus tracking mode sends `CSI I` when the terminal receives, and `CSI O` when it loses focus. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
		</table> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<h4>Mouse Report Encoding</h4> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The following encoding schemes can be used with any of the tracking modes (except Focus tracking, which is not affected). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<div class="tscroll"> | 
				
			||||
		<table class="nomen"> | 
				
			||||
			<thead><tr><th>Option</th><th>Name</th><th>Description</th></tr></thead> | 
				
			||||
			<tr> | 
				
			||||
				<td>--</td> | 
				
			||||
				<td>*Normal~encoding*</td> | 
				
			||||
				<td> | 
				
			||||
					This is the default encoding scheme used when no other option is selected. | 
				
			||||
					In this mode, a mouse report has the format `CSI M _n_ _x_ _y_`, | 
				
			||||
					where _n_, _x_ and _y_ are characters with ASCII value = 32 (space) + the respective number, e.g. | 
				
			||||
					0 becomes 32 (space), 1 becomes 33 (!). The reason for adding 32 is to avoid producing control characters. | 
				
			||||
					Example: `\e[M !!` - left button press at coordinates 1,1 when using X10 mode. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1005`</td> | 
				
			||||
				<td>*UTF-8~encoding*</td> | 
				
			||||
				<td> | 
				
			||||
					This scheme should encode each of the numbers as a UTF-8 code point, expanding the maximum possible value. | 
				
			||||
					Since ESPTerm's screen size is limited and this has no practical benefit, this serves simply as an alias | 
				
			||||
					to the normal scheme. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1006`</td> | 
				
			||||
				<td>*SGR~encoding*</td> | 
				
			||||
				<td> | 
				
			||||
					In SGR encoding, the response looks like a SGR sequence with the three numbers as semicolon-separated | 
				
			||||
					ASCII values. In this case 32 is not added like in the Normal and UTF-8 schemes, because | 
				
			||||
					it would serve nor purpose here. Also, button release is not reported as 11b, | 
				
			||||
					but using the normal button code while changing the final SGR character: `M` for button press | 
				
			||||
					and `m` for button release. Example: `\e[2;80;24m` - the right button was released | 
				
			||||
					at row 80, column 24. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`1015`</td> | 
				
			||||
				<td>*URXVT~encoding*</td> | 
				
			||||
				<td> | 
				
			||||
					This is similar to SGR encoding, but the final character is always `M` and the numbers are | 
				
			||||
					like in the Normal scheme, with 32 added. This scheme has no real advantage over the previous schemes and | 
				
			||||
					was added solely for completeness. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
		</table> | 
				
			||||
		</div> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Cursor Commands</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			The coordinates are 1-based, origin is top left. The cursor can move within the entire screen, | 
				
			||||
			or in the active Scrolling Region if Origin Mode is enabled. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>After writing a character, the cursor advances to the right. If it has reached the end of the row, | 
				
			||||
			it stays on the same line, but writing the next character makes it jump to the start of the next | 
				
			||||
			line first, scrolling up if needed. If Auto-wrap mode is disabled, the cursor never wraps or scrolls | 
				
			||||
			the screen. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			*Legend:* | 
				
			||||
			Italic letters such as _n_ are ASCII numbers that serve as arguments, separated with a semicolon. | 
				
			||||
			If an argument is left out, it's treated as 0 or 1, depending on what makes sense for the command. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Movement</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>A \\ | 
				
			||||
						\e[<i>n</i>B \\ | 
				
			||||
						\e[<i>n</i>C \\ | 
				
			||||
						\e[<i>n</i>D | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Move cursor up (`A`), down (`B`), right (`C`), left (`D`)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>F \\ | 
				
			||||
						\e[<i>n</i>E | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Go _n_ lines up (`F`) or down (`E`), start of line</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>r</i>d \\ | 
				
			||||
						\e[<i>c</i>G \\ | 
				
			||||
						\e[<i>r</i>;<i>c</i>H | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Go to absolute position - row (`d`), column (`G`), or both (`H`). Use `\e[H` to go to 1,1. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[6n` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Query cursor position. Sent back as `\e[<i>r</i>;<i>c</i>R`. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Save / restore</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[s \\ | 
				
			||||
						\e[u | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Save (`s`) or restore (`u`) cursor position</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e7 \\ | 
				
			||||
						\e8 | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Save (`7`) or restore (`8`) cursor position and attributes</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Scrolling Region</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>a</i>;<i>b</i>r` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Set scrolling region to rows _a_ through _b_ and go to 1,1. By default, the | 
				
			||||
					scrolling region spans the entire screen height. The cursor can leave the region using | 
				
			||||
					absolute position commands, unless Origin Mode (see below) is active. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?6h \\ | 
				
			||||
						\e[?6l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Enable (`h`) or disable (`l`) Origin Mode and go to 1,1. In Origin Mode, all coordinates | 
				
			||||
					are relative to the Scrolling Region and the cursor can't leave the region. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>S \\ | 
				
			||||
						\e[<i>n</i>T | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Move contents of the Scrolling Region up (`S`) or down (`T`), pad with empty | 
				
			||||
					lines of the current background color. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Tab stops</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\eH` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Set tab stop at the current column. There are, by default, tabs every 8 columns. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>I \\ | 
				
			||||
						\e[<i>n</i>Z | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Advance (`I`) or go back (`Z`) _n_ tab stops or end/start of line. ASCII _TAB_ (9) is equivalent to <code>\e[1I</code></td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[0g \\ | 
				
			||||
						\e[3g \\ | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Clear tab stop at the current column (`0`), or all columns (`3`).</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Other options</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?7h \\ | 
				
			||||
						\e[?7l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Enable (`h`) or disable (`l`) cursor auto-wrap and screen auto-scroll</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?25h \\ | 
				
			||||
						\e[?25l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Show (`h`) or hide (`l`) the cursor</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Screen Content Manipulation</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			<b>Legend:</b> | 
				
			||||
			Italic letters such as _n_ are ASCII numbers that serve as arguments, separated with a semicolon. | 
				
			||||
			If an argument is left out, it's treated as 0 or 1, depending on what makes sense for the command. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>m</i>J` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Clear part of screen. _m_: 0 - from cursor, 1 - to cursor, 2 - all | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>m</i>K` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Erase part of line. _m_: 0 - from cursor, 1 - to cursor, 2 - all | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>n</i>X`</td> | 
				
			||||
				<td> | 
				
			||||
					Erase _n_ characters in line. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>L \\ | 
				
			||||
						\e[<i>n</i>M | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Insert (`L`) or delete (`M`) _n_ lines. Following lines are pulled up or pushed down. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>@ \\ | 
				
			||||
						\e[<i>n</i>P | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Insert (`@`) or delete (`P`) _n_ characters. The rest of the line is pulled left or pushed right. | 
				
			||||
					Characters going past the end of line are lost. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Alternate Character Sets</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			ESPTerm implements Alternate Character Sets as a way to print box drawing characters | 
				
			||||
			and special symbols. A character set can change what each received ASCII character | 
				
			||||
			is printed as on the screen (eg. "{" is "π" in codepage `0`). The implementation is based | 
				
			||||
			on the original VT devices. | 
				
			||||
			Since ESPTerm also fully supports UTF-8, you can probably ignore this feature and use | 
				
			||||
			Unicode directly. It's added for compatibility with some programs that use this. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>The following codepages are implemented:</p> | 
				
			||||
 | 
				
			||||
		<ul> | 
				
			||||
			<li>`B` - US ASCII (default)</li> | 
				
			||||
			<li>`A` - UK ASCII: # replaced with £</li> | 
				
			||||
			<li>`0` - Symbols and basic line drawing (standard DEC alternate character set)</li> | 
				
			||||
			<li>`1` - Symbols and advanced line drawing (based on DOS codepage 437)</li> | 
				
			||||
		</ul> | 
				
			||||
 | 
				
			||||
		<p>To see what character maps to which symbol, look in the source code or try it. All codepages use codes 32-127, 32 being space.</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			There are two character set slots, G0 and G1. | 
				
			||||
			Those slots are selected as active using ASCII codes Shift In and Shift Out (those originally served for shifting | 
				
			||||
			a red-black typewriter tape). Each slot (G0 and G1) can have a different codepage assigned. G0 and G1 and the active slot number are | 
				
			||||
			saved and restored with the cursor and cleared with a screen reset (<code>\ec</code>). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>The following commands are used:</p> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e(<i>x</i>`</td> | 
				
			||||
				<td>Set G0 = codepage <i>x</i></td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e)<i>x</i>`</td> | 
				
			||||
				<td>Set G1 = codepage <i>x</i></td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>_SO_ (14)</td> | 
				
			||||
				<td>Activate G0</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>_SI_ (15)</td> | 
				
			||||
				<td>Activate G1</td> | 
				
			||||
			</tr> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>System Commands</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			It's possible to dynamically change the screen title text and action button labels. | 
				
			||||
			Setting an empty label to a button makes it look disabled. The buttons send ASCII 1-5 when clicked. | 
				
			||||
			Those changes are not retained after restart. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\ec`</td> | 
				
			||||
				<td> | 
				
			||||
					Clear screen, reset attributes and cursor. | 
				
			||||
					The screen size, title and button labels remain unchanged. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e[5n`</td> | 
				
			||||
				<td> | 
				
			||||
					Query device status, ESPTerm replies with `\e[0n` "device is OK". | 
				
			||||
					Can be used to check if the terminal has booted up and is ready to receive commands. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>_CAN_ (24)</td> | 
				
			||||
				<td> | 
				
			||||
					This ASCII code is not a command, but is sent by ESPTerm when it becomes ready to receive commands. | 
				
			||||
					When this code is received on the UART, it means ESPTerm has restarted and is ready. Use this to detect | 
				
			||||
					spontaneous restarts which require a full screen repaint. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e]0;<i>title</i>\a`</td> | 
				
			||||
				<td>Set screen title (this is a standard OSC command)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e]<i>81</i>;<i>btn1</i>\a \\ | 
				
			||||
						\e]<i>82</i>;<i>btn2</i>\a \\ | 
				
			||||
						\e]<i>83</i>;<i>btn3</i>\a \\ | 
				
			||||
						\e]<i>84</i>;<i>btn4</i>\a \\ | 
				
			||||
						\e]<i>85</i>;<i>btn5</i>\a \\ | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Set button 1-5 label - eg.`\e]81;Yes\a` | 
				
			||||
					sets the first button text to "Yes". | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e[8;<i>r</i>;<i>c</i>t`</td> | 
				
			||||
				<td>Set screen size (this is a command borrowed from xterm)</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
<div class="Box"> | 
				
			||||
	<a href="#" onclick="hpfold(1)">Expand all</a> | <a href="#" onclick="hpfold(0)">Collapse all</a> | 
				
			||||
</div> | 
				
			||||
 | 
				
			||||
<?php require __DIR__ . "/help/troubleshooting.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/nomenclature.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/screen_behavior.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/input.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/charsets.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/sgr_styles.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/sgr_colors.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/cmd_cursor.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/cmd_screen.php"; ?> | 
				
			||||
<?php require __DIR__ . "/help/cmd_system.php"; ?> | 
				
			||||
 | 
				
			||||
<script> | 
				
			||||
	function hpfold(yes) { | 
				
			||||
		$('.fold').toggleClass('expanded', !!yes); | 
				
			||||
	} | 
				
			||||
</script> | 
				
			||||
 | 
				
			||||
@ -0,0 +1,80 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Alternate Character Sets</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			ESPTerm implements Alternate Character Sets as a way to print box drawing characters | 
				
			||||
			and special symbols. A character set can change what each received ASCII character | 
				
			||||
			is printed as on the screen (eg. "{" is "π" in codepage `0`). The implementation is based | 
				
			||||
			on the original VT devices. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Since ESPTerm also supports UTF-8, this feature is the most useful for applications | 
				
			||||
			which can't print UTF-8 or already use alternate character sets for historical reasons. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Supported codepages</h3> | 
				
			||||
 | 
				
			||||
		<ul> | 
				
			||||
			<li>`B` - US ASCII (default)</li> | 
				
			||||
			<li>`A` - UK ASCII: # replaced with £</li> | 
				
			||||
			<li>`0` - Symbols and basic line drawing (standard DEC alternate character set)</li> | 
				
			||||
			<li>`1` - Symbols and advanced line drawing (based on DOS codepage 437, ESPTerm specific)</li> | 
				
			||||
		</ul> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			All codepages use codes 32-127, 32 being space. A character with no entry in the active codepage | 
				
			||||
			stays unchanged. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<?php | 
				
			||||
			$codepages = load_esp_charsets(); | 
				
			||||
			foreach($codepages as $name => $cp) { | 
				
			||||
				echo "<h4>Codepage `$name`</h4>\n"; | 
				
			||||
				echo '<div class="charset">'; | 
				
			||||
				foreach($cp as $point) { | 
				
			||||
					$dis = $point[1]==$point[2]?' class="none"' : ''; | 
				
			||||
					echo "<div$dis><span>$point[0]</span><span>$point[1]</span><span>$point[2]</span></div>"; | 
				
			||||
				} | 
				
			||||
				echo '</div>'; | 
				
			||||
			} | 
				
			||||
		?> | 
				
			||||
 | 
				
			||||
		<h3>Switching commands</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			There are two character set slots, G0 and G1. | 
				
			||||
			Those slots are selected as active using ASCII codes Shift In and Shift Out (those originally served for shifting | 
				
			||||
			a red-black typewriter tape). Often only G0 is used for simplicity. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Each slot (G0 and G1) can have a different codepage assigned. G0 and G1 and the active slot number are | 
				
			||||
			saved and restored with the cursor and cleared with a screen reset (<code>\ec</code>). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>The following commands are used:</p> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e(<i>x</i>`</td> | 
				
			||||
				<td>Set G0 = codepage <i>x</i></td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e)<i>x</i>`</td> | 
				
			||||
				<td>Set G1 = codepage <i>x</i></td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>_SO_ (14)</td> | 
				
			||||
				<td>Activate G0</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>_SI_ (15)</td> | 
				
			||||
				<td>Activate G1</td> | 
				
			||||
			</tr> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,199 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Commands: Cursor Functions</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			The coordinates are 1-based, origin is top left. The cursor can move within the entire screen, | 
				
			||||
			or in the active Scrolling Region if Origin Mode is enabled. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>After writing a character, the cursor advances to the right. If it has reached the end of the row, | 
				
			||||
			it stays on the same line, but writing the next character makes it jump to the start of the next | 
				
			||||
			line first, scrolling up if needed. If Auto-wrap mode is disabled, the cursor never wraps or scrolls | 
				
			||||
			the screen. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			*Legend:* | 
				
			||||
			Italic letters such as _n_ are ASCII numbers that serve as arguments, separated with a semicolon. | 
				
			||||
			If an argument is left out, it's treated as 0 or 1, depending on what makes sense for the command. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Movement</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>A \\ | 
				
			||||
						\e[<i>n</i>B \\ | 
				
			||||
						\e[<i>n</i>C \\ | 
				
			||||
						\e[<i>n</i>D | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Move cursor up (`A`), down (`B`), right (`C`), left (`D`)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>F \\ | 
				
			||||
						\e[<i>n</i>E | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Go _n_ lines up (`F`) or down (`E`), start of line</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>r</i>d \\ | 
				
			||||
						\e[<i>c</i>G \\ | 
				
			||||
						\e[<i>r</i>;<i>c</i>H | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Go to absolute position - row (`d`), column (`G`), or both (`H`). Use `\e[H` to go to 1,1. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[6n` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Query cursor position. Sent back as `\e[<i>r</i>;<i>c</i>R`. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Save / restore</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[s \\ | 
				
			||||
						\e[u | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Save (`s`) or restore (`u`) cursor position</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e7 \\ | 
				
			||||
						\e8 | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Save (`7`) or restore (`8`) cursor position and attributes</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Scrolling Region</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>a</i>;<i>b</i>r` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Set scrolling region to rows _a_ through _b_ and go to 1,1. By default, the | 
				
			||||
					scrolling region spans the entire screen height. The cursor can leave the region using | 
				
			||||
					absolute position commands, unless Origin Mode (see below) is active. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?6h \\ | 
				
			||||
						\e[?6l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Enable (`h`) or disable (`l`) Origin Mode and go to 1,1. In Origin Mode, all coordinates | 
				
			||||
					are relative to the Scrolling Region and the cursor can't leave the region. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>S \\ | 
				
			||||
						\e[<i>n</i>T | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Move contents of the Scrolling Region up (`S`) or down (`T`), pad with empty | 
				
			||||
					lines of the current background color. This is similar to what happens when AutoWrap | 
				
			||||
					is enabled and some text is printed at the very end of the screen. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Tab stops</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\eH` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Set tab stop at the current column. There are, by default, tabs every 8 columns. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>I \\ | 
				
			||||
						\e[<i>n</i>Z | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Advance (`I`) or go back (`Z`) _n_ tab stops or end/start of line. ASCII _TAB_ (9) is equivalent to <code>\e[1I</code></td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[0g \\ | 
				
			||||
						\e[3g \\ | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Clear tab stop at the current column (`0`), or all columns (`3`).</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Other options</h3> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?7h \\ | 
				
			||||
						\e[?7l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Enable (`h`) or disable (`l`) cursor auto-wrap and screen auto-scroll</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?25h \\ | 
				
			||||
						\e[?25l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td>Show (`h`) or hide (`l`) the cursor</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,63 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Commands: Screen Functions</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			<b>Legend:</b> | 
				
			||||
			Italic letters such as _n_ are ASCII numbers that serve as arguments, separated with a semicolon. | 
				
			||||
			If an argument is left out, it's treated as 0 or 1, depending on what makes sense for the command. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>m</i>J` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Clear part of screen. _m_: 0 - from cursor, 1 - to cursor, 2 - all | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>m</i>K` | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Erase part of line. _m_: 0 - from cursor, 1 - to cursor, 2 - all | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					`\e[<i>n</i>X`</td> | 
				
			||||
				<td> | 
				
			||||
					Erase _n_ characters in line. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>L \\ | 
				
			||||
						\e[<i>n</i>M | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Insert (`L`) or delete (`M`) _n_ lines. Following lines are pulled up or pushed down. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[<i>n</i>@ \\ | 
				
			||||
						\e[<i>n</i>P | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Insert (`@`) or delete (`P`) _n_ characters. The rest of the line is pulled left or pushed right. | 
				
			||||
					Characters going past the end of line are lost. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,84 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Commands: System Functions</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			It's possible to dynamically change the screen title text and action button labels. | 
				
			||||
			Setting an empty label to a button makes it look disabled. The buttons send ASCII 1-5 when clicked. | 
				
			||||
			Those changes are not retained after restart. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<table class="ansiref w100"> | 
				
			||||
			<thead><tr><th>Code</th><th>Meaning</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\ec`</td> | 
				
			||||
				<td> | 
				
			||||
					Clear screen, reset attributes and cursor. | 
				
			||||
					The screen size, title and button labels remain unchanged. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e[5n`</td> | 
				
			||||
				<td> | 
				
			||||
					Query device status, ESPTerm replies with `\e[0n` "device is OK". | 
				
			||||
					Can be used to check if the terminal has booted up and is ready to receive commands. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>_CAN_ (24)</td> | 
				
			||||
				<td> | 
				
			||||
					This ASCII code is not a command, but is sent by ESPTerm when it becomes ready to receive commands. | 
				
			||||
					When this code is received on the UART, it means ESPTerm has restarted and is ready. Use this to detect | 
				
			||||
					spontaneous restarts which require a full screen repaint. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e]0;<i>title</i>\a`</td> | 
				
			||||
				<td>Set screen title (this is a standard OSC command)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e]<i>81</i>;<i>btn1</i>\a \\ | 
				
			||||
						\e]<i>82</i>;<i>btn2</i>\a \\ | 
				
			||||
						\e]<i>83</i>;<i>btn3</i>\a \\ | 
				
			||||
						\e]<i>84</i>;<i>btn4</i>\a \\ | 
				
			||||
						\e]<i>85</i>;<i>btn5</i>\a \\ | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Set button 1-5 label - eg.`\e]81;Yes\a` | 
				
			||||
					sets the first button text to "Yes". | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?800h \\ | 
				
			||||
						\e[?800l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Show (`h`) or hide (`l`) action buttons (the blue buttons under the screen). | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td> | 
				
			||||
					<code> | 
				
			||||
						\e[?801h \\ | 
				
			||||
						\e[?801l | 
				
			||||
					</code> | 
				
			||||
				</td> | 
				
			||||
				<td> | 
				
			||||
					Show (`h`) or hide (`l`) menu/help links under the screen. | 
				
			||||
				</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>`\e[8;<i>r</i>;<i>c</i>t`</td> | 
				
			||||
				<td>Set screen size (this is a command borrowed from xterm)</td> | 
				
			||||
			</tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,254 @@ | 
				
			||||
 | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>User Input: Keyboard, Mouse</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<h3>Keyboard</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The user can input text using their keyboard, or on Android, using the on-screen keyboard which is open using | 
				
			||||
			a button beneath the screen. Supported are all printable characters, as well as many control keys, such as arrows, _Ctrl+letters_ | 
				
			||||
			and function keys. Sequences sent by function keys are based on VT102 and Xterm. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The codes sent by _Home_, _End_, _F1-F4_ and cursor keys are affected by various keyboard modes (_Application Cursor Keys_, | 
				
			||||
			_Application Numpad Mode_, _SS3 Fn Keys Mode_). Some can be set in the <a href="<?= url('cfg_term') ?>">Terminal Settings</a>,
 | 
				
			||||
			others via commands. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Here are some examples of control key codes: | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<table> | 
				
			||||
			<thead><tr><th>Key</th><th>Code</th><th>Key</th><th>Code</th></tr></thead> | 
				
			||||
			<tr> | 
				
			||||
				<td>Up</td> | 
				
			||||
				<td>`\e[A`,~`\eOA`</td> | 
				
			||||
				<td>F1</td> | 
				
			||||
				<td>`\eOP`,~`\e[11\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Down</td> | 
				
			||||
				<td>`\e[B`,~`\eOB`</td> | 
				
			||||
				<td>F2</td> | 
				
			||||
				<td>`\eOQ`,~`\e[12\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Right</td> | 
				
			||||
				<td>`\e[C`,~`\eOC`</td> | 
				
			||||
				<td>F3</td> | 
				
			||||
				<td>`\eOR`,~`\e[13\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Left</td> | 
				
			||||
				<td>`\e[D`,~`\eOD`</td> | 
				
			||||
				<td>F4</td> | 
				
			||||
				<td>`\eOS`,~`\e[14\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Home</td> | 
				
			||||
				<td>`\eOH`,~`\e[H`,~`\e[1\~`</td> | 
				
			||||
				<td>F5</td> | 
				
			||||
				<td>`\e[15~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>End</td> | 
				
			||||
				<td>`\eOF`,~`\e[F`,~`\e[4\~`</td> | 
				
			||||
				<td>F6</td> | 
				
			||||
				<td>`\e[17\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Insert</td> | 
				
			||||
				<td>`\e[2\~`</td> | 
				
			||||
				<td>F7</td> | 
				
			||||
				<td>`\e[18\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Delete</td> | 
				
			||||
				<td>`\e[3\~`</td> | 
				
			||||
				<td>F8</td> | 
				
			||||
				<td>`\e[19\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Page Up</td> | 
				
			||||
				<td>`\e[5\~`</td> | 
				
			||||
				<td>F9</td> | 
				
			||||
				<td>`\e[20\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Page Down</td> | 
				
			||||
				<td>`\e[6\~`</td> | 
				
			||||
				<td>F10</td> | 
				
			||||
				<td>`\e[21\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Enter</td> | 
				
			||||
				<td>`\r` (13)</td> | 
				
			||||
				<td>F11</td> | 
				
			||||
				<td>`\e[23\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Ctrl+Enter</td> | 
				
			||||
				<td>`\n` (10)</td> | 
				
			||||
				<td>F12</td> | 
				
			||||
				<td>`\e[24\~`</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Tab</td> | 
				
			||||
				<td>`\t` (9)</td> | 
				
			||||
				<td>ESC</td> | 
				
			||||
				<td>`\e` (27)</td> | 
				
			||||
			</tr> | 
				
			||||
			<tr> | 
				
			||||
				<td>Backspace</td> | 
				
			||||
				<td>`\b` (8)</td> | 
				
			||||
				<td>Ctrl+A..Z</td> | 
				
			||||
				<td>ASCII 1-26</td> | 
				
			||||
			</tr> | 
				
			||||
		</table> | 
				
			||||
 | 
				
			||||
		<h3>Action buttons</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The blue buttons under the screen send ASCII codes 1, 2, 3, 4, 5, which incidentally | 
				
			||||
			correspond to _Ctrl+A,B,C,D,E_. This choice was made to make button press parsing as simple as possible. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Mouse</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			ESPTerm implements standard mouse tracking modes based on Xterm. Mouse tracking can be used to implement | 
				
			||||
			powerful user interactions such as on-screen buttons, draggable sliders or dials, menus etc. ESPTerm's | 
				
			||||
			mouse tracking was tested using VTTest and should be compatible with all terminal applications | 
				
			||||
			that request mouse tracking. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Mouse can be tracked in different ways; some are easier to parse, others more powerful. The coordinates | 
				
			||||
			can also be encoded in different ways. All mouse tracking options are set using option commands: | 
				
			||||
			`CSI ? _n_ h` to enable, `CSI ? _n_ l` to disable option _n_. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h4>Mouse Tracking Modes</h4> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			All tracking modes produce three numbers which are then encoded and send to the application. | 
				
			||||
			First is the _event number_ N, then the _X and Y coordinates_, 1-based. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Mouse buttons are numbered: 1=left, 2=middle, 3=right. | 
				
			||||
			Wheel works as two buttons (4 and 5) which generate only press events (no release). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<div class="tscroll"> | 
				
			||||
			<table class="nomen"> | 
				
			||||
				<thead><tr><th>Option</th><th>Name</th><th>Description</th></tr></thead> | 
				
			||||
				<tr> | 
				
			||||
					<td>`9`</td> | 
				
			||||
					<td>*X10~mode*</td> | 
				
			||||
					<td> | 
				
			||||
						This is the most basic tracking mode, in which <b>only button presses</b> are reported. | 
				
			||||
						N = button - 1: (0 left, 1 middle, 2 right, 3, 4 wheel). | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1000`</td> | 
				
			||||
					<td>*Normal~mode*</td> | 
				
			||||
					<td> | 
				
			||||
						In Normal mode, both button presses and releases are reported. | 
				
			||||
						The lower two bits of N indicate the button pressed: | 
				
			||||
						`00b` (0) left, `01b` (1) middle, `10b` (2) right, `11b` (3) button release. | 
				
			||||
						Wheel buttons are reported as 0 and 1 with added 64 (e.g. 64 and 65). | 
				
			||||
						Normal mode also supports tracking of modifier keys, which are added to N as bit masks: | 
				
			||||
						4=_Shift_, 8=_Meta/Alt_, 16=_Control/Cmd_. Example: middle button with _Shift_ = 1 + 4 = `101b` (5). | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1002`</td> | 
				
			||||
					<td>*Button-Event tracking*</td> | 
				
			||||
					<td> | 
				
			||||
						This is similar to Normal mode (`1000`), but mouse motion with a button held is also reported. | 
				
			||||
						A motion event is generated when the mouse cursor moves between screen character cells. | 
				
			||||
						A motion event has the same N as a press event, but 32 is added. | 
				
			||||
						For example, drag-drop event with the middle button will produce N = 1 (press), 33 (dragging) and 3 (release). | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1003`</td> | 
				
			||||
					<td>*Any-Event tracking*</td> | 
				
			||||
					<td> | 
				
			||||
						This mode is almost identical to Button Event tracking (1002), but motion events | 
				
			||||
						are sent even when no mouse buttons are held. This could be used to draw on-screen mouse cursor, for example. | 
				
			||||
						Motion events with no buttons will use N = 32 + _11b_ (35). | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1004`</td> | 
				
			||||
					<td>*Focus~tracking*</td> | 
				
			||||
					<td> | 
				
			||||
						Focus tracking is a separate function from the other mouse tracking modes, therefore they can be enabled together. | 
				
			||||
						Focus tracking reports when the terminal window (in Xterm) gets or loses focus, or in ESPTerm's case, when any | 
				
			||||
						user is connected. This can be used to pause/resume a game or on-screen animations. | 
				
			||||
						Focus tracking mode sends `CSI I` when the terminal receives, and `CSI O` when it loses focus. | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
			</table> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<h4>Mouse Report Encoding</h4> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The following encoding schemes can be used with any of the tracking modes (except Focus tracking, which is not affected). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<div class="tscroll"> | 
				
			||||
			<table class="nomen"> | 
				
			||||
				<thead><tr><th>Option</th><th>Name</th><th>Description</th></tr></thead> | 
				
			||||
				<tr> | 
				
			||||
					<td>--</td> | 
				
			||||
					<td>*Normal~encoding*</td> | 
				
			||||
					<td> | 
				
			||||
						This is the default encoding scheme used when no other option is selected. | 
				
			||||
						In this mode, a mouse report has the format `CSI M _n_ _x_ _y_`, | 
				
			||||
						where _n_, _x_ and _y_ are characters with ASCII value = 32 (space) + the respective number, e.g. | 
				
			||||
						0 becomes 32 (space), 1 becomes 33 (!). The reason for adding 32 is to avoid producing control characters. | 
				
			||||
						Example: `\e[M !!` - left button press at coordinates 1,1 when using X10 mode. | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1005`</td> | 
				
			||||
					<td>*UTF-8~encoding*</td> | 
				
			||||
					<td> | 
				
			||||
						This scheme should encode each of the numbers as a UTF-8 code point, expanding the maximum possible value. | 
				
			||||
						Since ESPTerm's screen size is limited and this has no practical benefit, this serves simply as an alias | 
				
			||||
						to the normal scheme. | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1006`</td> | 
				
			||||
					<td>*SGR~encoding*</td> | 
				
			||||
					<td> | 
				
			||||
						In SGR encoding, the response looks like a SGR sequence with the three numbers as semicolon-separated | 
				
			||||
						ASCII values. In this case 32 is not added like in the Normal and UTF-8 schemes, because | 
				
			||||
						it would serve nor purpose here. Also, button release is not reported as 11b, | 
				
			||||
						but using the normal button code while changing the final SGR character: `M` for button press | 
				
			||||
						and `m` for button release. Example: `\e[2;80;24m` - the right button was released | 
				
			||||
						at row 80, column 24. | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>`1015`</td> | 
				
			||||
					<td>*URXVT~encoding*</td> | 
				
			||||
					<td> | 
				
			||||
						This is similar to SGR encoding, but the final character is always `M` and the numbers are | 
				
			||||
						like in the Normal scheme, with 32 added. This scheme has no real advantage over the previous schemes and | 
				
			||||
						was added solely for completeness. | 
				
			||||
					</td> | 
				
			||||
				</tr> | 
				
			||||
			</table> | 
				
			||||
		</div> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,84 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Basic Intro & Nomenclature</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<img src="/img/vt100.jpg" class="aside" alt="VT102"> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			ESPTerm emulates VT102 (pictured) with some additions from later VT models and Xterm. | 
				
			||||
			All commonly used attributes and commands are supported. | 
				
			||||
			ESPTerm is capable of displaying ncurses applications such as _Midnight Commander_ using _agetty_. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			ESPTerm accepts UTF-8 characters received on the communication UART and displays them on the screen, | 
				
			||||
			interpreting some codes as Control Characters. Those are e.g. _Carriage Return_ (13), _Line Feed_ (10), | 
				
			||||
			_Tab_ (9), _Backspace_ (8) and _Bell_ (7). | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Escape sequences start with the control character _ESC_ (27), | 
				
			||||
			followed by any number of ASCII characters forming the body of the command. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Nomenclature & Command Types</h3> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Examples on this help page use the following symbols for special characters and command types:\\ | 
				
			||||
			(spaces are for clarity only, _DO NOT_ include them in the commands!) | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<div class="tscroll"> | 
				
			||||
			<table class="nomen"> | 
				
			||||
				<thead><tr><th>Name</th><th>Symbol</th><th>ASCII</th><th>C string</th><th>Function</th></tr></thead> | 
				
			||||
				<tbody> | 
				
			||||
				<tr> | 
				
			||||
					<td>*ESC*</td> | 
				
			||||
					<td>`\e`</td> | 
				
			||||
					<td>`ESC` (27)</td> | 
				
			||||
					<td>`"\e"`, `"\x1b"`, `"\033"`</td> | 
				
			||||
					<td>Introduces an escape sequence. _(Note: `\e` is a GCC extension)_</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>*Bell*</td> | 
				
			||||
					<td>`\a`</td> | 
				
			||||
					<td>`BEL`~(7)</td> | 
				
			||||
					<td>`"\a"`, `"\x7"`, `"\07"`</td> | 
				
			||||
					<td>Audible beep</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>*String Terminator*</td> | 
				
			||||
					<td>`ST`</td> | 
				
			||||
					<td>`ESC \`~(27~92)<br>_or_~`\a`~(7)</td> | 
				
			||||
					<td>`"\x1b\\"`, `"\a"`</td> | 
				
			||||
					<td>Terminates a string command (`\a` can be used as an alternative)</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>*Control Sequence Introducer*</td> | 
				
			||||
					<td>`CSI`</td> | 
				
			||||
					<td>`ESC [`</td> | 
				
			||||
					<td>`"\x1b["`</td> | 
				
			||||
					<td>Starts a CSI command. Examples: `\e[?7;10h`, `\e[2J`</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>*Operating System Command*</td> | 
				
			||||
					<td>`OSC`</td> | 
				
			||||
					<td>`ESC ]`</td> | 
				
			||||
					<td>`"\x1b]"`</td> | 
				
			||||
					<td>Starts an OSC command. Is followed by a command string terminated by `ST`. Example: `\e]0;My Screen Title\a`</td> | 
				
			||||
				</tr> | 
				
			||||
				<tr> | 
				
			||||
					<td>*Select Graphic Rendition*</td> | 
				
			||||
					<td>`SGR`</td> | 
				
			||||
					<td>`CSI <i>n</i>;<i>n</i>;<i>n</i>m`</td> | 
				
			||||
					<td>`"\x1b[1;2;3m"`</td> | 
				
			||||
					<td>Set text attributes, like color or style. 0 to 10 numbers can be used, `\e[m` is treated as `\e[0m`</td> | 
				
			||||
				</tr> | 
				
			||||
				</tbody> | 
				
			||||
			</table> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<p>There are also some other commands that don't follow the CSI, SGR or OSC pattern, such as `\e7` or | 
				
			||||
			`\e#8`. A list of the most important escape sequences is presented in the following sections.</p> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,17 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Screen Behavior & Refreshing</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			The initial screen size, title text and button labels can be configured in <a href="<?= url('cfg_term') ?>">Terminal Settings</a>.
 | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			Screen updates are sent to the browser through a WebSocket after some time of inactivity on the communication UART | 
				
			||||
			(called "Redraw Delay"). After an update is sent, at least a time of "Redraw Cooldown" must elapse before the next | 
				
			||||
			update can be sent. Those delays are used is to avoid burdening the server with tiny updates during a large screen | 
				
			||||
			repaint. If you experience issues (broken image due to dropped bytes), try adjusting those config options. It may also | 
				
			||||
			be useful to try different baud rates. | 
				
			||||
		</p> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,65 @@ | 
				
			||||
 | 
				
			||||
<div class="Box fold theme-0"> | 
				
			||||
	<h2>Commands: Color SGR</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			Colors are set using SGR commands (like `\e[10;20;30m`). The following tables list the SGR codes to use. | 
				
			||||
			Selected colors are used for any new text entered, as well as for empty space when using line and screen clearing commands. | 
				
			||||
			The configured default colors can be restored using SGR 39 for foreground and SGR 49 for background. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p> | 
				
			||||
			The actual color representation depends on a color theme which | 
				
			||||
			can be selected in <a href="<?= url('cfg_term') ?>">Terminal Settings</a>.
 | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<h3>Foreground colors</h3> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg7 fg0">30</span> | 
				
			||||
			<span class="bg0 fg1">31</span> | 
				
			||||
			<span class="bg0 fg2">32</span> | 
				
			||||
			<span class="bg0 fg3">33</span> | 
				
			||||
			<span class="bg0 fg4">34</span> | 
				
			||||
			<span class="bg0 fg5">35</span> | 
				
			||||
			<span class="bg0 fg6">36</span> | 
				
			||||
			<span class="bg0 fg7">37</span> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg0 fg8">90</span> | 
				
			||||
			<span class="bg0 fg9">91</span> | 
				
			||||
			<span class="bg0 fg10">92</span> | 
				
			||||
			<span class="bg0 fg11">93</span> | 
				
			||||
			<span class="bg0 fg12">94</span> | 
				
			||||
			<span class="bg0 fg13">95</span> | 
				
			||||
			<span class="bg0 fg14">96</span> | 
				
			||||
			<span class="bg0 fg15">97</span> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<h3>Background colors</h3> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg0 fg15">40</span> | 
				
			||||
			<span class="bg1 fg15">41</span> | 
				
			||||
			<span class="bg2 fg15">42</span> | 
				
			||||
			<span class="bg3 fg0">43</span> | 
				
			||||
			<span class="bg4 fg15">44</span> | 
				
			||||
			<span class="bg5 fg15">45</span> | 
				
			||||
			<span class="bg6 fg15">46</span> | 
				
			||||
			<span class="bg7 fg0">47</span> | 
				
			||||
		</div> | 
				
			||||
 | 
				
			||||
		<div class="colorprev"> | 
				
			||||
			<span class="bg8 fg15">100</span> | 
				
			||||
			<span class="bg9 fg0">101</span> | 
				
			||||
			<span class="bg10 fg0">102</span> | 
				
			||||
			<span class="bg11 fg0">103</span> | 
				
			||||
			<span class="bg12 fg0">104</span> | 
				
			||||
			<span class="bg13 fg0">105</span> | 
				
			||||
			<span class="bg14 fg0">106</span> | 
				
			||||
			<span class="bg15 fg0">107</span> | 
				
			||||
		</div> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,26 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Commands: Style SGR</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<p> | 
				
			||||
			All text attributes are set using SGR commands like `\e[10;20;30m`, with up to 10 numbers separated by semicolons. | 
				
			||||
			To restore all attributes to their default states, use SGR 0: `\e[0m` or `\e[m`. | 
				
			||||
		</p> | 
				
			||||
 | 
				
			||||
		<p>Those are the supported text attributes SGR codes:</p> | 
				
			||||
 | 
				
			||||
		<table> | 
				
			||||
			<thead><tr><th>Style</th><th>Enable</th><th>Disable</th></tr></thead> | 
				
			||||
			<tbody> | 
				
			||||
			<tr><td><b>Bold</b></td><td>1</td><td>21, 22</td></tr> | 
				
			||||
			<tr><td style="opacity:.6">Faint</td><td>2</td><td>22</td></tr> | 
				
			||||
			<tr><td><i>Italic</i></td><td>3</td><td>23</td></tr> | 
				
			||||
			<tr><td><u>Underlined</u></td><td>4</td><td>24</td></tr> | 
				
			||||
			<tr><td>Blink</td><td>5</td><td>25</td></tr> | 
				
			||||
			<tr><td><span style="color:black;background:#ccc;">Inverse</span></td><td>7</td><td>27</td></tr> | 
				
			||||
			<tr><td><s>Striked</s></td><td>9</td><td>29</td></tr> | 
				
			||||
			<tr><td>𝔉𝔯𝔞𝔨𝔱𝔲𝔯</td><td>20</td><td>23</td></tr> | 
				
			||||
			</tbody> | 
				
			||||
		</table> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,33 @@ | 
				
			||||
<div class="Box fold"> | 
				
			||||
	<h2>Tips & Troubleshooting</h2> | 
				
			||||
 | 
				
			||||
	<div class="Row v"> | 
				
			||||
		<ul> | 
				
			||||
			<li>*Communication UART (Rx, Tx)* can be configured in the <a href="<?= url('cfg_system') ?>">System Settings</a>.
 | 
				
			||||
 | 
				
			||||
			<li>*Boot log and debug messages* are available on pin *GPIO2* (P2) at 115200\,baud, 1 stop bit, no parity. | 
				
			||||
				Those messages may be disabled through compile flags. | 
				
			||||
 | 
				
			||||
			<li>*Loopback test*: Connect the Rx and Tx pins with a piece of wire. Anything you type in the browser should | 
				
			||||
				appear on the screen. Set _Parser Timeout = 0_ in <a href="<?= url('cfg_term') ?>">Terminal Settings</a>
 | 
				
			||||
				to be able to manually enter escape sequences. | 
				
			||||
 | 
				
			||||
			<li>There is very little RAM available to the webserver, and it can support at most 4 connections at the same time. | 
				
			||||
				Each terminal session (open window with the terminal screen) uses one persistent connection for screen updates. | 
				
			||||
				*Avoid leaving unused windows open*, or either the RAM or connections may be exhausted. | 
				
			||||
 | 
				
			||||
			<li>*For best performance*, use the module in Client mode (connected to external network) and minimize the number | 
				
			||||
				of simultaneous connections. Enabling AP consumes extra RAM because the DHCP server and Captive Portal | 
				
			||||
				DNS server are started. | 
				
			||||
 | 
				
			||||
			<li>In AP mode, *check that the WiFi channel used is clear*; interference may cause flaky connection. | 
				
			||||
				A good mobile app to use for this is | 
				
			||||
				<a href="https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer">WiFi Analyzer (Google Play)</a>. | 
				
			||||
				Adjust the hotspot strength and range using the _Tx Power setting_. | 
				
			||||
 | 
				
			||||
			<li>Hold the BOOT button (GPIO0 to GND) for ~1 second to force enable AP. Hold it for ~6 seconds to restore default settings. | 
				
			||||
				(This is indicated by the blue LED rapidly flashing). Default settings can be overwritten in the | 
				
			||||
				<a href="<?= url('cfg_system') ?>">System Settings</a>.
 | 
				
			||||
		</ul> | 
				
			||||
	</div> | 
				
			||||
</div> | 
				
			||||
@ -0,0 +1,169 @@ | 
				
			||||
//
 | 
				
			||||
// Created by MightyPork on 2017/09/06.
 | 
				
			||||
//
 | 
				
			||||
 | 
				
			||||
#ifndef ESPTERM_CHARACTER_SETS_H_H | 
				
			||||
#define ESPTERM_CHARACTER_SETS_H_H | 
				
			||||
 | 
				
			||||
#include <c_types.h> | 
				
			||||
 | 
				
			||||
// Tables must be contiguous!
 | 
				
			||||
 | 
				
			||||
#define CODEPAGE_A_BEGIN 35 | 
				
			||||
#define CODEPAGE_A_END 35 | 
				
			||||
 | 
				
			||||
static const u16 codepage_A[] = | 
				
			||||
	{//	Unicode    ASCII   SYM
 | 
				
			||||
		// %%BEGIN:A%%
 | 
				
			||||
		0x20a4, // 35   #   £
 | 
				
			||||
		// %%END:A%%
 | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
#define CODEPAGE_0_BEGIN 96 | 
				
			||||
#define CODEPAGE_0_END 126 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * translates VT100 ACS escape codes to Unicode values. | 
				
			||||
 * Based on rxvt-unicode screen.C table. | 
				
			||||
 */ | 
				
			||||
static const u16 codepage_0[] = | 
				
			||||
	{//	Unicode    ASCII   SYM
 | 
				
			||||
		// %%BEGIN:0%%
 | 
				
			||||
		0x2666, // 96	`	♦
 | 
				
			||||
		0x2592, // 97	a	▒
 | 
				
			||||
		0x2409, // 98	b	HT
 | 
				
			||||
		0x240c, // 99	c	FF
 | 
				
			||||
		0x240d, // 100	d	CR
 | 
				
			||||
		0x240a, // 101	e	LF
 | 
				
			||||
		0x00b0, // 102	f	°
 | 
				
			||||
		0x00b1, // 103	g	±
 | 
				
			||||
		0x2424, // 104	h	NL
 | 
				
			||||
		0x240b, // 105	i	VT
 | 
				
			||||
		0x2518, // 106	j	┘
 | 
				
			||||
		0x2510, // 107	k	┐
 | 
				
			||||
		0x250c, // 108	l	┌
 | 
				
			||||
		0x2514, // 109	m	└
 | 
				
			||||
		0x253c, // 110	n	┼
 | 
				
			||||
		0x23ba, // 111	o	⎺
 | 
				
			||||
		0x23bb, // 112	p	⎻
 | 
				
			||||
		0x2500, // 113	q	─
 | 
				
			||||
		0x23bc, // 114	r	⎼
 | 
				
			||||
		0x23bd, // 115	s	⎽
 | 
				
			||||
		0x251c, // 116	t	├
 | 
				
			||||
		0x2524, // 117	u	┤
 | 
				
			||||
		0x2534, // 118	v	┴
 | 
				
			||||
		0x252c, // 119	w	┬
 | 
				
			||||
		0x2502, // 120	x	│
 | 
				
			||||
		0x2264, // 121	y	≤
 | 
				
			||||
		0x2265, // 122	z	≥
 | 
				
			||||
		0x03c0, // 123	{	π
 | 
				
			||||
		0x2260, // 124	|	≠
 | 
				
			||||
		0x20a4, // 125	}	£
 | 
				
			||||
		0x00b7, // 126	~	·
 | 
				
			||||
		// %%END:0%%
 | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
#define CODEPAGE_1_BEGIN 33 | 
				
			||||
#define CODEPAGE_1_END 126 | 
				
			||||
 | 
				
			||||
static const u16 codepage_1[] = | 
				
			||||
	{//	Unicode    ASCII   SYM  DOS
 | 
				
			||||
		// %%BEGIN:1%%
 | 
				
			||||
		0x263A,	// 33	!	☺	(1)  - low ASCII symbols from DOS, moved to +32
 | 
				
			||||
		0x263B,	// 34	"	☻	(2)
 | 
				
			||||
		0x2665,	// 35	#	♥	(3)
 | 
				
			||||
		0x2666,	// 36	$	♦	(4)
 | 
				
			||||
		0x2663,	// 37	%	♣	(5)
 | 
				
			||||
		0x2660,	// 38	&	♠	(6)
 | 
				
			||||
		0x2022,	// 39	'	•	(7)  - inverse dot and circle left out, can be done with SGR
 | 
				
			||||
		0x231B,	// 40	(	⌛        - hourglass (timer icon)
 | 
				
			||||
		0x25CB,	// 41	)	○	(9)
 | 
				
			||||
		0x21AF,	// 42	*	↯        - electricity (lightning monitor...)
 | 
				
			||||
		0x266A,	// 43	+	♪	(13)
 | 
				
			||||
		0x266B,	// 44	,	♫	(14)
 | 
				
			||||
		0x263C,	// 45	-	☼	(15)
 | 
				
			||||
		0x2302,	// 46	.	⌂	(127)
 | 
				
			||||
		0x2622,	// 47	/	☢         - radioactivity (geiger counter...)
 | 
				
			||||
		0x2591,	// 48	0	░	(176) - this block is kept aligned and ordered from DOS, moved -128
 | 
				
			||||
		0x2592,	// 49	1	▒	(177)
 | 
				
			||||
		0x2593,	// 50	2	▓	(178)
 | 
				
			||||
		0x2502,	// 51	3	│	(179)
 | 
				
			||||
		0x2524,	// 52	4	┤	(180)
 | 
				
			||||
		0x2561,	// 53	5	╡	(181)
 | 
				
			||||
		0x2562,	// 54	6	╢	(182)
 | 
				
			||||
		0x2556,	// 55	7	╖	(183)
 | 
				
			||||
		0x2555,	// 56	8	╕	(184)
 | 
				
			||||
		0x2563,	// 57	9	╣	(185)
 | 
				
			||||
		0x2551,	// 58	:	║	(186)
 | 
				
			||||
		0x2557,	// 59	;	╗	(187)
 | 
				
			||||
		0x255D,	// 60	<	╝	(188)
 | 
				
			||||
		0x255C,	// 61	=	╜	(189)
 | 
				
			||||
		0x255B,	// 62	>	╛	(190)
 | 
				
			||||
		0x2510,	// 63	?	┐	(191)
 | 
				
			||||
		0x2514,	// 64	@	└	(192)
 | 
				
			||||
		0x2534,	// 65	A	┴	(193)
 | 
				
			||||
		0x252C,	// 66	B	┬	(194)
 | 
				
			||||
		0x251C,	// 67	C	├	(195)
 | 
				
			||||
		0x2500,	// 68	D	─	(196)
 | 
				
			||||
		0x253C,	// 69	E	┼	(197)
 | 
				
			||||
		0x255E,	// 70	F	╞	(198)
 | 
				
			||||
		0x255F,	// 71	G	╟	(199)
 | 
				
			||||
		0x255A,	// 72	H	╚	(200)
 | 
				
			||||
		0x2554,	// 73	I	╔	(201)
 | 
				
			||||
		0x2569,	// 74	J	╩	(202)
 | 
				
			||||
		0x2566,	// 75	K	╦	(203)
 | 
				
			||||
		0x2560,	// 76	L	╠	(204)
 | 
				
			||||
		0x2550,	// 77	M	═	(205)
 | 
				
			||||
		0x256C,	// 78	N	╬	(206)
 | 
				
			||||
		0x2567,	// 79	O	╧	(207)
 | 
				
			||||
		0x2568,	// 80	P	╨	(208)
 | 
				
			||||
		0x2564,	// 81	Q	╤	(209)
 | 
				
			||||
		0x2565,	// 82	R	╥	(210)
 | 
				
			||||
		0x2559,	// 83	S	╙	(211)
 | 
				
			||||
		0x2558,	// 84	T	╘	(212)
 | 
				
			||||
		0x2552,	// 85	U	╒	(213)
 | 
				
			||||
		0x2553,	// 86	V	╓	(214)
 | 
				
			||||
		0x256B,	// 87	W	╫	(215)
 | 
				
			||||
		0x256A,	// 88	X	╪	(216)
 | 
				
			||||
		0x2518,	// 89	Y	┘	(217)
 | 
				
			||||
		0x250C,	// 90	Z	┌	(218)
 | 
				
			||||
		0x2588,	// 91	[	█	(219)
 | 
				
			||||
		0x2584,	// 92	\	▄	(220)
 | 
				
			||||
		0x258C,	// 93	]	▌	(221)
 | 
				
			||||
		0x2590,	// 94	^	▐	(222)
 | 
				
			||||
		0x2580,	// 95	_	▀	(223)
 | 
				
			||||
		0x2195,	// 96	`	↕	(18)  - moved from low DOS ASCII
 | 
				
			||||
		0x2191,	// 97	a	↑	(24)
 | 
				
			||||
		0x2193,	// 98	b	↓	(25)
 | 
				
			||||
		0x2192,	// 99	c	→	(26)
 | 
				
			||||
		0x2190,	// 100	d	←	(27)
 | 
				
			||||
		0x2194,	// 101	e	↔	(29)
 | 
				
			||||
		0x25B2,	// 102	f	▲	(30)
 | 
				
			||||
		0x25BC,	// 103	g	▼	(31)
 | 
				
			||||
		0x25BA,	// 104	h	►	(16)
 | 
				
			||||
		0x25C4,	// 105	i	◄	(17)
 | 
				
			||||
		0x25E2,	// 106	j	◢         - added for slanted corners
 | 
				
			||||
		0x25E3,	// 107	k	◣
 | 
				
			||||
		0x25E4,	// 108	l	◤
 | 
				
			||||
		0x25E5,	// 109	m	◥
 | 
				
			||||
		0x256D,	// 110	n	╭         - rounded corners
 | 
				
			||||
		0x256E,	// 111	o	╮
 | 
				
			||||
		0x256F,	// 112	p	╯
 | 
				
			||||
		0x2570,	// 113	q	╰
 | 
				
			||||
		0x0,	// 114	r             - free positions for future expansion
 | 
				
			||||
		0x0,	// 115	s
 | 
				
			||||
		0x0,	// 116	t
 | 
				
			||||
		0x0,	// 117	u
 | 
				
			||||
		0x0,	// 118	v
 | 
				
			||||
		0x0,	// 119	w
 | 
				
			||||
		0x0,	// 120	x
 | 
				
			||||
		0x0,	// 121	y
 | 
				
			||||
		0x0,	// 122	z
 | 
				
			||||
		0x0,	// 123	{
 | 
				
			||||
		0x0,	// 124	|
 | 
				
			||||
		0x2714,	// 125	}	✔         - checkboxes or checklist items
 | 
				
			||||
		0x2718,	// 126	~	✘
 | 
				
			||||
		// %%END:1%%
 | 
				
			||||
	}; | 
				
			||||
 | 
				
			||||
#endif //ESPTERM_CHARACTER_SETS_H_H
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue