Ottawa Bootcamp Publish
Dependencies: SX127x lorawan1v1
vt100.h@15:f380b2565ac0, 2018-10-21 (annotated)
- Committer:
- bootcamps
- Date:
- Sun Oct 21 01:06:42 2018 +0000
- Revision:
- 15:f380b2565ac0
- Parent:
- 9:1a94f4a5e716
Name and commissioning edits
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wayne Roberts |
0:62e456e60083 | 1 | /* |
Wayne Roberts |
0:62e456e60083 | 2 | / _____) _ | | |
Wayne Roberts |
0:62e456e60083 | 3 | ( (____ _____ ____ _| |_ _____ ____| |__ |
Wayne Roberts |
0:62e456e60083 | 4 | \____ \| ___ | (_ _) ___ |/ ___) _ \ |
Wayne Roberts |
0:62e456e60083 | 5 | _____) ) ____| | | || |_| ____( (___| | | | |
Wayne Roberts |
0:62e456e60083 | 6 | (______/|_____)_|_|_| \__)_____)\____)_| |_| |
Wayne Roberts |
0:62e456e60083 | 7 | (C)2015 Semtech |
Wayne Roberts |
0:62e456e60083 | 8 | |
Wayne Roberts |
0:62e456e60083 | 9 | Description: VT100 terminal support class |
Wayne Roberts |
0:62e456e60083 | 10 | |
Wayne Roberts |
0:62e456e60083 | 11 | License: Revised BSD License, see LICENSE.TXT file include in the project |
Wayne Roberts |
0:62e456e60083 | 12 | |
Wayne Roberts |
0:62e456e60083 | 13 | Maintainer: Miguel Luis and Gregory Cristian |
Wayne Roberts |
0:62e456e60083 | 14 | */ |
Wayne Roberts |
0:62e456e60083 | 15 | #ifndef __VT100_H__ |
Wayne Roberts |
0:62e456e60083 | 16 | #define __VT100_H__ |
Wayne Roberts |
0:62e456e60083 | 17 | |
Wayne Roberts |
0:62e456e60083 | 18 | #ifndef STRING_STACK_LIMIT |
Wayne Roberts |
0:62e456e60083 | 19 | #define STRING_STACK_LIMIT 120 |
Wayne Roberts |
0:62e456e60083 | 20 | #endif |
Wayne Roberts |
0:62e456e60083 | 21 | |
Wayne Roberts |
0:62e456e60083 | 22 | #ifdef TARGET_MOTE_L152RC |
Wayne Roberts |
0:62e456e60083 | 23 | #define VT100_BAUD 115200 |
Wayne Roberts |
0:62e456e60083 | 24 | #elif defined(TARGET_DISCO_L072CZ_LRWAN1) |
Wayne Roberts |
0:62e456e60083 | 25 | #define VT100_BAUD 38400 /* HSI? */ |
Wayne Roberts |
0:62e456e60083 | 26 | #elif defined(TARGET_NUCLEO_L152RE) |
Wayne Roberts |
0:62e456e60083 | 27 | #define VT100_BAUD 115200 |
Wayne Roberts |
0:62e456e60083 | 28 | #elif defined(TARGET_NUCLEO_L073RZ) |
Wayne Roberts |
0:62e456e60083 | 29 | #define VT100_BAUD 115200 |
Wayne Roberts |
9:1a94f4a5e716 | 30 | #elif defined(TARGET_NRF52_DK) |
Wayne Roberts |
9:1a94f4a5e716 | 31 | #define VT100_BAUD 115200 |
Wayne Roberts |
0:62e456e60083 | 32 | #else |
Wayne Roberts |
0:62e456e60083 | 33 | #error find_usable_vt100_baudrate |
Wayne Roberts |
0:62e456e60083 | 34 | #endif |
Wayne Roberts |
0:62e456e60083 | 35 | |
Wayne Roberts |
0:62e456e60083 | 36 | /** |
Wayne Roberts |
0:62e456e60083 | 37 | * Implements VT100 terminal commands support. |
Wayne Roberts |
0:62e456e60083 | 38 | * Implments also the same behaviour has RawSerial class. The only difference |
Wayne Roberts |
0:62e456e60083 | 39 | * is located in putc fucntion where writeable check is made befor sending the character. |
Wayne Roberts |
0:62e456e60083 | 40 | */ |
Wayne Roberts |
0:62e456e60083 | 41 | class VT100 : public SerialBase |
Wayne Roberts |
0:62e456e60083 | 42 | { |
Wayne Roberts |
0:62e456e60083 | 43 | public: |
Wayne Roberts |
0:62e456e60083 | 44 | enum TextAttributes |
Wayne Roberts |
0:62e456e60083 | 45 | { |
Wayne Roberts |
0:62e456e60083 | 46 | ATTR_OFF = 0, |
Wayne Roberts |
0:62e456e60083 | 47 | BOLD = 1, |
Wayne Roberts |
0:62e456e60083 | 48 | USCORE = 4, |
Wayne Roberts |
0:62e456e60083 | 49 | BLINK = 5, |
Wayne Roberts |
0:62e456e60083 | 50 | REVERSE = 7, |
Wayne Roberts |
0:62e456e60083 | 51 | BOLD_OFF = 21, |
Wayne Roberts |
0:62e456e60083 | 52 | USCORE_OFF = 24, |
Wayne Roberts |
0:62e456e60083 | 53 | BLINK_OFF = 25, |
Wayne Roberts |
0:62e456e60083 | 54 | REVERSE_OFF = 27, |
Wayne Roberts |
0:62e456e60083 | 55 | }; |
Wayne Roberts |
0:62e456e60083 | 56 | |
Wayne Roberts |
0:62e456e60083 | 57 | enum Colors |
Wayne Roberts |
0:62e456e60083 | 58 | { |
Wayne Roberts |
0:62e456e60083 | 59 | BLACK = 0, |
Wayne Roberts |
0:62e456e60083 | 60 | RED = 1, |
Wayne Roberts |
0:62e456e60083 | 61 | GREEN = 2, |
Wayne Roberts |
0:62e456e60083 | 62 | BROWN = 3, |
Wayne Roberts |
0:62e456e60083 | 63 | BLUE = 4, |
Wayne Roberts |
0:62e456e60083 | 64 | MAGENTA = 5, |
Wayne Roberts |
0:62e456e60083 | 65 | CYAN = 6, |
Wayne Roberts |
0:62e456e60083 | 66 | WHITE = 7, |
Wayne Roberts |
0:62e456e60083 | 67 | }; |
Wayne Roberts |
0:62e456e60083 | 68 | |
Wayne Roberts |
0:62e456e60083 | 69 | VT100( PinName tx, PinName rx ): SerialBase(tx, rx, VT100_BAUD) |
Wayne Roberts |
0:62e456e60083 | 70 | { |
Wayne Roberts |
0:62e456e60083 | 71 | // initializes terminal to "power-on" settings |
Wayne Roberts |
0:62e456e60083 | 72 | // ESC c |
Wayne Roberts |
0:62e456e60083 | 73 | this->printf( "\x1B\x63" ); |
Wayne Roberts |
0:62e456e60083 | 74 | } |
Wayne Roberts |
0:62e456e60083 | 75 | |
Wayne Roberts |
0:62e456e60083 | 76 | void ClearScreen( uint8_t param ) |
Wayne Roberts |
0:62e456e60083 | 77 | { |
Wayne Roberts |
0:62e456e60083 | 78 | // ESC [ Ps J |
Wayne Roberts |
0:62e456e60083 | 79 | // 0 Clear screen from cursor down |
Wayne Roberts |
0:62e456e60083 | 80 | // 1 Clear screen from cursor up |
Wayne Roberts |
0:62e456e60083 | 81 | // 2 Clear entire screen |
Wayne Roberts |
0:62e456e60083 | 82 | this->printf( "\x1B[%dJ", param ); |
Wayne Roberts |
0:62e456e60083 | 83 | } |
Wayne Roberts |
0:62e456e60083 | 84 | |
Wayne Roberts |
0:62e456e60083 | 85 | void ClearLine( uint8_t param ) |
Wayne Roberts |
0:62e456e60083 | 86 | { |
Wayne Roberts |
0:62e456e60083 | 87 | // ESC [ Ps K |
Wayne Roberts |
0:62e456e60083 | 88 | // 0 Erase from the active position to the end of the line, inclusive (default) |
Wayne Roberts |
0:62e456e60083 | 89 | // 1 Erase from the start of the screen to the active position, inclusive |
Wayne Roberts |
0:62e456e60083 | 90 | // 2 Erase all of the line, inclusive |
Wayne Roberts |
0:62e456e60083 | 91 | this->printf( "\x1B[%dK", param ); |
Wayne Roberts |
0:62e456e60083 | 92 | } |
Wayne Roberts |
0:62e456e60083 | 93 | |
Wayne Roberts |
0:62e456e60083 | 94 | void SetAttribute( uint8_t attr ) |
Wayne Roberts |
0:62e456e60083 | 95 | { |
Wayne Roberts |
0:62e456e60083 | 96 | // ESC [ Ps;...;Ps m |
Wayne Roberts |
0:62e456e60083 | 97 | this->printf( "\x1B[%dm", attr ); |
Wayne Roberts |
0:62e456e60083 | 98 | } |
Wayne Roberts |
0:62e456e60083 | 99 | |
Wayne Roberts |
0:62e456e60083 | 100 | void SetAttribute( uint8_t attr, uint8_t fgcolor, uint8_t bgcolor ) |
Wayne Roberts |
0:62e456e60083 | 101 | { |
Wayne Roberts |
0:62e456e60083 | 102 | // ESC [ Ps;...;Ps m |
Wayne Roberts |
0:62e456e60083 | 103 | this->printf( "\x1B[%d;%d;%dm", attr, fgcolor + 30, bgcolor + 40 ); |
Wayne Roberts |
0:62e456e60083 | 104 | } |
Wayne Roberts |
0:62e456e60083 | 105 | |
Wayne Roberts |
0:62e456e60083 | 106 | void SetCursorMode( uint8_t visible ) |
Wayne Roberts |
0:62e456e60083 | 107 | { |
Wayne Roberts |
0:62e456e60083 | 108 | if( visible == true ) |
Wayne Roberts |
0:62e456e60083 | 109 | { |
Wayne Roberts |
0:62e456e60083 | 110 | // ESC [ ? 25 h |
Wayne Roberts |
0:62e456e60083 | 111 | this->printf( "\x1B[?25h" ); |
Wayne Roberts |
0:62e456e60083 | 112 | } |
Wayne Roberts |
0:62e456e60083 | 113 | else |
Wayne Roberts |
0:62e456e60083 | 114 | { |
Wayne Roberts |
0:62e456e60083 | 115 | // ESC [ ? 25 l |
Wayne Roberts |
0:62e456e60083 | 116 | this->printf( "\x1B[?25l" ); |
Wayne Roberts |
0:62e456e60083 | 117 | } |
Wayne Roberts |
0:62e456e60083 | 118 | } |
Wayne Roberts |
0:62e456e60083 | 119 | |
Wayne Roberts |
0:62e456e60083 | 120 | void SetCursorPos( uint8_t line, uint8_t col ) |
Wayne Roberts |
0:62e456e60083 | 121 | { |
Wayne Roberts |
0:62e456e60083 | 122 | // ESC [ Pl ; Pc H |
Wayne Roberts |
0:62e456e60083 | 123 | this->printf( "\x1B[%d;%dH", line, col ); |
Wayne Roberts |
0:62e456e60083 | 124 | } |
Wayne Roberts |
0:62e456e60083 | 125 | |
Wayne Roberts |
0:62e456e60083 | 126 | void PutStringAt( uint8_t line, uint8_t col, const char *s ) |
Wayne Roberts |
0:62e456e60083 | 127 | { |
Wayne Roberts |
0:62e456e60083 | 128 | this->SetCursorPos( line, col ); |
Wayne Roberts |
0:62e456e60083 | 129 | this->printf( "%s", s ); |
Wayne Roberts |
0:62e456e60083 | 130 | } |
Wayne Roberts |
0:62e456e60083 | 131 | |
Wayne Roberts |
0:62e456e60083 | 132 | void PutCharAt( uint8_t line, uint8_t col, uint8_t c ) |
Wayne Roberts |
0:62e456e60083 | 133 | { |
Wayne Roberts |
0:62e456e60083 | 134 | this->SetCursorPos( line, col ); |
Wayne Roberts |
0:62e456e60083 | 135 | this->printf( "%c", c ); |
Wayne Roberts |
0:62e456e60083 | 136 | } |
Wayne Roberts |
0:62e456e60083 | 137 | |
Wayne Roberts |
0:62e456e60083 | 138 | void PutHexAt( uint8_t line, uint8_t col, uint16_t n ) |
Wayne Roberts |
0:62e456e60083 | 139 | { |
Wayne Roberts |
0:62e456e60083 | 140 | this->SetCursorPos( line, col ); |
Wayne Roberts |
0:62e456e60083 | 141 | this->printf( "%X", n ); |
Wayne Roberts |
0:62e456e60083 | 142 | } |
Wayne Roberts |
0:62e456e60083 | 143 | |
Wayne Roberts |
0:62e456e60083 | 144 | void PutBoxDrawingChar( uint8_t c ) |
Wayne Roberts |
0:62e456e60083 | 145 | { |
Wayne Roberts |
0:62e456e60083 | 146 | this->printf( "\x1B(0%c\x1b(B", c ); |
Wayne Roberts |
0:62e456e60083 | 147 | } |
Wayne Roberts |
0:62e456e60083 | 148 | |
Wayne Roberts |
0:62e456e60083 | 149 | bool Readable( void ) |
Wayne Roberts |
0:62e456e60083 | 150 | { |
Wayne Roberts |
0:62e456e60083 | 151 | return this->readable( ); |
Wayne Roberts |
0:62e456e60083 | 152 | } |
Wayne Roberts |
0:62e456e60083 | 153 | |
Wayne Roberts |
0:62e456e60083 | 154 | uint8_t GetChar( void ) |
Wayne Roberts |
0:62e456e60083 | 155 | { |
Wayne Roberts |
0:62e456e60083 | 156 | return this->getc( ); |
Wayne Roberts |
0:62e456e60083 | 157 | } |
Wayne Roberts |
0:62e456e60083 | 158 | |
Wayne Roberts |
0:62e456e60083 | 159 | /* |
Wayne Roberts |
0:62e456e60083 | 160 | * RawSerial class implmentation copy. |
Wayne Roberts |
0:62e456e60083 | 161 | */ |
Wayne Roberts |
0:62e456e60083 | 162 | /** Read a char from the serial port |
Wayne Roberts |
0:62e456e60083 | 163 | * |
Wayne Roberts |
0:62e456e60083 | 164 | * @returns The char read from the serial port |
Wayne Roberts |
0:62e456e60083 | 165 | */ |
Wayne Roberts |
0:62e456e60083 | 166 | int getc( ) |
Wayne Roberts |
0:62e456e60083 | 167 | { |
Wayne Roberts |
0:62e456e60083 | 168 | return _base_getc( ); |
Wayne Roberts |
0:62e456e60083 | 169 | } |
Wayne Roberts |
0:62e456e60083 | 170 | |
Wayne Roberts |
0:62e456e60083 | 171 | /** Write a char to the serial port |
Wayne Roberts |
0:62e456e60083 | 172 | * |
Wayne Roberts |
0:62e456e60083 | 173 | * @param c The char to write |
Wayne Roberts |
0:62e456e60083 | 174 | * |
Wayne Roberts |
0:62e456e60083 | 175 | * @returns The written char or -1 if an error occured |
Wayne Roberts |
0:62e456e60083 | 176 | */ |
Wayne Roberts |
0:62e456e60083 | 177 | int putc( int c ) |
Wayne Roberts |
0:62e456e60083 | 178 | { |
Wayne Roberts |
0:62e456e60083 | 179 | while( this->writeable( ) != 1 ); |
Wayne Roberts |
0:62e456e60083 | 180 | return _base_putc( c ); |
Wayne Roberts |
0:62e456e60083 | 181 | } |
Wayne Roberts |
0:62e456e60083 | 182 | |
Wayne Roberts |
0:62e456e60083 | 183 | /** Write a string to the serial port |
Wayne Roberts |
0:62e456e60083 | 184 | * |
Wayne Roberts |
0:62e456e60083 | 185 | * @param str The string to write |
Wayne Roberts |
0:62e456e60083 | 186 | * |
Wayne Roberts |
0:62e456e60083 | 187 | * @returns 0 if the write succeeds, EOF for error |
Wayne Roberts |
0:62e456e60083 | 188 | */ |
Wayne Roberts |
0:62e456e60083 | 189 | int puts( const char *str ) |
Wayne Roberts |
0:62e456e60083 | 190 | { |
Wayne Roberts |
0:62e456e60083 | 191 | while( *str ) |
Wayne Roberts |
0:62e456e60083 | 192 | putc( *str++ ); |
Wayne Roberts |
0:62e456e60083 | 193 | return 0; |
Wayne Roberts |
0:62e456e60083 | 194 | } |
Wayne Roberts |
0:62e456e60083 | 195 | |
Wayne Roberts |
0:62e456e60083 | 196 | // Experimental support for printf in RawSerial. No Stream inheritance |
Wayne Roberts |
0:62e456e60083 | 197 | // means we can't call printf() directly, so we use sprintf() instead. |
Wayne Roberts |
0:62e456e60083 | 198 | // We only call malloc() for the sprintf() buffer if the buffer |
Wayne Roberts |
0:62e456e60083 | 199 | // length is above a certain threshold, otherwise we use just the stack. |
Wayne Roberts |
0:62e456e60083 | 200 | int printf( const char *format, ... ) |
Wayne Roberts |
0:62e456e60083 | 201 | { |
Wayne Roberts |
0:62e456e60083 | 202 | std::va_list arg; |
Wayne Roberts |
0:62e456e60083 | 203 | va_start( arg, format ); |
Wayne Roberts |
0:62e456e60083 | 204 | int len = vsnprintf( NULL, 0, format, arg ); |
Wayne Roberts |
0:62e456e60083 | 205 | if( len < STRING_STACK_LIMIT ) |
Wayne Roberts |
0:62e456e60083 | 206 | { |
Wayne Roberts |
0:62e456e60083 | 207 | char temp[STRING_STACK_LIMIT]; |
Wayne Roberts |
0:62e456e60083 | 208 | vsprintf( temp, format, arg ); |
Wayne Roberts |
0:62e456e60083 | 209 | puts( temp ); |
Wayne Roberts |
0:62e456e60083 | 210 | } |
Wayne Roberts |
0:62e456e60083 | 211 | else |
Wayne Roberts |
0:62e456e60083 | 212 | { |
Wayne Roberts |
0:62e456e60083 | 213 | char *temp = new char[len + 1]; |
Wayne Roberts |
0:62e456e60083 | 214 | vsprintf( temp, format, arg ); |
Wayne Roberts |
0:62e456e60083 | 215 | puts( temp ); |
Wayne Roberts |
0:62e456e60083 | 216 | delete[] temp; |
Wayne Roberts |
0:62e456e60083 | 217 | } |
Wayne Roberts |
0:62e456e60083 | 218 | va_end( arg ); |
Wayne Roberts |
0:62e456e60083 | 219 | return len; |
Wayne Roberts |
0:62e456e60083 | 220 | } |
Wayne Roberts |
0:62e456e60083 | 221 | |
Wayne Roberts |
0:62e456e60083 | 222 | private: |
Wayne Roberts |
0:62e456e60083 | 223 | |
Wayne Roberts |
0:62e456e60083 | 224 | }; |
Wayne Roberts |
0:62e456e60083 | 225 | |
Wayne Roberts |
0:62e456e60083 | 226 | #endif // __VT100_H__ |