Sending IKS01A1 temperature sensor to LoRaWAN port-5 uplink

Dependencies:   X_NUCLEO_IKS01A1 mbed LoRaWAN-lib SX1276Lib

Fork of LoRaWAN-demo-76 by Semtech

Use IKS01A1 sensor shield with SX1272 shield or SX1276 shield.

Sends temperature sensor to LoRaWAN uplink port 5.


Remove SB22 and SB23 from IKS01A1 before using

SB28 conflicts with DIO0 on radio. (TxDone RxDone)

SB22 conflicts with RxTx on radio. (antenna switch)

Committer:
mluis
Date:
Mon Mar 14 09:20:40 2016 +0000
Revision:
4:00cf2370c99d
Parent:
3:9c6f7f082151
Child:
5:1e9f6a365854
Updated project with latest version of the used libraries

Who changed what in which revision?

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