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 Jul 25 09:55:31 2018 -0700
Revision:
11:09556b27dbce
Parent:
9:1a94f4a5e716
mbed-os to branch latest

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