Application example using LoRaWAN-lib MAC layer implementation

Dependencies:   mbed LoRaWAN-lib SX1276Lib

Fork of LoRaWAN-demo-76 by Semtech

Committer:
helloqi
Date:
Thu Aug 25 13:20:05 2016 +0000
Revision:
8:9d6683e60974
Parent:
7:3173f0508a98
LoRaWan demo for sx1276;

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
mluis 0:92bca02df485 22 /*!
mluis 1:352f608c3337 23 * Defines the application data transmission duty cycle. 5s, value in [us].
mluis 0:92bca02df485 24 */
mluis 1:352f608c3337 25 #define APP_TX_DUTYCYCLE 5000000
mluis 1:352f608c3337 26
mluis 1:352f608c3337 27 /*!
mluis 1:352f608c3337 28 * Defines a random delay for application data transmission duty cycle. 1s,
mluis 1:352f608c3337 29 * value in [us].
mluis 1:352f608c3337 30 */
mluis 1:352f608c3337 31 #define APP_TX_DUTYCYCLE_RND 1000000
mluis 0:92bca02df485 32
mluis 0:92bca02df485 33 /*!
mluis 5:1e9f6a365854 34 * Default datarate
mluis 3:9c6f7f082151 35 */
mluis 3:9c6f7f082151 36 #define LORAWAN_DEFAULT_DATARATE DR_0
mluis 3:9c6f7f082151 37
mluis 3:9c6f7f082151 38 /*!
mluis 0:92bca02df485 39 * LoRaWAN confirmed messages
mluis 0:92bca02df485 40 */
mluis 0:92bca02df485 41 #define LORAWAN_CONFIRMED_MSG_ON true
mluis 0:92bca02df485 42
mluis 0:92bca02df485 43 /*!
mluis 3:9c6f7f082151 44 * LoRaWAN Adaptive Data Rate
mluis 0:92bca02df485 45 *
mluis 0:92bca02df485 46 * \remark Please note that when ADR is enabled the end-device should be static
mluis 0:92bca02df485 47 */
mluis 0:92bca02df485 48 #define LORAWAN_ADR_ON 1
mluis 0:92bca02df485 49
mluis 1:352f608c3337 50 #if defined( USE_BAND_868 )
mluis 1:352f608c3337 51
mluis 3:9c6f7f082151 52 #include "LoRaMacTest.h"
mluis 3:9c6f7f082151 53
mluis 0:92bca02df485 54 /*!
mluis 0:92bca02df485 55 * LoRaWAN ETSI duty cycle control enable/disable
mluis 0:92bca02df485 56 *
mluis 0:92bca02df485 57 * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
mluis 0:92bca02df485 58 */
mluis 3:9c6f7f082151 59 #define LORAWAN_DUTYCYCLE_ON true
mluis 0:92bca02df485 60
mluis 5:1e9f6a365854 61 #define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP 1
mluis 5:1e9f6a365854 62
mluis 5:1e9f6a365854 63 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 5:1e9f6a365854 64
mluis 5:1e9f6a365854 65 #define LC4 { 867100000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:1e9f6a365854 66 #define LC5 { 867300000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:1e9f6a365854 67 #define LC6 { 867500000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:1e9f6a365854 68 #define LC7 { 867700000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:1e9f6a365854 69 #define LC8 { 867900000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:1e9f6a365854 70 #define LC9 { 868800000, { ( ( DR_7 << 4 ) | DR_7 ) }, 2 }
mluis 5:1e9f6a365854 71 #define LC10 { 868300000, { ( ( DR_6 << 4 ) | DR_6 ) }, 1 }
mluis 5:1e9f6a365854 72
mluis 5:1e9f6a365854 73 #endif
mluis 5:1e9f6a365854 74
mluis 1:352f608c3337 75 #endif
mluis 1:352f608c3337 76
mluis 0:92bca02df485 77 /*!
mluis 0:92bca02df485 78 * LoRaWAN application port
mluis 0:92bca02df485 79 */
mluis 0:92bca02df485 80 #define LORAWAN_APP_PORT 15
mluis 0:92bca02df485 81
mluis 0:92bca02df485 82 /*!
mluis 0:92bca02df485 83 * User application data buffer size
mluis 0:92bca02df485 84 */
mluis 0:92bca02df485 85 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
mluis 0:92bca02df485 86 #define LORAWAN_APP_DATA_SIZE 6
mluis 0:92bca02df485 87
mluis 0:92bca02df485 88 #else
mluis 0:92bca02df485 89 #define LORAWAN_APP_DATA_SIZE 1
mluis 0:92bca02df485 90
mluis 0:92bca02df485 91 #endif
mluis 0:92bca02df485 92
mluis 0:92bca02df485 93 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
mluis 0:92bca02df485 94 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
mluis 0:92bca02df485 95 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
mluis 0:92bca02df485 96
mluis 7:3173f0508a98 97 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:92bca02df485 98
mluis 0:92bca02df485 99 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
mluis 0:92bca02df485 100 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
mluis 0:92bca02df485 101
mluis 3:9c6f7f082151 102 /*!
mluis 3:9c6f7f082151 103 * Device address
mluis 3:9c6f7f082151 104 */
mluis 3:9c6f7f082151 105 static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
mluis 0:92bca02df485 106
mluis 3:9c6f7f082151 107 #endif
mluis 0:92bca02df485 108
mluis 0:92bca02df485 109 /*!
mluis 1:352f608c3337 110 * Application port
mluis 1:352f608c3337 111 */
mluis 1:352f608c3337 112 static uint8_t AppPort = LORAWAN_APP_PORT;
mluis 1:352f608c3337 113
mluis 1:352f608c3337 114 /*!
mluis 1:352f608c3337 115 * User application data size
mluis 1:352f608c3337 116 */
mluis 1:352f608c3337 117 static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 1:352f608c3337 118
mluis 1:352f608c3337 119 /*!
mluis 1:352f608c3337 120 * User application data buffer size
mluis 1:352f608c3337 121 */
mluis 1:352f608c3337 122 #define LORAWAN_APP_DATA_MAX_SIZE 64
mluis 1:352f608c3337 123
mluis 1:352f608c3337 124 /*!
mluis 0:92bca02df485 125 * User application data
mluis 0:92bca02df485 126 */
helloqi 8:9d6683e60974 127 static char AppData[LORAWAN_APP_DATA_MAX_SIZE];
mluis 1:352f608c3337 128
mluis 1:352f608c3337 129 /*!
mluis 1:352f608c3337 130 * Indicates if the node is sending confirmed or unconfirmed messages
mluis 1:352f608c3337 131 */
mluis 1:352f608c3337 132 static uint8_t IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 0:92bca02df485 133
mluis 0:92bca02df485 134 /*!
mluis 0:92bca02df485 135 * Defines the application data transmission duty cycle
mluis 0:92bca02df485 136 */
mluis 0:92bca02df485 137
mluis 1:352f608c3337 138 /*!
mluis 1:352f608c3337 139 * Timer to handle the application data transmission duty cycle
mluis 1:352f608c3337 140 */
mluis 1:352f608c3337 141 static TimerEvent_t TxNextPacketTimer;
mluis 0:92bca02df485 142
mluis 3:9c6f7f082151 143 /*!
mluis 3:9c6f7f082151 144 * Specifies the state of the application LED
mluis 3:9c6f7f082151 145 */
helloqi 8:9d6683e60974 146 //static bool AppLedStateOn = false;
mluis 3:9c6f7f082151 147 volatile bool Led3StateChanged = false;
mluis 0:92bca02df485 148 /*!
mluis 3:9c6f7f082151 149 * Timer to handle the state of LED1
mluis 0:92bca02df485 150 */
mluis 3:9c6f7f082151 151 static TimerEvent_t Led1Timer;
mluis 3:9c6f7f082151 152 volatile bool Led1State = false;
mluis 3:9c6f7f082151 153 volatile bool Led1StateChanged = false;
mluis 3:9c6f7f082151 154 /*!
mluis 3:9c6f7f082151 155 * Timer to handle the state of LED2
mluis 3:9c6f7f082151 156 */
mluis 3:9c6f7f082151 157 static TimerEvent_t Led2Timer;
mluis 3:9c6f7f082151 158 volatile bool Led2State = false;
mluis 3:9c6f7f082151 159 volatile bool Led2StateChanged = false;
mluis 0:92bca02df485 160
mluis 0:92bca02df485 161 /*!
mluis 0:92bca02df485 162 * Indicates if a new packet can be sent
mluis 0:92bca02df485 163 */
mluis 0:92bca02df485 164
mluis 3:9c6f7f082151 165 /*!
mluis 3:9c6f7f082151 166 * Device states
mluis 3:9c6f7f082151 167 */
mluis 3:9c6f7f082151 168 static enum eDevicState
mluis 3:9c6f7f082151 169 {
mluis 3:9c6f7f082151 170 DEVICE_STATE_INIT,
mluis 3:9c6f7f082151 171 DEVICE_STATE_JOIN,
mluis 3:9c6f7f082151 172 DEVICE_STATE_SEND,
mluis 3:9c6f7f082151 173 DEVICE_STATE_CYCLE,
mluis 3:9c6f7f082151 174 DEVICE_STATE_SLEEP
mluis 3:9c6f7f082151 175 }DeviceState;
mluis 0:92bca02df485 176
mluis 3:9c6f7f082151 177 /*!
mluis 3:9c6f7f082151 178 * LoRaWAN compliance tests support data
mluis 3:9c6f7f082151 179 */
mluis 3:9c6f7f082151 180 struct ComplianceTest_s
mluis 3:9c6f7f082151 181 {
mluis 3:9c6f7f082151 182 bool Running;
mluis 3:9c6f7f082151 183 uint8_t State;
mluis 3:9c6f7f082151 184 bool IsTxConfirmed;
mluis 3:9c6f7f082151 185 uint8_t AppPort;
mluis 3:9c6f7f082151 186 uint8_t AppDataSize;
mluis 3:9c6f7f082151 187 uint8_t *AppDataBuffer;
mluis 3:9c6f7f082151 188 uint16_t DownLinkCounter;
mluis 3:9c6f7f082151 189 bool LinkCheck;
mluis 3:9c6f7f082151 190 uint8_t DemodMargin;
mluis 3:9c6f7f082151 191 uint8_t NbGateways;
mluis 3:9c6f7f082151 192 }ComplianceTest;
mluis 0:92bca02df485 193
mluis 3:9c6f7f082151 194 /*
mluis 3:9c6f7f082151 195 * SerialDisplay managment variables
mluis 3:9c6f7f082151 196 */
mluis 1:352f608c3337 197
mluis 3:9c6f7f082151 198 /*!
mluis 3:9c6f7f082151 199 * Indicates if the MAC layer network join status has changed.
mluis 3:9c6f7f082151 200 */
helloqi 8:9d6683e60974 201
mluis 3:9c6f7f082151 202
mluis 3:9c6f7f082151 203 /*!
mluis 3:9c6f7f082151 204 * Strucure containing the Uplink status
mluis 3:9c6f7f082151 205 */
mluis 0:92bca02df485 206 struct sLoRaMacUplinkStatus
mluis 0:92bca02df485 207 {
mluis 0:92bca02df485 208 uint8_t Acked;
mluis 0:92bca02df485 209 int8_t Datarate;
mluis 0:92bca02df485 210 uint16_t UplinkCounter;
mluis 0:92bca02df485 211 uint8_t Port;
helloqi 8:9d6683e60974 212 char *Buffer;
mluis 0:92bca02df485 213 uint8_t BufferSize;
mluis 0:92bca02df485 214 }LoRaMacUplinkStatus;
mluis 3:9c6f7f082151 215 volatile bool UplinkStatusUpdated = false;
mluis 0:92bca02df485 216
mluis 3:9c6f7f082151 217 /*!
mluis 3:9c6f7f082151 218 * Strucure containing the Downlink status
mluis 3:9c6f7f082151 219 */
mluis 0:92bca02df485 220 struct sLoRaMacDownlinkStatus
mluis 0:92bca02df485 221 {
mluis 0:92bca02df485 222 int16_t Rssi;
mluis 0:92bca02df485 223 int8_t Snr;
mluis 0:92bca02df485 224 uint16_t DownlinkCounter;
mluis 0:92bca02df485 225 bool RxData;
mluis 0:92bca02df485 226 uint8_t Port;
mluis 0:92bca02df485 227 uint8_t *Buffer;
mluis 0:92bca02df485 228 uint8_t BufferSize;
mluis 0:92bca02df485 229 }LoRaMacDownlinkStatus;
mluis 3:9c6f7f082151 230 volatile bool DownlinkStatusUpdated = false;
mluis 0:92bca02df485 231
mluis 0:92bca02df485 232
mluis 0:92bca02df485 233 /*!
mluis 3:9c6f7f082151 234 * \brief Prepares the payload of the frame
mluis 0:92bca02df485 235 */
helloqi 8:9d6683e60974 236 static void PrepareTxFrame(char* value )
mluis 0:92bca02df485 237 {
helloqi 8:9d6683e60974 238
helloqi 8:9d6683e60974 239 for( int i = 0;i < strlen(value);i++)
helloqi 8:9d6683e60974 240 AppData[i] = value[i];
helloqi 8:9d6683e60974 241 //AppData[0] = 0x12;
helloqi 8:9d6683e60974 242 //AppData[1] = 0x34;
helloqi 8:9d6683e60974 243 //AppData[2] = 0x56;
helloqi 8:9d6683e60974 244 //AppData[3] = 0x78;
helloqi 8:9d6683e60974 245 //AppData[4] = 0x90;
helloqi 8:9d6683e60974 246 //AppData[5] = 0x12;
mluis 0:92bca02df485 247 }
mluis 0:92bca02df485 248
mluis 3:9c6f7f082151 249 /*!
mluis 3:9c6f7f082151 250 * \brief Prepares the payload of the frame
mluis 3:9c6f7f082151 251 *
mluis 3:9c6f7f082151 252 * \retval [0: frame could be send, 1: error]
mluis 3:9c6f7f082151 253 */
mluis 0:92bca02df485 254 static bool SendFrame( void )
mluis 0:92bca02df485 255 {
mluis 3:9c6f7f082151 256 McpsReq_t mcpsReq;
mluis 3:9c6f7f082151 257 LoRaMacTxInfo_t txInfo;
mluis 0:92bca02df485 258
mluis 3:9c6f7f082151 259 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
mluis 1:352f608c3337 260 {
mluis 3:9c6f7f082151 261 // Send empty frame in order to flush MAC commands
mluis 3:9c6f7f082151 262 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 3:9c6f7f082151 263 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
mluis 3:9c6f7f082151 264 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
mluis 3:9c6f7f082151 265 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 5:1e9f6a365854 266
mluis 3:9c6f7f082151 267 LoRaMacUplinkStatus.Acked = false;
mluis 3:9c6f7f082151 268 LoRaMacUplinkStatus.Port = 0;
mluis 3:9c6f7f082151 269 LoRaMacUplinkStatus.Buffer = NULL;
mluis 3:9c6f7f082151 270 LoRaMacUplinkStatus.BufferSize = 0;
helloqi 8:9d6683e60974 271 //SerialDisplayUpdateFrameType( false );
mluis 1:352f608c3337 272 }
mluis 1:352f608c3337 273 else
mluis 1:352f608c3337 274 {
mluis 3:9c6f7f082151 275 LoRaMacUplinkStatus.Acked = false;
mluis 3:9c6f7f082151 276 LoRaMacUplinkStatus.Port = AppPort;
mluis 3:9c6f7f082151 277 LoRaMacUplinkStatus.Buffer = AppData;
mluis 3:9c6f7f082151 278 LoRaMacUplinkStatus.BufferSize = AppDataSize;
helloqi 8:9d6683e60974 279 //SerialDisplayUpdateFrameType( IsTxConfirmed );
mluis 3:9c6f7f082151 280
mluis 3:9c6f7f082151 281 if( IsTxConfirmed == false )
mluis 3:9c6f7f082151 282 {
mluis 3:9c6f7f082151 283 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 3:9c6f7f082151 284 mcpsReq.Req.Unconfirmed.fPort = AppPort;
mluis 3:9c6f7f082151 285 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
mluis 3:9c6f7f082151 286 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
mluis 3:9c6f7f082151 287 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 3:9c6f7f082151 288 }
mluis 3:9c6f7f082151 289 else
mluis 3:9c6f7f082151 290 {
mluis 3:9c6f7f082151 291 mcpsReq.Type = MCPS_CONFIRMED;
mluis 3:9c6f7f082151 292 mcpsReq.Req.Confirmed.fPort = AppPort;
mluis 3:9c6f7f082151 293 mcpsReq.Req.Confirmed.fBuffer = AppData;
mluis 3:9c6f7f082151 294 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
mluis 4:00cf2370c99d 295 mcpsReq.Req.Confirmed.NbTrials = 8;
mluis 3:9c6f7f082151 296 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 3:9c6f7f082151 297 }
mluis 1:352f608c3337 298 }
mluis 1:352f608c3337 299
mluis 3:9c6f7f082151 300 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
mluis 0:92bca02df485 301 {
mluis 0:92bca02df485 302 return false;
mluis 0:92bca02df485 303 }
mluis 3:9c6f7f082151 304 return true;
mluis 0:92bca02df485 305 }
mluis 0:92bca02df485 306
mluis 0:92bca02df485 307 /*!
mluis 3:9c6f7f082151 308 * \brief MCPS-Confirm event function
mluis 3:9c6f7f082151 309 *
mluis 5:1e9f6a365854 310 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
mluis 3:9c6f7f082151 311 * containing confirm attributes.
mluis 0:92bca02df485 312 */
mluis 5:1e9f6a365854 313 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
mluis 0:92bca02df485 314 {
mluis 5:1e9f6a365854 315 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 0:92bca02df485 316 {
mluis 5:1e9f6a365854 317 switch( mcpsConfirm->McpsRequest )
mluis 3:9c6f7f082151 318 {
mluis 3:9c6f7f082151 319 case MCPS_UNCONFIRMED:
mluis 3:9c6f7f082151 320 {
mluis 3:9c6f7f082151 321 // Check Datarate
mluis 3:9c6f7f082151 322 // Check TxPower
mluis 3:9c6f7f082151 323 break;
mluis 3:9c6f7f082151 324 }
mluis 3:9c6f7f082151 325 case MCPS_CONFIRMED:
mluis 3:9c6f7f082151 326 {
mluis 3:9c6f7f082151 327 // Check Datarate
mluis 3:9c6f7f082151 328 // Check TxPower
mluis 3:9c6f7f082151 329 // Check AckReceived
mluis 5:1e9f6a365854 330 // Check NbTrials
mluis 5:1e9f6a365854 331 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
mluis 3:9c6f7f082151 332 break;
mluis 3:9c6f7f082151 333 }
mluis 3:9c6f7f082151 334 case MCPS_PROPRIETARY:
mluis 3:9c6f7f082151 335 {
mluis 3:9c6f7f082151 336 break;
mluis 3:9c6f7f082151 337 }
mluis 3:9c6f7f082151 338 default:
mluis 3:9c6f7f082151 339 break;
mluis 3:9c6f7f082151 340 }
mluis 5:1e9f6a365854 341 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
mluis 5:1e9f6a365854 342 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
mluis 5:1e9f6a365854 343
mluis 7:3173f0508a98 344 // Switch LED 1 ON
mluis 7:3173f0508a98 345 Led1State = true;
mluis 7:3173f0508a98 346 Led1StateChanged = true;
mluis 7:3173f0508a98 347 TimerStart( &Led1Timer );
mluis 7:3173f0508a98 348
mluis 3:9c6f7f082151 349 UplinkStatusUpdated = true;
mluis 3:9c6f7f082151 350 }
helloqi 8:9d6683e60974 351
mluis 3:9c6f7f082151 352 }
mluis 3:9c6f7f082151 353
mluis 3:9c6f7f082151 354 /*!
mluis 3:9c6f7f082151 355 * \brief MCPS-Indication event function
mluis 3:9c6f7f082151 356 *
mluis 5:1e9f6a365854 357 * \param [IN] mcpsIndication - Pointer to the indication structure,
mluis 3:9c6f7f082151 358 * containing indication attributes.
mluis 3:9c6f7f082151 359 */
mluis 5:1e9f6a365854 360 static void McpsIndication( McpsIndication_t *mcpsIndication )
mluis 3:9c6f7f082151 361 {
mluis 5:1e9f6a365854 362 if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
mluis 3:9c6f7f082151 363 {
mluis 3:9c6f7f082151 364 return;
mluis 3:9c6f7f082151 365 }
mluis 3:9c6f7f082151 366
mluis 5:1e9f6a365854 367 switch( mcpsIndication->McpsIndication )
mluis 3:9c6f7f082151 368 {
mluis 3:9c6f7f082151 369 case MCPS_UNCONFIRMED:
mluis 3:9c6f7f082151 370 {
mluis 3:9c6f7f082151 371 break;
mluis 3:9c6f7f082151 372 }
mluis 3:9c6f7f082151 373 case MCPS_CONFIRMED:
mluis 3:9c6f7f082151 374 {
mluis 3:9c6f7f082151 375 break;
mluis 3:9c6f7f082151 376 }
mluis 3:9c6f7f082151 377 case MCPS_PROPRIETARY:
mluis 3:9c6f7f082151 378 {
mluis 3:9c6f7f082151 379 break;
mluis 3:9c6f7f082151 380 }
mluis 3:9c6f7f082151 381 case MCPS_MULTICAST:
mluis 3:9c6f7f082151 382 {
mluis 3:9c6f7f082151 383 break;
mluis 3:9c6f7f082151 384 }
mluis 3:9c6f7f082151 385 default:
mluis 3:9c6f7f082151 386 break;
mluis 3:9c6f7f082151 387 }
mluis 3:9c6f7f082151 388
mluis 3:9c6f7f082151 389 // Check Multicast
mluis 3:9c6f7f082151 390 // Check Port
mluis 3:9c6f7f082151 391 // Check Datarate
mluis 3:9c6f7f082151 392 // Check FramePending
mluis 3:9c6f7f082151 393 // Check Buffer
mluis 3:9c6f7f082151 394 // Check BufferSize
mluis 3:9c6f7f082151 395 // Check Rssi
mluis 3:9c6f7f082151 396 // Check Snr
mluis 3:9c6f7f082151 397 // Check RxSlot
mluis 5:1e9f6a365854 398 LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
mluis 5:1e9f6a365854 399 if( mcpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
mluis 3:9c6f7f082151 400 {
mluis 3:9c6f7f082151 401 // Invert and divide by 4
mluis 5:1e9f6a365854 402 LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
mluis 3:9c6f7f082151 403 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
mluis 0:92bca02df485 404 }
mluis 0:92bca02df485 405 else
mluis 0:92bca02df485 406 {
mluis 3:9c6f7f082151 407 // Divide by 4
mluis 5:1e9f6a365854 408 LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
mluis 3:9c6f7f082151 409 }
mluis 3:9c6f7f082151 410 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 5:1e9f6a365854 411 LoRaMacDownlinkStatus.RxData = mcpsIndication->RxData;
mluis 5:1e9f6a365854 412 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
mluis 5:1e9f6a365854 413 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
mluis 5:1e9f6a365854 414 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
mluis 3:9c6f7f082151 415
mluis 3:9c6f7f082151 416 if( ComplianceTest.Running == true )
mluis 3:9c6f7f082151 417 {
mluis 3:9c6f7f082151 418 ComplianceTest.DownLinkCounter++;
mluis 3:9c6f7f082151 419 }
mluis 0:92bca02df485 420
mluis 5:1e9f6a365854 421 if( mcpsIndication->RxData == true )
mluis 3:9c6f7f082151 422 {
mluis 5:1e9f6a365854 423 switch( mcpsIndication->Port )
mluis 0:92bca02df485 424 {
mluis 3:9c6f7f082151 425 case 1: // The application LED can be controlled on port 1 or 2
mluis 3:9c6f7f082151 426 case 2:
mluis 5:1e9f6a365854 427 if( mcpsIndication->BufferSize == 1 )
mluis 1:352f608c3337 428 {
mluis 3:9c6f7f082151 429 Led3StateChanged = true;
mluis 3:9c6f7f082151 430 }
mluis 3:9c6f7f082151 431 break;
mluis 3:9c6f7f082151 432 case 224:
mluis 3:9c6f7f082151 433 if( ComplianceTest.Running == false )
mluis 3:9c6f7f082151 434 {
mluis 3:9c6f7f082151 435 // Check compliance test enable command (i)
mluis 5:1e9f6a365854 436 if( ( mcpsIndication->BufferSize == 4 ) &&
mluis 5:1e9f6a365854 437 ( mcpsIndication->Buffer[0] == 0x01 ) &&
mluis 5:1e9f6a365854 438 ( mcpsIndication->Buffer[1] == 0x01 ) &&
mluis 5:1e9f6a365854 439 ( mcpsIndication->Buffer[2] == 0x01 ) &&
mluis 5:1e9f6a365854 440 ( mcpsIndication->Buffer[3] == 0x01 ) )
mluis 1:352f608c3337 441 {
mluis 3:9c6f7f082151 442 IsTxConfirmed = false;
mluis 3:9c6f7f082151 443 AppPort = 224;
mluis 3:9c6f7f082151 444 AppDataSize = 2;
mluis 3:9c6f7f082151 445 ComplianceTest.DownLinkCounter = 0;
mluis 3:9c6f7f082151 446 ComplianceTest.LinkCheck = false;
mluis 3:9c6f7f082151 447 ComplianceTest.DemodMargin = 0;
mluis 3:9c6f7f082151 448 ComplianceTest.NbGateways = 0;
mluis 3:9c6f7f082151 449 ComplianceTest.Running = true;
mluis 3:9c6f7f082151 450 ComplianceTest.State = 1;
mluis 3:9c6f7f082151 451
mluis 3:9c6f7f082151 452 MibRequestConfirm_t mibReq;
mluis 3:9c6f7f082151 453 mibReq.Type = MIB_ADR;
mluis 3:9c6f7f082151 454 mibReq.Param.AdrEnable = true;
mluis 3:9c6f7f082151 455 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 456
mluis 3:9c6f7f082151 457 #if defined( USE_BAND_868 )
mluis 3:9c6f7f082151 458 LoRaMacTestSetDutyCycleOn( false );
mluis 3:9c6f7f082151 459 #endif
mluis 1:352f608c3337 460 }
mluis 1:352f608c3337 461 }
mluis 0:92bca02df485 462 else
mluis 0:92bca02df485 463 {
mluis 5:1e9f6a365854 464 ComplianceTest.State = mcpsIndication->Buffer[0];
mluis 3:9c6f7f082151 465 switch( ComplianceTest.State )
mluis 3:9c6f7f082151 466 {
mluis 3:9c6f7f082151 467 case 0: // Check compliance test disable command (ii)
mluis 3:9c6f7f082151 468 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 3:9c6f7f082151 469 AppPort = LORAWAN_APP_PORT;
mluis 3:9c6f7f082151 470 AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 3:9c6f7f082151 471 ComplianceTest.DownLinkCounter = 0;
mluis 3:9c6f7f082151 472 ComplianceTest.Running = false;
mluis 3:9c6f7f082151 473
mluis 3:9c6f7f082151 474 MibRequestConfirm_t mibReq;
mluis 3:9c6f7f082151 475 mibReq.Type = MIB_ADR;
mluis 3:9c6f7f082151 476 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 3:9c6f7f082151 477 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 478 #if defined( USE_BAND_868 )
mluis 3:9c6f7f082151 479 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 3:9c6f7f082151 480 #endif
mluis 3:9c6f7f082151 481 break;
mluis 3:9c6f7f082151 482 case 1: // (iii, iv)
mluis 3:9c6f7f082151 483 AppDataSize = 2;
mluis 3:9c6f7f082151 484 break;
mluis 3:9c6f7f082151 485 case 2: // Enable confirmed messages (v)
mluis 3:9c6f7f082151 486 IsTxConfirmed = true;
mluis 3:9c6f7f082151 487 ComplianceTest.State = 1;
mluis 3:9c6f7f082151 488 break;
mluis 3:9c6f7f082151 489 case 3: // Disable confirmed messages (vi)
mluis 3:9c6f7f082151 490 IsTxConfirmed = false;
mluis 3:9c6f7f082151 491 ComplianceTest.State = 1;
mluis 3:9c6f7f082151 492 break;
mluis 3:9c6f7f082151 493 case 4: // (vii)
mluis 5:1e9f6a365854 494 AppDataSize = mcpsIndication->BufferSize;
mluis 3:9c6f7f082151 495
mluis 3:9c6f7f082151 496 AppData[0] = 4;
mluis 3:9c6f7f082151 497 for( uint8_t i = 1; i < AppDataSize; i++ )
mluis 3:9c6f7f082151 498 {
mluis 5:1e9f6a365854 499 AppData[i] = mcpsIndication->Buffer[i] + 1;
mluis 3:9c6f7f082151 500 }
mluis 3:9c6f7f082151 501 break;
mluis 3:9c6f7f082151 502 case 5: // (viii)
mluis 3:9c6f7f082151 503 {
mluis 3:9c6f7f082151 504 MlmeReq_t mlmeReq;
mluis 3:9c6f7f082151 505 mlmeReq.Type = MLME_LINK_CHECK;
mluis 3:9c6f7f082151 506 LoRaMacMlmeRequest( &mlmeReq );
mluis 3:9c6f7f082151 507 }
mluis 3:9c6f7f082151 508 break;
mluis 7:3173f0508a98 509 case 6: // (ix)
mluis 7:3173f0508a98 510 {
mluis 7:3173f0508a98 511 MlmeReq_t mlmeReq;
mluis 7:3173f0508a98 512
mluis 7:3173f0508a98 513 mlmeReq.Type = MLME_JOIN;
mluis 7:3173f0508a98 514
mluis 7:3173f0508a98 515 mlmeReq.Req.Join.DevEui = DevEui;
mluis 7:3173f0508a98 516 mlmeReq.Req.Join.AppEui = AppEui;
mluis 7:3173f0508a98 517 mlmeReq.Req.Join.AppKey = AppKey;
mluis 7:3173f0508a98 518
mluis 7:3173f0508a98 519 LoRaMacMlmeRequest( &mlmeReq );
mluis 7:3173f0508a98 520 DeviceState = DEVICE_STATE_SLEEP;
mluis 7:3173f0508a98 521 }
mluis 7:3173f0508a98 522 break;
mluis 3:9c6f7f082151 523 default:
mluis 3:9c6f7f082151 524 break;
mluis 3:9c6f7f082151 525 }
mluis 0:92bca02df485 526 }
mluis 3:9c6f7f082151 527 break;
mluis 3:9c6f7f082151 528 default:
mluis 3:9c6f7f082151 529 break;
mluis 0:92bca02df485 530 }
mluis 0:92bca02df485 531 }
mluis 1:352f608c3337 532
mluis 3:9c6f7f082151 533 // Switch LED 2 ON for each received downlink
mluis 3:9c6f7f082151 534 Led2State = true;
mluis 3:9c6f7f082151 535 Led2StateChanged = true;
mluis 3:9c6f7f082151 536 TimerStart( &Led2Timer );
mluis 3:9c6f7f082151 537 DownlinkStatusUpdated = true;
mluis 3:9c6f7f082151 538 }
mluis 3:9c6f7f082151 539
mluis 3:9c6f7f082151 540 /*!
mluis 3:9c6f7f082151 541 * \brief MLME-Confirm event function
mluis 3:9c6f7f082151 542 *
mluis 5:1e9f6a365854 543 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
mluis 3:9c6f7f082151 544 * containing confirm attributes.
mluis 3:9c6f7f082151 545 */
mluis 5:1e9f6a365854 546 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mluis 3:9c6f7f082151 547 {
mluis 5:1e9f6a365854 548 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 3:9c6f7f082151 549 {
mluis 5:1e9f6a365854 550 switch( mlmeConfirm->MlmeRequest )
mluis 3:9c6f7f082151 551 {
mluis 3:9c6f7f082151 552 case MLME_JOIN:
mluis 3:9c6f7f082151 553 {
mluis 3:9c6f7f082151 554 // Status is OK, node has joined the network
mluis 7:3173f0508a98 555 DeviceState = DEVICE_STATE_SEND;
mluis 3:9c6f7f082151 556 break;
mluis 3:9c6f7f082151 557 }
mluis 3:9c6f7f082151 558 case MLME_LINK_CHECK:
mluis 3:9c6f7f082151 559 {
mluis 3:9c6f7f082151 560 // Check DemodMargin
mluis 3:9c6f7f082151 561 // Check NbGateways
mluis 3:9c6f7f082151 562 if( ComplianceTest.Running == true )
mluis 3:9c6f7f082151 563 {
mluis 3:9c6f7f082151 564 ComplianceTest.LinkCheck = true;
mluis 5:1e9f6a365854 565 ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
mluis 5:1e9f6a365854 566 ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
mluis 3:9c6f7f082151 567 }
mluis 3:9c6f7f082151 568 break;
mluis 3:9c6f7f082151 569 }
mluis 3:9c6f7f082151 570 default:
mluis 3:9c6f7f082151 571 break;
mluis 3:9c6f7f082151 572 }
mluis 3:9c6f7f082151 573 }
mluis 3:9c6f7f082151 574 UplinkStatusUpdated = true;
mluis 0:92bca02df485 575 }
mluis 0:92bca02df485 576
mluis 0:92bca02df485 577 /**
mluis 0:92bca02df485 578 * Main application entry point.
mluis 0:92bca02df485 579 */
mluis 0:92bca02df485 580 int main( void )
mluis 0:92bca02df485 581 {
helloqi 8:9d6683e60974 582 char send_data[] = "abcdefghijklmn";
mluis 3:9c6f7f082151 583 LoRaMacPrimitives_t LoRaMacPrimitives;
mluis 3:9c6f7f082151 584 LoRaMacCallback_t LoRaMacCallbacks;
mluis 3:9c6f7f082151 585 MibRequestConfirm_t mibReq;
mluis 0:92bca02df485 586
mluis 0:92bca02df485 587 BoardInit( );
mluis 3:9c6f7f082151 588 DeviceState = DEVICE_STATE_INIT;
mluis 0:92bca02df485 589
mluis 0:92bca02df485 590 while( 1 )
mluis 0:92bca02df485 591 {
mluis 3:9c6f7f082151 592 switch( DeviceState )
mluis 0:92bca02df485 593 {
mluis 3:9c6f7f082151 594 case DEVICE_STATE_INIT:
mluis 3:9c6f7f082151 595 {
mluis 3:9c6f7f082151 596 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
mluis 3:9c6f7f082151 597 LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
mluis 3:9c6f7f082151 598 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
mluis 3:9c6f7f082151 599 LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
mluis 3:9c6f7f082151 600 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
mluis 3:9c6f7f082151 601 mibReq.Type = MIB_ADR;
mluis 3:9c6f7f082151 602 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 3:9c6f7f082151 603 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 604
mluis 3:9c6f7f082151 605 mibReq.Type = MIB_PUBLIC_NETWORK;
mluis 3:9c6f7f082151 606 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
mluis 3:9c6f7f082151 607 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 608
mluis 3:9c6f7f082151 609 #if defined( USE_BAND_868 )
mluis 3:9c6f7f082151 610 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 5:1e9f6a365854 611
mluis 5:1e9f6a365854 612 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 5:1e9f6a365854 613 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
mluis 5:1e9f6a365854 614 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
mluis 5:1e9f6a365854 615 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
mluis 5:1e9f6a365854 616 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
mluis 5:1e9f6a365854 617 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
mluis 5:1e9f6a365854 618 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
mluis 5:1e9f6a365854 619 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
mluis 7:3173f0508a98 620
mluis 7:3173f0508a98 621 mibReq.Type = MIB_RX2_CHANNEL;
mluis 7:3173f0508a98 622 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
mluis 7:3173f0508a98 623 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 5:1e9f6a365854 624 #endif
mluis 5:1e9f6a365854 625
mluis 3:9c6f7f082151 626 #endif
mluis 3:9c6f7f082151 627 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 3:9c6f7f082151 628
mluis 3:9c6f7f082151 629 DeviceState = DEVICE_STATE_JOIN;
mluis 3:9c6f7f082151 630 break;
mluis 3:9c6f7f082151 631 }
mluis 3:9c6f7f082151 632 case DEVICE_STATE_JOIN:
mluis 3:9c6f7f082151 633 {
mluis 3:9c6f7f082151 634 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 3:9c6f7f082151 635 MlmeReq_t mlmeReq;
mluis 3:9c6f7f082151 636
mluis 3:9c6f7f082151 637 mlmeReq.Type = MLME_JOIN;
mluis 3:9c6f7f082151 638
mluis 3:9c6f7f082151 639 mlmeReq.Req.Join.DevEui = DevEui;
mluis 3:9c6f7f082151 640 mlmeReq.Req.Join.AppEui = AppEui;
mluis 3:9c6f7f082151 641 mlmeReq.Req.Join.AppKey = AppKey;
mluis 3:9c6f7f082151 642
mluis 3:9c6f7f082151 643 if( NextTx == true )
mluis 3:9c6f7f082151 644 {
mluis 3:9c6f7f082151 645 LoRaMacMlmeRequest( &mlmeReq );
mluis 3:9c6f7f082151 646 }
mluis 7:3173f0508a98 647 DeviceState = DEVICE_STATE_SLEEP;
mluis 3:9c6f7f082151 648 #else
mluis 3:9c6f7f082151 649 mibReq.Type = MIB_NET_ID;
mluis 3:9c6f7f082151 650 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
mluis 3:9c6f7f082151 651 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 652
mluis 3:9c6f7f082151 653 mibReq.Type = MIB_DEV_ADDR;
mluis 3:9c6f7f082151 654 mibReq.Param.DevAddr = DevAddr;
mluis 3:9c6f7f082151 655 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 656
mluis 3:9c6f7f082151 657 mibReq.Type = MIB_NWK_SKEY;
mluis 3:9c6f7f082151 658 mibReq.Param.NwkSKey = NwkSKey;
mluis 3:9c6f7f082151 659 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 660
mluis 3:9c6f7f082151 661 mibReq.Type = MIB_APP_SKEY;
mluis 3:9c6f7f082151 662 mibReq.Param.AppSKey = AppSKey;
mluis 3:9c6f7f082151 663 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 664
mluis 3:9c6f7f082151 665 mibReq.Type = MIB_NETWORK_JOINED;
mluis 3:9c6f7f082151 666 mibReq.Param.IsNetworkJoined = true;
mluis 3:9c6f7f082151 667 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 668
mluis 3:9c6f7f082151 669 DeviceState = DEVICE_STATE_SEND;
mluis 3:9c6f7f082151 670 #endif
mluis 3:9c6f7f082151 671 break;
mluis 3:9c6f7f082151 672 }
mluis 3:9c6f7f082151 673 case DEVICE_STATE_SEND:
mluis 3:9c6f7f082151 674 {
helloqi 8:9d6683e60974 675 PrepareTxFrame(send_data);
helloqi 8:9d6683e60974 676 SendFrame();
mluis 3:9c6f7f082151 677 DeviceState = DEVICE_STATE_CYCLE;
mluis 3:9c6f7f082151 678 break;
mluis 3:9c6f7f082151 679 }
mluis 3:9c6f7f082151 680 case DEVICE_STATE_CYCLE:
mluis 3:9c6f7f082151 681 {
helloqi 8:9d6683e60974 682 DeviceState = DEVICE_STATE_INIT;
mluis 3:9c6f7f082151 683 break;
mluis 3:9c6f7f082151 684 }
mluis 3:9c6f7f082151 685 case DEVICE_STATE_SLEEP:
mluis 3:9c6f7f082151 686 {
mluis 3:9c6f7f082151 687 // Wake up through events
mluis 3:9c6f7f082151 688 break;
mluis 3:9c6f7f082151 689 }
mluis 3:9c6f7f082151 690 default:
mluis 3:9c6f7f082151 691 {
mluis 3:9c6f7f082151 692 DeviceState = DEVICE_STATE_INIT;
mluis 3:9c6f7f082151 693 break;
mluis 3:9c6f7f082151 694 }
mluis 0:92bca02df485 695 }
mluis 0:92bca02df485 696 }
mluis 0:92bca02df485 697 }