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