Bootcamp_Final

Dependencies:   lorawan1v1

Fork of LoRaWAN-grove-cayenne by wayne roberts

Committer:
bootcamps
Date:
Thu Apr 12 20:50:19 2018 +0000
Revision:
7:6107eb45fe98
Parent:
0:62e456e60083
Bootcamp

Who changed what in which revision?

UserRevisionLine numberNew 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__