Semtech stack for ELMO - ver. 4.1.0.

Dependencies:   SX1272lib mbed

Fork of LoRaWAN_Semtech_stack_v4.1 by Michal Leksinski

Committer:
mleksio
Date:
Fri Apr 22 07:37:04 2016 +0000
Revision:
5:cbb921e2a03b
Parent:
1:2be292bd43f9
Removed unused files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mleksio 1:2be292bd43f9 1 #if 0
mleksio 1:2be292bd43f9 2 /*
mleksio 1:2be292bd43f9 3 / _____) _ | |
mleksio 1:2be292bd43f9 4 ( (____ _____ ____ _| |_ _____ ____| |__
mleksio 1:2be292bd43f9 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
mleksio 1:2be292bd43f9 6 _____) ) ____| | | || |_| ____( (___| | | |
mleksio 1:2be292bd43f9 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mleksio 1:2be292bd43f9 8 (C)2013 Semtech
mleksio 1:2be292bd43f9 9
mleksio 1:2be292bd43f9 10 Description: LoRaMac classA device implementation
mleksio 1:2be292bd43f9 11
mleksio 1:2be292bd43f9 12 License: Revised BSD License, see LICENSE.TXT file include in the project
mleksio 1:2be292bd43f9 13
mleksio 1:2be292bd43f9 14 Maintainer: Miguel Luis and Gregory Cristian
mleksio 1:2be292bd43f9 15 */
mleksio 1:2be292bd43f9 16 #include <string.h>
mleksio 1:2be292bd43f9 17 #include <math.h>
mleksio 1:2be292bd43f9 18 #include "mbed.h"
mleksio 1:2be292bd43f9 19
mleksio 1:2be292bd43f9 20 #include "utilities.h"
mleksio 1:2be292bd43f9 21 #include "LoRaMac-api-v3.h"
mleksio 1:2be292bd43f9 22 #include "Comissioning.h"
mleksio 1:2be292bd43f9 23
mleksio 1:2be292bd43f9 24 /*!
mleksio 1:2be292bd43f9 25 * When set to 1 the application uses the Over-the-Air activation procedure
mleksio 1:2be292bd43f9 26 * When set to 0 the application uses the Personalization activation procedure
mleksio 1:2be292bd43f9 27 */
mleksio 1:2be292bd43f9 28 #define OVER_THE_AIR_ACTIVATION 1
mleksio 1:2be292bd43f9 29
mleksio 1:2be292bd43f9 30 /*!
mleksio 1:2be292bd43f9 31 * Join requests trials duty cycle.
mleksio 1:2be292bd43f9 32 */
mleksio 1:2be292bd43f9 33 #define OVER_THE_AIR_ACTIVATION_DUTYCYCLE 10000000 // 10 [s] value in us
mleksio 1:2be292bd43f9 34
mleksio 1:2be292bd43f9 35 /*!
mleksio 1:2be292bd43f9 36 * Defines the application data transmission duty cycle. 5s, value in [us].
mleksio 1:2be292bd43f9 37 */
mleksio 1:2be292bd43f9 38 #define APP_TX_DUTYCYCLE 5000000
mleksio 1:2be292bd43f9 39
mleksio 1:2be292bd43f9 40 /*!
mleksio 1:2be292bd43f9 41 * Defines a random delay for application data transmission duty cycle. 1s,
mleksio 1:2be292bd43f9 42 * value in [us].
mleksio 1:2be292bd43f9 43 */
mleksio 1:2be292bd43f9 44 #define APP_TX_DUTYCYCLE_RND 1000000
mleksio 1:2be292bd43f9 45
mleksio 1:2be292bd43f9 46 /*!
mleksio 1:2be292bd43f9 47 * LoRaWAN confirmed messages
mleksio 1:2be292bd43f9 48 */
mleksio 1:2be292bd43f9 49 #define LORAWAN_CONFIRMED_MSG_ON false
mleksio 1:2be292bd43f9 50
mleksio 1:2be292bd43f9 51 /*!
mleksio 1:2be292bd43f9 52 * LoRaWAN Adaptative Data Rate
mleksio 1:2be292bd43f9 53 *
mleksio 1:2be292bd43f9 54 * \remark Please note that when ADR is enabled the end-device should be static
mleksio 1:2be292bd43f9 55 */
mleksio 1:2be292bd43f9 56 #define LORAWAN_ADR_ON 1
mleksio 1:2be292bd43f9 57
mleksio 1:2be292bd43f9 58 #if defined( USE_BAND_868 )
mleksio 1:2be292bd43f9 59
mleksio 1:2be292bd43f9 60 /*!
mleksio 1:2be292bd43f9 61 * LoRaWAN ETSI duty cycle control enable/disable
mleksio 1:2be292bd43f9 62 *
mleksio 1:2be292bd43f9 63 * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
mleksio 1:2be292bd43f9 64 */
mleksio 1:2be292bd43f9 65 #define LORAWAN_DUTYCYCLE_ON true
mleksio 1:2be292bd43f9 66
mleksio 1:2be292bd43f9 67 #endif
mleksio 1:2be292bd43f9 68
mleksio 1:2be292bd43f9 69 /*!
mleksio 1:2be292bd43f9 70 * LoRaWAN application port
mleksio 1:2be292bd43f9 71 */
mleksio 1:2be292bd43f9 72 #define LORAWAN_APP_PORT 1
mleksio 1:2be292bd43f9 73
mleksio 1:2be292bd43f9 74 /*!
mleksio 1:2be292bd43f9 75 * User application data buffer size
mleksio 1:2be292bd43f9 76 */
mleksio 1:2be292bd43f9 77 #define LORAWAN_APP_DATA_SIZE 8
mleksio 1:2be292bd43f9 78
mleksio 1:2be292bd43f9 79 #if( OVER_THE_AIR_ACTIVATION != 0 )
mleksio 1:2be292bd43f9 80
mleksio 1:2be292bd43f9 81 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
mleksio 1:2be292bd43f9 82 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
mleksio 1:2be292bd43f9 83 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
mleksio 1:2be292bd43f9 84
mleksio 1:2be292bd43f9 85 #else
mleksio 1:2be292bd43f9 86
mleksio 1:2be292bd43f9 87 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
mleksio 1:2be292bd43f9 88 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
mleksio 1:2be292bd43f9 89
mleksio 1:2be292bd43f9 90 /*!
mleksio 1:2be292bd43f9 91 * Device address
mleksio 1:2be292bd43f9 92 */
mleksio 1:2be292bd43f9 93 static uint32_t DevAddr;
mleksio 1:2be292bd43f9 94
mleksio 1:2be292bd43f9 95 #endif
mleksio 1:2be292bd43f9 96
mleksio 1:2be292bd43f9 97 /*!
mleksio 1:2be292bd43f9 98 * Indicates if the MAC layer has already joined a network.
mleksio 1:2be292bd43f9 99 */
mleksio 1:2be292bd43f9 100 static bool IsNetworkJoined = false;
mleksio 1:2be292bd43f9 101
mleksio 1:2be292bd43f9 102 /*!
mleksio 1:2be292bd43f9 103 * Application port
mleksio 1:2be292bd43f9 104 */
mleksio 1:2be292bd43f9 105 static uint8_t AppPort = LORAWAN_APP_PORT;
mleksio 1:2be292bd43f9 106
mleksio 1:2be292bd43f9 107 /*!
mleksio 1:2be292bd43f9 108 * User application data size
mleksio 1:2be292bd43f9 109 */
mleksio 1:2be292bd43f9 110 static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
mleksio 1:2be292bd43f9 111
mleksio 1:2be292bd43f9 112 /*!
mleksio 1:2be292bd43f9 113 * User application data buffer size
mleksio 1:2be292bd43f9 114 */
mleksio 1:2be292bd43f9 115 #define LORAWAN_APP_DATA_MAX_SIZE 64
mleksio 1:2be292bd43f9 116
mleksio 1:2be292bd43f9 117 /*!
mleksio 1:2be292bd43f9 118 * User application data
mleksio 1:2be292bd43f9 119 */
mleksio 1:2be292bd43f9 120 static uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
mleksio 1:2be292bd43f9 121
mleksio 1:2be292bd43f9 122 /*!
mleksio 1:2be292bd43f9 123 * Indicates if the node is sending confirmed or unconfirmed messages
mleksio 1:2be292bd43f9 124 */
mleksio 1:2be292bd43f9 125 static uint8_t IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mleksio 1:2be292bd43f9 126
mleksio 1:2be292bd43f9 127 /*!
mleksio 1:2be292bd43f9 128 * Defines the application data transmission duty cycle
mleksio 1:2be292bd43f9 129 */
mleksio 1:2be292bd43f9 130 static uint32_t TxDutyCycleTime;
mleksio 1:2be292bd43f9 131
mleksio 1:2be292bd43f9 132 /*!
mleksio 1:2be292bd43f9 133 * Timer to handle the application data transmission duty cycle
mleksio 1:2be292bd43f9 134 */
mleksio 1:2be292bd43f9 135 static void OnTxNextPacketTimerEvent( void );
mleksio 1:2be292bd43f9 136 static Timeout TxNextPacketTimer;
mleksio 1:2be292bd43f9 137
mleksio 1:2be292bd43f9 138
mleksio 1:2be292bd43f9 139 #if( OVER_THE_AIR_ACTIVATION != 0 )
mleksio 1:2be292bd43f9 140
mleksio 1:2be292bd43f9 141 /*!
mleksio 1:2be292bd43f9 142 * Defines the join request timer
mleksio 1:2be292bd43f9 143 */
mleksio 1:2be292bd43f9 144 static void OnJoinReqTimerEvent( void );
mleksio 1:2be292bd43f9 145 static Timeout JoinReqTimer;
mleksio 1:2be292bd43f9 146
mleksio 1:2be292bd43f9 147 #endif
mleksio 1:2be292bd43f9 148
mleksio 1:2be292bd43f9 149 /*!
mleksio 1:2be292bd43f9 150 * Indicates if a new packet can be sent
mleksio 1:2be292bd43f9 151 */
mleksio 1:2be292bd43f9 152 static bool TxNextPacket = true;
mleksio 1:2be292bd43f9 153 static bool ScheduleNextTx = false;
mleksio 1:2be292bd43f9 154 static bool DownlinkStatusUpdate = false;
mleksio 1:2be292bd43f9 155
mleksio 1:2be292bd43f9 156 static LoRaMacCallbacks_t LoRaMacCallbacks;
mleksio 1:2be292bd43f9 157
mleksio 1:2be292bd43f9 158 /*!
mleksio 1:2be292bd43f9 159 * \brief Function executed on duty cycle delayed Tx timer event
mleksio 1:2be292bd43f9 160 */
mleksio 1:2be292bd43f9 161 static void OnLed1TimerEvent( void );
mleksio 1:2be292bd43f9 162 static void OnLed2TimerEvent( void );
mleksio 1:2be292bd43f9 163
mleksio 1:2be292bd43f9 164 static Timeout Led1Timer;
mleksio 1:2be292bd43f9 165 static Timeout Led2Timer;
mleksio 1:2be292bd43f9 166 volatile bool Led1StateChanged = false;
mleksio 1:2be292bd43f9 167 volatile bool Led2StateChanged = false;
mleksio 1:2be292bd43f9 168
mleksio 1:2be292bd43f9 169 #define LED1_TIMER_TIMEOUT 25000
mleksio 1:2be292bd43f9 170 #define LED2_TIMER_TIMEOUT 25000
mleksio 1:2be292bd43f9 171
mleksio 1:2be292bd43f9 172 static bool AppLedStateOn = false;
mleksio 1:2be292bd43f9 173
mleksio 1:2be292bd43f9 174 /*!
mleksio 1:2be292bd43f9 175 * LoRaWAN compliance tests support data
mleksio 1:2be292bd43f9 176 */
mleksio 1:2be292bd43f9 177 struct ComplianceTest_s
mleksio 1:2be292bd43f9 178 {
mleksio 1:2be292bd43f9 179 bool Running;
mleksio 1:2be292bd43f9 180 uint8_t State;
mleksio 1:2be292bd43f9 181 bool IsTxConfirmed;
mleksio 1:2be292bd43f9 182 uint8_t AppPort;
mleksio 1:2be292bd43f9 183 uint8_t AppDataSize;
mleksio 1:2be292bd43f9 184 uint8_t *AppDataBuffer;
mleksio 1:2be292bd43f9 185 uint16_t DownLinkCounter;
mleksio 1:2be292bd43f9 186 bool LinkCheck;
mleksio 1:2be292bd43f9 187 uint8_t DemodMargin;
mleksio 1:2be292bd43f9 188 uint8_t NbGateways;
mleksio 1:2be292bd43f9 189 }ComplianceTest;
mleksio 1:2be292bd43f9 190
mleksio 1:2be292bd43f9 191 DigitalOut led1(LED1);
mleksio 1:2be292bd43f9 192 DigitalOut led2(LED2);
mleksio 1:2be292bd43f9 193
mleksio 1:2be292bd43f9 194 /*!
mleksio 1:2be292bd43f9 195 * Prepares the frame buffer to be sent
mleksio 1:2be292bd43f9 196 */
mleksio 1:2be292bd43f9 197 static void PrepareTxFrame( uint8_t port )
mleksio 1:2be292bd43f9 198 {
mleksio 1:2be292bd43f9 199 switch( port )
mleksio 1:2be292bd43f9 200 {
mleksio 1:2be292bd43f9 201 case 1:
mleksio 1:2be292bd43f9 202 {
mleksio 1:2be292bd43f9 203 //uint16_t pressure = 0;
mleksio 1:2be292bd43f9 204 //int16_t altitudeBar = 0;
mleksio 1:2be292bd43f9 205 //int16_t temperature = 0;
mleksio 1:2be292bd43f9 206 //uint8_t batteryLevel = 0;
mleksio 1:2be292bd43f9 207
mleksio 1:2be292bd43f9 208 //pressure = ( uint16_t )( MPL3115ReadPressure( ) / 10 ); // in hPa / 10
mleksio 1:2be292bd43f9 209 //temperature = ( int16_t )( MPL3115ReadTemperature( ) * 100 ); // in ?C * 100
mleksio 1:2be292bd43f9 210 //altitudeBar = ( int16_t )( MPL3115ReadAltitude( ) * 10 ); // in m * 10
mleksio 1:2be292bd43f9 211 //batteryLevel = BoardGetBatteryLevel( ); // 1 (very low) to 254 (fully charged)
mleksio 1:2be292bd43f9 212
mleksio 1:2be292bd43f9 213 //AppData[0] = ( SelectorGetValue( ) << 4 ) | AppLedStateOn;
mleksio 1:2be292bd43f9 214 //AppData[1] = ( pressure >> 8 ) & 0xFF;
mleksio 1:2be292bd43f9 215 //AppData[2] = pressure & 0xFF;
mleksio 1:2be292bd43f9 216 //AppData[3] = ( temperature >> 8 ) & 0xFF;
mleksio 1:2be292bd43f9 217 //AppData[4] = temperature & 0xFF;
mleksio 1:2be292bd43f9 218 //AppData[5] = ( altitudeBar >> 8 ) & 0xFF;
mleksio 1:2be292bd43f9 219 //AppData[6] = altitudeBar & 0xFF;
mleksio 1:2be292bd43f9 220 //AppData[7] = batteryLevel;
mleksio 1:2be292bd43f9 221 }
mleksio 1:2be292bd43f9 222 break;
mleksio 1:2be292bd43f9 223 case 224:
mleksio 1:2be292bd43f9 224 if( ComplianceTest.LinkCheck == true )
mleksio 1:2be292bd43f9 225 {
mleksio 1:2be292bd43f9 226 ComplianceTest.LinkCheck = false;
mleksio 1:2be292bd43f9 227 AppDataSize = 3;
mleksio 1:2be292bd43f9 228 AppData[0] = 5;
mleksio 1:2be292bd43f9 229 AppData[1] = ComplianceTest.DemodMargin;
mleksio 1:2be292bd43f9 230 AppData[2] = ComplianceTest.NbGateways;
mleksio 1:2be292bd43f9 231 ComplianceTest.State = 1;
mleksio 1:2be292bd43f9 232 }
mleksio 1:2be292bd43f9 233 else
mleksio 1:2be292bd43f9 234 {
mleksio 1:2be292bd43f9 235 switch( ComplianceTest.State )
mleksio 1:2be292bd43f9 236 {
mleksio 1:2be292bd43f9 237 case 4:
mleksio 1:2be292bd43f9 238 ComplianceTest.State = 1;
mleksio 1:2be292bd43f9 239 break;
mleksio 1:2be292bd43f9 240 case 1:
mleksio 1:2be292bd43f9 241 AppDataSize = 2;
mleksio 1:2be292bd43f9 242 AppData[0] = ComplianceTest.DownLinkCounter >> 8;
mleksio 1:2be292bd43f9 243 AppData[1] = ComplianceTest.DownLinkCounter;
mleksio 1:2be292bd43f9 244 break;
mleksio 1:2be292bd43f9 245 }
mleksio 1:2be292bd43f9 246 }
mleksio 1:2be292bd43f9 247 break;
mleksio 1:2be292bd43f9 248 default:
mleksio 1:2be292bd43f9 249 break;
mleksio 1:2be292bd43f9 250 }
mleksio 1:2be292bd43f9 251 }
mleksio 1:2be292bd43f9 252
mleksio 1:2be292bd43f9 253 static void ProcessRxFrame( LoRaMacEventFlags_t *flags, LoRaMacEventInfo_t *info )
mleksio 1:2be292bd43f9 254 {
mleksio 1:2be292bd43f9 255 switch( info->RxPort ) // Check Rx port number
mleksio 1:2be292bd43f9 256 {
mleksio 1:2be292bd43f9 257 case 1: // The application LED can be controlled on port 1 or 2
mleksio 1:2be292bd43f9 258 case 2:
mleksio 1:2be292bd43f9 259 if( info->RxBufferSize == 1 )
mleksio 1:2be292bd43f9 260 {
mleksio 1:2be292bd43f9 261 AppLedStateOn = info->RxBuffer[0] & 0x01;
mleksio 1:2be292bd43f9 262 //Led3StateChanged = true;
mleksio 1:2be292bd43f9 263 }
mleksio 1:2be292bd43f9 264 break;
mleksio 1:2be292bd43f9 265 case 224:
mleksio 1:2be292bd43f9 266 if( ComplianceTest.Running == false )
mleksio 1:2be292bd43f9 267 {
mleksio 1:2be292bd43f9 268 // Check compliance test enable command (i)
mleksio 1:2be292bd43f9 269 if( ( info->RxBufferSize == 4 ) &&
mleksio 1:2be292bd43f9 270 ( info->RxBuffer[0] == 0x01 ) &&
mleksio 1:2be292bd43f9 271 ( info->RxBuffer[1] == 0x01 ) &&
mleksio 1:2be292bd43f9 272 ( info->RxBuffer[2] == 0x01 ) &&
mleksio 1:2be292bd43f9 273 ( info->RxBuffer[3] == 0x01 ) )
mleksio 1:2be292bd43f9 274 {
mleksio 1:2be292bd43f9 275 IsTxConfirmed = false;
mleksio 1:2be292bd43f9 276 AppPort = 224;
mleksio 1:2be292bd43f9 277 AppDataSize = 2;
mleksio 1:2be292bd43f9 278 ComplianceTest.DownLinkCounter = 0;
mleksio 1:2be292bd43f9 279 ComplianceTest.LinkCheck = false;
mleksio 1:2be292bd43f9 280 ComplianceTest.DemodMargin = 0;
mleksio 1:2be292bd43f9 281 ComplianceTest.NbGateways = 0;
mleksio 1:2be292bd43f9 282 ComplianceTest.Running = true;
mleksio 1:2be292bd43f9 283 ComplianceTest.State = 1;
mleksio 1:2be292bd43f9 284
mleksio 1:2be292bd43f9 285 LoRaMacSetAdrOn( true );
mleksio 1:2be292bd43f9 286 #if defined( USE_BAND_868 )
mleksio 1:2be292bd43f9 287 LoRaMacTestSetDutyCycleOn( false );
mleksio 1:2be292bd43f9 288 #endif
mleksio 1:2be292bd43f9 289 }
mleksio 1:2be292bd43f9 290 }
mleksio 1:2be292bd43f9 291 else
mleksio 1:2be292bd43f9 292 {
mleksio 1:2be292bd43f9 293 ComplianceTest.State = info->RxBuffer[0];
mleksio 1:2be292bd43f9 294 switch( ComplianceTest.State )
mleksio 1:2be292bd43f9 295 {
mleksio 1:2be292bd43f9 296 case 0: // Check compliance test disable command (ii)
mleksio 1:2be292bd43f9 297 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mleksio 1:2be292bd43f9 298 AppPort = LORAWAN_APP_PORT;
mleksio 1:2be292bd43f9 299 AppDataSize = LORAWAN_APP_DATA_SIZE;
mleksio 1:2be292bd43f9 300 ComplianceTest.DownLinkCounter = 0;
mleksio 1:2be292bd43f9 301 ComplianceTest.Running = false;
mleksio 1:2be292bd43f9 302 LoRaMacSetAdrOn( LORAWAN_ADR_ON );
mleksio 1:2be292bd43f9 303 #if defined( USE_BAND_868 )
mleksio 1:2be292bd43f9 304 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mleksio 1:2be292bd43f9 305 #endif
mleksio 1:2be292bd43f9 306 break;
mleksio 1:2be292bd43f9 307 case 1: // (iii, iv)
mleksio 1:2be292bd43f9 308 AppDataSize = 2;
mleksio 1:2be292bd43f9 309 break;
mleksio 1:2be292bd43f9 310 case 2: // Enable confirmed messages (v)
mleksio 1:2be292bd43f9 311 IsTxConfirmed = true;
mleksio 1:2be292bd43f9 312 ComplianceTest.State = 1;
mleksio 1:2be292bd43f9 313 break;
mleksio 1:2be292bd43f9 314 case 3: // Disable confirmed messages (vi)
mleksio 1:2be292bd43f9 315 IsTxConfirmed = false;
mleksio 1:2be292bd43f9 316 ComplianceTest.State = 1;
mleksio 1:2be292bd43f9 317 break;
mleksio 1:2be292bd43f9 318 case 4: // (vii)
mleksio 1:2be292bd43f9 319 AppDataSize = info->RxBufferSize;
mleksio 1:2be292bd43f9 320
mleksio 1:2be292bd43f9 321 AppData[0] = 4;
mleksio 1:2be292bd43f9 322 for( uint8_t i = 1; i < AppDataSize; i++ )
mleksio 1:2be292bd43f9 323 {
mleksio 1:2be292bd43f9 324 AppData[i] = info->RxBuffer[i] + 1;
mleksio 1:2be292bd43f9 325 }
mleksio 1:2be292bd43f9 326 break;
mleksio 1:2be292bd43f9 327 case 5: // (viii)
mleksio 1:2be292bd43f9 328 LoRaMacLinkCheckReq( );
mleksio 1:2be292bd43f9 329 break;
mleksio 1:2be292bd43f9 330 default:
mleksio 1:2be292bd43f9 331 break;
mleksio 1:2be292bd43f9 332 }
mleksio 1:2be292bd43f9 333 }
mleksio 1:2be292bd43f9 334 break;
mleksio 1:2be292bd43f9 335 default:
mleksio 1:2be292bd43f9 336 break;
mleksio 1:2be292bd43f9 337 }
mleksio 1:2be292bd43f9 338 }
mleksio 1:2be292bd43f9 339
mleksio 1:2be292bd43f9 340 static bool SendFrame( void )
mleksio 1:2be292bd43f9 341 {
mleksio 1:2be292bd43f9 342 uint8_t sendFrameStatus = 0;
mleksio 1:2be292bd43f9 343
mleksio 1:2be292bd43f9 344 if( IsTxConfirmed == false )
mleksio 1:2be292bd43f9 345 {
mleksio 1:2be292bd43f9 346 sendFrameStatus = LoRaMacSendFrame( AppPort, AppData, AppDataSize );
mleksio 1:2be292bd43f9 347 }
mleksio 1:2be292bd43f9 348 else
mleksio 1:2be292bd43f9 349 {
mleksio 1:2be292bd43f9 350 sendFrameStatus = LoRaMacSendConfirmedFrame( AppPort, AppData, AppDataSize, 8 );
mleksio 1:2be292bd43f9 351 }
mleksio 1:2be292bd43f9 352
mleksio 1:2be292bd43f9 353 switch( sendFrameStatus )
mleksio 1:2be292bd43f9 354 {
mleksio 1:2be292bd43f9 355 case 3: // LENGTH_ERROR
mleksio 1:2be292bd43f9 356 // Send empty frame in order to flush MAC commands
mleksio 1:2be292bd43f9 357 LoRaMacSendFrame( 0, NULL, 0 );
mleksio 1:2be292bd43f9 358 return false;
mleksio 1:2be292bd43f9 359 case 5: // NO_FREE_CHANNEL
mleksio 1:2be292bd43f9 360 // Try again later
mleksio 1:2be292bd43f9 361 return true;
mleksio 1:2be292bd43f9 362 default:
mleksio 1:2be292bd43f9 363 return false;
mleksio 1:2be292bd43f9 364 }
mleksio 1:2be292bd43f9 365 }
mleksio 1:2be292bd43f9 366
mleksio 1:2be292bd43f9 367 #if( OVER_THE_AIR_ACTIVATION != 0 )
mleksio 1:2be292bd43f9 368
mleksio 1:2be292bd43f9 369 /*!
mleksio 1:2be292bd43f9 370 * \brief Function executed on JoinReq Timeout event
mleksio 1:2be292bd43f9 371 */
mleksio 1:2be292bd43f9 372 static void OnJoinReqTimerEvent( void )
mleksio 1:2be292bd43f9 373 {
mleksio 1:2be292bd43f9 374 JoinReqTimer.detach();
mleksio 1:2be292bd43f9 375 TxNextPacket = true;
mleksio 1:2be292bd43f9 376 }
mleksio 1:2be292bd43f9 377
mleksio 1:2be292bd43f9 378 #endif
mleksio 1:2be292bd43f9 379
mleksio 1:2be292bd43f9 380 /*!
mleksio 1:2be292bd43f9 381 * \brief Function executed on TxNextPacket Timeout event
mleksio 1:2be292bd43f9 382 */
mleksio 1:2be292bd43f9 383 static void OnTxNextPacketTimerEvent( void )
mleksio 1:2be292bd43f9 384 {
mleksio 1:2be292bd43f9 385 TxNextPacketTimer.detach();
mleksio 1:2be292bd43f9 386 TxNextPacket = true;
mleksio 1:2be292bd43f9 387 }
mleksio 1:2be292bd43f9 388
mleksio 1:2be292bd43f9 389 /*!
mleksio 1:2be292bd43f9 390 * \brief Function executed on Led 1 Timeout event
mleksio 1:2be292bd43f9 391 */
mleksio 1:2be292bd43f9 392 static void OnLed1TimerEvent( void )
mleksio 1:2be292bd43f9 393 {
mleksio 1:2be292bd43f9 394 Led1Timer.detach();
mleksio 1:2be292bd43f9 395 Led1StateChanged = true;
mleksio 1:2be292bd43f9 396 }
mleksio 1:2be292bd43f9 397
mleksio 1:2be292bd43f9 398 /*!
mleksio 1:2be292bd43f9 399 * \brief Function executed on Led 2 Timeout event
mleksio 1:2be292bd43f9 400 */
mleksio 1:2be292bd43f9 401 static void OnLed2TimerEvent( void )
mleksio 1:2be292bd43f9 402 {
mleksio 1:2be292bd43f9 403 Led2Timer.detach();
mleksio 1:2be292bd43f9 404 Led2StateChanged = true;
mleksio 1:2be292bd43f9 405 }
mleksio 1:2be292bd43f9 406
mleksio 1:2be292bd43f9 407 /*!
mleksio 1:2be292bd43f9 408 * \brief Function to be executed on MAC layer event
mleksio 1:2be292bd43f9 409 */
mleksio 1:2be292bd43f9 410 static void OnMacEvent( LoRaMacEventFlags_t *flags, LoRaMacEventInfo_t *info )
mleksio 1:2be292bd43f9 411 {
mleksio 1:2be292bd43f9 412 if( flags->Bits.JoinAccept == 1 )
mleksio 1:2be292bd43f9 413 {
mleksio 1:2be292bd43f9 414 #if( OVER_THE_AIR_ACTIVATION != 0 )
mleksio 1:2be292bd43f9 415 JoinReqTimer.detach();
mleksio 1:2be292bd43f9 416 #endif
mleksio 1:2be292bd43f9 417 IsNetworkJoined = true;
mleksio 1:2be292bd43f9 418 }
mleksio 1:2be292bd43f9 419 else
mleksio 1:2be292bd43f9 420 {
mleksio 1:2be292bd43f9 421 if( flags->Bits.Tx == 1 )
mleksio 1:2be292bd43f9 422 {
mleksio 1:2be292bd43f9 423 }
mleksio 1:2be292bd43f9 424
mleksio 1:2be292bd43f9 425 if( flags->Bits.Rx == 1 )
mleksio 1:2be292bd43f9 426 {
mleksio 1:2be292bd43f9 427 if( ComplianceTest.Running == true )
mleksio 1:2be292bd43f9 428 {
mleksio 1:2be292bd43f9 429 ComplianceTest.DownLinkCounter++;
mleksio 1:2be292bd43f9 430 if( flags->Bits.LinkCheck == 1 )
mleksio 1:2be292bd43f9 431 {
mleksio 1:2be292bd43f9 432 ComplianceTest.LinkCheck = true;
mleksio 1:2be292bd43f9 433 ComplianceTest.DemodMargin = info->DemodMargin;
mleksio 1:2be292bd43f9 434 ComplianceTest.NbGateways = info->NbGateways;
mleksio 1:2be292bd43f9 435 }
mleksio 1:2be292bd43f9 436 }
mleksio 1:2be292bd43f9 437 if( flags->Bits.RxData == true )
mleksio 1:2be292bd43f9 438 {
mleksio 1:2be292bd43f9 439 ProcessRxFrame( flags, info );
mleksio 1:2be292bd43f9 440 }
mleksio 1:2be292bd43f9 441
mleksio 1:2be292bd43f9 442 DownlinkStatusUpdate = true;
mleksio 1:2be292bd43f9 443 Led2Timer.attach_us(OnLed2TimerEvent, LED2_TIMER_TIMEOUT);
mleksio 1:2be292bd43f9 444 }
mleksio 1:2be292bd43f9 445 }
mleksio 1:2be292bd43f9 446 // Schedule a new transmission
mleksio 1:2be292bd43f9 447 ScheduleNextTx = true;
mleksio 1:2be292bd43f9 448 }
mleksio 1:2be292bd43f9 449
mleksio 1:2be292bd43f9 450 /**
mleksio 1:2be292bd43f9 451 * Main application entry point.
mleksio 1:2be292bd43f9 452 */
mleksio 1:2be292bd43f9 453 int main( void )
mleksio 1:2be292bd43f9 454 {
mleksio 1:2be292bd43f9 455 #if( OVER_THE_AIR_ACTIVATION != 0 )
mleksio 1:2be292bd43f9 456 uint8_t sendFrameStatus = 0;
mleksio 1:2be292bd43f9 457 #endif
mleksio 1:2be292bd43f9 458 bool trySendingFrameAgain = false;
mleksio 1:2be292bd43f9 459
mleksio 1:2be292bd43f9 460 #warning HW and RADIO CHIP must be configured!!!!
mleksio 1:2be292bd43f9 461 //BoardInitMcu( );
mleksio 1:2be292bd43f9 462 //BoardInitPeriph( );
mleksio 1:2be292bd43f9 463 //hal_init();
mleksio 1:2be292bd43f9 464 //radio_init();
mleksio 1:2be292bd43f9 465
mleksio 1:2be292bd43f9 466 LoRaMacCallbacks.MacEvent = OnMacEvent;
mleksio 1:2be292bd43f9 467 //LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
mleksio 1:2be292bd43f9 468 LoRaMacInit( &LoRaMacCallbacks );
mleksio 1:2be292bd43f9 469
mleksio 1:2be292bd43f9 470 IsNetworkJoined = false;
mleksio 1:2be292bd43f9 471
mleksio 1:2be292bd43f9 472 #if( OVER_THE_AIR_ACTIVATION == 0 )
mleksio 1:2be292bd43f9 473 // Random seed initialization
mleksio 1:2be292bd43f9 474 #warning seed initialization must be implemented
mleksio 1:2be292bd43f9 475 srand1( 1 );
mleksio 1:2be292bd43f9 476 // Choose a random device address based on Board unique ID
mleksio 1:2be292bd43f9 477 // NwkAddr rand [0, 33554431]
mleksio 1:2be292bd43f9 478 DevAddr = randr( 0, 0x01FFFFFF );
mleksio 1:2be292bd43f9 479
mleksio 1:2be292bd43f9 480 LoRaMacInitNwkIds( LORAWAN_NETWORK_ID, DevAddr, NwkSKey, AppSKey );
mleksio 1:2be292bd43f9 481 IsNetworkJoined = true;
mleksio 1:2be292bd43f9 482 #else
mleksio 1:2be292bd43f9 483 // Initialize LoRaMac device unique ID
mleksio 1:2be292bd43f9 484 //BoardGetUniqueId( DevEui );
mleksio 1:2be292bd43f9 485 #endif
mleksio 1:2be292bd43f9 486
mleksio 1:2be292bd43f9 487 TxNextPacket = true;
mleksio 1:2be292bd43f9 488
mleksio 1:2be292bd43f9 489 LoRaMacSetAdrOn( LORAWAN_ADR_ON );
mleksio 1:2be292bd43f9 490 LoRaMacSetPublicNetwork( LORAWAN_PUBLIC_NETWORK );
mleksio 1:2be292bd43f9 491
mleksio 1:2be292bd43f9 492 #if defined( USE_BAND_868 )
mleksio 1:2be292bd43f9 493 #warning dutycycleON OFFFFFFFFFFFFF!!!!!!!!!!!!!!!!!!!!!!!
mleksio 1:2be292bd43f9 494 // LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mleksio 1:2be292bd43f9 495 LoRaMacTestSetDutyCycleOn( 0 );
mleksio 1:2be292bd43f9 496
mleksio 1:2be292bd43f9 497 // LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mleksio 1:2be292bd43f9 498 #endif
mleksio 1:2be292bd43f9 499
mleksio 1:2be292bd43f9 500 while( 1 )
mleksio 1:2be292bd43f9 501 {
mleksio 1:2be292bd43f9 502 while( IsNetworkJoined == false )
mleksio 1:2be292bd43f9 503 {
mleksio 1:2be292bd43f9 504 #if( OVER_THE_AIR_ACTIVATION != 0 )
mleksio 1:2be292bd43f9 505 if( TxNextPacket == true )
mleksio 1:2be292bd43f9 506 {
mleksio 1:2be292bd43f9 507 printf("Trial to join network... txnextpacket %i \r\n", TxNextPacket);
mleksio 1:2be292bd43f9 508 TxNextPacket = false;
mleksio 1:2be292bd43f9 509
mleksio 1:2be292bd43f9 510 sendFrameStatus = LoRaMacJoinReq( DevEui, AppEui, AppKey );
mleksio 1:2be292bd43f9 511 printf("status = %i\r\n", sendFrameStatus);
mleksio 1:2be292bd43f9 512 switch( sendFrameStatus )
mleksio 1:2be292bd43f9 513 {
mleksio 1:2be292bd43f9 514 case 1: // BUSY
mleksio 1:2be292bd43f9 515 break;
mleksio 1:2be292bd43f9 516 case 0: // OK
mleksio 1:2be292bd43f9 517 case 2: // NO_NETWORK_JOINED
mleksio 1:2be292bd43f9 518 case 3: // LENGTH_PORT_ERROR
mleksio 1:2be292bd43f9 519 case 4: // MAC_CMD_ERROR
mleksio 1:2be292bd43f9 520 case 6: // DEVICE_OFF
mleksio 1:2be292bd43f9 521 default:
mleksio 1:2be292bd43f9 522 // Relaunch timer for next trial
mleksio 1:2be292bd43f9 523 JoinReqTimer.attach_us(OnJoinReqTimerEvent, OVER_THE_AIR_ACTIVATION_DUTYCYCLE);
mleksio 1:2be292bd43f9 524 break;
mleksio 1:2be292bd43f9 525 }
mleksio 1:2be292bd43f9 526 }
mleksio 1:2be292bd43f9 527 //TimerLowPowerHandler( );
mleksio 1:2be292bd43f9 528 #endif
mleksio 1:2be292bd43f9 529 }
mleksio 1:2be292bd43f9 530
mleksio 1:2be292bd43f9 531 if( Led1StateChanged == true )
mleksio 1:2be292bd43f9 532 {
mleksio 1:2be292bd43f9 533 Led1StateChanged = false;
mleksio 1:2be292bd43f9 534 // Switch LED 1 OFF
mleksio 1:2be292bd43f9 535 led1 = 0;
mleksio 1:2be292bd43f9 536 }
mleksio 1:2be292bd43f9 537 if( Led2StateChanged == true )
mleksio 1:2be292bd43f9 538 {
mleksio 1:2be292bd43f9 539 Led2StateChanged = false;
mleksio 1:2be292bd43f9 540 // Switch LED 2 OFF
mleksio 1:2be292bd43f9 541 led2 = 0;
mleksio 1:2be292bd43f9 542 }
mleksio 1:2be292bd43f9 543 if( DownlinkStatusUpdate == true )
mleksio 1:2be292bd43f9 544 {
mleksio 1:2be292bd43f9 545 DownlinkStatusUpdate = false;
mleksio 1:2be292bd43f9 546 // Switch LED 2 ON for each received downlink
mleksio 1:2be292bd43f9 547 led2 = 1;
mleksio 1:2be292bd43f9 548 }
mleksio 1:2be292bd43f9 549
mleksio 1:2be292bd43f9 550 if( ScheduleNextTx == true )
mleksio 1:2be292bd43f9 551 {
mleksio 1:2be292bd43f9 552 ScheduleNextTx = false;
mleksio 1:2be292bd43f9 553
mleksio 1:2be292bd43f9 554 if( ComplianceTest.Running == true )
mleksio 1:2be292bd43f9 555 {
mleksio 1:2be292bd43f9 556 TxNextPacket = true;
mleksio 1:2be292bd43f9 557 }
mleksio 1:2be292bd43f9 558 else
mleksio 1:2be292bd43f9 559 {
mleksio 1:2be292bd43f9 560 // Schedule next packet transmission
mleksio 1:2be292bd43f9 561 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
mleksio 1:2be292bd43f9 562 TxNextPacketTimer.attach_us(OnTxNextPacketTimerEvent, TxDutyCycleTime);
mleksio 1:2be292bd43f9 563 }
mleksio 1:2be292bd43f9 564 }
mleksio 1:2be292bd43f9 565
mleksio 1:2be292bd43f9 566 if( trySendingFrameAgain == true )
mleksio 1:2be292bd43f9 567 {
mleksio 1:2be292bd43f9 568 trySendingFrameAgain = SendFrame( );
mleksio 1:2be292bd43f9 569 }
mleksio 1:2be292bd43f9 570 if( TxNextPacket == true )
mleksio 1:2be292bd43f9 571 {
mleksio 1:2be292bd43f9 572 TxNextPacket = false;
mleksio 1:2be292bd43f9 573
mleksio 1:2be292bd43f9 574 PrepareTxFrame( AppPort );
mleksio 1:2be292bd43f9 575
mleksio 1:2be292bd43f9 576 // Switch LED 1 ON
mleksio 1:2be292bd43f9 577 led1 = 1;
mleksio 1:2be292bd43f9 578 Led1Timer.attach_us(OnLed1TimerEvent, LED1_TIMER_TIMEOUT);
mleksio 1:2be292bd43f9 579
mleksio 1:2be292bd43f9 580 trySendingFrameAgain = SendFrame( );
mleksio 1:2be292bd43f9 581 }
mleksio 1:2be292bd43f9 582
mleksio 1:2be292bd43f9 583 //TimerLowPowerHandler( );
mleksio 1:2be292bd43f9 584 }
mleksio 1:2be292bd43f9 585 }
mleksio 1:2be292bd43f9 586
mleksio 1:2be292bd43f9 587 #endif