This code uses Semtech's open source LoRaWAN stack ported to mbed environment.

Dependencies:   mbed LoRaWAN-lib SX1272Lib

Committer:
Mehrad
Date:
Fri Jun 10 00:01:00 2016 +0000
Revision:
1:7da3f0db0d82
Parent:
0:6155544d38b1
Initial commit

Who changed what in which revision?

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