LoRaWAN demo application using grove peripherals generating Cayenne LPP

Dependencies:   lorawan1v1

radio chip selection

Radio chip driver is not included, because two options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

Grove peripherals -> Cayenne demo

Read LoRaWAN-1.1 page for configuration instructions.

This project adds support for Murata discovery board, in addition to LoRa shields on NUCLEO boards.

Use with sx1272 shield with grove peripherals connected:

D8 D9: ButtonRX TXA3 A4: TempSense
D6 D7:SCL SDA : LEDA1 A2: Pot

Button

Sends two different payload types: short press (under 1 sec)
long press: held down > 1 sec.

serial console keys

115200bps, 8N1
Enter key not used
Keys '0' to '3': cayenne channel number
'0': pot (rotary sensor)
'1': temperature
'2': digital out
'3': analog out

DevEUI configuration

For use on networks which force you to use DevEUI defined by network, comment out HardwareIDtoDevEUI().
HardwareIDtoDevEUI() obtains DevEUI from the CPU unique hardware serial number. However, some networks may force you to use their DevEUI value.

Committer:
Wayne Roberts
Date:
Wed Feb 28 14:06:17 2018 -0800
Revision:
0:62e456e60083
Child:
9:1a94f4a5e716
initial commit

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__