Hello World Test

Dependencies:   mbed LoRaWAN-lib SX1276Lib

Committer:
uss1994
Date:
Thu Dec 27 18:37:04 2018 +0000
Revision:
10:4e528716aa7a
Parent:
9:ee9dcbb9708d
Child:
11:3dd2d0ba2613
latest changes;

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