Amir Chaudhary / Mbed 2 deprecated LoRaWAN-hello-world_Class_C_Anish

Dependencies:   mbed LoRaWAN-lib SX1276Lib

Committer:
amirchaudhary
Date:
Fri Mar 22 16:50:10 2019 +0000
Revision:
12:497383202228
Parent:
11:876331d64e0e
Child:
13:7c3f8a6bad36
Updated the code to boost the Lorawan Signal

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
amirchaudhary 12:497383202228 220 /*BLUE and green led pin?
amirchaudhary 12:497383202228 221 D7 == Green
amirchaudhary 12:497383202228 222 D8 == Blue
amirchaudhary 12:497383202228 223 Pelase proceed
uss1994 10:4e528716aa7a 224
amirchaudhary 12:497383202228 225 */
amirchaudhary 12:497383202228 226 DigitalOut myled(D6);
amirchaudhary 12:497383202228 227 DigitalOut myGreenLed(D7); // ON = Lora Connected
amirchaudhary 12:497383202228 228 DigitalOut myBlueLed(D8); // Blink twice = Sends data or increments counter value Pelase proceed
uss1994 10:4e528716aa7a 229
mluis 0:92bca02df485 230 void SerialDisplayRefresh( void )
mluis 0:92bca02df485 231 {
mluis 3:9c6f7f082151 232 MibRequestConfirm_t mibReq;
mluis 3:9c6f7f082151 233
mluis 0:92bca02df485 234 SerialDisplayInit( );
mluis 0:92bca02df485 235 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:92bca02df485 236
mluis 0:92bca02df485 237 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:92bca02df485 238 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 3:9c6f7f082151 239 SerialDisplayUpdateDevAddr( DevAddr );
mluis 0:92bca02df485 240 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 0:92bca02df485 241 SerialDisplayUpdateKey( 13, AppSKey );
mluis 7:3173f0508a98 242 #endif
mluis 0:92bca02df485 243 SerialDisplayUpdateEui( 5, DevEui );
mluis 0:92bca02df485 244 SerialDisplayUpdateEui( 6, AppEui );
mluis 0:92bca02df485 245 SerialDisplayUpdateKey( 7, AppKey );
mluis 3:9c6f7f082151 246
mluis 3:9c6f7f082151 247 mibReq.Type = MIB_NETWORK_JOINED;
mluis 3:9c6f7f082151 248 LoRaMacMibGetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 249 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
mluis 0:92bca02df485 250
mluis 0:92bca02df485 251 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 1:352f608c3337 252 #if defined( USE_BAND_868 )
mluis 0:92bca02df485 253 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 1:352f608c3337 254 #else
mluis 1:352f608c3337 255 SerialDisplayUpdateDutyCycle( false );
mluis 1:352f608c3337 256 #endif
mluis 0:92bca02df485 257 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:92bca02df485 258 }
mluis 0:92bca02df485 259
mluis 0:92bca02df485 260 void SerialRxProcess( void )
mluis 0:92bca02df485 261 {
mluis 0:92bca02df485 262 if( SerialDisplayReadable( ) == true )
mluis 0:92bca02df485 263 {
mluis 0:92bca02df485 264 switch( SerialDisplayGetChar( ) )
mluis 0:92bca02df485 265 {
mluis 0:92bca02df485 266 case 'R':
mluis 0:92bca02df485 267 case 'r':
mluis 0:92bca02df485 268 // Refresh Serial screen
mluis 0:92bca02df485 269 SerialDisplayRefresh( );
mluis 0:92bca02df485 270 break;
mluis 0:92bca02df485 271 default:
mluis 0:92bca02df485 272 break;
mluis 0:92bca02df485 273 }
mluis 0:92bca02df485 274 }
mluis 0:92bca02df485 275 }
mluis 0:92bca02df485 276
mluis 0:92bca02df485 277 /*!
mluis 3:9c6f7f082151 278 * \brief Prepares the payload of the frame
mluis 0:92bca02df485 279 */
mluis 0:92bca02df485 280 static void PrepareTxFrame( uint8_t port )
mluis 0:92bca02df485 281 {
mluis 1:352f608c3337 282 switch( port )
mluis 1:352f608c3337 283 {
mluis 1:352f608c3337 284 case 15:
mluis 1:352f608c3337 285 {
uss1994 10:4e528716aa7a 286 AppData[0] = 0;
mluis 1:352f608c3337 287 if( IsTxConfirmed == true )
mluis 1:352f608c3337 288 {
mluis 1:352f608c3337 289 AppData[1] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
mluis 1:352f608c3337 290 AppData[2] = LoRaMacDownlinkStatus.DownlinkCounter;
mluis 1:352f608c3337 291 AppData[3] = LoRaMacDownlinkStatus.Rssi >> 8;
mluis 1:352f608c3337 292 AppData[4] = LoRaMacDownlinkStatus.Rssi;
mluis 1:352f608c3337 293 AppData[5] = LoRaMacDownlinkStatus.Snr;
mluis 1:352f608c3337 294 }
mluis 1:352f608c3337 295 }
mluis 1:352f608c3337 296 break;
mluis 1:352f608c3337 297 case 224:
mluis 3:9c6f7f082151 298 if( ComplianceTest.LinkCheck == true )
mluis 1:352f608c3337 299 {
mluis 3:9c6f7f082151 300 ComplianceTest.LinkCheck = false;
mluis 1:352f608c3337 301 AppDataSize = 3;
mluis 1:352f608c3337 302 AppData[0] = 5;
mluis 3:9c6f7f082151 303 AppData[1] = ComplianceTest.DemodMargin;
mluis 3:9c6f7f082151 304 AppData[2] = ComplianceTest.NbGateways;
mluis 3:9c6f7f082151 305 ComplianceTest.State = 1;
mluis 1:352f608c3337 306 }
mluis 1:352f608c3337 307 else
mluis 1:352f608c3337 308 {
mluis 3:9c6f7f082151 309 switch( ComplianceTest.State )
mluis 1:352f608c3337 310 {
mluis 1:352f608c3337 311 case 4:
mluis 3:9c6f7f082151 312 ComplianceTest.State = 1;
mluis 1:352f608c3337 313 break;
mluis 1:352f608c3337 314 case 1:
mluis 1:352f608c3337 315 AppDataSize = 2;
mluis 3:9c6f7f082151 316 AppData[0] = ComplianceTest.DownLinkCounter >> 8;
mluis 3:9c6f7f082151 317 AppData[1] = ComplianceTest.DownLinkCounter;
mluis 1:352f608c3337 318 break;
mluis 1:352f608c3337 319 }
mluis 1:352f608c3337 320 }
mluis 1:352f608c3337 321 break;
mluis 3:9c6f7f082151 322 default:
mluis 3:9c6f7f082151 323 break;
mluis 1:352f608c3337 324 }
mluis 0:92bca02df485 325 }
mluis 0:92bca02df485 326
mluis 3:9c6f7f082151 327 /*!
mluis 3:9c6f7f082151 328 * \brief Prepares the payload of the frame
mluis 3:9c6f7f082151 329 *
mluis 3:9c6f7f082151 330 * \retval [0: frame could be send, 1: error]
mluis 3:9c6f7f082151 331 */
mluis 0:92bca02df485 332 static bool SendFrame( void )
mluis 0:92bca02df485 333 {
mluis 3:9c6f7f082151 334 McpsReq_t mcpsReq;
mluis 3:9c6f7f082151 335 LoRaMacTxInfo_t txInfo;
mluis 9:ee9dcbb9708d 336
mluis 3:9c6f7f082151 337 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
mluis 1:352f608c3337 338 {
mluis 3:9c6f7f082151 339 // Send empty frame in order to flush MAC commands
mluis 3:9c6f7f082151 340 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 3:9c6f7f082151 341 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
mluis 3:9c6f7f082151 342 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
mluis 3:9c6f7f082151 343 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 5:1e9f6a365854 344
mluis 3:9c6f7f082151 345 LoRaMacUplinkStatus.Acked = false;
mluis 3:9c6f7f082151 346 LoRaMacUplinkStatus.Port = 0;
mluis 3:9c6f7f082151 347 LoRaMacUplinkStatus.Buffer = NULL;
mluis 3:9c6f7f082151 348 LoRaMacUplinkStatus.BufferSize = 0;
mluis 3:9c6f7f082151 349 SerialDisplayUpdateFrameType( false );
mluis 1:352f608c3337 350 }
mluis 1:352f608c3337 351 else
mluis 1:352f608c3337 352 {
mluis 3:9c6f7f082151 353 LoRaMacUplinkStatus.Acked = false;
mluis 3:9c6f7f082151 354 LoRaMacUplinkStatus.Port = AppPort;
mluis 3:9c6f7f082151 355 LoRaMacUplinkStatus.Buffer = AppData;
mluis 3:9c6f7f082151 356 LoRaMacUplinkStatus.BufferSize = AppDataSize;
mluis 3:9c6f7f082151 357 SerialDisplayUpdateFrameType( IsTxConfirmed );
mluis 3:9c6f7f082151 358
mluis 3:9c6f7f082151 359 if( IsTxConfirmed == false )
mluis 3:9c6f7f082151 360 {
mluis 3:9c6f7f082151 361 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 3:9c6f7f082151 362 mcpsReq.Req.Unconfirmed.fPort = AppPort;
mluis 3:9c6f7f082151 363 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
mluis 3:9c6f7f082151 364 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
mluis 3:9c6f7f082151 365 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 3:9c6f7f082151 366 }
mluis 3:9c6f7f082151 367 else
mluis 3:9c6f7f082151 368 {
mluis 3:9c6f7f082151 369 mcpsReq.Type = MCPS_CONFIRMED;
mluis 3:9c6f7f082151 370 mcpsReq.Req.Confirmed.fPort = AppPort;
mluis 3:9c6f7f082151 371 mcpsReq.Req.Confirmed.fBuffer = AppData;
mluis 3:9c6f7f082151 372 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
mluis 4:00cf2370c99d 373 mcpsReq.Req.Confirmed.NbTrials = 8;
mluis 3:9c6f7f082151 374 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 3:9c6f7f082151 375 }
mluis 1:352f608c3337 376 }
mluis 1:352f608c3337 377
mluis 3:9c6f7f082151 378 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
mluis 0:92bca02df485 379 {
mluis 0:92bca02df485 380 return false;
mluis 0:92bca02df485 381 }
mluis 3:9c6f7f082151 382 return true;
mluis 0:92bca02df485 383 }
mluis 0:92bca02df485 384
mluis 0:92bca02df485 385 /*!
mluis 0:92bca02df485 386 * \brief Function executed on TxNextPacket Timeout event
mluis 0:92bca02df485 387 */
mluis 0:92bca02df485 388 static void OnTxNextPacketTimerEvent( void )
mluis 0:92bca02df485 389 {
mluis 3:9c6f7f082151 390 MibRequestConfirm_t mibReq;
mluis 3:9c6f7f082151 391 LoRaMacStatus_t status;
mluis 3:9c6f7f082151 392
mluis 0:92bca02df485 393 TimerStop( &TxNextPacketTimer );
mluis 3:9c6f7f082151 394
mluis 3:9c6f7f082151 395 mibReq.Type = MIB_NETWORK_JOINED;
mluis 3:9c6f7f082151 396 status = LoRaMacMibGetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 397
mluis 3:9c6f7f082151 398 if( status == LORAMAC_STATUS_OK )
mluis 3:9c6f7f082151 399 {
mluis 3:9c6f7f082151 400 if( mibReq.Param.IsNetworkJoined == true )
mluis 3:9c6f7f082151 401 {
mluis 3:9c6f7f082151 402 DeviceState = DEVICE_STATE_SEND;
mluis 3:9c6f7f082151 403 NextTx = true;
mluis 3:9c6f7f082151 404 }
mluis 3:9c6f7f082151 405 else
mluis 3:9c6f7f082151 406 {
mluis 3:9c6f7f082151 407 DeviceState = DEVICE_STATE_JOIN;
mluis 3:9c6f7f082151 408 }
mluis 3:9c6f7f082151 409 }
mluis 0:92bca02df485 410 }
mluis 0:92bca02df485 411
mluis 0:92bca02df485 412
mluis 0:92bca02df485 413 /*!
mluis 3:9c6f7f082151 414 * \brief MCPS-Confirm event function
mluis 3:9c6f7f082151 415 *
mluis 5:1e9f6a365854 416 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
mluis 3:9c6f7f082151 417 * containing confirm attributes.
mluis 0:92bca02df485 418 */
mluis 5:1e9f6a365854 419 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
mluis 0:92bca02df485 420 {
mluis 5:1e9f6a365854 421 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 0:92bca02df485 422 {
mluis 5:1e9f6a365854 423 switch( mcpsConfirm->McpsRequest )
mluis 3:9c6f7f082151 424 {
mluis 3:9c6f7f082151 425 case MCPS_UNCONFIRMED:
mluis 3:9c6f7f082151 426 {
mluis 3:9c6f7f082151 427 // Check Datarate
mluis 3:9c6f7f082151 428 // Check TxPower
mluis 3:9c6f7f082151 429 break;
mluis 3:9c6f7f082151 430 }
mluis 3:9c6f7f082151 431 case MCPS_CONFIRMED:
mluis 3:9c6f7f082151 432 {
mluis 3:9c6f7f082151 433 // Check Datarate
mluis 3:9c6f7f082151 434 // Check TxPower
mluis 3:9c6f7f082151 435 // Check AckReceived
mluis 5:1e9f6a365854 436 // Check NbTrials
mluis 5:1e9f6a365854 437 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
mluis 3:9c6f7f082151 438 break;
mluis 3:9c6f7f082151 439 }
mluis 3:9c6f7f082151 440 case MCPS_PROPRIETARY:
mluis 3:9c6f7f082151 441 {
mluis 3:9c6f7f082151 442 break;
mluis 3:9c6f7f082151 443 }
mluis 3:9c6f7f082151 444 default:
mluis 3:9c6f7f082151 445 break;
mluis 3:9c6f7f082151 446 }
mluis 5:1e9f6a365854 447 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
mluis 5:1e9f6a365854 448 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
mluis 5:1e9f6a365854 449
mluis 3:9c6f7f082151 450 UplinkStatusUpdated = true;
mluis 3:9c6f7f082151 451 }
mluis 3:9c6f7f082151 452 NextTx = true;
mluis 3:9c6f7f082151 453 }
mluis 3:9c6f7f082151 454
mluis 3:9c6f7f082151 455 /*!
mluis 3:9c6f7f082151 456 * \brief MCPS-Indication event function
mluis 3:9c6f7f082151 457 *
mluis 5:1e9f6a365854 458 * \param [IN] mcpsIndication - Pointer to the indication structure,
mluis 3:9c6f7f082151 459 * containing indication attributes.
mluis 3:9c6f7f082151 460 */
mluis 5:1e9f6a365854 461 static void McpsIndication( McpsIndication_t *mcpsIndication )
mluis 3:9c6f7f082151 462 {
mluis 5:1e9f6a365854 463 if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
mluis 3:9c6f7f082151 464 {
mluis 3:9c6f7f082151 465 return;
mluis 3:9c6f7f082151 466 }
mluis 3:9c6f7f082151 467
mluis 5:1e9f6a365854 468 switch( mcpsIndication->McpsIndication )
mluis 3:9c6f7f082151 469 {
mluis 3:9c6f7f082151 470 case MCPS_UNCONFIRMED:
mluis 3:9c6f7f082151 471 {
mluis 3:9c6f7f082151 472 break;
mluis 3:9c6f7f082151 473 }
mluis 3:9c6f7f082151 474 case MCPS_CONFIRMED:
mluis 3:9c6f7f082151 475 {
mluis 3:9c6f7f082151 476 break;
mluis 3:9c6f7f082151 477 }
mluis 3:9c6f7f082151 478 case MCPS_PROPRIETARY:
mluis 3:9c6f7f082151 479 {
mluis 3:9c6f7f082151 480 break;
mluis 3:9c6f7f082151 481 }
mluis 3:9c6f7f082151 482 case MCPS_MULTICAST:
mluis 3:9c6f7f082151 483 {
mluis 3:9c6f7f082151 484 break;
mluis 3:9c6f7f082151 485 }
mluis 3:9c6f7f082151 486 default:
mluis 3:9c6f7f082151 487 break;
mluis 3:9c6f7f082151 488 }
mluis 3:9c6f7f082151 489
mluis 3:9c6f7f082151 490 // Check Multicast
mluis 3:9c6f7f082151 491 // Check Port
mluis 3:9c6f7f082151 492 // Check Datarate
mluis 3:9c6f7f082151 493 // Check FramePending
mluis 3:9c6f7f082151 494 // Check Buffer
mluis 3:9c6f7f082151 495 // Check BufferSize
mluis 3:9c6f7f082151 496 // Check Rssi
mluis 3:9c6f7f082151 497 // Check Snr
mluis 3:9c6f7f082151 498 // Check RxSlot
mluis 5:1e9f6a365854 499 LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
mluis 5:1e9f6a365854 500 if( mcpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
mluis 3:9c6f7f082151 501 {
mluis 3:9c6f7f082151 502 // Invert and divide by 4
mluis 5:1e9f6a365854 503 LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
mluis 3:9c6f7f082151 504 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
mluis 0:92bca02df485 505 }
mluis 0:92bca02df485 506 else
mluis 0:92bca02df485 507 {
mluis 3:9c6f7f082151 508 // Divide by 4
mluis 5:1e9f6a365854 509 LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
mluis 3:9c6f7f082151 510 }
mluis 3:9c6f7f082151 511 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 5:1e9f6a365854 512 LoRaMacDownlinkStatus.RxData = mcpsIndication->RxData;
mluis 5:1e9f6a365854 513 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
mluis 5:1e9f6a365854 514 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
mluis 5:1e9f6a365854 515 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
mluis 3:9c6f7f082151 516
mluis 3:9c6f7f082151 517 if( ComplianceTest.Running == true )
mluis 3:9c6f7f082151 518 {
mluis 3:9c6f7f082151 519 ComplianceTest.DownLinkCounter++;
mluis 3:9c6f7f082151 520 }
mluis 0:92bca02df485 521
mluis 5:1e9f6a365854 522 if( mcpsIndication->RxData == true )
mluis 3:9c6f7f082151 523 {
mluis 5:1e9f6a365854 524 switch( mcpsIndication->Port )
mluis 0:92bca02df485 525 {
mluis 3:9c6f7f082151 526 case 1: // The application LED can be controlled on port 1 or 2
mluis 3:9c6f7f082151 527 case 2:
mluis 3:9c6f7f082151 528 break;
mluis 3:9c6f7f082151 529 case 224:
mluis 3:9c6f7f082151 530 if( ComplianceTest.Running == false )
mluis 3:9c6f7f082151 531 {
mluis 3:9c6f7f082151 532 // Check compliance test enable command (i)
mluis 5:1e9f6a365854 533 if( ( mcpsIndication->BufferSize == 4 ) &&
mluis 5:1e9f6a365854 534 ( mcpsIndication->Buffer[0] == 0x01 ) &&
mluis 5:1e9f6a365854 535 ( mcpsIndication->Buffer[1] == 0x01 ) &&
mluis 5:1e9f6a365854 536 ( mcpsIndication->Buffer[2] == 0x01 ) &&
mluis 5:1e9f6a365854 537 ( mcpsIndication->Buffer[3] == 0x01 ) )
mluis 1:352f608c3337 538 {
mluis 3:9c6f7f082151 539 IsTxConfirmed = false;
mluis 3:9c6f7f082151 540 AppPort = 224;
mluis 3:9c6f7f082151 541 AppDataSize = 2;
mluis 3:9c6f7f082151 542 ComplianceTest.DownLinkCounter = 0;
mluis 3:9c6f7f082151 543 ComplianceTest.LinkCheck = false;
mluis 3:9c6f7f082151 544 ComplianceTest.DemodMargin = 0;
mluis 3:9c6f7f082151 545 ComplianceTest.NbGateways = 0;
mluis 3:9c6f7f082151 546 ComplianceTest.Running = true;
mluis 3:9c6f7f082151 547 ComplianceTest.State = 1;
mluis 9:ee9dcbb9708d 548
mluis 3:9c6f7f082151 549 MibRequestConfirm_t mibReq;
mluis 3:9c6f7f082151 550 mibReq.Type = MIB_ADR;
mluis 3:9c6f7f082151 551 mibReq.Param.AdrEnable = true;
mluis 3:9c6f7f082151 552 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 553
mluis 3:9c6f7f082151 554 #if defined( USE_BAND_868 )
mluis 3:9c6f7f082151 555 LoRaMacTestSetDutyCycleOn( false );
mluis 3:9c6f7f082151 556 #endif
mluis 1:352f608c3337 557 }
mluis 1:352f608c3337 558 }
mluis 0:92bca02df485 559 else
mluis 0:92bca02df485 560 {
mluis 5:1e9f6a365854 561 ComplianceTest.State = mcpsIndication->Buffer[0];
mluis 3:9c6f7f082151 562 switch( ComplianceTest.State )
mluis 3:9c6f7f082151 563 {
mluis 3:9c6f7f082151 564 case 0: // Check compliance test disable command (ii)
mluis 3:9c6f7f082151 565 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 3:9c6f7f082151 566 AppPort = LORAWAN_APP_PORT;
mluis 3:9c6f7f082151 567 AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 3:9c6f7f082151 568 ComplianceTest.DownLinkCounter = 0;
mluis 3:9c6f7f082151 569 ComplianceTest.Running = false;
mluis 9:ee9dcbb9708d 570
mluis 3:9c6f7f082151 571 MibRequestConfirm_t mibReq;
mluis 3:9c6f7f082151 572 mibReq.Type = MIB_ADR;
mluis 3:9c6f7f082151 573 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 3:9c6f7f082151 574 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 575 #if defined( USE_BAND_868 )
mluis 3:9c6f7f082151 576 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 3:9c6f7f082151 577 #endif
mluis 3:9c6f7f082151 578 break;
mluis 3:9c6f7f082151 579 case 1: // (iii, iv)
mluis 3:9c6f7f082151 580 AppDataSize = 2;
mluis 3:9c6f7f082151 581 break;
mluis 3:9c6f7f082151 582 case 2: // Enable confirmed messages (v)
mluis 3:9c6f7f082151 583 IsTxConfirmed = true;
mluis 3:9c6f7f082151 584 ComplianceTest.State = 1;
mluis 3:9c6f7f082151 585 break;
mluis 3:9c6f7f082151 586 case 3: // Disable confirmed messages (vi)
mluis 3:9c6f7f082151 587 IsTxConfirmed = false;
mluis 3:9c6f7f082151 588 ComplianceTest.State = 1;
mluis 3:9c6f7f082151 589 break;
mluis 3:9c6f7f082151 590 case 4: // (vii)
mluis 5:1e9f6a365854 591 AppDataSize = mcpsIndication->BufferSize;
mluis 3:9c6f7f082151 592
mluis 3:9c6f7f082151 593 AppData[0] = 4;
mluis 3:9c6f7f082151 594 for( uint8_t i = 1; i < AppDataSize; i++ )
mluis 3:9c6f7f082151 595 {
mluis 5:1e9f6a365854 596 AppData[i] = mcpsIndication->Buffer[i] + 1;
mluis 3:9c6f7f082151 597 }
mluis 3:9c6f7f082151 598 break;
mluis 3:9c6f7f082151 599 case 5: // (viii)
mluis 3:9c6f7f082151 600 {
mluis 3:9c6f7f082151 601 MlmeReq_t mlmeReq;
mluis 3:9c6f7f082151 602 mlmeReq.Type = MLME_LINK_CHECK;
mluis 3:9c6f7f082151 603 LoRaMacMlmeRequest( &mlmeReq );
mluis 3:9c6f7f082151 604 }
mluis 3:9c6f7f082151 605 break;
mluis 7:3173f0508a98 606 case 6: // (ix)
mluis 7:3173f0508a98 607 {
mluis 7:3173f0508a98 608 MlmeReq_t mlmeReq;
mluis 7:3173f0508a98 609
mluis 9:ee9dcbb9708d 610 // Disable TestMode and revert back to normal operation
mluis 9:ee9dcbb9708d 611 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 9:ee9dcbb9708d 612 AppPort = LORAWAN_APP_PORT;
mluis 9:ee9dcbb9708d 613 AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 9:ee9dcbb9708d 614 ComplianceTest.DownLinkCounter = 0;
mluis 9:ee9dcbb9708d 615 ComplianceTest.Running = false;
mluis 9:ee9dcbb9708d 616
mluis 9:ee9dcbb9708d 617 MibRequestConfirm_t mibReq;
mluis 9:ee9dcbb9708d 618 mibReq.Type = MIB_ADR;
mluis 9:ee9dcbb9708d 619 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 9:ee9dcbb9708d 620 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 9:ee9dcbb9708d 621 #if defined( USE_BAND_868 )
mluis 9:ee9dcbb9708d 622 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 9:ee9dcbb9708d 623 #endif
mluis 9:ee9dcbb9708d 624
mluis 7:3173f0508a98 625 mlmeReq.Type = MLME_JOIN;
mluis 7:3173f0508a98 626
mluis 7:3173f0508a98 627 mlmeReq.Req.Join.DevEui = DevEui;
mluis 7:3173f0508a98 628 mlmeReq.Req.Join.AppEui = AppEui;
mluis 7:3173f0508a98 629 mlmeReq.Req.Join.AppKey = AppKey;
mluis 9:ee9dcbb9708d 630 mlmeReq.Req.Join.NbTrials = 3;
mluis 7:3173f0508a98 631
mluis 7:3173f0508a98 632 LoRaMacMlmeRequest( &mlmeReq );
mluis 7:3173f0508a98 633 DeviceState = DEVICE_STATE_SLEEP;
mluis 7:3173f0508a98 634 }
mluis 7:3173f0508a98 635 break;
mluis 9:ee9dcbb9708d 636 case 7: // (x)
mluis 9:ee9dcbb9708d 637 {
mluis 9:ee9dcbb9708d 638 if( mcpsIndication->BufferSize == 3 )
mluis 9:ee9dcbb9708d 639 {
mluis 9:ee9dcbb9708d 640 MlmeReq_t mlmeReq;
mluis 9:ee9dcbb9708d 641 mlmeReq.Type = MLME_TXCW;
mluis 9:ee9dcbb9708d 642 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
mluis 9:ee9dcbb9708d 643 LoRaMacMlmeRequest( &mlmeReq );
mluis 9:ee9dcbb9708d 644 }
mluis 9:ee9dcbb9708d 645 else if( mcpsIndication->BufferSize == 7 )
mluis 9:ee9dcbb9708d 646 {
mluis 9:ee9dcbb9708d 647 MlmeReq_t mlmeReq;
mluis 9:ee9dcbb9708d 648 mlmeReq.Type = MLME_TXCW_1;
mluis 9:ee9dcbb9708d 649 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
mluis 9:ee9dcbb9708d 650 mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100;
mluis 9:ee9dcbb9708d 651 mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6];
mluis 9:ee9dcbb9708d 652 LoRaMacMlmeRequest( &mlmeReq );
mluis 9:ee9dcbb9708d 653 }
mluis 9:ee9dcbb9708d 654 ComplianceTest.State = 1;
mluis 9:ee9dcbb9708d 655 }
mluis 9:ee9dcbb9708d 656 break;
mluis 3:9c6f7f082151 657 default:
mluis 3:9c6f7f082151 658 break;
mluis 3:9c6f7f082151 659 }
mluis 0:92bca02df485 660 }
mluis 3:9c6f7f082151 661 break;
mluis 3:9c6f7f082151 662 default:
mluis 3:9c6f7f082151 663 break;
mluis 0:92bca02df485 664 }
mluis 0:92bca02df485 665 }
mluis 1:352f608c3337 666
mluis 3:9c6f7f082151 667 DownlinkStatusUpdated = true;
mluis 3:9c6f7f082151 668 }
mluis 3:9c6f7f082151 669
mluis 3:9c6f7f082151 670 /*!
mluis 3:9c6f7f082151 671 * \brief MLME-Confirm event function
mluis 3:9c6f7f082151 672 *
mluis 5:1e9f6a365854 673 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
mluis 3:9c6f7f082151 674 * containing confirm attributes.
mluis 3:9c6f7f082151 675 */
mluis 5:1e9f6a365854 676 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mluis 3:9c6f7f082151 677 {
mluis 9:ee9dcbb9708d 678 switch( mlmeConfirm->MlmeRequest )
mluis 3:9c6f7f082151 679 {
mluis 9:ee9dcbb9708d 680 case MLME_JOIN:
mluis 3:9c6f7f082151 681 {
mluis 9:ee9dcbb9708d 682 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 3:9c6f7f082151 683 {
mluis 3:9c6f7f082151 684 // Status is OK, node has joined the network
mluis 3:9c6f7f082151 685 IsNetworkJoinedStatusUpdate = true;
mluis 7:3173f0508a98 686 DeviceState = DEVICE_STATE_SEND;
mluis 9:ee9dcbb9708d 687 }
mluis 9:ee9dcbb9708d 688 else
mluis 9:ee9dcbb9708d 689 {
mluis 9:ee9dcbb9708d 690 // Join was not successful. Try to join again
mluis 9:ee9dcbb9708d 691 DeviceState = DEVICE_STATE_JOIN;
mluis 3:9c6f7f082151 692 }
mluis 9:ee9dcbb9708d 693 break;
mluis 9:ee9dcbb9708d 694 }
mluis 9:ee9dcbb9708d 695 case MLME_LINK_CHECK:
mluis 9:ee9dcbb9708d 696 {
mluis 9:ee9dcbb9708d 697 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mluis 3:9c6f7f082151 698 {
mluis 3:9c6f7f082151 699 // Check DemodMargin
mluis 3:9c6f7f082151 700 // Check NbGateways
mluis 3:9c6f7f082151 701 if( ComplianceTest.Running == true )
mluis 3:9c6f7f082151 702 {
mluis 3:9c6f7f082151 703 ComplianceTest.LinkCheck = true;
mluis 5:1e9f6a365854 704 ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
mluis 5:1e9f6a365854 705 ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
mluis 3:9c6f7f082151 706 }
mluis 3:9c6f7f082151 707 }
mluis 9:ee9dcbb9708d 708 break;
mluis 3:9c6f7f082151 709 }
mluis 9:ee9dcbb9708d 710 default:
mluis 9:ee9dcbb9708d 711 break;
mluis 3:9c6f7f082151 712 }
mluis 3:9c6f7f082151 713 NextTx = true;
mluis 3:9c6f7f082151 714 UplinkStatusUpdated = true;
mluis 0:92bca02df485 715 }
mluis 0:92bca02df485 716
uss1994 10:4e528716aa7a 717 void flash_builtin() {
uss1994 10:4e528716aa7a 718 myled = 1; // turn the LED on (HIGH is the voltage level)
uss1994 10:4e528716aa7a 719 wait(2); // wait for a second
uss1994 10:4e528716aa7a 720 myled = 0; // turn the LED off by making the voltage LOW
uss1994 10:4e528716aa7a 721 wait(1);
uss1994 10:4e528716aa7a 722 }
uss1994 10:4e528716aa7a 723
mluis 0:92bca02df485 724 /**
mluis 0:92bca02df485 725 * Main application entry point.
mluis 0:92bca02df485 726 */
a22zsolutions 11:876331d64e0e 727 Serial pc(SERIAL_TX, SERIAL_RX,115200);
a22zsolutions 11:876331d64e0e 728 int MY_SetSysClock_PLL_HSE(void)
a22zsolutions 11:876331d64e0e 729 {
a22zsolutions 11:876331d64e0e 730 RCC_ClkInitTypeDef RCC_ClkInitStruct;
a22zsolutions 11:876331d64e0e 731 RCC_OscInitTypeDef RCC_OscInitStruct;
a22zsolutions 11:876331d64e0e 732
a22zsolutions 11:876331d64e0e 733 /* Enable HSE and activate PLL with HSE as source */
a22zsolutions 11:876331d64e0e 734 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
a22zsolutions 11:876331d64e0e 735 RCC_OscInitStruct.HSEState = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */
a22zsolutions 11:876331d64e0e 736
a22zsolutions 11:876331d64e0e 737 // PLLCLK = (8 MHz * 8)/2 = 32 MHz
a22zsolutions 11:876331d64e0e 738 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
a22zsolutions 11:876331d64e0e 739 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
a22zsolutions 11:876331d64e0e 740 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;
a22zsolutions 11:876331d64e0e 741 RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
a22zsolutions 11:876331d64e0e 742 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
a22zsolutions 11:876331d64e0e 743 return (-1); // FAIL
a22zsolutions 11:876331d64e0e 744 }
a22zsolutions 11:876331d64e0e 745
a22zsolutions 11:876331d64e0e 746 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
a22zsolutions 11:876331d64e0e 747 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
a22zsolutions 11:876331d64e0e 748 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 32 MHz
a22zsolutions 11:876331d64e0e 749 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 32 MHz
a22zsolutions 11:876331d64e0e 750 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // 32 MHz
a22zsolutions 11:876331d64e0e 751 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 32 MHz
a22zsolutions 11:876331d64e0e 752 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
a22zsolutions 11:876331d64e0e 753 return (-2); // FAIL
a22zsolutions 11:876331d64e0e 754 }
a22zsolutions 11:876331d64e0e 755
a22zsolutions 11:876331d64e0e 756 /* Enable HSE and activate PLL with HSE as source */
a22zsolutions 11:876331d64e0e 757 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
a22zsolutions 11:876331d64e0e 758 RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
a22zsolutions 11:876331d64e0e 759 RCC_OscInitStruct.MSIState = RCC_MSI_OFF;
a22zsolutions 11:876331d64e0e 760 RCC_OscInitStruct.HSI48State = RCC_HSI48_OFF;
a22zsolutions 11:876331d64e0e 761 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
a22zsolutions 11:876331d64e0e 762 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
a22zsolutions 11:876331d64e0e 763 return (-3); // FAIL
a22zsolutions 11:876331d64e0e 764 }
a22zsolutions 11:876331d64e0e 765
a22zsolutions 11:876331d64e0e 766 return 0; // OK
a22zsolutions 11:876331d64e0e 767 }
a22zsolutions 11:876331d64e0e 768
a22zsolutions 11:876331d64e0e 769 void my_patch(void)
a22zsolutions 11:876331d64e0e 770 {
a22zsolutions 11:876331d64e0e 771 int retVal;
a22zsolutions 11:876331d64e0e 772
a22zsolutions 11:876331d64e0e 773 HAL_RCC_DeInit();
a22zsolutions 11:876331d64e0e 774 retVal = MY_SetSysClock_PLL_HSE();
a22zsolutions 11:876331d64e0e 775 if(retVal< 0)
a22zsolutions 11:876331d64e0e 776 {
a22zsolutions 11:876331d64e0e 777 // fail
a22zsolutions 11:876331d64e0e 778 pc.printf("Failed to start HSE, ERR= %d\r\n", retVal);
a22zsolutions 11:876331d64e0e 779
a22zsolutions 11:876331d64e0e 780 // indicate error
a22zsolutions 11:876331d64e0e 781 while(1)
a22zsolutions 11:876331d64e0e 782 {
a22zsolutions 11:876331d64e0e 783 myled = 1;
a22zsolutions 11:876331d64e0e 784 wait(0.2);
a22zsolutions 11:876331d64e0e 785 myled = 0;
a22zsolutions 11:876331d64e0e 786 wait(0.5);
a22zsolutions 11:876331d64e0e 787 }
a22zsolutions 11:876331d64e0e 788 }
a22zsolutions 11:876331d64e0e 789 }
a22zsolutions 11:876331d64e0e 790
mluis 0:92bca02df485 791 int main( void )
mluis 0:92bca02df485 792 {
a22zsolutions 11:876331d64e0e 793 pc.printf("mbed-os-rev: %d.%d.%d lib-rev: %d\r\n", \
a22zsolutions 11:876331d64e0e 794 MBED_MAJOR_VERSION, MBED_MINOR_VERSION,MBED_PATCH_VERSION,MBED_LIBRARY_VERSION);
a22zsolutions 11:876331d64e0e 795 pc.printf("BUILD= %s, SysClock= %d, RCC= %0X\r\n", __TIME__, SystemCoreClock, RCC->CR);
a22zsolutions 11:876331d64e0e 796 my_patch();
a22zsolutions 11:876331d64e0e 797 pc.printf("NEW SysClock= %d, NEW RCC= %0X\r\n", SystemCoreClock, RCC->CR);
a22zsolutions 11:876331d64e0e 798
uss1994 10:4e528716aa7a 799 flash_builtin();
uss1994 10:4e528716aa7a 800 flash_builtin();
uss1994 10:4e528716aa7a 801 flash_builtin();
uss1994 10:4e528716aa7a 802 flash_builtin();
uss1994 10:4e528716aa7a 803
mluis 3:9c6f7f082151 804 LoRaMacPrimitives_t LoRaMacPrimitives;
mluis 3:9c6f7f082151 805 LoRaMacCallback_t LoRaMacCallbacks;
mluis 3:9c6f7f082151 806 MibRequestConfirm_t mibReq;
mluis 0:92bca02df485 807
mluis 0:92bca02df485 808 BoardInit( );
mluis 3:9c6f7f082151 809 SerialDisplayInit( );
mluis 0:92bca02df485 810
mluis 7:3173f0508a98 811 SerialDisplayUpdateEui( 5, DevEui );
mluis 7:3173f0508a98 812 SerialDisplayUpdateEui( 6, AppEui );
mluis 7:3173f0508a98 813 SerialDisplayUpdateKey( 7, AppKey );
mluis 7:3173f0508a98 814
mluis 7:3173f0508a98 815 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 7:3173f0508a98 816 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 7:3173f0508a98 817 SerialDisplayUpdateDevAddr( DevAddr );
mluis 7:3173f0508a98 818 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 7:3173f0508a98 819 SerialDisplayUpdateKey( 13, AppSKey );
mluis 7:3173f0508a98 820 #endif
mluis 7:3173f0508a98 821
amirchaudhary 12:497383202228 822 myGreenLed = 0;
amirchaudhary 12:497383202228 823 myBlueLed = 0;
mluis 3:9c6f7f082151 824 DeviceState = DEVICE_STATE_INIT;
mluis 0:92bca02df485 825
mluis 0:92bca02df485 826 while( 1 )
mluis 0:92bca02df485 827 {
mluis 0:92bca02df485 828 SerialRxProcess( );
uss1994 10:4e528716aa7a 829 flash_builtin();
mluis 0:92bca02df485 830 if( IsNetworkJoinedStatusUpdate == true )
mluis 0:92bca02df485 831 {
mluis 0:92bca02df485 832 IsNetworkJoinedStatusUpdate = false;
mluis 3:9c6f7f082151 833 mibReq.Type = MIB_NETWORK_JOINED;
mluis 3:9c6f7f082151 834 LoRaMacMibGetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 835 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
amirchaudhary 12:497383202228 836 if(mibReq.Param.IsNetworkJoined == true)
amirchaudhary 12:497383202228 837 myGreenLed = 1;
amirchaudhary 12:497383202228 838 else
amirchaudhary 12:497383202228 839 myGreenLed = 0;
mluis 0:92bca02df485 840 }
mluis 3:9c6f7f082151 841 if( UplinkStatusUpdated == true )
mluis 0:92bca02df485 842 {
mluis 3:9c6f7f082151 843 UplinkStatusUpdated = false;
mluis 3:9c6f7f082151 844 SerialDisplayUpdateUplink( LoRaMacUplinkStatus.Acked, LoRaMacUplinkStatus.Datarate, LoRaMacUplinkStatus.UplinkCounter, LoRaMacUplinkStatus.Port, LoRaMacUplinkStatus.Buffer, LoRaMacUplinkStatus.BufferSize );
amirchaudhary 12:497383202228 845
amirchaudhary 12:497383202228 846 myBlueLed = 1; wait(1); myBlueLed = 0; wait(1);
amirchaudhary 12:497383202228 847 myBlueLed = 1; wait(1); myBlueLed = 0; wait(1);
mluis 3:9c6f7f082151 848 }
mluis 3:9c6f7f082151 849 if( DownlinkStatusUpdated == true )
mluis 3:9c6f7f082151 850 {
mluis 3:9c6f7f082151 851 DownlinkStatusUpdated = false;
mluis 0:92bca02df485 852 SerialDisplayUpdateDownlink( LoRaMacDownlinkStatus.RxData, LoRaMacDownlinkStatus.Rssi, LoRaMacDownlinkStatus.Snr, LoRaMacDownlinkStatus.DownlinkCounter, LoRaMacDownlinkStatus.Port, LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
mluis 0:92bca02df485 853 }
mluis 3:9c6f7f082151 854
mluis 3:9c6f7f082151 855 switch( DeviceState )
mluis 0:92bca02df485 856 {
mluis 3:9c6f7f082151 857 case DEVICE_STATE_INIT:
mluis 3:9c6f7f082151 858 {
mluis 3:9c6f7f082151 859 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
mluis 3:9c6f7f082151 860 LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
mluis 3:9c6f7f082151 861 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
mluis 3:9c6f7f082151 862 LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
mluis 3:9c6f7f082151 863 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
mluis 3:9c6f7f082151 864
mluis 3:9c6f7f082151 865 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
mluis 3:9c6f7f082151 866
mluis 3:9c6f7f082151 867 mibReq.Type = MIB_ADR;
mluis 3:9c6f7f082151 868 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 3:9c6f7f082151 869 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 870
mluis 3:9c6f7f082151 871 mibReq.Type = MIB_PUBLIC_NETWORK;
mluis 3:9c6f7f082151 872 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
mluis 3:9c6f7f082151 873 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 874
mluis 3:9c6f7f082151 875 #if defined( USE_BAND_868 )
mluis 3:9c6f7f082151 876 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 3:9c6f7f082151 877 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 5:1e9f6a365854 878
mluis 9:ee9dcbb9708d 879 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 5:1e9f6a365854 880 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
mluis 5:1e9f6a365854 881 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
mluis 5:1e9f6a365854 882 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
mluis 5:1e9f6a365854 883 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
mluis 5:1e9f6a365854 884 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
mluis 5:1e9f6a365854 885 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
mluis 5:1e9f6a365854 886 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
mluis 7:3173f0508a98 887
mluis 9:ee9dcbb9708d 888 mibReq.Type = MIB_RX2_DEFAULT_CHANNEL;
mluis 9:ee9dcbb9708d 889 mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
mluis 9:ee9dcbb9708d 890 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 9:ee9dcbb9708d 891
mluis 7:3173f0508a98 892 mibReq.Type = MIB_RX2_CHANNEL;
mluis 7:3173f0508a98 893 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
mluis 7:3173f0508a98 894 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 5:1e9f6a365854 895 #endif
mluis 5:1e9f6a365854 896
mluis 3:9c6f7f082151 897 #endif
mluis 3:9c6f7f082151 898 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 3:9c6f7f082151 899 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 3:9c6f7f082151 900 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 3:9c6f7f082151 901
mluis 3:9c6f7f082151 902 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 3:9c6f7f082151 903
mluis 3:9c6f7f082151 904 DeviceState = DEVICE_STATE_JOIN;
mluis 3:9c6f7f082151 905 break;
mluis 3:9c6f7f082151 906 }
mluis 3:9c6f7f082151 907 case DEVICE_STATE_JOIN:
mluis 3:9c6f7f082151 908 {
mluis 3:9c6f7f082151 909 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 3:9c6f7f082151 910 MlmeReq_t mlmeReq;
mluis 3:9c6f7f082151 911
mluis 3:9c6f7f082151 912 mlmeReq.Type = MLME_JOIN;
mluis 3:9c6f7f082151 913
mluis 3:9c6f7f082151 914 mlmeReq.Req.Join.DevEui = DevEui;
mluis 3:9c6f7f082151 915 mlmeReq.Req.Join.AppEui = AppEui;
mluis 3:9c6f7f082151 916 mlmeReq.Req.Join.AppKey = AppKey;
mluis 3:9c6f7f082151 917
mluis 3:9c6f7f082151 918 if( NextTx == true )
mluis 3:9c6f7f082151 919 {
mluis 3:9c6f7f082151 920 LoRaMacMlmeRequest( &mlmeReq );
mluis 3:9c6f7f082151 921 }
mluis 7:3173f0508a98 922 DeviceState = DEVICE_STATE_SLEEP;
mluis 3:9c6f7f082151 923 #else
mluis 3:9c6f7f082151 924 mibReq.Type = MIB_NET_ID;
mluis 3:9c6f7f082151 925 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
mluis 3:9c6f7f082151 926 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 927
mluis 3:9c6f7f082151 928 mibReq.Type = MIB_DEV_ADDR;
mluis 3:9c6f7f082151 929 mibReq.Param.DevAddr = DevAddr;
mluis 3:9c6f7f082151 930 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 931
mluis 3:9c6f7f082151 932 mibReq.Type = MIB_NWK_SKEY;
mluis 3:9c6f7f082151 933 mibReq.Param.NwkSKey = NwkSKey;
mluis 3:9c6f7f082151 934 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 935
mluis 3:9c6f7f082151 936 mibReq.Type = MIB_APP_SKEY;
mluis 3:9c6f7f082151 937 mibReq.Param.AppSKey = AppSKey;
mluis 3:9c6f7f082151 938 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 939
mluis 3:9c6f7f082151 940 mibReq.Type = MIB_NETWORK_JOINED;
mluis 3:9c6f7f082151 941 mibReq.Param.IsNetworkJoined = true;
mluis 3:9c6f7f082151 942 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 3:9c6f7f082151 943
mluis 3:9c6f7f082151 944 DeviceState = DEVICE_STATE_SEND;
mluis 3:9c6f7f082151 945 #endif
mluis 3:9c6f7f082151 946 IsNetworkJoinedStatusUpdate = true;
mluis 3:9c6f7f082151 947 break;
mluis 3:9c6f7f082151 948 }
mluis 3:9c6f7f082151 949 case DEVICE_STATE_SEND:
mluis 3:9c6f7f082151 950 {
mluis 3:9c6f7f082151 951 if( NextTx == true )
mluis 3:9c6f7f082151 952 {
mluis 3:9c6f7f082151 953 SerialDisplayUpdateUplinkAcked( false );
mluis 3:9c6f7f082151 954 SerialDisplayUpdateDonwlinkRxData( false );
mluis 3:9c6f7f082151 955 PrepareTxFrame( AppPort );
mluis 3:9c6f7f082151 956
mluis 3:9c6f7f082151 957 NextTx = SendFrame( );
mluis 3:9c6f7f082151 958 }
mluis 3:9c6f7f082151 959 if( ComplianceTest.Running == true )
mluis 3:9c6f7f082151 960 {
mluis 5:1e9f6a365854 961 // Schedule next packet transmission
mluis 9:ee9dcbb9708d 962 TxDutyCycleTime = 5000; // 5000 ms
mluis 3:9c6f7f082151 963 }
mluis 3:9c6f7f082151 964 else
mluis 3:9c6f7f082151 965 {
mluis 3:9c6f7f082151 966 // Schedule next packet transmission
mluis 3:9c6f7f082151 967 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
mluis 3:9c6f7f082151 968 }
mluis 3:9c6f7f082151 969 DeviceState = DEVICE_STATE_CYCLE;
mluis 3:9c6f7f082151 970 break;
mluis 3:9c6f7f082151 971 }
mluis 3:9c6f7f082151 972 case DEVICE_STATE_CYCLE:
mluis 3:9c6f7f082151 973 {
mluis 5:1e9f6a365854 974 DeviceState = DEVICE_STATE_SLEEP;
mluis 5:1e9f6a365854 975
mluis 3:9c6f7f082151 976 // Schedule next packet transmission
mluis 1:352f608c3337 977 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
mluis 1:352f608c3337 978 TimerStart( &TxNextPacketTimer );
mluis 3:9c6f7f082151 979 break;
mluis 3:9c6f7f082151 980 }
mluis 3:9c6f7f082151 981 case DEVICE_STATE_SLEEP:
mluis 3:9c6f7f082151 982 {
mluis 3:9c6f7f082151 983 // Wake up through events
mluis 3:9c6f7f082151 984 break;
mluis 3:9c6f7f082151 985 }
mluis 3:9c6f7f082151 986 default:
mluis 3:9c6f7f082151 987 {
mluis 3:9c6f7f082151 988 DeviceState = DEVICE_STATE_INIT;
mluis 3:9c6f7f082151 989 break;
mluis 3:9c6f7f082151 990 }
mluis 0:92bca02df485 991 }
mluis 0:92bca02df485 992 }
mluis 0:92bca02df485 993 }