Application example using LoRaWAN-lib MAC layer implementation

Dependencies:   mbed LoRaWAN-lib SX1272Lib

LoRaWAN-demo is a ClassA device example project using LoRaWAN-lib and SX1272Lib libraries.

This demo application sends a frame every 4 to 6 seconds (randomly) and displays its current status using a serial port as display(VT100).

The serial port settings are as shown in below image. To access the serial port settings please click on "Setup" menu and then "Serial port..."

/media/uploads/mluis/serial_port_settings.png

The terminal window should be setup as shown in below image. To access the terminal window settings please click on "Setup" menu and then "Terminal..."

/media/uploads/mluis/terminal_window_settings.png

The image below shows the VT100 application status.

Application main screen

The application gives the possibility to either activate the device using

  • Over The Air Activation (OTAA)
  • Personalization activation (PA)

The activation mode can be adjusted in Comissioning.h by changing the following parameter:

/*!
 * When set to 1 the application uses the Over-the-Air activation procedure
 * When set to 0 the application uses the Personalization activation procedure
 */
#define OVER_THE_AIR_ACTIVATION                     1


The application gives the possibility to select which kind of network we are connecting to.

  • Public Network (true)
  • Private Network (false)

The netork type can be changed as follows:

/*!
 * Indicates if the end-device is to be connected to a private or public network
 */
#define LORAWAN_PUBLIC_NETWORK                      true


OTAA
When OTAA is selected the user must porvide a device EUI, an application EUI and an application key.
These can be adjusted by changing the following parameters:

/*!
 * Mote device IEEE EUI (big endian)
 */
#define LORAWAN_DEVICE_EUI                          { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }

/*!
 * Application IEEE EUI (big endian)
 */
#define LORAWAN_APPLICATION_EUI                     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }

/*!
 * AES encryption/decryption cipher application key
 */
#define LORAWAN_APPLICATION_KEY                     { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }


PA
When PA is selected the user must porvide a network ID, a device address, a network session key and an application session key.
These can be adjusted by changing the following parameters:

/*!
 * Current network ID
 */
#define LORAWAN_NETWORK_ID                          ( uint32_t )0

/*!
 * Device address on the network (big endian)
 */
#define LORAWAN_DEVICE_ADDRESS                      ( uint32_t )0x12345678

/*!
 * AES encryption/decryption cipher network session key
 */
#define LORAWAN_NWKSKEY                             { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }

/*!
 * AES encryption/decryption cipher application session key
 */
#define LORAWAN_APPSKEY                             { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }


On top of main.c the user has the possibility to tweak some application settings such as:

  • Join requests transmission frequency
  • Frames transmission frequency
  • Application default datarate
  • Confirmed or Unconfirmed frames transmission
  • ADR (Adaptive Datarate) ON/OFF
  • Application port to be used by the transmitted frames

The join requests transmission frequency can be adjusted by changing the follwoing parameter:

/*!
 * Join requests trials duty cycle.
 */
#define OVER_THE_AIR_ACTIVATION_DUTYCYCLE           10000000  // 10 [s] value in us


The frame transmission frequency can be adjusted by changing the follwoing parameters:

/*!
 * Defines the application data transmission duty cycle. 5s, value in [us].
 */
#define APP_TX_DUTYCYCLE                            5000000

/*!
 * Defines a random delay for application data transmission duty cycle. 1s,
 * value in [us].
 */
#define APP_TX_DUTYCYCLE_RND                        1000000


The frame transmission scheduling is then executed as follows:

        if( ScheduleNextTx == true )
        {
            ScheduleNextTx = false;
            // Schedule next packet transmission
            TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
            TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
            TimerStart( &TxNextPacketTimer );
        }


The application default datarate can be adjusted by changing the following parameter:

Quote:

When ADR is off this setting is the fixed datarate that will be used by the application.
When ADR is on this setting is the initial datarate used by the application.

/*!
 * Default mote datarate
 */
#define LORAWAN_DEFAULT_DATARATE                    DR_0


The transmitted frame contents will depend on LORAWAN_CONFIRMED_MSG_ON value.

/*!
 * LoRaWAN confirmed messages
 */
#define LORAWAN_CONFIRMED_MSG_ON                    true
  • If LORAWAN_CONFIRMED_MSG_ON equals false then the application payload is one byte corresponding to the AppLed state.
  • If LORAWAN_CONFIRMED_MSG_ON equals true then the application payload is six bytes corresponding to the AppLed state, Downlink counter (unsigned 16 bits), received RSSI (signed 16 bits) and received SNR (signed 8 bits).

/*!
 * \brief   Prepares the payload of the frame
 */
