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:
5:62862ef9480b
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: LoRaMac classA device implementation
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 "mbed.h"
mluis 0:45496a70a8a5 16 #include "board.h"
mluis 0:45496a70a8a5 17 #include "radio.h"
mluis 0:45496a70a8a5 18
mluis 0:45496a70a8a5 19 #include "LoRaMac.h"
mluis 7:5077515c163b 20 #include "Commissioning.h"
mluis 0:45496a70a8a5 21 #include "SerialDisplay.h"
mluis 0:45496a70a8a5 22
mluis 0:45496a70a8a5 23 /*!
mluis 7:5077515c163b 24 * Defines the application data transmission duty cycle. 5s, value in [ms].
mluis 0:45496a70a8a5 25 */
mluis 7:5077515c163b 26 #define APP_TX_DUTYCYCLE 5000
mluis 0:45496a70a8a5 27
mluis 0:45496a70a8a5 28 /*!
mluis 0:45496a70a8a5 29 * Defines a random delay for application data transmission duty cycle. 1s,
mluis 7:5077515c163b 30 * value in [ms].
mluis 0:45496a70a8a5 31 */
mluis 7:5077515c163b 32 #define APP_TX_DUTYCYCLE_RND 1000
mluis 0:45496a70a8a5 33
mluis 0:45496a70a8a5 34 /*!
mluis 3:3152aa75c58d 35 * Default datarate
mluis 0:45496a70a8a5 36 */
mluis 0:45496a70a8a5 37 #define LORAWAN_DEFAULT_DATARATE DR_0
mluis 0:45496a70a8a5 38
mluis 0:45496a70a8a5 39 /*!
mluis 0:45496a70a8a5 40 * LoRaWAN confirmed messages
mluis 0:45496a70a8a5 41 */
mluis 0:45496a70a8a5 42 #define LORAWAN_CONFIRMED_MSG_ON true
mluis 0:45496a70a8a5 43
mluis 0:45496a70a8a5 44 /*!
mluis 0:45496a70a8a5 45 * LoRaWAN Adaptive Data Rate
mluis 0:45496a70a8a5 46 *
mluis 0:45496a70a8a5 47 * \remark Please note that when ADR is enabled the end-device should be static
mluis 0:45496a70a8a5 48 */
mluis 0:45496a70a8a5 49 #define LORAWAN_ADR_ON 1
mluis 0:45496a70a8a5 50
mluis 0:45496a70a8a5 51 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 52
mluis 0:45496a70a8a5 53 #include "LoRaMacTest.h"
mluis 0:45496a70a8a5 54
mluis 0:45496a70a8a5 55 /*!
mluis 0:45496a70a8a5 56 * LoRaWAN ETSI duty cycle control enable/disable
mluis 0:45496a70a8a5 57 *
mluis 0:45496a70a8a5 58 * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
mluis 0:45496a70a8a5 59 */
mluis 7:5077515c163b 60 #define LORAWAN_DUTYCYCLE_ON false
mluis 0:45496a70a8a5 61
mluis 3:3152aa75c58d 62 #define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP 1
mluis 3:3152aa75c58d 63
mluis 7:5077515c163b 64 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 3:3152aa75c58d 65
mluis 3:3152aa75c58d 66 #define LC4 { 867100000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 3:3152aa75c58d 67 #define LC5 { 867300000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 3:3152aa75c58d 68 #define LC6 { 867500000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 3:3152aa75c58d 69 #define LC7 { 867700000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 3:3152aa75c58d 70 #define LC8 { 867900000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 3:3152aa75c58d 71 #define LC9 { 868800000, { ( ( DR_7 << 4 ) | DR_7 ) }, 2 }
mluis 3:3152aa75c58d 72 #define LC10 { 868300000, { ( ( DR_6 << 4 ) | DR_6 ) }, 1 }
mluis 3:3152aa75c58d 73
mluis 3:3152aa75c58d 74 #endif
mluis 3:3152aa75c58d 75
mluis 0:45496a70a8a5 76 #endif
mluis 0:45496a70a8a5 77
mluis 0:45496a70a8a5 78 /*!
mluis 0:45496a70a8a5 79 * LoRaWAN application port
mluis 0:45496a70a8a5 80 */
mluis 0:45496a70a8a5 81 #define LORAWAN_APP_PORT 15
mluis 0:45496a70a8a5 82
mluis 0:45496a70a8a5 83 /*!
mluis 0:45496a70a8a5 84 * User application data buffer size
mluis 0:45496a70a8a5 85 */
mluis 0:45496a70a8a5 86 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
mluis 0:45496a70a8a5 87 #define LORAWAN_APP_DATA_SIZE 6
mluis 0:45496a70a8a5 88
mluis 0:45496a70a8a5 89 #else
mluis 0:45496a70a8a5 90 #define LORAWAN_APP_DATA_SIZE 1
mluis 0:45496a70a8a5 91
mluis 0:45496a70a8a5 92 #endif
mluis 0:45496a70a8a5 93
mluis 0:45496a70a8a5 94 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
mluis 0:45496a70a8a5 95 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
mluis 0:45496a70a8a5 96 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
mluis 0:45496a70a8a5 97
mluis 5:62862ef9480b 98 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:45496a70a8a5 99
mluis 0:45496a70a8a5 100 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
mluis 0:45496a70a8a5 101 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
mluis 0:45496a70a8a5 102
mluis 0:45496a70a8a5 103 /*!
mluis 0:45496a70a8a5 104 * Device address
mluis 0:45496a70a8a5 105 */
mluis 0:45496a70a8a5 106 static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
mluis 0:45496a70a8a5 107
mluis 0:45496a70a8a5 108 #endif
mluis 0:45496a70a8a5 109
mluis 0:45496a70a8a5 110 /*!
mluis 0:45496a70a8a5 111 * Application port
mluis 0:45496a70a8a5 112 */
mluis 0:45496a70a8a5 113 static uint8_t AppPort = LORAWAN_APP_PORT;
mluis 0:45496a70a8a5 114
mluis 0:45496a70a8a5 115 /*!
mluis 0:45496a70a8a5 116 * User application data size
mluis 0:45496a70a8a5 117 */
mluis 0:45496a70a8a5 118 static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 0:45496a70a8a5 119
mluis 0:45496a70a8a5 120 /*!
mluis 0:45496a70a8a5 121 * User application data buffer size
mluis 0:45496a70a8a5 122 */
mluis 0:45496a70a8a5 123 #define LORAWAN_APP_DATA_MAX_SIZE 64
mluis 0:45496a70a8a5 124
mluis 0:45496a70a8a5 125 /*!
mluis 0:45496a70a8a5 126 * User application data
mluis 0:45496a70a8a5 127 */
mluis 0:45496a70a8a5 128 static uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
mluis 0:45496a70a8a5 129
mluis 0:45496a70a8a5 130 /*!
mluis 0:45496a70a8a5 131 * Indicates if the node is sending confirmed or unconfirmed messages
mluis 0:45496a70a8a5 132 */
mluis 0:45496a70a8a5 133 static uint8_t IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 0:45496a70a8a5 134
mluis 0:45496a70a8a5 135 /*!
mluis 0:45496a70a8a5 136 * Defines the application data transmission duty cycle
mluis 0:45496a70a8a5 137 */
mluis 0:45496a70a8a5 138 static uint32_t TxDutyCycleTime;
mluis 0:45496a70a8a5 139
mluis 0:45496a70a8a5 140 /*!
mluis 0:45496a70a8a5 141 * Timer to handle the application data transmission duty cycle
mluis 0:45496a70a8a5 142 */
mluis 0:45496a70a8a5 143 static TimerEvent_t TxNextPacketTimer;
mluis 0:45496a70a8a5 144
mluis 0:45496a70a8a5 145 /*!
mluis 0:45496a70a8a5 146 * Specifies the state of the application LED
mluis 0:45496a70a8a5 147 */
mluis 0:45496a70a8a5 148 static bool AppLedStateOn = false;
mluis 0:45496a70a8a5 149 volatile bool Led3StateChanged = false;
mluis 0:45496a70a8a5 150 /*!
mluis 0:45496a70a8a5 151 * Timer to handle the state of LED1
mluis 0:45496a70a8a5 152 */
mluis 0:45496a70a8a5 153 static TimerEvent_t Led1Timer;
mluis 0:45496a70a8a5 154 volatile bool Led1State = false;
mluis 0:45496a70a8a5 155 volatile bool Led1StateChanged = false;
mluis 0:45496a70a8a5 156 /*!
mluis 0:45496a70a8a5 157 * Timer to handle the state of LED2
mluis 0:45496a70a8a5 158 */
mluis 0:45496a70a8a5 159 static TimerEvent_t Led2Timer;
mluis 0:45496a70a8a5 160 volatile bool Led2State = false;
mluis 0:45496a70a8a5 161 volatile bool Led2StateChanged = false;
mluis 0:45496a70a8a5 162
mluis 0:45496a70a8a5 163 /*!
mluis 0:45496a70a8a5 164 * Indicates if a new packet can be sent
mluis 0:45496a70a8a5 165 */
mluis 0:45496a70a8a5 166 static bool NextTx = true;
mluis 0:45496a70a8a5 167
mluis 0:45496a70a8a5 168 /*!
mluis 0:45496a70a8a5 169 * Device states
mluis 0:45496a70a8a5 170 */
mluis 7:5077515c163b 171 static enum eDeviceState
mluis 0:45496a70a8a5 172 {
mluis 0:45496a70a8a5 173 DEVICE_STATE_INIT,
mluis 0:45496a70a8a5 174 DEVICE_STATE_JOIN,
mluis 0:45496a70a8a5 175 DEVICE_STATE_SEND,
mluis 0:45496a70a8a5 176 DEVICE_STATE_CYCLE,
mluis 0:45496a70a8a5 177 DEVICE_STATE_SLEEP
mluis 0:45496a70a8a5 178 }DeviceState;
mluis 0:45496a70a8a5 179
mluis 0:45496a70a8a5 180 /*!
mluis 0:45496a70a8a5 181 * LoRaWAN compliance tests support data
mluis 0:45496a70a8a5 182 */
mluis 0:45496a70a8a5 183 struct ComplianceTest_s
mluis 0:45496a70a8a5 184 {
mluis 0:45496a70a8a5 185 bool Running;
mluis 0:45496a70a8a5 186 uint8_t State;
mluis 0:45496a70a8a5 187 bool IsTxConfirmed;
mluis 0:45496a70a8a5 188 uint8_t AppPort;
mluis 0:45496a70a8a5 189 uint8_t AppDataSize;
mluis 0:45496a70a8a5 190 uint8_t *AppDataBuffer;
mluis 0:45496a70a8a5 191 uint16_t DownLinkCounter;
mluis 0:45496a70a8a5 192 bool LinkCheck;
mluis 0:45496a70a8a5 193 uint8_t DemodMargin;
mluis 0:45496a70a8a5 194 uint8_t NbGateways;
mluis 0:45496a70a8a5 195 }ComplianceTest;
mluis 0:45496a70a8a5 196
mluis 0:45496a70a8a5 197 /*
mluis 0:45496a70a8a5 198 * SerialDisplay managment variables
mluis 0:45496a70a8a5 199 */
mluis 0:45496a70a8a5 200
mluis 0:45496a70a8a5 201 /*!
mluis 0:45496a70a8a5 202 * Indicates if the MAC layer network join status has changed.
mluis 0:45496a70a8a5 203 */
mluis 0:45496a70a8a5 204 static bool IsNetworkJoinedStatusUpdate = false;
mluis 0:45496a70a8a5 205
mluis 0:45496a70a8a5 206 /*!
mluis 0:45496a70a8a5 207 * Strucure containing the Uplink status
mluis 0:45496a70a8a5 208 */
mluis 0:45496a70a8a5 209 struct sLoRaMacUplinkStatus
mluis 0:45496a70a8a5 210 {
mluis 0:45496a70a8a5 211 uint8_t Acked;
mluis 0:45496a70a8a5 212 int8_t Datarate;
mluis 0:45496a70a8a5 213 uint16_t UplinkCounter;
mluis 0:45496a70a8a5 214 uint8_t Port;
mluis 0:45496a70a8a5 215 uint8_t *Buffer;
mluis 0:45496a70a8a5 216 uint8_t BufferSize;
mluis 0:45496a70a8a5 217 }LoRaMacUplinkStatus;
mluis 0:45496a70a8a5 218 volatile bool UplinkStatusUpdated = false;
mluis 0:45496a70a8a5 219
mluis 0:45496a70a8a5 220 /*!
mluis 0:45496a70a8a5 221 * Strucure containing the Downlink status
mluis 0:45496a70a8a5 222 */
mluis 0:45496a70a8a5 223 struct sLoRaMacDownlinkStatus
mluis 0:45496a70a8a5 224 {
mluis 0:45496a70a8a5 225 int16_t Rssi;
mluis 0:45496a70a8a5 226 int8_t Snr;
mluis 0:45496a70a8a5 227 uint16_t DownlinkCounter;
mluis 0:45496a70a8a5 228 bool RxData;
mluis 0:45496a70a8a5 229 uint8_t Port;
mluis 0:45496a70a8a5 230 uint8_t *Buffer;
mluis 0:45496a70a8a5 231 uint8_t BufferSize;
mluis 0:45496a70a8a5 232 }LoRaMacDownlinkStatus;
mluis 0:45496a70a8a5 233 volatile bool DownlinkStatusUpdated = false;
mluis 0:45496a70a8a5 234
mluis 0:45496a70a8a5 235 void SerialDisplayRefresh( void )
mluis 0:45496a70a8a5 236 {
mluis 0:45496a70a8a5 237 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 238
mluis 0:45496a70a8a5 239 SerialDisplayInit( );
mluis 0:45496a70a8a5 240 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:45496a70a8a5 241
mluis 0:45496a70a8a5 242 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:45496a70a8a5 243 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 0:45496a70a8a5 244 SerialDisplayUpdateDevAddr( DevAddr );
mluis 0:45496a70a8a5 245 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 0:45496a70a8a5 246 SerialDisplayUpdateKey( 13, AppSKey );
mluis 5:62862ef9480b 247 #endif
mluis 0:45496a70a8a5 248 SerialDisplayUpdateEui( 5, DevEui );
mluis 0:45496a70a8a5 249 SerialDisplayUpdateEui( 6, AppEui );
mluis 0:45496a70a8a5 250 SerialDisplayUpdateKey( 7, AppKey );
mluis 0:45496a70a8a5 251
mluis 0:45496a70a8a5 252 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 253 LoRaMacMibGetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 254 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
mluis 0:45496a70a8a5 255
mluis 0:45496a70a8a5 256 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:45496a70a8a5 257 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 258 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 0:45496a70a8a5 259 #else
mluis 0:45496a70a8a5 260 SerialDisplayUpdateDutyCycle( false );
mluis 0:45496a70a8a5 261 #endif
mluis 0:45496a70a8a5 262 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:45496a70a8a5 263
mluis 0:45496a70a8a5 264 SerialDisplayUpdateLedState( 3, AppLedStateOn );
mluis 0:45496a70a8a5 265 }
mluis 0:45496a70a8a5 266
mluis 0:45496a70a8a5 267 void SerialRxProcess( void )
mluis 0:45496a70a8a5 268 {
mluis 0:45496a70a8a5 269 if( SerialDisplayReadable( ) == true )
mluis 0:45496a70a8a5 270 {
mluis 0:45496a70a8a5 271 switch( SerialDisplayGetChar( ) )
mluis 0:45496a70a8a5 272 {
mluis 0:45496a70a8a5 273 case 'R':
mluis 0:45496a70a8a5 274 case 'r':
mluis 0:45496a70a8a5 275 // Refresh Serial screen
mluis 0:45496a70a8a5 276 SerialDisplayRefresh( );
mluis 0:45496a70a8a5 277 break;
mluis 0:45496a70a8a5 278 default:
mluis 0:45496a70a8a5 279 break;
mluis 0:45496a70a8a5 280 }
mluis 0:45496a70a8a5 281 }
mluis 0:45496a70a8a5 282 }
mluis 0:45496a70a8a5 283
mluis 0:45496a70a8a5 284 /*!
mluis 0:45496a70a8a5 285 * \brief Prepares the payload of the frame
mluis 0:45496a70a8a5 286 */
mluis 0:45496a70a8a5 287 static void PrepareTxFrame( uint8_t port )
mluis 0:45496a70a8a5 288 {
mluis 0:45496a70a8a5 289 switch( port )
mluis 0:45496a70a8a5 290 {
mluis 0:45496a70a8a5 291 case 15:
mluis 0:45496a70a8a5 292 {
mluis 0:45496a70a8a5 293 AppData[0] = AppLedStateOn;
mluis 0:45496a70a8a5 294 if( IsTxConfirmed == true )
mluis 0:45496a70a8a5 295 {
mluis 0:45496a70a8a5 296 AppData[1] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
mluis 0:45496a70a8a5 297 AppData[2] = LoRaMacDownlinkStatus.DownlinkCounter;
mluis 0:45496a70a8a5 298 AppData[3] = LoRaMacDownlinkStatus.Rssi >> 8;
mluis 0:45496a70a8a5 299 AppData[4] = LoRaMacDownlinkStatus.Rssi;
mluis 0:45496a70a8a5 300 AppData[5] = LoRaMacDownlinkStatus.Snr;
mluis 0:45496a70a8a5 301 }
mluis 0:45496a70a8a5 302 }
mluis 0:45496a70a8a5 303 break;
mluis 0:45496a70a8a5 304 case 224:
mluis 0:45496a70a8a5 305 if( ComplianceTest.LinkCheck == true )
mluis 0:45496a70a8a5 306 {
mluis 0:45496a70a8a5 307 ComplianceTest.LinkCheck = false;
mluis 0:45496a70a8a5 308 AppDataSize = 3;
mluis 0:45496a70a8a5 309 AppData[0] = 5;
mluis 0:45496a70a8a5 310 AppData[1] = ComplianceTest.DemodMargin;
mluis 0:45496a70a8a5 311 AppData[2] = ComplianceTest.NbGateways;
mluis 0:45496a70a8a5 312 ComplianceTest.State = 1;
mluis 0:45496a70a8a5 313 }
mluis 0:45496a70a8a5 314 else
mluis 0:45496a70a8a5 315 {
mluis 0:45496a70a8a5 316 switch( ComplianceTest.State )
mluis 0:45496a70a8a5 317 {
mluis 0:45496a70a8a5 318 case 4:
mluis 0:45496a70a8a5 319 ComplianceTest.State = 1;
mluis 0:45496a70a8a5 320 break;
mluis 0:45496a70a8a5 321 case 1:
mluis 0:45496a70a8a5 322 AppDataSize = 2;
mluis 0:45496a70a8a5 323 AppData[0] = ComplianceTest.DownLinkCounter >> 8;
mluis 0:45496a70a8a5 324 AppData[1] = ComplianceTest.DownLinkCounter;
mluis 0:45496a70a8a5 325 break;
mluis 0:45496a70a8a5 326 }
mluis 0:45496a70a8a5 327 }
mluis 0:45496a70a8a5 328 break;
mluis 0:45496a70a8a5 329 default:
mluis 0:45496a70a8a5 330 break;
mluis 0:45496a70a8a5 331 }
mluis 0:45496a70a8a5 332 }
mluis 0:45496a70a8a5 333
mluis 0:45496a70a8a5 334 /*!
mluis 0:45496a70a8a5 335 * \brief Prepares the payload of the frame
mluis 0:45496a70a8a5 336 *
mluis 0:45496a70a8a5 337 * \retval [0: frame could be send, 1: error]
mluis 0:45496a70a8a5 338 */
mluis 0:45496a70a8a5 339 static bool SendFrame( void )
mluis 0:45496a70a8a5 340 {
mluis 0:45496a70a8a5 341 McpsReq_t mcpsReq;
mluis 0:45496a70a8a5 342 LoRaMacTxInfo_t txInfo;
mluis 7:5077515c163b 343
mluis 0:45496a70a8a5 344 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
mluis 0:45496a70a8a5 345 {
mluis 0:45496a70a8a5 346 // Send empty frame in order to flush MAC commands
mluis 0:45496a70a8a5 347 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 0:45496a70a8a5 348 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
mluis 0:45496a70a8a5 349 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
mluis 0:45496a70a8a5 350 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 3:3152aa75c58d 351
mluis 0:45496a70a8a5 352 LoRaMacUplinkStatus.Acked = false;
mluis 0:45496a70a8a5 353 LoRaMacUplinkStatus.Port = 0;
mluis 0:45496a70a8a5 354 LoRaMacUplinkStatus.Buffer = NULL;
mluis 0:45496a70a8a5 355 LoRaMacUplinkStatus.BufferSize = 0;
mluis 0:45496a70a8a5 356 SerialDisplayUpdateFrameType( false );
mluis 0:45496a70a8a5 357 }
mluis 0:45496a70a8a5 358 else
mluis 0:45496a70a8a5 359 {
mluis 0:45496a70a8a5 360 LoRaMacUplinkStatus.Acked = false;
mluis 0:45496a70a8a5 361 LoRaMacUplinkStatus.Port = AppPort;
mluis 0:45496a70a8a5 362 LoRaMacUplinkStatus.Buffer = AppData;
mluis 0:45496a70a8a5 363 LoRaMacUplinkStatus.BufferSize = AppDataSize;
mluis 0:45496a70a8a5 364 SerialDisplayUpdateFrameType( IsTxConfirmed );
mluis 0:45496a70a8a5 365
mluis 0:45496a70a8a5 366 if( IsTxConfirmed == false )
mluis 0:45496a70a8a5 367 {
mluis 0:45496a70a8a5 368 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 0:45496a70a8a5 369 mcpsReq.Req.Unconfirmed.fPort = AppPort;
mluis 0:45496a70a8a5 370 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
mluis 0:45496a70a8a5 371 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
mluis 0:45496a70a8a5 372 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 0:45496a70a8a5 373 }
mluis 0:45496a70a8a5 374 else
mluis 0:45496a70a8a5 375 {
mluis 0:45496a70a8a5 376 mcpsReq.Type = MCPS_CONFIRMED;
mluis 0:45496a70a8a5 377 mcpsReq.Req.Confirmed.fPort = AppPort;
mluis 0:45496a70a8a5 378 mcpsReq.Req.Confirmed.fBuffer = AppData;
mluis 0:45496a70a8a5 379 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
mluis 2:2eeaeae2c725 380 mcpsReq.Req.Confirmed.NbTrials = 8;
mluis 0:45496a70a8a5 381 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 0:45496a70a8a5 382 }
mluis 0:45496a70a8a5 383 }
mluis 0:45496a70a8a5 384
mluis 0:45496a70a8a5 385 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
mluis 0:45496a70a8a5 386 {
mluis 0:45496a70a8a5 387 return false;
mluis 0:45496a70a8a5 388 }
mluis 0:45496a70a8a5 389 return true;
mluis 0:45496a70a8a5 390 }
mluis 0:45496a70a8a5 391
mluis 0:45496a70a8a5 392 /*!
mluis 0:45496a70a8a5 393 * \brief Function executed on TxNextPacket Timeout event
mluis 0:45496a70a8a5 394 */
mluis 0:45496a70a8a5 395 static void OnTxNextPacketTimerEvent( void )
mluis 0:45496a70a8a5 396 {
mluis 0:45496a70a8a5 397 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 398 LoRaMacStatus_t status;
mluis 0:45496a70a8a5 399
mluis 0:45496a70a8a5 400 TimerStop( &TxNextPacketTimer );
mluis 0:45496a70a8a5 401
mluis 0:45496a70a8a5 402 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 403 status = LoRaMacMibGetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 404
mluis 0:45496a70a8a5 405 if( status == LORAMAC_STATUS_OK )
mluis 0:45496a70a8a5 406 {
mluis 0:45496a70a8a5 407 if( mibReq.Param.IsNetworkJoined == true )
mluis 0:45496a70a8a5 408 {
mluis 0:45496a70a8a5 409 DeviceState = DEVICE_STATE_SEND;
mluis 0:45496a70a8a5 410 NextTx = true;
mluis 0:45496a70a8a5 411 }
mluis 0:45496a70a8a5 412 else
mluis 0:45496a70a8a5 413 {
mluis 0:45496a70a8a5 414 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 415 }
mluis 0:45496a70a8a5 416 }
mluis 0:45496a70a8a5 417 }
mluis 0:45496a70a8a5 418
mluis 0:45496a70a8a5 419 /*!
mluis 0:45496a70a8a5 420 * \brief Function executed on Led 1 Timeout event
mluis 0:45496a70a8a5 421 */
mluis 0:45496a70a8a5 422 static void OnLed1TimerEvent( void )
mluis 0:45496a70a8a5 423 {
mluis 0:45496a70a8a5 424 TimerStop( &Led1Timer );
mluis 0:45496a70a8a5 425 // Switch LED 1 OFF
mluis 0:45496a70a8a5 426 Led1State = false;
mluis 0:45496a70a8a5 427 Led1StateChanged = true;
mluis 0:45496a70a8a5 428 }
mluis 0:45496a70a8a5 429
mluis 0:45496a70a8a5 430 /*!
mluis 0:45496a70a8a5 431 * \brief Function executed on Led 2 Timeout event
mluis 0:45496a70a8a5 432 */
mluis 0:45496a70a8a5 433 static void OnLed2TimerEvent( void )
mluis 0:45496a70a8a5 434 {
mluis 0:45496a70a8a5 435 TimerStop( &Led2Timer );
mluis 0:45496a70a8a5 436 // Switch LED 2 OFF
mluis 0:45496a70a8a5 437 Led2State = false;
mluis 0:45496a70a8a5 438 Led2StateChanged = true;
mluis 0:45496a70a8a5 439 }
mluis 0:45496a70a8a5 440
mluis 0:45496a70a8a5 441 /*!
mluis 0:45496a70a8a5 442 * \brief MCPS-Confirm event function
mluis 0:45496a70a8a5 443 *
mluis 3:3152aa75c58d 444 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
mluis 0:45496a70a8a5 445 * containing confirm attributes.
mluis 0:45496a70a8a5 446 */
mluis 3:3152aa75c58d 447 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
mluis 0:45496a70a8a5 448 {
mluis 3:3152aa75c58d 449 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 0:45496a70a8a5 450 {
mluis 3:3152aa75c58d 451 switch( mcpsConfirm->McpsRequest )
mluis 0:45496a70a8a5 452 {
mluis 0:45496a70a8a5 453 case MCPS_UNCONFIRMED:
mluis 0:45496a70a8a5 454 {
mluis 0:45496a70a8a5 455 // Check Datarate
mluis 0:45496a70a8a5 456 // Check TxPower
mluis 0:45496a70a8a5 457 break;
mluis 0:45496a70a8a5 458 }
mluis 0:45496a70a8a5 459 case MCPS_CONFIRMED:
mluis 0:45496a70a8a5 460 {
mluis 0:45496a70a8a5 461 // Check Datarate
mluis 0:45496a70a8a5 462 // Check TxPower
mluis 0:45496a70a8a5 463 // Check AckReceived
mluis 3:3152aa75c58d 464 // Check NbTrials
mluis 3:3152aa75c58d 465 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
mluis 0:45496a70a8a5 466 break;
mluis 0:45496a70a8a5 467 }
mluis 0:45496a70a8a5 468 case MCPS_PROPRIETARY:
mluis 0:45496a70a8a5 469 {
mluis 0:45496a70a8a5 470 break;
mluis 0:45496a70a8a5 471 }
mluis 0:45496a70a8a5 472 default:
mluis 0:45496a70a8a5 473 break;
mluis 0:45496a70a8a5 474 }
mluis 3:3152aa75c58d 475 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
mluis 3:3152aa75c58d 476 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
mluis 3:3152aa75c58d 477
mluis 5:62862ef9480b 478 // Switch LED 1 ON
mluis 5:62862ef9480b 479 Led1State = true;
mluis 5:62862ef9480b 480 Led1StateChanged = true;
mluis 5:62862ef9480b 481 TimerStart( &Led1Timer );
mluis 5:62862ef9480b 482
mluis 0:45496a70a8a5 483 UplinkStatusUpdated = true;
mluis 0:45496a70a8a5 484 }
mluis 0:45496a70a8a5 485 NextTx = true;
mluis 0:45496a70a8a5 486 }
mluis 0:45496a70a8a5 487
mluis 0:45496a70a8a5 488 /*!
mluis 0:45496a70a8a5 489 * \brief MCPS-Indication event function
mluis 0:45496a70a8a5 490 *
mluis 3:3152aa75c58d 491 * \param [IN] mcpsIndication - Pointer to the indication structure,
mluis 0:45496a70a8a5 492 * containing indication attributes.
mluis 0:45496a70a8a5 493 */
mluis 3:3152aa75c58d 494 static void McpsIndication( McpsIndication_t *mcpsIndication )
mluis 0:45496a70a8a5 495 {
mluis 3:3152aa75c58d 496 if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
mluis 0:45496a70a8a5 497 {
mluis 0:45496a70a8a5 498 return;
mluis 0:45496a70a8a5 499 }
mluis 0:45496a70a8a5 500
mluis 3:3152aa75c58d 501 switch( mcpsIndication->McpsIndication )
mluis 0:45496a70a8a5 502 {
mluis 0:45496a70a8a5 503 case MCPS_UNCONFIRMED:
mluis 0:45496a70a8a5 504 {
mluis 0:45496a70a8a5 505 break;
mluis 0:45496a70a8a5 506 }
mluis 0:45496a70a8a5 507 case MCPS_CONFIRMED:
mluis 0:45496a70a8a5 508 {
mluis 0:45496a70a8a5 509 break;
mluis 0:45496a70a8a5 510 }
mluis 0:45496a70a8a5 511 case MCPS_PROPRIETARY:
mluis 0:45496a70a8a5 512 {
mluis 0:45496a70a8a5 513 break;
mluis 0:45496a70a8a5 514 }
mluis 0:45496a70a8a5 515 case MCPS_MULTICAST:
mluis 0:45496a70a8a5 516 {
mluis 0:45496a70a8a5 517 break;
mluis 0:45496a70a8a5 518 }
mluis 0:45496a70a8a5 519 default:
mluis 0:45496a70a8a5 520 break;
mluis 0:45496a70a8a5 521 }
mluis 0:45496a70a8a5 522
mluis 0:45496a70a8a5 523 // Check Multicast
mluis 0:45496a70a8a5 524 // Check Port
mluis 0:45496a70a8a5 525 // Check Datarate
mluis 0:45496a70a8a5 526 // Check FramePending
mluis 0:45496a70a8a5 527 // Check Buffer
mluis 0:45496a70a8a5 528 // Check BufferSize
mluis 0:45496a70a8a5 529 // Check Rssi
mluis 0:45496a70a8a5 530 // Check Snr
mluis 0:45496a70a8a5 531 // Check RxSlot
mluis 3:3152aa75c58d 532 LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
mluis 3:3152aa75c58d 533 if( mcpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
mluis 0:45496a70a8a5 534 {
mluis 0:45496a70a8a5 535 // Invert and divide by 4
mluis 3:3152aa75c58d 536 LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
mluis 0:45496a70a8a5 537 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
mluis 0:45496a70a8a5 538 }
mluis 0:45496a70a8a5 539 else
mluis 0:45496a70a8a5 540 {
mluis 0:45496a70a8a5 541 // Divide by 4
mluis 3:3152aa75c58d 542 LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
mluis 0:45496a70a8a5 543 }
mluis 0:45496a70a8a5 544 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 3:3152aa75c58d 545 LoRaMacDownlinkStatus.RxData = mcpsIndication->RxData;
mluis 3:3152aa75c58d 546 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
mluis 3:3152aa75c58d 547 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
mluis 3:3152aa75c58d 548 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
mluis 0:45496a70a8a5 549
mluis 0:45496a70a8a5 550 if( ComplianceTest.Running == true )
mluis 0:45496a70a8a5 551 {
mluis 0:45496a70a8a5 552 ComplianceTest.DownLinkCounter++;
mluis 0:45496a70a8a5 553 }
mluis 0:45496a70a8a5 554
mluis 3:3152aa75c58d 555 if( mcpsIndication->RxData == true )
mluis 0:45496a70a8a5 556 {
mluis 3:3152aa75c58d 557 switch( mcpsIndication->Port )
mluis 0:45496a70a8a5 558 {
mluis 0:45496a70a8a5 559 case 1: // The application LED can be controlled on port 1 or 2
mluis 0:45496a70a8a5 560 case 2:
mluis 3:3152aa75c58d 561 if( mcpsIndication->BufferSize == 1 )
mluis 0:45496a70a8a5 562 {
mluis 3:3152aa75c58d 563 AppLedStateOn = mcpsIndication->Buffer[0] & 0x01;
mluis 0:45496a70a8a5 564 Led3StateChanged = true;
mluis 0:45496a70a8a5 565 }
mluis 0:45496a70a8a5 566 break;
mluis 0:45496a70a8a5 567 case 224:
mluis 0:45496a70a8a5 568 if( ComplianceTest.Running == false )
mluis 0:45496a70a8a5 569 {
mluis 0:45496a70a8a5 570 // Check compliance test enable command (i)
mluis 3:3152aa75c58d 571 if( ( mcpsIndication->BufferSize == 4 ) &&
mluis 3:3152aa75c58d 572 ( mcpsIndication->Buffer[0] == 0x01 ) &&
mluis 3:3152aa75c58d 573 ( mcpsIndication->Buffer[1] == 0x01 ) &&
mluis 3:3152aa75c58d 574 ( mcpsIndication->Buffer[2] == 0x01 ) &&
mluis 3:3152aa75c58d 575 ( mcpsIndication->Buffer[3] == 0x01 ) )
mluis 0:45496a70a8a5 576 {
mluis 0:45496a70a8a5 577 IsTxConfirmed = false;
mluis 0:45496a70a8a5 578 AppPort = 224;
mluis 0:45496a70a8a5 579 AppDataSize = 2;
mluis 0:45496a70a8a5 580 ComplianceTest.DownLinkCounter = 0;
mluis 0:45496a70a8a5 581 ComplianceTest.LinkCheck = false;
mluis 0:45496a70a8a5 582 ComplianceTest.DemodMargin = 0;
mluis 0:45496a70a8a5 583 ComplianceTest.NbGateways = 0;
mluis 0:45496a70a8a5 584 ComplianceTest.Running = true;
mluis 0:45496a70a8a5 585 ComplianceTest.State = 1;
mluis 7:5077515c163b 586
mluis 0:45496a70a8a5 587 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 588 mibReq.Type = MIB_ADR;
mluis 0:45496a70a8a5 589 mibReq.Param.AdrEnable = true;
mluis 0:45496a70a8a5 590 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 591
mluis 0:45496a70a8a5 592 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 593 LoRaMacTestSetDutyCycleOn( false );
mluis 0:45496a70a8a5 594 #endif
mluis 0:45496a70a8a5 595 }
mluis 0:45496a70a8a5 596 }
mluis 0:45496a70a8a5 597 else
mluis 0:45496a70a8a5 598 {
mluis 3:3152aa75c58d 599 ComplianceTest.State = mcpsIndication->Buffer[0];
mluis 0:45496a70a8a5 600 switch( ComplianceTest.State )
mluis 0:45496a70a8a5 601 {
mluis 0:45496a70a8a5 602 case 0: // Check compliance test disable command (ii)
mluis 0:45496a70a8a5 603 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 0:45496a70a8a5 604 AppPort = LORAWAN_APP_PORT;
mluis 0:45496a70a8a5 605 AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 0:45496a70a8a5 606 ComplianceTest.DownLinkCounter = 0;
mluis 0:45496a70a8a5 607 ComplianceTest.Running = false;
mluis 7:5077515c163b 608
mluis 0:45496a70a8a5 609 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 610 mibReq.Type = MIB_ADR;
mluis 0:45496a70a8a5 611 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 0:45496a70a8a5 612 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 613 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 614 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 0:45496a70a8a5 615 #endif
mluis 0:45496a70a8a5 616 break;
mluis 0:45496a70a8a5 617 case 1: // (iii, iv)
mluis 0:45496a70a8a5 618 AppDataSize = 2;
mluis 0:45496a70a8a5 619 break;
mluis 0:45496a70a8a5 620 case 2: // Enable confirmed messages (v)
mluis 0:45496a70a8a5 621 IsTxConfirmed = true;
mluis 0:45496a70a8a5 622 ComplianceTest.State = 1;
mluis 0:45496a70a8a5 623 break;
mluis 0:45496a70a8a5 624 case 3: // Disable confirmed messages (vi)
mluis 0:45496a70a8a5 625 IsTxConfirmed = false;
mluis 0:45496a70a8a5 626 ComplianceTest.State = 1;
mluis 0:45496a70a8a5 627 break;
mluis 0:45496a70a8a5 628 case 4: // (vii)
mluis 3:3152aa75c58d 629 AppDataSize = mcpsIndication->BufferSize;
mluis 0:45496a70a8a5 630
mluis 0:45496a70a8a5 631 AppData[0] = 4;
mluis 0:45496a70a8a5 632 for( uint8_t i = 1; i < AppDataSize; i++ )
mluis 0:45496a70a8a5 633 {
mluis 3:3152aa75c58d 634 AppData[i] = mcpsIndication->Buffer[i] + 1;
mluis 0:45496a70a8a5 635 }
mluis 0:45496a70a8a5 636 break;
mluis 0:45496a70a8a5 637 case 5: // (viii)
mluis 0:45496a70a8a5 638 {
mluis 0:45496a70a8a5 639 MlmeReq_t mlmeReq;
mluis 0:45496a70a8a5 640 mlmeReq.Type = MLME_LINK_CHECK;
mluis 0:45496a70a8a5 641 LoRaMacMlmeRequest( &mlmeReq );
mluis 0:45496a70a8a5 642 }
mluis 0:45496a70a8a5 643 break;
mluis 5:62862ef9480b 644 case 6: // (ix)
mluis 5:62862ef9480b 645 {
mluis 5:62862ef9480b 646 MlmeReq_t mlmeReq;
mluis 5:62862ef9480b 647
mluis 7:5077515c163b 648 // Disable TestMode and revert back to normal operation
mluis 7:5077515c163b 649 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 7:5077515c163b 650 AppPort = LORAWAN_APP_PORT;
mluis 7:5077515c163b 651 AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 7:5077515c163b 652 ComplianceTest.DownLinkCounter = 0;
mluis 7:5077515c163b 653 ComplianceTest.Running = false;
mluis 7:5077515c163b 654
mluis 7:5077515c163b 655 MibRequestConfirm_t mibReq;
mluis 7:5077515c163b 656 mibReq.Type = MIB_ADR;
mluis 7:5077515c163b 657 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 7:5077515c163b 658 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 7:5077515c163b 659 #if defined( USE_BAND_868 )
mluis 7:5077515c163b 660 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 7:5077515c163b 661 #endif
mluis 7:5077515c163b 662
mluis 5:62862ef9480b 663 mlmeReq.Type = MLME_JOIN;
mluis 5:62862ef9480b 664
mluis 5:62862ef9480b 665 mlmeReq.Req.Join.DevEui = DevEui;
mluis 5:62862ef9480b 666 mlmeReq.Req.Join.AppEui = AppEui;
mluis 5:62862ef9480b 667 mlmeReq.Req.Join.AppKey = AppKey;
mluis 7:5077515c163b 668 mlmeReq.Req.Join.NbTrials = 3;
mluis 5:62862ef9480b 669
mluis 5:62862ef9480b 670 LoRaMacMlmeRequest( &mlmeReq );
mluis 5:62862ef9480b 671 DeviceState = DEVICE_STATE_SLEEP;
mluis 5:62862ef9480b 672 }
mluis 5:62862ef9480b 673 break;
mluis 7:5077515c163b 674 case 7: // (x)
mluis 7:5077515c163b 675 {
mluis 7:5077515c163b 676 if( mcpsIndication->BufferSize == 3 )
mluis 7:5077515c163b 677 {
mluis 7:5077515c163b 678 MlmeReq_t mlmeReq;
mluis 7:5077515c163b 679 mlmeReq.Type = MLME_TXCW;
mluis 7:5077515c163b 680 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
mluis 7:5077515c163b 681 LoRaMacMlmeRequest( &mlmeReq );
mluis 7:5077515c163b 682 }
mluis 7:5077515c163b 683 else if( mcpsIndication->BufferSize == 7 )
mluis 7:5077515c163b 684 {
mluis 7:5077515c163b 685 MlmeReq_t mlmeReq;
mluis 7:5077515c163b 686 mlmeReq.Type = MLME_TXCW_1;
mluis 7:5077515c163b 687 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
mluis 7:5077515c163b 688 mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100;
mluis 7:5077515c163b 689 mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6];
mluis 7:5077515c163b 690 LoRaMacMlmeRequest( &mlmeReq );
mluis 7:5077515c163b 691 }
mluis 7:5077515c163b 692 ComplianceTest.State = 1;
mluis 7:5077515c163b 693 }
mluis 7:5077515c163b 694 break;
mluis 0:45496a70a8a5 695 default:
mluis 0:45496a70a8a5 696 break;
mluis 0:45496a70a8a5 697 }
mluis 0:45496a70a8a5 698 }
mluis 0:45496a70a8a5 699 break;
mluis 0:45496a70a8a5 700 default:
mluis 0:45496a70a8a5 701 break;
mluis 0:45496a70a8a5 702 }
mluis 0:45496a70a8a5 703 }
mluis 0:45496a70a8a5 704
mluis 0:45496a70a8a5 705 // Switch LED 2 ON for each received downlink
mluis 0:45496a70a8a5 706 Led2State = true;
mluis 0:45496a70a8a5 707 Led2StateChanged = true;
mluis 0:45496a70a8a5 708 TimerStart( &Led2Timer );
mluis 0:45496a70a8a5 709 DownlinkStatusUpdated = true;
mluis 0:45496a70a8a5 710 }
mluis 0:45496a70a8a5 711
mluis 0:45496a70a8a5 712 /*!
mluis 0:45496a70a8a5 713 * \brief MLME-Confirm event function
mluis 0:45496a70a8a5 714 *
mluis 3:3152aa75c58d 715 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
mluis 0:45496a70a8a5 716 * containing confirm attributes.
mluis 0:45496a70a8a5 717 */
mluis 3:3152aa75c58d 718 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mluis 0:45496a70a8a5 719 {
mluis 7:5077515c163b 720 switch( mlmeConfirm->MlmeRequest )
mluis 0:45496a70a8a5 721 {
mluis 7:5077515c163b 722 case MLME_JOIN:
mluis 0:45496a70a8a5 723 {
mluis 7:5077515c163b 724 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 0:45496a70a8a5 725 {
mluis 0:45496a70a8a5 726 // Status is OK, node has joined the network
mluis 0:45496a70a8a5 727 IsNetworkJoinedStatusUpdate = true;
mluis 5:62862ef9480b 728 DeviceState = DEVICE_STATE_SEND;
mluis 7:5077515c163b 729 }
mluis 7:5077515c163b 730 else
mluis 7:5077515c163b 731 {
mluis 7:5077515c163b 732 // Join was not successful. Try to join again
mluis 7:5077515c163b 733 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 734 }
mluis 7:5077515c163b 735 break;
mluis 7:5077515c163b 736 }
mluis 7:5077515c163b 737 case MLME_LINK_CHECK:
mluis 7:5077515c163b 738 {
mluis 7:5077515c163b 739 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 0:45496a70a8a5 740 {
mluis 0:45496a70a8a5 741 // Check DemodMargin
mluis 0:45496a70a8a5 742 // Check NbGateways
mluis 0:45496a70a8a5 743 if( ComplianceTest.Running == true )
mluis 0:45496a70a8a5 744 {
mluis 0:45496a70a8a5 745 ComplianceTest.LinkCheck = true;
mluis 3:3152aa75c58d 746 ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
mluis 3:3152aa75c58d 747 ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
mluis 0:45496a70a8a5 748 }
mluis 0:45496a70a8a5 749 }
mluis 7:5077515c163b 750 break;
mluis 0:45496a70a8a5 751 }
mluis 7:5077515c163b 752 default:
mluis 7:5077515c163b 753 break;
mluis 0:45496a70a8a5 754 }
mluis 0:45496a70a8a5 755 NextTx = true;
mluis 0:45496a70a8a5 756 UplinkStatusUpdated = true;
mluis 0:45496a70a8a5 757 }
mluis 0:45496a70a8a5 758
mluis 0:45496a70a8a5 759 /**
mluis 0:45496a70a8a5 760 * Main application entry point.
mluis 0:45496a70a8a5 761 */
mluis 0:45496a70a8a5 762 int main( void )
mluis 0:45496a70a8a5 763 {
mluis 0:45496a70a8a5 764 LoRaMacPrimitives_t LoRaMacPrimitives;
mluis 0:45496a70a8a5 765 LoRaMacCallback_t LoRaMacCallbacks;
mluis 0:45496a70a8a5 766 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 767
mluis 0:45496a70a8a5 768 BoardInit( );
mluis 0:45496a70a8a5 769 SerialDisplayInit( );
mluis 0:45496a70a8a5 770
mluis 5:62862ef9480b 771 SerialDisplayUpdateEui( 5, DevEui );
mluis 5:62862ef9480b 772 SerialDisplayUpdateEui( 6, AppEui );
mluis 5:62862ef9480b 773 SerialDisplayUpdateKey( 7, AppKey );
mluis 5:62862ef9480b 774
mluis 5:62862ef9480b 775 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 5:62862ef9480b 776 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 5:62862ef9480b 777 SerialDisplayUpdateDevAddr( DevAddr );
mluis 5:62862ef9480b 778 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 5:62862ef9480b 779 SerialDisplayUpdateKey( 13, AppSKey );
mluis 5:62862ef9480b 780 #endif
mluis 5:62862ef9480b 781
mluis 0:45496a70a8a5 782 DeviceState = DEVICE_STATE_INIT;
mluis 0:45496a70a8a5 783
mluis 0:45496a70a8a5 784 while( 1 )
mluis 0:45496a70a8a5 785 {
mluis 0:45496a70a8a5 786 SerialRxProcess( );
mluis 0:45496a70a8a5 787 if( IsNetworkJoinedStatusUpdate == true )
mluis 0:45496a70a8a5 788 {
mluis 0:45496a70a8a5 789 IsNetworkJoinedStatusUpdate = false;
mluis 0:45496a70a8a5 790 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 791 LoRaMacMibGetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 792 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
mluis 0:45496a70a8a5 793 }
mluis 0:45496a70a8a5 794 if( Led1StateChanged == true )
mluis 0:45496a70a8a5 795 {
mluis 0:45496a70a8a5 796 Led1StateChanged = false;
mluis 0:45496a70a8a5 797 SerialDisplayUpdateLedState( 1, Led1State );
mluis 0:45496a70a8a5 798 }
mluis 0:45496a70a8a5 799 if( Led2StateChanged == true )
mluis 0:45496a70a8a5 800 {
mluis 0:45496a70a8a5 801 Led2StateChanged = false;
mluis 0:45496a70a8a5 802 SerialDisplayUpdateLedState( 2, Led2State );
mluis 0:45496a70a8a5 803 }
mluis 0:45496a70a8a5 804 if( Led3StateChanged == true )
mluis 0:45496a70a8a5 805 {
mluis 0:45496a70a8a5 806 Led3StateChanged = false;
mluis 0:45496a70a8a5 807 SerialDisplayUpdateLedState( 3, AppLedStateOn );
mluis 0:45496a70a8a5 808 }
mluis 0:45496a70a8a5 809 if( UplinkStatusUpdated == true )
mluis 0:45496a70a8a5 810 {
mluis 0:45496a70a8a5 811 UplinkStatusUpdated = false;
mluis 0:45496a70a8a5 812 SerialDisplayUpdateUplink( LoRaMacUplinkStatus.Acked, LoRaMacUplinkStatus.Datarate, LoRaMacUplinkStatus.UplinkCounter, LoRaMacUplinkStatus.Port, LoRaMacUplinkStatus.Buffer, LoRaMacUplinkStatus.BufferSize );
mluis 0:45496a70a8a5 813 }
mluis 0:45496a70a8a5 814 if( DownlinkStatusUpdated == true )
mluis 0:45496a70a8a5 815 {
mluis 0:45496a70a8a5 816 DownlinkStatusUpdated = false;
mluis 0:45496a70a8a5 817 SerialDisplayUpdateLedState( 2, Led2State );
mluis 0:45496a70a8a5 818 SerialDisplayUpdateDownlink( LoRaMacDownlinkStatus.RxData, LoRaMacDownlinkStatus.Rssi, LoRaMacDownlinkStatus.Snr, LoRaMacDownlinkStatus.DownlinkCounter, LoRaMacDownlinkStatus.Port, LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
mluis 0:45496a70a8a5 819 }
mluis 0:45496a70a8a5 820
mluis 0:45496a70a8a5 821 switch( DeviceState )
mluis 0:45496a70a8a5 822 {
mluis 0:45496a70a8a5 823 case DEVICE_STATE_INIT:
mluis 0:45496a70a8a5 824 {
mluis 0:45496a70a8a5 825 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
mluis 0:45496a70a8a5 826 LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
mluis 0:45496a70a8a5 827 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
mluis 0:45496a70a8a5 828 LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
mluis 0:45496a70a8a5 829 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
mluis 0:45496a70a8a5 830
mluis 0:45496a70a8a5 831 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
mluis 0:45496a70a8a5 832
mluis 0:45496a70a8a5 833 TimerInit( &Led1Timer, OnLed1TimerEvent );
mluis 7:5077515c163b 834 TimerSetValue( &Led1Timer, 25 );
mluis 0:45496a70a8a5 835
mluis 0:45496a70a8a5 836 TimerInit( &Led2Timer, OnLed2TimerEvent );
mluis 7:5077515c163b 837 TimerSetValue( &Led2Timer, 25 );
mluis 0:45496a70a8a5 838
mluis 0:45496a70a8a5 839 mibReq.Type = MIB_ADR;
mluis 0:45496a70a8a5 840 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 0:45496a70a8a5 841 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 842
mluis 0:45496a70a8a5 843 mibReq.Type = MIB_PUBLIC_NETWORK;
mluis 0:45496a70a8a5 844 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
mluis 0:45496a70a8a5 845 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 846
mluis 0:45496a70a8a5 847 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 848 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 0:45496a70a8a5 849 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 3:3152aa75c58d 850
mluis 7:5077515c163b 851 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 3:3152aa75c58d 852 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
mluis 3:3152aa75c58d 853 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
mluis 3:3152aa75c58d 854 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
mluis 3:3152aa75c58d 855 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
mluis 3:3152aa75c58d 856 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
mluis 3:3152aa75c58d 857 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
mluis 3:3152aa75c58d 858 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
mluis 5:62862ef9480b 859
mluis 7:5077515c163b 860 mibReq.Type = MIB_RX2_DEFAULT_CHANNEL;
mluis 7:5077515c163b 861 mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
mluis 7:5077515c163b 862 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 7:5077515c163b 863
mluis 5:62862ef9480b 864 mibReq.Type = MIB_RX2_CHANNEL;
mluis 5:62862ef9480b 865 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
mluis 5:62862ef9480b 866 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:3152aa75c58d 867 #endif
mluis 3:3152aa75c58d 868
mluis 0:45496a70a8a5 869 #endif
mluis 0:45496a70a8a5 870 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:45496a70a8a5 871 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:45496a70a8a5 872 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:45496a70a8a5 873
mluis 0:45496a70a8a5 874 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 0:45496a70a8a5 875
mluis 0:45496a70a8a5 876 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 877 break;
mluis 0:45496a70a8a5 878 }
mluis 0:45496a70a8a5 879 case DEVICE_STATE_JOIN:
mluis 0:45496a70a8a5 880 {
mluis 0:45496a70a8a5 881 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:45496a70a8a5 882 MlmeReq_t mlmeReq;
mluis 0:45496a70a8a5 883
mluis 0:45496a70a8a5 884 mlmeReq.Type = MLME_JOIN;
mluis 0:45496a70a8a5 885
mluis 0:45496a70a8a5 886 mlmeReq.Req.Join.DevEui = DevEui;
mluis 0:45496a70a8a5 887 mlmeReq.Req.Join.AppEui = AppEui;
mluis 0:45496a70a8a5 888 mlmeReq.Req.Join.AppKey = AppKey;
mluis 0:45496a70a8a5 889
mluis 0:45496a70a8a5 890 if( NextTx == true )
mluis 0:45496a70a8a5 891 {
mluis 0:45496a70a8a5 892 LoRaMacMlmeRequest( &mlmeReq );
mluis 0:45496a70a8a5 893 }
mluis 5:62862ef9480b 894 DeviceState = DEVICE_STATE_SLEEP;
mluis 0:45496a70a8a5 895 #else
mluis 0:45496a70a8a5 896 mibReq.Type = MIB_NET_ID;
mluis 0:45496a70a8a5 897 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
mluis 0:45496a70a8a5 898 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 899
mluis 0:45496a70a8a5 900 mibReq.Type = MIB_DEV_ADDR;
mluis 0:45496a70a8a5 901 mibReq.Param.DevAddr = DevAddr;
mluis 0:45496a70a8a5 902 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 903
mluis 0:45496a70a8a5 904 mibReq.Type = MIB_NWK_SKEY;
mluis 0:45496a70a8a5 905 mibReq.Param.NwkSKey = NwkSKey;
mluis 0:45496a70a8a5 906 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 907
mluis 0:45496a70a8a5 908 mibReq.Type = MIB_APP_SKEY;
mluis 0:45496a70a8a5 909 mibReq.Param.AppSKey = AppSKey;
mluis 0:45496a70a8a5 910 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 911
mluis 0:45496a70a8a5 912 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 913 mibReq.Param.IsNetworkJoined = true;
mluis 0:45496a70a8a5 914 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 915
mluis 0:45496a70a8a5 916 DeviceState = DEVICE_STATE_SEND;
mluis 0:45496a70a8a5 917 #endif
mluis 0:45496a70a8a5 918 IsNetworkJoinedStatusUpdate = true;
mluis 0:45496a70a8a5 919 break;
mluis 0:45496a70a8a5 920 }
mluis 0:45496a70a8a5 921 case DEVICE_STATE_SEND:
mluis 0:45496a70a8a5 922 {
mluis 0:45496a70a8a5 923 if( NextTx == true )
mluis 0:45496a70a8a5 924 {
mluis 0:45496a70a8a5 925 SerialDisplayUpdateUplinkAcked( false );
mluis 0:45496a70a8a5 926 SerialDisplayUpdateDonwlinkRxData( false );
mluis 0:45496a70a8a5 927 PrepareTxFrame( AppPort );
mluis 0:45496a70a8a5 928
mluis 0:45496a70a8a5 929 NextTx = SendFrame( );
mluis 0:45496a70a8a5 930 }
mluis 0:45496a70a8a5 931 if( ComplianceTest.Running == true )
mluis 0:45496a70a8a5 932 {
mluis 3:3152aa75c58d 933 // Schedule next packet transmission
mluis 7:5077515c163b 934 TxDutyCycleTime = 5000; // 5000 ms
mluis 0:45496a70a8a5 935 }
mluis 0:45496a70a8a5 936 else
mluis 0:45496a70a8a5 937 {
mluis 0:45496a70a8a5 938 // Schedule next packet transmission
mluis 0:45496a70a8a5 939 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
mluis 0:45496a70a8a5 940 }
mluis 0:45496a70a8a5 941 DeviceState = DEVICE_STATE_CYCLE;
mluis 0:45496a70a8a5 942 break;
mluis 0:45496a70a8a5 943 }
mluis 0:45496a70a8a5 944 case DEVICE_STATE_CYCLE:
mluis 0:45496a70a8a5 945 {
mluis 3:3152aa75c58d 946 DeviceState = DEVICE_STATE_SLEEP;
mluis 3:3152aa75c58d 947
mluis 0:45496a70a8a5 948 // Schedule next packet transmission
mluis 0:45496a70a8a5 949 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
mluis 0:45496a70a8a5 950 TimerStart( &TxNextPacketTimer );
mluis 0:45496a70a8a5 951 break;
mluis 0:45496a70a8a5 952 }
mluis 0:45496a70a8a5 953 case DEVICE_STATE_SLEEP:
mluis 0:45496a70a8a5 954 {
mluis 0:45496a70a8a5 955 // Wake up through events
mluis 0:45496a70a8a5 956 break;
mluis 0:45496a70a8a5 957 }
mluis 0:45496a70a8a5 958 default:
mluis 0:45496a70a8a5 959 {
mluis 0:45496a70a8a5 960 DeviceState = DEVICE_STATE_INIT;
mluis 0:45496a70a8a5 961 break;
mluis 0:45496a70a8a5 962 }
mluis 0:45496a70a8a5 963 }
mluis 0:45496a70a8a5 964 }
mluis 0:45496a70a8a5 965 }