#ifndef VT100_h
#define VT100_h
//
//    FILE: VT100.h
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: VT100 codes, to be sent by serial.print() et al.
//    DATE: 2013-09-30
//     URL:
//
// Released to the public domain
//

// a sourcec of VT100 codes
// http://ascii-table.com/ansi-escape-sequences-vt-100.php

#include <stdint.h>


char * vt100_pos(uint8_t x, uint8_t y);


#define VT_ESC				"\033["

// CHAR MODES
#define VT_OFF				"\033[0m"
#define VT_BOLD				"\033[1m"
#define VT_LOWINTENS		"\033[2m"
#define VT_UNDERLINE		"\033[4m"
#define VT_BLINK			"\033[5m"
#define VT_REVERSE			"\033[7m"

// POSITIONING
#define VT_RESET			"\033[c"		// resets terminal to default settings
#define VT_CLS				"\033[2J"       // Esc[2J Clear entire screen with background color
#define VT_HOME				"\033[H"
#define VTC_POS				"H"     		// Esc[Line;ColumnH

#define VT_CUR_UP(x)		"\033[xA"		// Esc[ValueA 	Move cursor up n lines 	    CUU
#define VT_CUR_DN(x)		"\033[xB"		// Esc[ValueB 	Move cursor down n lines 	CUD
#define VT_CUR_LF(x)		"\033[xD"		// Esc[ValueC 	Move cursor right n lines 	CUF
#define VT_CUR_RT(x)		"\033[xC"		// Esc[ValueD 	Move cursor left n lines 	CUB