static void PrepareTxFrame( uint8_t port )
{

    switch( port )
    {
    case 15:
        {
            AppData[0] = AppLedStateOn;
            if( IsTxConfirmed == true )
            {
                AppData[1] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
                AppData[2] = LoRaMacDownlinkStatus.DownlinkCounter;
                AppData[3] = LoRaMacDownlinkStatus.Rssi >> 8;
                AppData[4] = LoRaMacDownlinkStatus.Rssi;
                AppData[5] = LoRaMacDownlinkStatus.Snr;
            }
        }
        break;
    case 224:
...
}


The ADR enabling/disabling can be adjusted by changing the following parameter:

/*!
 * LoRaWAN Adaptive Data Rate
 *
 * \remark Please note that when ADR is enabled the end-device should be static
 */
#define LORAWAN_ADR_ON                              1


The application port can be adjusted by changing the following parameter:

/*!
 * LoRaWAN application port
 */
#define LORAWAN_APP_PORT                            15
Committer:
mluis
Date:
Mon Apr 24 13:29:34 2017 +0000
Revision:
7:5077515c163b
Parent:
0:45496a70a8a5
WARNING: Radio API timings changed from micro-seconds to milliseconds; ; Synchronized with https://github.com/Lora-net/LoRaMac-node git revision e506c246652fa44c3f24cecb89d0707b49ece739; Updated all libraries to the latest versions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 0:45496a70a8a5 1 /*
mluis 0:45496a70a8a5 2 / _____) _ | |
mluis 0:45496a70a8a5 3 ( (____ _____ ____ _| |_ _____ ____| |__
mluis 0:45496a70a8a5 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
mluis 0:45496a70a8a5 5 _____) ) ____| | | || |_| ____( (___| | | |
mluis 0:45496a70a8a5 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 0:45496a70a8a5 7 (C)2015 Semtech
mluis 0:45496a70a8a5 8
mluis 0:45496a70a8a5 9 Description: VT100 serial display management
mluis 0:45496a70a8a5 10
mluis 0:45496a70a8a5 11 License: Revised BSD License, see LICENSE.TXT file include in the project
mluis 0:45496a70a8a5 12
mluis 0:45496a70a8a5 13 Maintainer: Miguel Luis and Gregory Cristian
mluis 0:45496a70a8a5 14 */
mluis 0:45496a70a8a5 15 #include "board.h"
mluis 0:45496a70a8a5 16 #include "vt100.h"
mluis 0:45496a70a8a5 17 #include "SerialDisplay.h"
mluis 0:45496a70a8a5 18
mluis 0:45496a70a8a5 19 VT100 vt( USBTX, USBRX );
mluis 0:45496a70a8a5 20
mluis 0:45496a70a8a5 21 void SerialPrintCheckBox( bool activated, uint8_t color )
mluis 0:45496a70a8a5 22 {
mluis 0:45496a70a8a5 23 if( activated == true )
mluis 0:45496a70a8a5 24 {
mluis 0:45496a70a8a5 25 vt.SetAttribute( VT100::ATTR_OFF, color, color );
mluis 0:45496a70a8a5 26 }
mluis 0:45496a70a8a5 27 else
mluis 0:45496a70a8a5 28 {
mluis 0:45496a70a8a5 29 vt.SetAttribute( VT100::ATTR_OFF );
mluis 0:45496a70a8a5 30 }
mluis 0:45496a70a8a5 31 vt.printf( " " );
mluis 0:45496a70a8a5 32 vt.SetAttribute( VT100::ATTR_OFF );
mluis 0:45496a70a8a5 33 }
mluis 0:45496a70a8a5 34
mluis 0:45496a70a8a5 35 void SerialDisplayUpdateActivationMode( bool otaa )
mluis 0:45496a70a8a5 36 {
mluis 0:45496a70a8a5 37 vt.SetCursorPos( 4, 17 );
mluis 0:45496a70a8a5 38 SerialPrintCheckBox( otaa, VT100::WHITE );
mluis 0:45496a70a8a5 39 vt.SetCursorPos( 9, 17 );
mluis 0:45496a70a8a5 40 SerialPrintCheckBox( !otaa, VT100::WHITE );
mluis 0:45496a70a8a5 41 }
mluis 0:45496a70a8a5 42
mluis 0:45496a70a8a5 43 void SerialDisplayUpdateEui( uint8_t line, uint8_t *eui )
mluis 0:45496a70a8a5 44 {
mluis 0:45496a70a8a5 45 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 46 for( uint8_t i = 0; i < 8; i++ )
mluis 0:45496a70a8a5 47 {
mluis 0:45496a70a8a5 48 vt.printf( "%02X ", eui[i] );
mluis 0:45496a70a8a5 49 }
mluis 0:45496a70a8a5 50 vt.SetCursorPos( line, 50 );
mluis 0:45496a70a8a5 51 vt.printf( "]" );
mluis 0:45496a70a8a5 52 }
mluis 0:45496a70a8a5 53
mluis 0:45496a70a8a5 54 void SerialDisplayUpdateKey( uint8_t line, uint8_t *key )
mluis 0:45496a70a8a5 55 {
mluis 0:45496a70a8a5 56 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 57 for( uint8_t i = 0; i < 16; i++ )
mluis 0:45496a70a8a5 58 {
mluis 0:45496a70a8a5 59 vt.printf( "%02X ", key[i] );
mluis 0:45496a70a8a5 60 }
mluis 0:45496a70a8a5 61 vt.SetCursorPos( line, 74 );
mluis 0:45496a70a8a5 62 vt.printf( "]" );
mluis 0:45496a70a8a5 63 }
mluis 0:45496a70a8a5 64
mluis 0:45496a70a8a5 65 void SerialDisplayUpdateNwkId( uint8_t id )
mluis 0:45496a70a8a5 66 {
mluis 0:45496a70a8a5 67 vt.SetCursorPos( 10, 27 );
mluis 0:45496a70a8a5 68 vt.printf( "%03d", id );
mluis 0:45496a70a8a5 69 }
mluis 0:45496a70a8a5 70
mluis 0:45496a70a8a5 71 void SerialDisplayUpdateDevAddr( uint32_t addr )
mluis 0:45496a70a8a5 72 {
mluis 0:45496a70a8a5 73 vt.SetCursorPos( 11, 27 );
mluis 0:45496a70a8a5 74 vt.printf( "%02X %02X %02X %02X", ( addr >> 24 ) & 0xFF, ( addr >> 16 ) & 0xFF, ( addr >> 8 ) & 0xFF, addr & 0xFF );
mluis 0:45496a70a8a5 75 }
mluis 0:45496a70a8a5 76
mluis 0:45496a70a8a5 77 void SerialDisplayUpdateFrameType( bool confirmed )
mluis 0:45496a70a8a5 78 {
mluis 0:45496a70a8a5 79 vt.SetCursorPos( 15, 17 );
mluis 0:45496a70a8a5 80 SerialPrintCheckBox( confirmed, VT100::WHITE );
mluis 0:45496a70a8a5 81 vt.SetCursorPos( 15, 32 );
mluis 0:45496a70a8a5 82 SerialPrintCheckBox( !confirmed, VT100::WHITE );
mluis 0:45496a70a8a5 83 }
mluis 0:45496a70a8a5 84
mluis 0:45496a70a8a5 85 void SerialDisplayUpdateAdr( bool adr )
mluis 0:45496a70a8a5 86 {
mluis 0:45496a70a8a5 87 vt.SetCursorPos( 16, 27 );
mluis 0:45496a70a8a5 88 if( adr == true )
mluis 0:45496a70a8a5 89 {
mluis 0:45496a70a8a5 90 vt.printf( " ON" );
mluis 0:45496a70a8a5 91 }
mluis 0:45496a70a8a5 92 else
mluis 0:45496a70a8a5 93 {
mluis 0:45496a70a8a5 94 vt.printf( "OFF" );
mluis 0:45496a70a8a5 95 }
mluis 0:45496a70a8a5 96 }
mluis 0:45496a70a8a5 97
mluis 0:45496a70a8a5 98 void SerialDisplayUpdateDutyCycle( bool dutyCycle )
mluis 0:45496a70a8a5 99 {
mluis 0:45496a70a8a5 100 vt.SetCursorPos( 17, 27 );
mluis 0:45496a70a8a5 101 if( dutyCycle == true )
mluis 0:45496a70a8a5 102 {
mluis 0:45496a70a8a5 103 vt.printf( " ON" );
mluis 0:45496a70a8a5 104 }
mluis 0:45496a70a8a5 105 else
mluis 0:45496a70a8a5 106 {
mluis 0:45496a70a8a5 107 vt.printf( "OFF" );
mluis 0:45496a70a8a5 108 }
mluis 0:45496a70a8a5 109 }
mluis 0:45496a70a8a5 110
mluis 0:45496a70a8a5 111 void SerialDisplayUpdatePublicNetwork( bool network )
mluis 0:45496a70a8a5 112 {
mluis 0:45496a70a8a5 113 vt.SetCursorPos( 19, 17 );
mluis 0:45496a70a8a5 114 SerialPrintCheckBox( network, VT100::WHITE );
mluis 0:45496a70a8a5 115 vt.SetCursorPos( 19, 30 );
mluis 0:45496a70a8a5 116 SerialPrintCheckBox( !network, VT100::WHITE );
mluis 0:45496a70a8a5 117 }
mluis 0:45496a70a8a5 118
mluis 0:45496a70a8a5 119 void SerialDisplayUpdateNetworkIsJoined( bool state )
mluis 0:45496a70a8a5 120 {
mluis 0:45496a70a8a5 121 vt.SetCursorPos( 20, 17 );
mluis 0:45496a70a8a5 122 SerialPrintCheckBox( !state, VT100::RED );
mluis 0:45496a70a8a5 123 vt.SetCursorPos( 20, 30 );
mluis 0:45496a70a8a5 124 SerialPrintCheckBox( state, VT100::GREEN );
mluis 0:45496a70a8a5 125 }
mluis 0:45496a70a8a5 126
mluis 0:45496a70a8a5 127 void SerialDisplayUpdateLedState( uint8_t id, uint8_t state )
mluis 0:45496a70a8a5 128 {
mluis 0:45496a70a8a5 129 switch( id )
mluis 0:45496a70a8a5 130 {
mluis 0:45496a70a8a5 131 case 1:
mluis 0:45496a70a8a5 132 vt.SetCursorPos( 22, 17 );
mluis 0:45496a70a8a5 133 SerialPrintCheckBox( state, VT100::RED );
mluis 0:45496a70a8a5 134 break;
mluis 0:45496a70a8a5 135 case 2:
mluis 0:45496a70a8a5 136 vt.SetCursorPos( 22, 31 );
mluis 0:45496a70a8a5 137 SerialPrintCheckBox( state, VT100::GREEN );
mluis 0:45496a70a8a5 138 break;
mluis 0:45496a70a8a5 139 case 3:
mluis 0:45496a70a8a5 140 vt.SetCursorPos( 22, 45 );
mluis 0:45496a70a8a5 141 SerialPrintCheckBox( state, VT100::BLUE );
mluis 0:45496a70a8a5 142 break;
mluis 0:45496a70a8a5 143 }
mluis 0:45496a70a8a5 144 }
mluis 0:45496a70a8a5 145
mluis 0:45496a70a8a5 146 void SerialDisplayUpdateData( uint8_t line, uint8_t *buffer, uint8_t size )
mluis 0:45496a70a8a5 147 {
mluis 0:45496a70a8a5 148 if( size != 0 )
mluis 0:45496a70a8a5 149 {
mluis 0:45496a70a8a5 150 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 151 for( uint8_t i = 0; i < size; i++ )
mluis 0:45496a70a8a5 152 {
mluis 0:45496a70a8a5 153 vt.printf( "%02X ", buffer[i] );
mluis 0:45496a70a8a5 154 if( ( ( i + 1 ) % 16 ) == 0 )
mluis 0:45496a70a8a5 155 {
mluis 0:45496a70a8a5 156 line++;
mluis 0:45496a70a8a5 157 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 158 }
mluis 0:45496a70a8a5 159 }
mluis 0:45496a70a8a5 160 for( uint8_t i = size; i < 64; i++ )
mluis 0:45496a70a8a5 161 {
mluis 0:45496a70a8a5 162 vt.printf( "__ " );
mluis 0:45496a70a8a5 163 if( ( ( i + 1 ) % 16 ) == 0 )
mluis 0:45496a70a8a5 164 {
mluis 0:45496a70a8a5 165 line++;
mluis 0:45496a70a8a5 166 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 167 }
mluis 0:45496a70a8a5 168 }
mluis 0:45496a70a8a5 169 vt.SetCursorPos( line - 1, 74 );
mluis 0:45496a70a8a5 170 vt.printf( "]" );
mluis 0:45496a70a8a5 171 }
mluis 0:45496a70a8a5 172 else
mluis 0:45496a70a8a5 173 {
mluis 0:45496a70a8a5 174 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 175 for( uint8_t i = 0; i < 64; i++ )
mluis 0:45496a70a8a5 176 {
mluis 0:45496a70a8a5 177 vt.printf( "__ " );
mluis 0:45496a70a8a5 178 if( ( ( i + 1 ) % 16 ) == 0 )
mluis 0:45496a70a8a5 179 {
mluis 0:45496a70a8a5 180 line++;
mluis 0:45496a70a8a5 181 vt.SetCursorPos( line, 27 );
mluis 0:45496a70a8a5 182 }
mluis 0:45496a70a8a5 183 }
mluis 0:45496a70a8a5 184 vt.SetCursorPos( line - 1, 74 );
mluis 0:45496a70a8a5 185 vt.printf( "]" );
mluis 0:45496a70a8a5 186 }
mluis 0:45496a70a8a5 187 }
mluis 0:45496a70a8a5 188
mluis 0:45496a70a8a5 189 void SerialDisplayUpdateUplinkAcked( bool state )
mluis 0:45496a70a8a5 190 {
mluis 0:45496a70a8a5 191 vt.SetCursorPos( 24, 36 );
mluis 0:45496a70a8a5 192 SerialPrintCheckBox( state, VT100::GREEN );
mluis 0:45496a70a8a5 193 }
mluis 0:45496a70a8a5 194
mluis 0:45496a70a8a5 195 void SerialDisplayUpdateUplink( bool acked, uint8_t datarate, uint16_t counter, uint8_t port, uint8_t *buffer, uint8_t bufferSize )
mluis 0:45496a70a8a5 196 {
mluis 0:45496a70a8a5 197 // Acked
mluis 0:45496a70a8a5 198 SerialDisplayUpdateUplinkAcked( acked );
mluis 0:45496a70a8a5 199 // Datarate
mluis 0:45496a70a8a5 200 vt.SetCursorPos( 25, 33 );
mluis 0:45496a70a8a5 201 vt.printf( "DR%d", datarate );
mluis 0:45496a70a8a5 202 // Counter
mluis 0:45496a70a8a5 203 vt.SetCursorPos( 26, 27 );
mluis 0:45496a70a8a5 204 vt.printf( "%10d", counter );
mluis 0:45496a70a8a5 205 // Port
mluis 0:45496a70a8a5 206 vt.SetCursorPos( 27, 34 );
mluis 0:45496a70a8a5 207 vt.printf( "%3d", port );
mluis 0:45496a70a8a5 208 // Data
mluis 0:45496a70a8a5 209 SerialDisplayUpdateData( 28, buffer, bufferSize );
mluis 0:45496a70a8a5 210 // Help message
mluis 0:45496a70a8a5 211 vt.SetCursorPos( 42, 1 );
mluis 0:45496a70a8a5 212 vt.printf( "To refresh screen please hit 'r' key." );
mluis 0:45496a70a8a5 213 }
mluis 0:45496a70a8a5 214
mluis 0:45496a70a8a5 215 void SerialDisplayUpdateDonwlinkRxData( bool state )
mluis 0:45496a70a8a5 216 {
mluis 0:45496a70a8a5 217 vt.SetCursorPos( 34, 4 );
mluis 0:45496a70a8a5 218 SerialPrintCheckBox( state, VT100::GREEN );
mluis 0:45496a70a8a5 219 }
mluis 0:45496a70a8a5 220
mluis 0:45496a70a8a5 221 void SerialDisplayUpdateDownlink( bool rxData, int16_t rssi, int8_t snr, uint16_t counter, uint8_t port, uint8_t *buffer, uint8_t bufferSize )
mluis 0:45496a70a8a5 222 {
mluis 0:45496a70a8a5 223 // Rx data
mluis 0:45496a70a8a5 224 SerialDisplayUpdateDonwlinkRxData( rxData );
mluis 0:45496a70a8a5 225 // RSSI
mluis 0:45496a70a8a5 226 vt.SetCursorPos( 33, 32 );
mluis 0:45496a70a8a5 227 vt.printf( "%5d", rssi );
mluis 0:45496a70a8a5 228 // SNR
mluis 0:45496a70a8a5 229 vt.SetCursorPos( 34, 32 );
mluis 0:45496a70a8a5 230 vt.printf( "%5d", snr );
mluis 0:45496a70a8a5 231 // Counter
mluis 0:45496a70a8a5 232 vt.SetCursorPos( 35, 27 );
mluis 0:45496a70a8a5 233 vt.printf( "%10d", counter );
mluis 0:45496a70a8a5 234 if( rxData == true )
mluis 0:45496a70a8a5 235 {
mluis 0:45496a70a8a5 236 // Port
mluis 0:45496a70a8a5 237 vt.SetCursorPos( 36, 34 );
mluis 0:45496a70a8a5 238 vt.printf( "%3d", port );
mluis 0:45496a70a8a5 239 // Data
mluis 0:45496a70a8a5 240 SerialDisplayUpdateData( 37, buffer, bufferSize );
mluis 0:45496a70a8a5 241 }
mluis 0:45496a70a8a5 242 else
mluis 0:45496a70a8a5 243 {
mluis 0:45496a70a8a5 244 // Port
mluis 0:45496a70a8a5 245 vt.SetCursorPos( 36, 34 );
mluis 0:45496a70a8a5 246 vt.printf( " " );
mluis 0:45496a70a8a5 247 // Data
mluis 0:45496a70a8a5 248 SerialDisplayUpdateData( 37, NULL, 0 );
mluis 0:45496a70a8a5 249 }
mluis 0:45496a70a8a5 250 }
mluis 0:45496a70a8a5 251
mluis 0:45496a70a8a5 252 void SerialDisplayDrawFirstLine( void )
mluis 0:45496a70a8a5 253 {
mluis 0:45496a70a8a5 254 vt.PutBoxDrawingChar( 'l' );
mluis 0:45496a70a8a5 255 for( int8_t i = 0; i <= 77; i++ )
mluis 0:45496a70a8a5 256 {
mluis 0:45496a70a8a5 257 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 258 }
mluis 0:45496a70a8a5 259 vt.PutBoxDrawingChar( 'k' );
mluis 0:45496a70a8a5 260 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 261 }
mluis 0:45496a70a8a5 262
mluis 0:45496a70a8a5 263 void SerialDisplayDrawTitle( const char* title )
mluis 0:45496a70a8a5 264 {
mluis 0:45496a70a8a5 265 vt.PutBoxDrawingChar( 'x' );
mluis 0:45496a70a8a5 266 vt.printf( "%s", title );
mluis 0:45496a70a8a5 267 vt.PutBoxDrawingChar( 'x' );
mluis 0:45496a70a8a5 268 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 269 }
mluis 0:45496a70a8a5 270 void SerialDisplayDrawTopSeparator( void )
mluis 0:45496a70a8a5 271 {
mluis 0:45496a70a8a5 272 vt.PutBoxDrawingChar( 't' );
mluis 0:45496a70a8a5 273 for( int8_t i = 0; i <= 11; i++ )
mluis 0:45496a70a8a5 274 {
mluis 0:45496a70a8a5 275 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 276 }
mluis 0:45496a70a8a5 277 vt.PutBoxDrawingChar( 'w' );
mluis 0:45496a70a8a5 278 for( int8_t i = 0; i <= 64; i++ )
mluis 0:45496a70a8a5 279 {
mluis 0:45496a70a8a5 280 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 281 }
mluis 0:45496a70a8a5 282 vt.PutBoxDrawingChar( 'u' );
mluis 0:45496a70a8a5 283 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 284 }
mluis 0:45496a70a8a5 285
mluis 0:45496a70a8a5 286 void SerialDisplayDrawColSeparator( void )
mluis 0:45496a70a8a5 287 {
mluis 0:45496a70a8a5 288 vt.PutBoxDrawingChar( 'x' );
mluis 0:45496a70a8a5 289 for( int8_t i = 0; i <= 11; i++ )
mluis 0:45496a70a8a5 290 {
mluis 0:45496a70a8a5 291 vt.PutBoxDrawingChar( ' ' );
mluis 0:45496a70a8a5 292 }
mluis 0:45496a70a8a5 293 vt.PutBoxDrawingChar( 't' );
mluis 0:45496a70a8a5 294 for( int8_t i = 0; i <= 64; i++ )
mluis 0:45496a70a8a5 295 {
mluis 0:45496a70a8a5 296 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 297 }
mluis 0:45496a70a8a5 298 vt.PutBoxDrawingChar( 'u' );
mluis 0:45496a70a8a5 299 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 300 }
mluis 0:45496a70a8a5 301
mluis 0:45496a70a8a5 302 void SerialDisplayDrawSeparator( void )
mluis 0:45496a70a8a5 303 {
mluis 0:45496a70a8a5 304 vt.PutBoxDrawingChar( 't' );
mluis 0:45496a70a8a5 305 for( int8_t i = 0; i <= 11; i++ )
mluis 0:45496a70a8a5 306 {
mluis 0:45496a70a8a5 307 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 308 }
mluis 0:45496a70a8a5 309 vt.PutBoxDrawingChar( 'n' );
mluis 0:45496a70a8a5 310 for( int8_t i = 0; i <= 64; i++ )
mluis 0:45496a70a8a5 311 {
mluis 0:45496a70a8a5 312 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 313 }
mluis 0:45496a70a8a5 314 vt.PutBoxDrawingChar( 'u' );
mluis 0:45496a70a8a5 315 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 316 }
mluis 0:45496a70a8a5 317
mluis 0:45496a70a8a5 318 void SerialDisplayDrawLine( const char* firstCol, const char* secondCol )
mluis 0:45496a70a8a5 319 {
mluis 0:45496a70a8a5 320 vt.PutBoxDrawingChar( 'x' );
mluis 0:45496a70a8a5 321 vt.printf( "%s", firstCol );
mluis 0:45496a70a8a5 322 vt.PutBoxDrawingChar( 'x' );
mluis 0:45496a70a8a5 323 vt.printf( "%s", secondCol );
mluis 0:45496a70a8a5 324 vt.PutBoxDrawingChar( 'x' );
mluis 0:45496a70a8a5 325 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 326 }
mluis 0:45496a70a8a5 327
mluis 0:45496a70a8a5 328 void SerialDisplayDrawBottomLine( void )
mluis 0:45496a70a8a5 329 {
mluis 0:45496a70a8a5 330 vt.PutBoxDrawingChar( 'm' );
mluis 0:45496a70a8a5 331 for( int8_t i = 0; i <= 11; i++ )
mluis 0:45496a70a8a5 332 {
mluis 0:45496a70a8a5 333 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 334 }
mluis 0:45496a70a8a5 335 vt.PutBoxDrawingChar( 'v' );
mluis 0:45496a70a8a5 336 for( int8_t i = 0; i <= 64; i++ )
mluis 0:45496a70a8a5 337 {
mluis 0:45496a70a8a5 338 vt.PutBoxDrawingChar( 'q' );
mluis 0:45496a70a8a5 339 }
mluis 0:45496a70a8a5 340 vt.PutBoxDrawingChar( 'j' );
mluis 0:45496a70a8a5 341 vt.printf( "\r\n" );
mluis 0:45496a70a8a5 342 }
mluis 0:45496a70a8a5 343
mluis 0:45496a70a8a5 344 void SerialDisplayInit( void )
mluis 0:45496a70a8a5 345 {
mluis 0:45496a70a8a5 346 vt.ClearScreen( 2 );
mluis 0:45496a70a8a5 347 vt.SetCursorMode( false );
mluis 0:45496a70a8a5 348 vt.SetCursorPos( 0, 0 );
mluis 0:45496a70a8a5 349
mluis 0:45496a70a8a5 350 // "+-----------------------------------------------------------------------------+" );
mluis 0:45496a70a8a5 351 SerialDisplayDrawFirstLine( );
mluis 0:45496a70a8a5 352 // "¦ LoRaWAN Demonstration Application ¦" );
mluis 0:45496a70a8a5 353 SerialDisplayDrawTitle( " LoRaWAN Demonstration Application " );
mluis 0:45496a70a8a5 354 // "+------------+----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 355 SerialDisplayDrawTopSeparator( );
mluis 0:45496a70a8a5 356 // "¦ Activation ¦ [ ]Over The Air ¦" );
mluis 0:45496a70a8a5 357 SerialDisplayDrawLine( " Activation ", " [ ]Over The Air " );
mluis 0:45496a70a8a5 358 // "¦ ¦ DevEui [__ __ __ __ __ __ __ __] ¦" );
mluis 0:45496a70a8a5 359 SerialDisplayDrawLine( " ", " DevEui [__ __ __ __ __ __ __ __] " );
mluis 0:45496a70a8a5 360 // "¦ ¦ AppEui [__ __ __ __ __ __ __ __] ¦" );
mluis 0:45496a70a8a5 361 SerialDisplayDrawLine( " ", " AppEui [__ __ __ __ __ __ __ __] " );
mluis 0:45496a70a8a5 362 // "¦ ¦ AppKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ¦" );
mluis 0:45496a70a8a5 363 SerialDisplayDrawLine( " ", " AppKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] " );
mluis 0:45496a70a8a5 364 // "¦ +----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 365 SerialDisplayDrawColSeparator( );
mluis 0:45496a70a8a5 366 // "¦ ¦ [x]Personalisation ¦" );
mluis 0:45496a70a8a5 367 SerialDisplayDrawLine( " ", " [ ]Personalisation " );
mluis 0:45496a70a8a5 368 // "¦ ¦ NwkId [___] ¦" );
mluis 0:45496a70a8a5 369 SerialDisplayDrawLine( " ", " NwkId [___] " );
mluis 0:45496a70a8a5 370 // "¦ ¦ DevAddr [__ __ __ __] ¦" );
mluis 0:45496a70a8a5 371 SerialDisplayDrawLine( " ", " DevAddr [__ __ __ __] " );
mluis 0:45496a70a8a5 372 // "¦ ¦ NwkSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ¦" );
mluis 0:45496a70a8a5 373 SerialDisplayDrawLine( " ", " NwkSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] " );
mluis 0:45496a70a8a5 374 // "¦ ¦ AppSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] ¦" );
mluis 0:45496a70a8a5 375 SerialDisplayDrawLine( " ", " AppSKey [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __] " );
mluis 0:45496a70a8a5 376 // "+------------+----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 377 SerialDisplayDrawSeparator( );
mluis 0:45496a70a8a5 378 // "¦ MAC params ¦ [ ]Confirmed / [ ]Unconfirmed ¦" );
mluis 0:45496a70a8a5 379 SerialDisplayDrawLine( " MAC params ", " [ ]Confirmed / [ ]Unconfirmed " );
mluis 0:45496a70a8a5 380 // "¦ ¦ ADR [ ] ¦" );
mluis 0:45496a70a8a5 381 SerialDisplayDrawLine( " ", " ADR [ ] " );
mluis 0:45496a70a8a5 382 // "¦ ¦ Duty cycle[ ] ¦" );
mluis 0:45496a70a8a5 383 SerialDisplayDrawLine( " ", " Duty cycle[ ] " );
mluis 0:45496a70a8a5 384 // "+------------+----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 385 SerialDisplayDrawSeparator( );
mluis 0:45496a70a8a5 386 // "¦ Network ¦ [ ]Public / [ ]Private ¦" );
mluis 0:45496a70a8a5 387 SerialDisplayDrawLine( " Network ", " [ ]Public / [ ]Private " );
mluis 0:45496a70a8a5 388 // "¦ ¦ [ ]Joining / [ ]Joined ¦" );
mluis 0:45496a70a8a5 389 SerialDisplayDrawLine( " ", " [ ]Joining / [ ]Joined " );
mluis 0:45496a70a8a5 390 // "+------------+----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 391 SerialDisplayDrawSeparator( );
mluis 0:45496a70a8a5 392 // "¦ LED status ¦ [ ]LED1(Tx) / [ ]LED2(Rx) / [ ]LED3(App) ¦" );
mluis 0:45496a70a8a5 393 SerialDisplayDrawLine( " LED status ", " [ ]LED1(Tx) / [ ]LED2(Rx) / [ ]LED3(App) " );
mluis 0:45496a70a8a5 394 // "+------------+----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 395 SerialDisplayDrawSeparator( );
mluis 0:45496a70a8a5 396 // "¦ Uplink ¦ Acked [ ] ¦" );
mluis 0:45496a70a8a5 397 SerialDisplayDrawLine( " Uplink ", " Acked [ ] " );
mluis 0:45496a70a8a5 398 // "¦ ¦ Datarate [ ] ¦" );
mluis 0:45496a70a8a5 399 SerialDisplayDrawLine( " ", " Datarate [ ] " );
mluis 0:45496a70a8a5 400 // "¦ ¦ Counter [ ] ¦" );
mluis 0:45496a70a8a5 401 SerialDisplayDrawLine( " ", " Counter [ ] " );
mluis 0:45496a70a8a5 402 // "¦ ¦ Port [ ] ¦" );
mluis 0:45496a70a8a5 403 SerialDisplayDrawLine( " ", " Port [ ] " );
mluis 0:45496a70a8a5 404 // "¦ ¦ Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 405 SerialDisplayDrawLine( " ", " Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 406 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 407 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 408 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 409 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 410 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 411 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 412 // "+------------+----------------------------------------------------------------¦" );
mluis 0:45496a70a8a5 413 SerialDisplayDrawSeparator( );
mluis 0:45496a70a8a5 414 // "¦ Downlink ¦ RSSI [ ] dBm ¦" );
mluis 0:45496a70a8a5 415 SerialDisplayDrawLine( " Downlink ", " RSSI [ ] dBm " );
mluis 0:45496a70a8a5 416 // "¦ [ ]Data ¦ SNR [ ] dB ¦" );
mluis 0:45496a70a8a5 417 SerialDisplayDrawLine( " [ ]Data ", " SNR [ ] dB " );
mluis 0:45496a70a8a5 418 // "¦ ¦ Counter [ ] ¦" );
mluis 0:45496a70a8a5 419 // "¦ ¦ Counter [ ] ¦" );
mluis 0:45496a70a8a5 420 SerialDisplayDrawLine( " ", " Counter [ ] " );
mluis 0:45496a70a8a5 421 // "¦ ¦ Port [ ] ¦" );
mluis 0:45496a70a8a5 422 SerialDisplayDrawLine( " ", " Port [ ] " );
mluis 0:45496a70a8a5 423 // "¦ ¦ Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 424 SerialDisplayDrawLine( " ", " Data [__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 425 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 426 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 427 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 428 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 429 // "¦ ¦ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ ¦" );
mluis 0:45496a70a8a5 430 SerialDisplayDrawLine( " ", " __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ " );
mluis 0:45496a70a8a5 431 // "+------------+----------------------------------------------------------------+" );
mluis 0:45496a70a8a5 432 SerialDisplayDrawBottomLine( );
mluis 0:45496a70a8a5 433 vt.printf( "To refresh screen please hit 'r' key.\r\n" );
mluis 0:45496a70a8a5 434 }
mluis 0:45496a70a8a5 435
mluis 0:45496a70a8a5 436 bool SerialDisplayReadable( void )
mluis 0:45496a70a8a5 437 {
mluis 0:45496a70a8a5 438 return vt.Readable( );
mluis 0:45496a70a8a5 439 }
mluis 0:45496a70a8a5 440
mluis 0:45496a70a8a5 441 uint8_t SerialDisplayGetChar( void )
mluis 0:45496a70a8a5 442 {
mluis 0:45496a70a8a5 443 return vt.GetChar( );
mluis 0:45496a70a8a5 444 }