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 serial display management
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 9:1a94f4a5e716 15 #include "lorawan_board.h"
Wayne Roberts 0:62e456e60083 16
Wayne Roberts 0:62e456e60083 17 #include "SerialDisplay.h"
Wayne Roberts 0:62e456e60083 18 #include "LoRaMacString.h"
Wayne Roberts 0:62e456e60083 19
Wayne Roberts 0:62e456e60083 20 #ifdef ENABLE_VT100
Wayne Roberts 0:62e456e60083 21 VT100 vt( USBTX, USBRX );
Wayne Roberts 0:62e456e60083 22
Wayne Roberts 0:62e456e60083 23 void SerialPrintCheckBox( bool activated, uint8_t color )
Wayne Roberts 0:62e456e60083 24 {
Wayne Roberts 0:62e456e60083 25 if( activated == true )
Wayne Roberts 0:62e456e60083 26 {
Wayne Roberts 0:62e456e60083 27 vt.SetAttribute( VT100::ATTR_OFF, color, color );
Wayne Roberts 0:62e456e60083 28 }
Wayne Roberts 0:62e456e60083 29 else
Wayne Roberts 0:62e456e60083 30 {
Wayne Roberts 0:62e456e60083 31 vt.SetAttribute( VT100::ATTR_OFF );
Wayne Roberts 0:62e456e60083 32 }
Wayne Roberts 0:62e456e60083 33 vt.printf( " " );
Wayne Roberts 0:62e456e60083 34 vt.SetAttribute( VT100::ATTR_OFF );
Wayne Roberts 0:62e456e60083 35 }
Wayne Roberts 0:62e456e60083 36
Wayne Roberts 0:62e456e60083 37 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 38 void SerialDisplayUpdateActivationMode( bool otaa )
Wayne Roberts 0:62e456e60083 39 {
Wayne Roberts 0:62e456e60083 40 vt.SetCursorPos( 4, 17 ); // TODO
Wayne Roberts 0:62e456e60083 41 SerialPrintCheckBox( otaa, VT100::WHITE );
Wayne Roberts 0:62e456e60083 42 }
Wayne Roberts 0:62e456e60083 43
Wayne Roberts 0:62e456e60083 44 void SerialDisplayUpdateEui( uint8_t line, const uint8_t *eui )
Wayne Roberts 0:62e456e60083 45 {
Wayne Roberts 0:62e456e60083 46 vt.SetCursorPos( line, 27 );
Wayne Roberts 0:62e456e60083 47 for( uint8_t i = 0; i < 8; i++ )
Wayne Roberts 0:62e456e60083 48 {
Wayne Roberts 0:62e456e60083 49 vt.printf( "%02x ", eui[i] );
Wayne Roberts 0:62e456e60083 50 }
Wayne Roberts 0:62e456e60083 51 vt.SetCursorPos( line, 50 );
Wayne Roberts 0:62e456e60083 52 vt.printf( "]" );
Wayne Roberts 0:62e456e60083 53 }
Wayne Roberts 0:62e456e60083 54 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 55
Wayne Roberts 0:62e456e60083 56 void SerialDisplayUpdateKey( uint8_t line, const uint8_t *key )
Wayne Roberts 0:62e456e60083 57 {
Wayne Roberts 0:62e456e60083 58 vt.SetCursorPos( line, 29 );
Wayne Roberts 0:62e456e60083 59 for( uint8_t i = 0; i < 16; i++ )
Wayne Roberts 0:62e456e60083 60 {
Wayne Roberts 0:62e456e60083 61 vt.printf( "%02x ", key[i] );
Wayne Roberts 0:62e456e60083 62 }
Wayne Roberts 0:62e456e60083 63 vt.SetCursorPos( line, 76 );
Wayne Roberts 0:62e456e60083 64 vt.printf( "]" );
Wayne Roberts 0:62e456e60083 65 }
Wayne Roberts 0:62e456e60083 66
Wayne Roberts 0:62e456e60083 67 void SerialDisplayUpdateNwkId( uint8_t id )
Wayne Roberts 0:62e456e60083 68 {
Wayne Roberts 0:62e456e60083 69 vt.SetCursorPos( ROW_NwkId, 27 );
Wayne Roberts 0:62e456e60083 70 vt.printf( "%03d", id );
Wayne Roberts 0:62e456e60083 71 }
Wayne Roberts 0:62e456e60083 72
Wayne Roberts 0:62e456e60083 73 void SerialDisplayUpdateDevAddr( uint32_t addr )
Wayne Roberts 0:62e456e60083 74 {
Wayne Roberts 0:62e456e60083 75 vt.SetCursorPos( ROW_DevAddr, 27 );
Wayne Roberts 0:62e456e60083 76 vt.printf( "%02X %02X %02X %02X", ( addr >> 24 ) & 0xFF, ( addr >> 16 ) & 0xFF, ( addr >> 8 ) & 0xFF, addr & 0xFF );
Wayne Roberts 0:62e456e60083 77 }
Wayne Roberts 0:62e456e60083 78
Wayne Roberts 0:62e456e60083 79 void SerialDisplayUpdateFrameType( bool confirmed )
Wayne Roberts 0:62e456e60083 80 {
Wayne Roberts 0:62e456e60083 81 vt.SetCursorPos( ROW_FrameType, 17 );
Wayne Roberts 0:62e456e60083 82 SerialPrintCheckBox( confirmed, VT100::WHITE );
Wayne Roberts 0:62e456e60083 83 vt.SetCursorPos( ROW_FrameType, 32 );
Wayne Roberts 0:62e456e60083 84 SerialPrintCheckBox( !confirmed, VT100::WHITE );
Wayne Roberts 0:62e456e60083 85 }
Wayne Roberts 0:62e456e60083 86
Wayne Roberts 0:62e456e60083 87 void SerialDisplayUpdateAdr( bool adr )
Wayne Roberts 0:62e456e60083 88 {
Wayne Roberts 0:62e456e60083 89 vt.SetCursorPos( ROW_ADR, 27 );
Wayne Roberts 0:62e456e60083 90 if( adr == true )
Wayne Roberts 0:62e456e60083 91 {
Wayne Roberts 0:62e456e60083 92 vt.printf( " ON" );
Wayne Roberts 0:62e456e60083 93 }
Wayne Roberts 0:62e456e60083 94 else
Wayne Roberts 0:62e456e60083 95 {
Wayne Roberts 0:62e456e60083 96 vt.printf( "OFF" );
Wayne Roberts 0:62e456e60083 97 }
Wayne Roberts 0:62e456e60083 98 }
Wayne Roberts 0:62e456e60083 99
Wayne Roberts 0:62e456e60083 100 void SerialDisplayUpdateDutyCycle( bool dutyCycle )
Wayne Roberts 0:62e456e60083 101 {
Wayne Roberts 0:62e456e60083 102 vt.SetCursorPos( ROW_DUTY, 27 );
Wayne Roberts 0:62e456e60083 103 if( dutyCycle == true )
Wayne Roberts 0:62e456e60083 104 {
Wayne Roberts 0:62e456e60083 105 vt.printf( " ON" );
Wayne Roberts 0:62e456e60083 106 }
Wayne Roberts 0:62e456e60083 107 else
Wayne Roberts 0:62e456e60083 108 {
Wayne Roberts 0:62e456e60083 109 vt.printf( "OFF" );
Wayne Roberts 0:62e456e60083 110 }
Wayne Roberts 0:62e456e60083 111 }
Wayne Roberts 0:62e456e60083 112
Wayne Roberts 0:62e456e60083 113 void SerialDisplayUpdatePublicNetwork( bool network )
Wayne Roberts 0:62e456e60083 114 {
Wayne Roberts 0:62e456e60083 115 vt.SetCursorPos( ROW_PUBLIC, 17 );
Wayne Roberts 0:62e456e60083 116 SerialPrintCheckBox( network, VT100::WHITE );
Wayne Roberts 0:62e456e60083 117 vt.SetCursorPos( ROW_PUBLIC, 30 );
Wayne Roberts 0:62e456e60083 118 SerialPrintCheckBox( !network, VT100::WHITE );
Wayne Roberts 0:62e456e60083 119 }
Wayne Roberts 0:62e456e60083 120
Wayne Roberts 0:62e456e60083 121 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 122 void SerialDisplayUpdateNetworkIsJoined( bool state )
Wayne Roberts 0:62e456e60083 123 {
Wayne Roberts 0:62e456e60083 124 vt.SetCursorPos( ROW_JOINED, 17 );
Wayne Roberts 0:62e456e60083 125 SerialPrintCheckBox( !state, VT100::RED );
Wayne Roberts 0:62e456e60083 126 vt.SetCursorPos( ROW_JOINED, 30 );
Wayne Roberts 0:62e456e60083 127 SerialPrintCheckBox( state, VT100::GREEN );
Wayne Roberts 0:62e456e60083 128 }
Wayne Roberts 0:62e456e60083 129 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 130
Wayne Roberts 0:62e456e60083 131 /*void SerialDisplayUpdateLedState( uint8_t id, uint8_t state )
Wayne Roberts 0:62e456e60083 132 {
Wayne Roberts 0:62e456e60083 133 switch( id )
Wayne Roberts 0:62e456e60083 134 {
Wayne Roberts 0:62e456e60083 135 case 1:
Wayne Roberts 0:62e456e60083 136 vt.SetCursorPos( 22, 17 );
Wayne Roberts 0:62e456e60083 137 SerialPrintCheckBox( state, VT100::RED );
Wayne Roberts 0:62e456e60083 138 break;
Wayne Roberts 0:62e456e60083 139 case 2:
Wayne Roberts 0:62e456e60083 140 vt.SetCursorPos( 22, 31 );
Wayne Roberts 0:62e456e60083 141 SerialPrintCheckBox( state, VT100::GREEN );
Wayne Roberts 0:62e456e60083 142 break;
Wayne Roberts 0:62e456e60083 143 case 3:
Wayne Roberts 0:62e456e60083 144 vt.SetCursorPos( 22, 45 );
Wayne Roberts 0:62e456e60083 145 SerialPrintCheckBox( state, VT100::BLUE );
Wayne Roberts 0:62e456e60083 146 break;
Wayne Roberts 0:62e456e60083 147 }
Wayne Roberts 0:62e456e60083 148 }*/
Wayne Roberts 0:62e456e60083 149
Wayne Roberts 0:62e456e60083 150 void SerialDisplayUpdateData( uint8_t line, const uint8_t *buffer, uint8_t size )
Wayne Roberts 0:62e456e60083 151 {
Wayne Roberts 0:62e456e60083 152 if( size != 0 )
Wayne Roberts 0:62e456e60083 153 {
Wayne Roberts 0:62e456e60083 154 vt.SetCursorPos( line, 27 );
Wayne Roberts 0:62e456e60083 155 for( uint8_t i = 0; i < size; i++ )
Wayne Roberts 0:62e456e60083 156 {
Wayne Roberts 0:62e456e60083 157 vt.printf( "%02X ", buffer[i] );
Wayne Roberts 0:62e456e60083 158 if( ( ( i + 1 ) % 16 ) == 0 )
Wayne Roberts 0:62e456e60083 159 {
Wayne Roberts 0:62e456e60083 160 line++;
Wayne Roberts 0:62e456e60083 161 vt.SetCursorPos( line, 27 );
Wayne Roberts 0:62e456e60083 162 }
Wayne Roberts 0:62e456e60083 163 }
Wayne Roberts 0:62e456e60083 164 for( uint8_t i = size; i < 64; i++ )
Wayne Roberts 0:62e456e60083 165 {
Wayne Roberts 0:62e456e60083 166 vt.printf( "__ " );
Wayne Roberts 0:62e456e60083 167 if( ( ( i + 1 ) % 16 ) == 0 )
Wayne Roberts 0:62e456e60083 168 {
Wayne Roberts 0:62e456e60083 169 line++;
Wayne Roberts 0:62e456e60083 170 vt.SetCursorPos( line, 27 );
Wayne Roberts 0:62e456e60083 171 }
Wayne Roberts 0:62e456e60083 172 }
Wayne Roberts 0:62e456e60083 173 vt.SetCursorPos( line - 1, 74 );
Wayne Roberts 0:62e456e60083 174 vt.printf( "]" );
Wayne Roberts 0:62e456e60083 175 }
Wayne Roberts 0:62e456e60083 176 else
Wayne Roberts 0:62e456e60083 177 {
Wayne Roberts 0:62e456e60083 178 vt.SetCursorPos( line, 27 );
Wayne Roberts 0:62e456e60083 179 for( uint8_t i = 0; i < 64; i++ )
Wayne Roberts 0:62e456e60083 180 {
Wayne Roberts 0:62e456e60083 181 vt.printf( "__ " );
Wayne Roberts 0:62e456e60083 182 if( ( ( i + 1 ) % 16 ) == 0 )
Wayne Roberts 0:62e456e60083 183 {
Wayne Roberts 0:62e456e60083 184 line++;
Wayne Roberts 0:62e456e60083 185 vt.SetCursorPos( line, 27 );
Wayne Roberts 0:62e456e60083 186 }
Wayne Roberts 0:62e456e60083 187 }
Wayne Roberts 0:62e456e60083 188 vt.SetCursorPos( line - 1, 74 );
Wayne Roberts 0:62e456e60083 189 vt.printf( "]" );
Wayne Roberts 0:62e456e60083 190 }
Wayne Roberts 0:62e456e60083 191 }
Wayne Roberts 0:62e456e60083 192
Wayne Roberts 0:62e456e60083 193 void SerialDisplayUpdateUplinkAcked( bool state )
Wayne Roberts 0:62e456e60083 194 {
Wayne Roberts 0:62e456e60083 195 vt.SetCursorPos( ROW_UPLINK_ACKED, 36 );
Wayne Roberts 0:62e456e60083 196 SerialPrintCheckBox( state, VT100::GREEN );
Wayne Roberts 0:62e456e60083 197 }
Wayne Roberts 0:62e456e60083 198
Wayne Roberts 0:62e456e60083 199 //void SerialDisplayUpdateUplink( bool acked, uint8_t datarate, uint32_t counter, uint8_t port, uint8_t *buffer, uint8_t bufferSize, LoRaMacEventInfoStatus_t s)
Wayne Roberts 0:62e456e60083 200 void SerialDisplayUplink(uint8_t fport, const uint8_t* buffer, uint8_t bufferSize )
Wayne Roberts 0:62e456e60083 201 {
Wayne Roberts 0:62e456e60083 202 vt.SetCursorPos( ROW_DOWNLINK_RSSI, 32 );
Wayne Roberts 0:62e456e60083 203 vt.printf( " ");
Wayne Roberts 0:62e456e60083 204 vt.SetCursorPos( ROW_DOWNLINK_SNR, 32 );
Wayne Roberts 0:62e456e60083 205 vt.printf( " ");
Wayne Roberts 0:62e456e60083 206
Wayne Roberts 0:62e456e60083 207 // Port
Wayne Roberts 0:62e456e60083 208 vt.SetCursorPos( ROW_UPLINK_PORT, 34 );
Wayne Roberts 0:62e456e60083 209 vt.printf( "%3u", fport );
Wayne Roberts 0:62e456e60083 210 // Data
Wayne Roberts 0:62e456e60083 211 SerialDisplayUpdateData( ROW_UPLINK_PAYLOAD, buffer, bufferSize );
Wayne Roberts 0:62e456e60083 212 }
Wayne Roberts 0:62e456e60083 213
Wayne Roberts 0:62e456e60083 214 void SerialDisplayMcpsConfirm( const McpsConfirm_t* mc)
Wayne Roberts 0:62e456e60083 215 {
Wayne Roberts 0:62e456e60083 216 char str[48];
Wayne Roberts 0:62e456e60083 217 static uint8_t lastStrLen = 0;
Wayne Roberts 0:62e456e60083 218 // Acked
Wayne Roberts 0:62e456e60083 219 SerialDisplayUpdateUplinkAcked(mc->AckReceived);
Wayne Roberts 0:62e456e60083 220 LoRaMacEventInfoStatus_to_string(mc->Status, str);
Wayne Roberts 0:62e456e60083 221 vt.printf("] %s", str);
Wayne Roberts 0:62e456e60083 222 for (unsigned n = 0; n < lastStrLen; n++)
Wayne Roberts 0:62e456e60083 223 vt.putc(' ' );
Wayne Roberts 0:62e456e60083 224 lastStrLen = strlen(str);
Wayne Roberts 0:62e456e60083 225 // Datarate
Wayne Roberts 0:62e456e60083 226 vt.SetCursorPos( ROW_UPLINK_DR, 33 );
Wayne Roberts 0:62e456e60083 227 vt.printf( "DR%u", mc->Datarate);
Wayne Roberts 0:62e456e60083 228 // Counter
Wayne Roberts 0:62e456e60083 229 vt.SetCursorPos( ROW_UPLINK_FCNT, 27 );
Wayne Roberts 0:62e456e60083 230 vt.printf( "%10" PRIu32, mc->UpLinkCounter);
Wayne Roberts 0:62e456e60083 231 }
Wayne Roberts 0:62e456e60083 232
Wayne Roberts 0:62e456e60083 233 void SerialDisplayMcpsIndication()
Wayne Roberts 0:62e456e60083 234 {
Wayne Roberts 0:62e456e60083 235 }
Wayne Roberts 0:62e456e60083 236
Wayne Roberts 0:62e456e60083 237 void SerialDisplayUpdateDonwlinkRxData( bool state )
Wayne Roberts 0:62e456e60083 238 {
Wayne Roberts 0:62e456e60083 239 vt.SetCursorPos( ROW_DOWNLINK_SNR, 4 );
Wayne Roberts 0:62e456e60083 240 SerialPrintCheckBox( state, VT100::GREEN );
Wayne Roberts 0:62e456e60083 241 }
Wayne Roberts 0:62e456e60083 242
Wayne Roberts 0:62e456e60083 243 void SerialDisplayMcpsIndication(const McpsIndication_t* mi)
Wayne Roberts 0:62e456e60083 244 {
Wayne Roberts 0:62e456e60083 245 int8_t Snr;
Wayne Roberts 0:62e456e60083 246
Wayne Roberts 0:62e456e60083 247 vt.SetCursorPos( ROW_DOWNLINK_RSSI, 32 );
Wayne Roberts 0:62e456e60083 248 vt.printf( "%5d", mi->Rssi );
Wayne Roberts 0:62e456e60083 249
Wayne Roberts 0:62e456e60083 250 if (mi->Snr & 0x80) { // The SNR sign bit is 1
Wayne Roberts 0:62e456e60083 251 // Invert and divide by 4
Wayne Roberts 0:62e456e60083 252 Snr = ( ( ~mi->Snr + 1 ) & 0xFF ) >> 2;
Wayne Roberts 0:62e456e60083 253 Snr = -Snr;
Wayne Roberts 0:62e456e60083 254 } else {
Wayne Roberts 0:62e456e60083 255 // Divide by 4
Wayne Roberts 0:62e456e60083 256 Snr = ( mi->Snr & 0xFF ) >> 2;
Wayne Roberts 0:62e456e60083 257 }
Wayne Roberts 0:62e456e60083 258 vt.SetCursorPos( ROW_DOWNLINK_SNR, 32 );
Wayne Roberts 0:62e456e60083 259 vt.printf( "%5d", Snr );
Wayne Roberts 0:62e456e60083 260
Wayne Roberts 0:62e456e60083 261 vt.SetCursorPos( ROW_DOWNLINK_FCNT, 27 );
Wayne Roberts 0:62e456e60083 262 vt.printf( "%10" PRIu32, mi->receivedFCntDown);
Wayne Roberts 0:62e456e60083 263
Wayne Roberts 0:62e456e60083 264 SerialDisplayUpdateDonwlinkRxData(mi->RxData);
Wayne Roberts 0:62e456e60083 265 vt.SetCursorPos( ROW_DOWNLINK_FPORT, 34 );
Wayne Roberts 0:62e456e60083 266 if (mi->RxData) {
Wayne Roberts 0:62e456e60083 267 vt.printf( "%3u", mi->Port);
Wayne Roberts 0:62e456e60083 268 SerialDisplayUpdateData( ROW_DOWNLINK_PAYLOAD, mi->Buffer, mi->BufferSize );
Wayne Roberts 0:62e456e60083 269 } else {
Wayne Roberts 0:62e456e60083 270 vt.printf(" ");
Wayne Roberts 0:62e456e60083 271 SerialDisplayUpdateData( ROW_DOWNLINK_PAYLOAD, NULL, 0 );
Wayne Roberts 0:62e456e60083 272 }
Wayne Roberts 0:62e456e60083 273 /*if (mcpsIndication->RxData) {
Wayne Roberts 0:62e456e60083 274 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
Wayne Roberts 0:62e456e60083 275 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
Wayne Roberts 0:62e456e60083 276 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
Wayne Roberts 0:62e456e60083 277 } else
Wayne Roberts 0:62e456e60083 278 LoRaMacDownlinkStatus.Buffer = NULL;*/
Wayne Roberts 0:62e456e60083 279 }
Wayne Roberts 0:62e456e60083 280
Wayne Roberts 0:62e456e60083 281 #if 0
Wayne Roberts 0:62e456e60083 282 void SerialDisplayUpdateDownlink( int16_t rssi, int8_t snr, uint32_t counter, uint8_t port, uint8_t *buffer, uint8_t bufferSize )
Wayne Roberts 0:62e456e60083 283 {
Wayne Roberts 0:62e456e60083 284 // Rx data
Wayne Roberts 0:62e456e60083 285 SerialDisplayUpdateDonwlinkRxData( buffer != NULL );
Wayne Roberts 0:62e456e60083 286 // RSSI
Wayne Roberts 0:62e456e60083 287 vt.SetCursorPos( ROW_DOWNLINK_RSSI, 32 );
Wayne Roberts 0:62e456e60083 288 vt.printf( "%5d", rssi );
Wayne Roberts 0:62e456e60083 289 // SNR
Wayne Roberts 0:62e456e60083 290 vt.SetCursorPos( ROW_DOWNLINK_SNR, 32 );
Wayne Roberts 0:62e456e60083 291 vt.printf( "%5d", snr );
Wayne Roberts 0:62e456e60083 292 // Counter
Wayne Roberts 0:62e456e60083 293 vt.SetCursorPos( ROW_DOWNLINK_FCNT, 27 );
Wayne Roberts 0:62e456e60083 294 vt.printf( "%10" PRIu32, counter );
Wayne Roberts 0:62e456e60083 295 if( buffer != NULL )
Wayne Roberts 0:62e456e60083 296 {
Wayne Roberts 0:62e456e60083 297 // Port
Wayne Roberts 0:62e456e60083 298 vt.SetCursorPos( ROW_DOWNLINK_FPORT, 34 );
Wayne Roberts 0:62e456e60083 299 vt.printf( "%3u", port );
Wayne Roberts 0:62e456e60083 300 // Data
Wayne Roberts 0:62e456e60083 301 SerialDisplayUpdateData( ROW_DOWNLINK_PAYLOAD, buffer, bufferSize );
Wayne Roberts 0:62e456e60083 302 }
Wayne Roberts 0:62e456e60083 303 else
Wayne Roberts 0:62e456e60083 304 {
Wayne Roberts 0:62e456e60083 305 // Port
Wayne Roberts 0:62e456e60083 306 vt.SetCursorPos( ROW_DOWNLINK_FPORT, 34 );
Wayne Roberts 0:62e456e60083 307 vt.printf( " " );
Wayne Roberts 0:62e456e60083 308 // Data
Wayne Roberts 0:62e456e60083 309 SerialDisplayUpdateData( ROW_DOWNLINK_PAYLOAD, NULL, 0 );
Wayne Roberts 0:62e456e60083 310 }
Wayne Roberts 0:62e456e60083 311 }
Wayne Roberts 0:62e456e60083 312 #endif /* if 0 */
Wayne Roberts 0:62e456e60083 313
Wayne Roberts 0:62e456e60083 314 void SerialDisplayDrawFirstLine( void )
Wayne Roberts 0:62e456e60083 315 {
Wayne Roberts 0:62e456e60083 316 vt.PutBoxDrawingChar( 'l' );
Wayne Roberts 0:62e456e60083 317 for( int8_t i = 0; i <= 77; i++ )
Wayne Roberts 0:62e456e60083 318 {
Wayne Roberts 0:62e456e60083 319 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 320 }
Wayne Roberts 0:62e456e60083 321 vt.PutBoxDrawingChar( 'k' );
Wayne Roberts 0:62e456e60083 322 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 323 }
Wayne Roberts 0:62e456e60083 324
Wayne Roberts 0:62e456e60083 325 void SerialDisplayDrawTitle( const char* title )
Wayne Roberts 0:62e456e60083 326 {
Wayne Roberts 0:62e456e60083 327 vt.PutBoxDrawingChar( 'x' );
Wayne Roberts 0:62e456e60083 328 vt.printf( "%s", title );
Wayne Roberts 0:62e456e60083 329 vt.PutBoxDrawingChar( 'x' );
Wayne Roberts 0:62e456e60083 330 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 331 }
Wayne Roberts 0:62e456e60083 332 void SerialDisplayDrawTopSeparator( void )
Wayne Roberts 0:62e456e60083 333 {
Wayne Roberts 0:62e456e60083 334 vt.PutBoxDrawingChar( 't' );
Wayne Roberts 0:62e456e60083 335 for( int8_t i = 0; i <= 11; i++ )
Wayne Roberts 0:62e456e60083 336 {
Wayne Roberts 0:62e456e60083 337 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 338 }
Wayne Roberts 0:62e456e60083 339 vt.PutBoxDrawingChar( 'w' );
Wayne Roberts 0:62e456e60083 340 for( int8_t i = 0; i <= 64; i++ )
Wayne Roberts 0:62e456e60083 341 {
Wayne Roberts 0:62e456e60083 342 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 343 }
Wayne Roberts 0:62e456e60083 344 vt.PutBoxDrawingChar( 'u' );
Wayne Roberts 0:62e456e60083 345 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 346 }
Wayne Roberts 0:62e456e60083 347
Wayne Roberts 0:62e456e60083 348 void SerialDisplayDrawColSeparator( void )
Wayne Roberts 0:62e456e60083 349 {
Wayne Roberts 0:62e456e60083 350 vt.PutBoxDrawingChar( 'x' );
Wayne Roberts 0:62e456e60083 351 for( int8_t i = 0; i <= 11; i++ )
Wayne Roberts 0:62e456e60083 352 {
Wayne Roberts 0:62e456e60083 353 vt.PutBoxDrawingChar( ' ' );
Wayne Roberts 0:62e456e60083 354 }
Wayne Roberts 0:62e456e60083 355 vt.PutBoxDrawingChar( 't' );
Wayne Roberts 0:62e456e60083 356 for( int8_t i = 0; i <= 64; i++ )
Wayne Roberts 0:62e456e60083 357 {
Wayne Roberts 0:62e456e60083 358 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 359 }
Wayne Roberts 0:62e456e60083 360 vt.PutBoxDrawingChar( 'u' );
Wayne Roberts 0:62e456e60083 361 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 362 }
Wayne Roberts 0:62e456e60083 363
Wayne Roberts 0:62e456e60083 364 void SerialDisplayDrawSeparator( void )
Wayne Roberts 0:62e456e60083 365 {
Wayne Roberts 0:62e456e60083 366 vt.PutBoxDrawingChar( 't' );
Wayne Roberts 0:62e456e60083 367 for( int8_t i = 0; i <= 11; i++ )
Wayne Roberts 0:62e456e60083 368 {
Wayne Roberts 0:62e456e60083 369 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 370 }
Wayne Roberts 0:62e456e60083 371 vt.PutBoxDrawingChar( 'n' );
Wayne Roberts 0:62e456e60083 372 for( int8_t i = 0; i <= 64; i++ )
Wayne Roberts 0:62e456e60083 373 {
Wayne Roberts 0:62e456e60083 374 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 375 }
Wayne Roberts 0:62e456e60083 376 vt.PutBoxDrawingChar( 'u' );
Wayne Roberts 0:62e456e60083 377 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 378 }
Wayne Roberts 0:62e456e60083 379
Wayne Roberts 0:62e456e60083 380 void SerialDisplayDrawLine( const char* firstCol, const char* secondCol )
Wayne Roberts 0:62e456e60083 381 {
Wayne Roberts 0:62e456e60083 382 vt.PutBoxDrawingChar( 'x' );
Wayne Roberts 0:62e456e60083 383 vt.printf( "%s", firstCol );
Wayne Roberts 0:62e456e60083 384 vt.PutBoxDrawingChar( 'x' );
Wayne Roberts 0:62e456e60083 385 vt.printf( "%s", secondCol );
Wayne Roberts 0:62e456e60083 386 vt.PutBoxDrawingChar( 'x' );
Wayne Roberts 0:62e456e60083 387 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 388 }
Wayne Roberts 0:62e456e60083 389
Wayne Roberts 0:62e456e60083 390 void SerialDisplayDrawBottomLine( void )
Wayne Roberts 0:62e456e60083 391 {
Wayne Roberts 0:62e456e60083 392 vt.PutBoxDrawingChar( 'm' );
Wayne Roberts 0:62e456e60083 393 for( int8_t i = 0; i <= 11; i++ )
Wayne Roberts 0:62e456e60083 394 {
Wayne Roberts 0:62e456e60083 395 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 396 }
Wayne Roberts 0:62e456e60083 397 vt.PutBoxDrawingChar( 'v' );
Wayne Roberts 0:62e456e60083 398 for( int8_t i = 0; i <= 64; i++ )
Wayne Roberts 0:62e456e60083 399 {
Wayne Roberts 0:62e456e60083 400 vt.PutBoxDrawingChar( 'q' );
Wayne Roberts 0:62e456e60083 401 }
Wayne Roberts 0:62e456e60083 402 vt.PutBoxDrawingChar( 'j' );
Wayne Roberts 0:62e456e60083 403 vt.printf( "\r\n" );
Wayne Roberts 0:62e456e60083 404 }
Wayne Roberts 0:62e456e60083 405
Wayne Roberts 0:62e456e60083 406 void SerialDisplayInit( void )
Wayne Roberts 0:62e456e60083 407 {
Wayne Roberts 0:62e456e60083 408 vt.ClearScreen( 2 );
Wayne Roberts 0:62e456e60083 409 vt.SetCursorMode( false );
Wayne Roberts 0:62e456e60083 410 vt.SetCursorPos( 0, 0 );
Wayne Roberts 0:62e456e60083 411
Wayne Roberts 0:62e456e60083 412 // "+-----------------------------------------------------------------------------+" );
Wayne Roberts 0:62e456e60083 413 SerialDisplayDrawFirstLine( );
Wayne Roberts 0:62e456e60083 414 // "¦ LoRaWAN Demonstration Application ¦" );
Wayne Roberts 0:62e456e60083 415 SerialDisplayDrawTitle( " LoRaWAN Demonstration Application " );
Wayne Roberts 0:62e456e60083 416 // "+------------+----------------------------------------------------------------¦" );
Wayne Roberts 0:62e456e60083 417 SerialDisplayDrawTopSeparator( );
Wayne Roberts 0:62e456e60083 418 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 419 // "¦ Activation ¦ [ ]Over The Air ¦" );
Wayne Roberts 0:62e456e60083 420 SerialDisplayDrawLine( " Activation ", " [ ]Over The Air " );
Wayne Roberts 0:62e456e60083 421 // "¦ ¦ DevEui [__ __ __ __ __ __ __ __] ¦" );
Wayne Roberts 0:62e456e60083 422 SerialDisplayDrawLine( " ", " DevEui [__ __ __ __ __ __ __ __] " );
Wayne Roberts 0:62e456e60083 423 // "¦ ¦ JoinEui [__ __ __ __ __ __ __ __] ¦" );
Wayne Roberts 0:62e456e60083 424 SerialDisplayDrawLine( " ", " JoinEui [__ __ __ __ __ __ __ __] " );
Wayne Roberts 0:62e456e60083 425 // "¦ ¦ NwkKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ¦" );
Wayne Roberts 0:62e456e60083 426 SerialDisplayDrawLine( " ", " NwkKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] " );
Wayne Roberts 0:62e456e60083 427 #ifdef OPTNEG
Wayne Roberts 0:62e456e60083 428 SerialDisplayDrawLine( " ", " AppKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] " );
Wayne Roberts 0:62e456e60083 429 #endif
Wayne Roberts 0:62e456e60083 430 // "¦ +----------------------------------------------------------------¦" );
Wayne Roberts 0:62e456e60083 431 SerialDisplayDrawColSeparator( );
Wayne Roberts 0:62e456e60083 432 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 433 // "¦ ¦ [x]Personalisation ¦" );
Wayne Roberts 0:62e456e60083 434 SerialDisplayDrawLine( " ", " [ ]Personalisation " );
Wayne Roberts 0:62e456e60083 435 // "¦ ¦ NwkId [___] ¦" );
Wayne Roberts 0:62e456e60083 436 SerialDisplayDrawLine( " ", " NwkId [___] " );
Wayne Roberts 0:62e456e60083 437 // "¦ ¦ DevAddr [__ __ __ __] ¦" );
Wayne Roberts 0:62e456e60083 438 SerialDisplayDrawLine( " ", " DevAddr [__ __ __ __] " );
Wayne Roberts 0:62e456e60083 439 #ifdef OPTNEG
Wayne Roberts 0:62e456e60083 440 SerialDisplayDrawLine( " ", " FNwkSIntKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ");
Wayne Roberts 0:62e456e60083 441 SerialDisplayDrawLine( " ", " SNwkSIntKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ");
Wayne Roberts 0:62e456e60083 442 SerialDisplayDrawLine( " ", " NwkSEncKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ");
Wayne Roberts 0:62e456e60083 443 #else
Wayne Roberts 0:62e456e60083 444 // "¦ ¦ NwkSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ¦" );
Wayne Roberts 0:62e456e60083 445 SerialDisplayDrawLine( " ", " NwkSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ");
Wayne Roberts 0:62e456e60083 446 #endif
Wayne Roberts 0:62e456e60083 447 // "¦ ¦ AppSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ¦" );
Wayne Roberts 0:62e456e60083 448 SerialDisplayDrawLine( " ", " AppSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ");
Wayne Roberts 0:62e456e60083 449 // "+------------+----------------------------------------------------------------¦" );
Wayne Roberts 0:62e456e60083 450 SerialDisplayDrawSeparator( );
Wayne Roberts 0:62e456e60083 451 // "¦ MAC params ¦ [ ]Confirmed / [ ]Unconfirmed ¦" );
Wayne Roberts 0:62e456e60083 452 SerialDisplayDrawLine( " MAC params ", " [ ]Confirmed / [ ]Unconfirmed " );
Wayne Roberts 0:62e456e60083 453 // "¦ ¦ ADR [ ] ¦" );
Wayne Roberts 0:62e456e60083 454 SerialDisplayDrawLine( " ", " ADR [ ] " );
Wayne Roberts 0:62e456e60083 455 // "¦ ¦ Duty cycle[ ] ¦" );
Wayne Roberts 0:62e456e60083 456 SerialDisplayDrawLine( " ", " Duty cycle[ ] " );
Wayne Roberts 0:62e456e60083 457 // "+------------+----------------------------------------------------------------¦" );
Wayne Roberts 0:62e456e60083 458 SerialDisplayDrawSeparator( );
Wayne Roberts 0:62e456e60083 459 // "¦ Network ¦ [ ]Public / [ ]Private ¦" );
Wayne Roberts 0:62e456e60083 460 SerialDisplayDrawLine( " Network ", " [ ]Public / [ ]Private " );
Wayne Roberts 0:62e456e60083 461 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 462 // "¦ ¦ [ ]Joining / [ ]Joined ¦" );
Wayne Roberts 0:62e456e60083 463 SerialDisplayDrawLine( " ", " [ ]Joining / [ ]Joined " );
Wayne Roberts 0:62e456e60083 464 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 465 // "+------------+----------------------------------------------------------------¦" );
Wayne Roberts 0:62e456e60083 466 SerialDisplayDrawSeparator( );
Wayne Roberts 0:62e456e60083 467 // "¦ Uplink ¦ Acked [ ] ¦" );
Wayne Roberts 0:62e456e60083 468 SerialDisplayDrawLine( " Uplink ", " Acked [ ] " );
Wayne Roberts 0:62e456e60083 469 // "¦ ¦ Datarate [ ] ¦" );
Wayne Roberts 0:62e456e60083 470 SerialDisplayDrawLine( " ", " Datarate [ ] " );
Wayne Roberts 0:62e456e60083 471 // "¦ ¦ Counter [ ] ¦" );
Wayne Roberts 0:62e456e60083 472 SerialDisplayDrawLine( " ", " Counter [ ] " );
Wayne Roberts 0:62e456e60083 473 // "¦ ¦ Port [ ] ¦" );
Wayne Roberts 0:62e456e60083 474 SerialDisplayDrawLine( " ", " Port [ ] " );
Wayne Roberts 0:62e456e60083 475 // "¦ ¦ Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 476 SerialDisplayDrawLine( " ", " Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 477 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 478 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 479 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 480 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 481 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 482 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 483 // "+------------+----------------------------------------------------------------¦" );
Wayne Roberts 0:62e456e60083 484 SerialDisplayDrawSeparator( );
Wayne Roberts 0:62e456e60083 485 // "¦ Downlink ¦ RSSI [ ] dBm ¦" );
Wayne Roberts 0:62e456e60083 486 SerialDisplayDrawLine( " Downlink ", " RSSI [ ] dBm " );
Wayne Roberts 0:62e456e60083 487 // "¦ [ ]Data ¦ SNR [ ] dB ¦" );
Wayne Roberts 0:62e456e60083 488 SerialDisplayDrawLine( " [ ]Data ", " SNR [ ] dB " );
Wayne Roberts 0:62e456e60083 489 // "¦ ¦ Counter [ ] ¦" );
Wayne Roberts 0:62e456e60083 490 // "¦ ¦ Counter [ ] ¦" );
Wayne Roberts 0:62e456e60083 491 SerialDisplayDrawLine( " ", " Counter [ ] " );
Wayne Roberts 0:62e456e60083 492 // "¦ ¦ Port [ ] ¦" );
Wayne Roberts 0:62e456e60083 493 SerialDisplayDrawLine( " ", " Port [ ] " );
Wayne Roberts 0:62e456e60083 494 // "¦ ¦ Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 495 SerialDisplayDrawLine( " ", " Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 496 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 497 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 498 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 499 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 500 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
Wayne Roberts 0:62e456e60083 501 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
Wayne Roberts 0:62e456e60083 502 // "+------------+----------------------------------------------------------------+" );
Wayne Roberts 0:62e456e60083 503 SerialDisplayDrawBottomLine( );
Wayne Roberts 0:62e456e60083 504 vt.printf( "To refresh screen please hit 'r' key.\r\n" );
Wayne Roberts 0:62e456e60083 505 }
Wayne Roberts 0:62e456e60083 506
Wayne Roberts 0:62e456e60083 507 bool SerialDisplayReadable( void )
Wayne Roberts 0:62e456e60083 508 {
Wayne Roberts 0:62e456e60083 509 return vt.Readable( );
Wayne Roberts 0:62e456e60083 510 }
Wayne Roberts 0:62e456e60083 511
Wayne Roberts 0:62e456e60083 512 uint8_t SerialDisplayGetChar( void )
Wayne Roberts 0:62e456e60083 513 {
Wayne Roberts 0:62e456e60083 514 return vt.GetChar( );
Wayne Roberts 0:62e456e60083 515 }
Wayne Roberts 0:62e456e60083 516
Wayne Roberts 0:62e456e60083 517 #endif /* ENABLE_VT100 */
Wayne Roberts 0:62e456e60083 518