// ADDITIONAL CODES depend on terminal if supported.
/*
Esc[20h 	Set new line mode 	LMN
Esc[?1h 	Set cursor key to application 	DECCKM
none 	Set ANSI (versus VT52) 	DECANM
*/
#define VT_COL_SET_132()	"\033[?3h"		// Esc[?3h 	Set number of columns to 132 	DECCOLM
/*
Esc[?4h 	Set smooth scrolling 	DECSCLM
Esc[?5h 	Set reverse video on screen 	DECSCNM
Esc[?6h 	Set origin to relative 	DECOM
Esc[?7h 	Set auto-wrap mode 	DECAWM
Esc[?8h 	Set auto-repeat mode 	DECARM
Esc[?9h 	Set interlacing mode 	DECINLM

Esc[20l 	Set line feed mode 	LMN
Esc[?1l 	Set cursor key to cursor 	DECCKM
Esc[?2l 	Set VT52 (versus ANSI) 	DECANM
*/
#define VT_COL_SET_80()		"\033[?3l"		// Esc[?3l 	Set number of columns to 80 	DECCOLM
/*
Esc[?4l 	Set jump scrolling 	DECSCLM
Esc[?5l 	Set normal video on screen 	DECSCNM
Esc[?6l 	Set origin to absolute 	DECOM
Esc[?7l 	Reset auto-wrap mode 	DECAWM
Esc[?8l 	Reset auto-repeat mode 	DECARM
Esc[?9l 	Reset interlacing mode 	DECINLM

Esc= 	Set alternate keypad mode 	DECKPAM
Esc> 	Set numeric keypad mode 	DECKPNM

Esc(A 	Set United Kingdom G0 character set 	setukg0
Esc)A 	Set United Kingdom G1 character set 	setukg1
Esc(B 	Set United States G0 character set 	setusg0
Esc)B 	Set United States G1 character set 	setusg1
Esc(0 	Set G0 special chars. & line set 	setspecg0
Esc)0 	Set G1 special chars. & line set 	setspecg1
Esc(1 	Set G0 alternate character ROM 	setaltg0
Esc)1 	Set G1 alternate character ROM 	setaltg1
Esc(2 	Set G0 alt char ROM and spec. graphics 	setaltspecg0
Esc)2 	Set G1 alt char ROM and spec. graphics 	setaltspecg1

EscN 	Set single shift 2 	SS2
EscO 	Set single shift 3 	SS3

Esc[m 	Turn off character attributes 	SGR0
Esc[0m 	Turn off character attributes 	SGR0
Esc[1m 	Turn bold mode on 	SGR1
Esc[2m 	Turn low intensity mode on 	SGR2
Esc[4m 	Turn underline mode on 	SGR4
Esc[5m 	Turn blinking mode on 	SGR5
Esc[7m 	Turn reverse video on 	SGR7
Esc[8m 	Turn invisible text mode on 	SGR8

Esc[Line;Liner 	Set top and bottom lines of a window 	DECSTBM

Esc[ValueA 	Move cursor up n lines 	CUU
Esc[ValueB 	Move cursor down n lines 	CUD
Esc[ValueC 	Move cursor right n lines 	CUF
Esc[ValueD 	Move cursor left n lines 	CUB
Esc[H 	Move cursor to upper left corner 	cursorhome
Esc[;H 	Move cursor to upper left corner 	cursorhome
Esc[Line;ColumnH 	Move cursor to screen location v,h 	CUP
Esc[f 	Move cursor to upper left corner 	hvhome
Esc[;f 	Move cursor to upper left corner 	hvhome
Esc[Line;Columnf 	Move cursor to screen location v,h 	CUP
EscD 	Move/scroll window up one line 	IND
EscM 	Move/scroll window down one line 	RI
EscE 	Move to next line 	NEL
Esc7 	Save cursor position and attributes 	DECSC
Esc8 	Restore cursor position and attributes 	DECSC

EscH 	Set a tab at the current column 	HTS
Esc[g 	Clear a tab at the current column 	TBC
Esc[0g 	Clear a tab at the current column 	TBC
Esc[3g 	Clear all tabs 	TBC

Esc#3 	Double-height letters, top half 	DECDHL
Esc#4 	Double-height letters, bottom half 	DECDHL
Esc#5 	Single width, single height letters 	DECSWL
Esc#6 	Double width, single height letters 	DECDWL

Esc[K 	Clear line from cursor right 	EL0
Esc[0K 	Clear line from cursor right 	EL0
Esc[1K 	Clear line from cursor left 	EL1
Esc[2K 	Clear entire line 	EL2

Esc[J 	Clear screen from cursor down 	ED0
Esc[0J 	Clear screen from cursor down 	ED0
Esc[1J 	Clear screen from cursor up 	ED1
Esc[2J 	Clear entire screen 	ED2

Esc5n 	Device status report 	DSR
Esc0n 	Response: terminal is OK 	DSR
Esc3n 	Response: terminal is not OK 	DSR

Esc6n 	Get cursor position 	DSR
EscLine;ColumnR 	Response: cursor is at v,h 	CPR

Esc[c 	Identify what terminal type 	DA
Esc[0c 	Identify what terminal type (another) 	DA
Esc[?1;Value0c 	Response: terminal type code n 	DA

Escc 	Reset terminal to initial state 	RIS

Esc#8 	Screen alignment display 	DECALN
Esc[2;1y 	Confidence power up test 	DECTST
Esc[2;2y 	Confidence loopback test 	DECTST
Esc[2;9y 	Repeat power up test 	DECTST
Esc[2;10y 	Repeat loopback test 	DECTST

Esc[0q 	Turn off all four leds 	DECLL0
Esc[1q 	Turn on LED #1 	DECLL1
Esc[2q 	Turn on LED #2 	DECLL2
Esc[3q 	Turn on LED #3 	DECLL3
Esc[4q 	Turn on LED #4 	DECLL4


Codes for use in VT52 compatibility mode
Esc< 	Enter/exit ANSI mode (VT52) 	setansi

Esc= 	Enter alternate keypad mode 	altkeypad
Esc> 	Exit alternate keypad mode 	numkeypad

EscF 	Use special graphics character set 	setgr
EscG 	Use normal US/UK character set 	resetgr

EscA 	Move cursor up one line 	cursorup
EscB 	Move cursor down one line 	cursordn
EscC 	Move cursor right one char 	cursorrt
EscD 	Move cursor left one char 	cursorlf
EscH 	Move cursor to upper left corner 	cursorhome
EscLineColumn 	Move cursor to v,h location 	cursorpos(v,h)
EscI 	Generate a reverse line-feed 	revindex

EscK 	Erase to end of current line 	cleareol
EscJ 	Erase to end of screen 	cleareos

EscZ 	Identify what the terminal is 	ident
Esc/Z 	Correct response to ident 	identresp




VT100 Special Key Codes

These are sent from the terminal back to the computer when the particular key is pressed.
Note that the numeric keypad keys send different codes in numeric mode than in alternate mode.
See escape codes above to change keypad mode.



Function Keys:
EscOP	PF1
EscOQ	PF2
EscOR	PF3
EscOS	PF4



Arrow Keys:
    Reset 	Set
up 	EscA	EscOA
down 	EscB	EscOB
right 	EscC	EscOC
left 	EscD	EscOD



Numeric Keypad Keys:
EscOp	0
EscOq	1
EscOr	2
EscOs	3
EscOt	4
EscOu	5
EscOv	6
EscOw	7
EscOx	8
EscOy	9
EscOm	-(minus)
EscOl	,(comma)
EscOn	.(period)
EscOM	^M



Printing:
Esc[i 	Print Screen 	Print the current screen
Esc[1i	Print Line 	Print the current line
Esc[4i	Stop Print Log 	Disable log
Esc[5i	Start Print Log	Start log; all received text is echoed to a printer

*/

#endif
