Sending IKS01A1 temperature sensor to LoRaWAN port-5 uplink

Dependencies:   X_NUCLEO_IKS01A1 mbed LoRaWAN-lib SX1276Lib

Fork of LoRaWAN-demo-76 by Semtech

Use IKS01A1 sensor shield with SX1272 shield or SX1276 shield.

Sends temperature sensor to LoRaWAN uplink port 5.


Remove SB22 and SB23 from IKS01A1 before using

SB28 conflicts with DIO0 on radio. (TxDone RxDone)

SB22 conflicts with RxTx on radio. (antenna switch)

Committer:
mluis
Date:
Tue Oct 20 13:23:35 2015 +0000
Revision:
0:92bca02df485
Child:
1:352f608c3337
LoRaWAN-demo project creation using LoRaWAN-lib library

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 0:92bca02df485 20
mluis 0:92bca02df485 21 #include "SerialDisplay.h"
mluis 0:92bca02df485 22
mluis 0:92bca02df485 23 /*!
mluis 0:92bca02df485 24 * When set to 1 the application uses the Over-the-Air activation procedure
mluis 0:92bca02df485 25 * When set to 0 the application uses the Personalization activation procedure
mluis 0:92bca02df485 26 */
mluis 0:92bca02df485 27 #define OVER_THE_AIR_ACTIVATION 1
mluis 0:92bca02df485 28
mluis 0:92bca02df485 29 /*!
mluis 0:92bca02df485 30 * Indicates if the end-device is to be connected to a private or public network
mluis 0:92bca02df485 31 */
mluis 0:92bca02df485 32 #define LORAWAN_PUBLIC_NETWORK true
mluis 0:92bca02df485 33
mluis 0:92bca02df485 34 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 35
mluis 0:92bca02df485 36 /*!
mluis 0:92bca02df485 37 * Join requests trials duty cycle.
mluis 0:92bca02df485 38 */
mluis 0:92bca02df485 39 #define OVER_THE_AIR_ACTIVATION_DUTYCYCLE 10000000 // 10 [s] value in us
mluis 0:92bca02df485 40
mluis 0:92bca02df485 41 /*!
mluis 0:92bca02df485 42 * Mote device IEEE EUI
mluis 0:92bca02df485 43 *
mluis 0:92bca02df485 44 * \remark must be written as a little endian value (reverse order of normal reading)
mluis 0:92bca02df485 45 */
mluis 0:92bca02df485 46 #define LORAWAN_DEVICE_EUI { 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 }
mluis 0:92bca02df485 47
mluis 0:92bca02df485 48 /*!
mluis 0:92bca02df485 49 * Application IEEE EUI
mluis 0:92bca02df485 50 *
mluis 0:92bca02df485 51 * \remark must be written as a little endian value (reverse order of normal reading)
mluis 0:92bca02df485 52 */
mluis 0:92bca02df485 53 #define LORAWAN_APPLICATION_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
mluis 0:92bca02df485 54
mluis 0:92bca02df485 55 /*!
mluis 0:92bca02df485 56 * AES encryption/decryption cipher application key
mluis 0:92bca02df485 57 */
mluis 0:92bca02df485 58 #define LORAWAN_APPLICATION_KEY { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00 }
mluis 0:92bca02df485 59
mluis 0:92bca02df485 60 #else
mluis 0:92bca02df485 61
mluis 0:92bca02df485 62 /*!
mluis 0:92bca02df485 63 * Current network ID
mluis 0:92bca02df485 64 */
mluis 0:92bca02df485 65 #define LORAWAN_NETWORK_ID ( uint32_t )0
mluis 0:92bca02df485 66
mluis 0:92bca02df485 67 /*!
mluis 0:92bca02df485 68 * Device address on the network
mluis 0:92bca02df485 69 *
mluis 0:92bca02df485 70 * \remark must be written as a big endian value (normal reading order)
mluis 0:92bca02df485 71 */
mluis 0:92bca02df485 72 #define LORAWAN_DEVICE_ADDRESS ( uint32_t )0x12345678
mluis 0:92bca02df485 73
mluis 0:92bca02df485 74 /*!
mluis 0:92bca02df485 75 * AES encryption/decryption cipher network session key
mluis 0:92bca02df485 76 */
mluis 0:92bca02df485 77 #define LORAWAN_NWKSKEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
mluis 0:92bca02df485 78
mluis 0:92bca02df485 79 /*!
mluis 0:92bca02df485 80 * AES encryption/decryption cipher application session key
mluis 0:92bca02df485 81 */
mluis 0:92bca02df485 82 #define LORAWAN_APPSKEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
mluis 0:92bca02df485 83
mluis 0:92bca02df485 84 #endif
mluis 0:92bca02df485 85
mluis 0:92bca02df485 86 /*!
mluis 0:92bca02df485 87 * Defines the application data transmission duty cycle
mluis 0:92bca02df485 88 */
mluis 0:92bca02df485 89 #define APP_TX_DUTYCYCLE 5000000 // 5 [s] value in us
mluis 0:92bca02df485 90 #define APP_TX_DUTYCYCLE_RND 1000000 // 1 [s] value in us
mluis 0:92bca02df485 91
mluis 0:92bca02df485 92 /*!
mluis 0:92bca02df485 93 * LoRaWAN confirmed messages
mluis 0:92bca02df485 94 */
mluis 0:92bca02df485 95 #define LORAWAN_CONFIRMED_MSG_ON true
mluis 0:92bca02df485 96
mluis 0:92bca02df485 97 /*!
mluis 0:92bca02df485 98 * LoRaWAN Adaptative Data Rate
mluis 0:92bca02df485 99 *
mluis 0:92bca02df485 100 * \remark Please note that when ADR is enabled the end-device should be static
mluis 0:92bca02df485 101 */
mluis 0:92bca02df485 102 #define LORAWAN_ADR_ON 1
mluis 0:92bca02df485 103
mluis 0:92bca02df485 104 /*!
mluis 0:92bca02df485 105 * LoRaWAN ETSI duty cycle control enable/disable
mluis 0:92bca02df485 106 *
mluis 0:92bca02df485 107 * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
mluis 0:92bca02df485 108 */
mluis 0:92bca02df485 109 #define LORAWAN_DUTYCYCLE_ON false
mluis 0:92bca02df485 110
mluis 0:92bca02df485 111 /*!
mluis 0:92bca02df485 112 * LoRaWAN application port
mluis 0:92bca02df485 113 */
mluis 0:92bca02df485 114 #define LORAWAN_APP_PORT 15
mluis 0:92bca02df485 115
mluis 0:92bca02df485 116 /*!
mluis 0:92bca02df485 117 * User application data buffer size
mluis 0:92bca02df485 118 */
mluis 0:92bca02df485 119 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
mluis 0:92bca02df485 120 #define LORAWAN_APP_DATA_SIZE 6
mluis 0:92bca02df485 121
mluis 0:92bca02df485 122 #else
mluis 0:92bca02df485 123 #define LORAWAN_APP_DATA_SIZE 1
mluis 0:92bca02df485 124
mluis 0:92bca02df485 125 #endif
mluis 0:92bca02df485 126
mluis 0:92bca02df485 127 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 128
mluis 0:92bca02df485 129 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
mluis 0:92bca02df485 130 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
mluis 0:92bca02df485 131 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
mluis 0:92bca02df485 132
mluis 0:92bca02df485 133 #else
mluis 0:92bca02df485 134
mluis 0:92bca02df485 135 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
mluis 0:92bca02df485 136 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
mluis 0:92bca02df485 137
mluis 0:92bca02df485 138 #endif
mluis 0:92bca02df485 139
mluis 0:92bca02df485 140 /*!
mluis 0:92bca02df485 141 * Indicates if the MAC layer has already joined a network.
mluis 0:92bca02df485 142 */
mluis 0:92bca02df485 143 static bool IsNetworkJoined = false;
mluis 0:92bca02df485 144 static bool IsNetworkJoinedStatusUpdate = false;
mluis 0:92bca02df485 145
mluis 0:92bca02df485 146 /*!
mluis 0:92bca02df485 147 * User application data
mluis 0:92bca02df485 148 */
mluis 0:92bca02df485 149 static uint8_t AppData[LORAWAN_APP_DATA_SIZE];
mluis 0:92bca02df485 150
mluis 0:92bca02df485 151 /*!
mluis 0:92bca02df485 152 * Defines the application data transmission duty cycle
mluis 0:92bca02df485 153 */
mluis 0:92bca02df485 154 static uint32_t TxDutyCycleTime;
mluis 0:92bca02df485 155
mluis 0:92bca02df485 156 TimerEvent_t TxNextPacketTimer;
mluis 0:92bca02df485 157
mluis 0:92bca02df485 158 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 159
mluis 0:92bca02df485 160 /*!
mluis 0:92bca02df485 161 * Defines the join request timer
mluis 0:92bca02df485 162 */
mluis 0:92bca02df485 163 TimerEvent_t JoinReqTimer;
mluis 0:92bca02df485 164
mluis 0:92bca02df485 165 #endif
mluis 0:92bca02df485 166
mluis 0:92bca02df485 167 /*!
mluis 0:92bca02df485 168 * Indicates if a new packet can be sent
mluis 0:92bca02df485 169 */
mluis 0:92bca02df485 170 static bool TxNextPacket = true;
mluis 0:92bca02df485 171 static bool ScheduleNextTx = false;
mluis 0:92bca02df485 172
mluis 0:92bca02df485 173 static bool AppLedStateOn = false;
mluis 0:92bca02df485 174
mluis 0:92bca02df485 175 static LoRaMacEvent_t LoRaMacEvents;
mluis 0:92bca02df485 176
mluis 0:92bca02df485 177 TimerEvent_t Led1Timer;
mluis 0:92bca02df485 178 volatile bool Led1StateChanged = false;
mluis 0:92bca02df485 179
mluis 0:92bca02df485 180 TimerEvent_t Led2Timer;
mluis 0:92bca02df485 181 volatile bool Led2StateChanged = false;
mluis 0:92bca02df485 182
mluis 0:92bca02df485 183 volatile bool Led3StateChanged = false;
mluis 0:92bca02df485 184
mluis 0:92bca02df485 185 volatile bool LinkStatusUpdated = false;
mluis 0:92bca02df485 186
mluis 0:92bca02df485 187 struct sLoRaMacUplinkStatus
mluis 0:92bca02df485 188 {
mluis 0:92bca02df485 189 uint8_t Acked;
mluis 0:92bca02df485 190 int8_t Datarate;
mluis 0:92bca02df485 191 uint16_t UplinkCounter;
mluis 0:92bca02df485 192 uint8_t Port;
mluis 0:92bca02df485 193 uint8_t *Buffer;
mluis 0:92bca02df485 194 uint8_t BufferSize;
mluis 0:92bca02df485 195 }LoRaMacUplinkStatus;
mluis 0:92bca02df485 196
mluis 0:92bca02df485 197 struct sLoRaMacDownlinkStatus
mluis 0:92bca02df485 198 {
mluis 0:92bca02df485 199 int16_t Rssi;
mluis 0:92bca02df485 200 int8_t Snr;
mluis 0:92bca02df485 201 uint16_t DownlinkCounter;
mluis 0:92bca02df485 202 bool RxData;
mluis 0:92bca02df485 203 uint8_t Port;
mluis 0:92bca02df485 204 uint8_t *Buffer;
mluis 0:92bca02df485 205 uint8_t BufferSize;
mluis 0:92bca02df485 206 }LoRaMacDownlinkStatus;
mluis 0:92bca02df485 207
mluis 0:92bca02df485 208 void SerialDisplayRefresh( void )
mluis 0:92bca02df485 209 {
mluis 0:92bca02df485 210 SerialDisplayInit( );
mluis 0:92bca02df485 211 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:92bca02df485 212
mluis 0:92bca02df485 213 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:92bca02df485 214 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 0:92bca02df485 215 SerialDisplayUpdateDevAddr( LORAWAN_DEVICE_ADDRESS );
mluis 0:92bca02df485 216 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 0:92bca02df485 217 SerialDisplayUpdateKey( 13, AppSKey );
mluis 0:92bca02df485 218 #else
mluis 0:92bca02df485 219 SerialDisplayUpdateEui( 5, DevEui );
mluis 0:92bca02df485 220 SerialDisplayUpdateEui( 6, AppEui );
mluis 0:92bca02df485 221 SerialDisplayUpdateKey( 7, AppKey );
mluis 0:92bca02df485 222 #endif
mluis 0:92bca02df485 223 SerialDisplayUpdateNetworkIsJoined( IsNetworkJoined );
mluis 0:92bca02df485 224
mluis 0:92bca02df485 225 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:92bca02df485 226 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 0:92bca02df485 227 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:92bca02df485 228
mluis 0:92bca02df485 229 SerialDisplayUpdateLedState( 3, AppLedStateOn );
mluis 0:92bca02df485 230 }
mluis 0:92bca02df485 231
mluis 0:92bca02df485 232 void SerialRxProcess( void )
mluis 0:92bca02df485 233 {
mluis 0:92bca02df485 234 if( SerialDisplayReadable( ) == true )
mluis 0:92bca02df485 235 {
mluis 0:92bca02df485 236 switch( SerialDisplayGetChar( ) )
mluis 0:92bca02df485 237 {
mluis 0:92bca02df485 238 case 'R':
mluis 0:92bca02df485 239 case 'r':
mluis 0:92bca02df485 240 // Refresh Serial screen
mluis 0:92bca02df485 241 SerialDisplayRefresh( );
mluis 0:92bca02df485 242 break;
mluis 0:92bca02df485 243 default:
mluis 0:92bca02df485 244 break;
mluis 0:92bca02df485 245 }
mluis 0:92bca02df485 246 }
mluis 0:92bca02df485 247 }
mluis 0:92bca02df485 248
mluis 0:92bca02df485 249 /*!
mluis 0:92bca02df485 250 * Prepares the frame buffer to be sent
mluis 0:92bca02df485 251 */
mluis 0:92bca02df485 252 static void PrepareTxFrame( uint8_t port )
mluis 0:92bca02df485 253 {
mluis 0:92bca02df485 254 AppData[0] = AppLedStateOn;
mluis 0:92bca02df485 255 #if ( LORAWAN_CONFIRMED_MSG_ON == true )
mluis 0:92bca02df485 256 AppData[1] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
mluis 0:92bca02df485 257 AppData[2] = LoRaMacDownlinkStatus.DownlinkCounter;
mluis 0:92bca02df485 258 AppData[3] = LoRaMacDownlinkStatus.Rssi >> 8;
mluis 0:92bca02df485 259 AppData[4] = LoRaMacDownlinkStatus.Rssi;
mluis 0:92bca02df485 260 AppData[5] = LoRaMacDownlinkStatus.Snr;
mluis 0:92bca02df485 261 #endif
mluis 0:92bca02df485 262 }
mluis 0:92bca02df485 263
mluis 0:92bca02df485 264 static void ProcessRxFrame( LoRaMacEventFlags_t *flags, LoRaMacEventInfo_t *info )
mluis 0:92bca02df485 265 {
mluis 0:92bca02df485 266 switch( info->RxPort ) // Check Rx port number
mluis 0:92bca02df485 267 {
mluis 0:92bca02df485 268 case 1: // The application LED can be controlled on port 1 or 2
mluis 0:92bca02df485 269 case 2:
mluis 0:92bca02df485 270 if( info->RxBufferSize == 1 )
mluis 0:92bca02df485 271 {
mluis 0:92bca02df485 272 AppLedStateOn = info->RxBuffer[0] & 0x01;
mluis 0:92bca02df485 273 Led3StateChanged = true;
mluis 0:92bca02df485 274 }
mluis 0:92bca02df485 275 break;
mluis 0:92bca02df485 276 default:
mluis 0:92bca02df485 277 break;
mluis 0:92bca02df485 278 }
mluis 0:92bca02df485 279 }
mluis 0:92bca02df485 280
mluis 0:92bca02df485 281 static bool SendFrame( void )
mluis 0:92bca02df485 282 {
mluis 0:92bca02df485 283 uint8_t sendFrameStatus = 0;
mluis 0:92bca02df485 284
mluis 0:92bca02df485 285 LoRaMacUplinkStatus.Acked = false;
mluis 0:92bca02df485 286 LoRaMacUplinkStatus.Port = LORAWAN_APP_PORT;
mluis 0:92bca02df485 287 LoRaMacUplinkStatus.Buffer = AppData;
mluis 0:92bca02df485 288 LoRaMacUplinkStatus.BufferSize = LORAWAN_APP_DATA_SIZE;
mluis 0:92bca02df485 289
mluis 0:92bca02df485 290 SerialDisplayUpdateFrameType( LORAWAN_CONFIRMED_MSG_ON );
mluis 0:92bca02df485 291 #if( LORAWAN_CONFIRMED_MSG_ON == false )
mluis 0:92bca02df485 292 sendFrameStatus = LoRaMacSendFrame( LORAWAN_APP_PORT, AppData, LORAWAN_APP_DATA_SIZE );
mluis 0:92bca02df485 293 #else
mluis 0:92bca02df485 294 sendFrameStatus = LoRaMacSendConfirmedFrame( LORAWAN_APP_PORT, AppData, LORAWAN_APP_DATA_SIZE, 8 );
mluis 0:92bca02df485 295 #endif
mluis 0:92bca02df485 296 switch( sendFrameStatus )
mluis 0:92bca02df485 297 {
mluis 0:92bca02df485 298 case 5: // NO_FREE_CHANNEL
mluis 0:92bca02df485 299 // Try again later
mluis 0:92bca02df485 300 return true;
mluis 0:92bca02df485 301 default:
mluis 0:92bca02df485 302 return false;
mluis 0:92bca02df485 303 }
mluis 0:92bca02df485 304 }
mluis 0:92bca02df485 305
mluis 0:92bca02df485 306 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 307
mluis 0:92bca02df485 308 /*!
mluis 0:92bca02df485 309 * \brief Function executed on JoinReq Timeout event
mluis 0:92bca02df485 310 */
mluis 0:92bca02df485 311 static void OnJoinReqTimerEvent( void )
mluis 0:92bca02df485 312 {
mluis 0:92bca02df485 313 TimerStop( &JoinReqTimer );
mluis 0:92bca02df485 314 TxNextPacket = true;
mluis 0:92bca02df485 315 }
mluis 0:92bca02df485 316
mluis 0:92bca02df485 317 #endif
mluis 0:92bca02df485 318
mluis 0:92bca02df485 319 /*!
mluis 0:92bca02df485 320 * \brief Function executed on TxNextPacket Timeout event
mluis 0:92bca02df485 321 */
mluis 0:92bca02df485 322 static void OnTxNextPacketTimerEvent( void )
mluis 0:92bca02df485 323 {
mluis 0:92bca02df485 324 TimerStop( &TxNextPacketTimer );
mluis 0:92bca02df485 325 TxNextPacket = true;
mluis 0:92bca02df485 326 }
mluis 0:92bca02df485 327
mluis 0:92bca02df485 328 /*!
mluis 0:92bca02df485 329 * \brief Function executed on Led 1 Timeout event
mluis 0:92bca02df485 330 */
mluis 0:92bca02df485 331 static void OnLed1TimerEvent( void )
mluis 0:92bca02df485 332 {
mluis 0:92bca02df485 333 TimerStop( &Led1Timer );
mluis 0:92bca02df485 334 Led1StateChanged = true;
mluis 0:92bca02df485 335 }
mluis 0:92bca02df485 336
mluis 0:92bca02df485 337 /*!
mluis 0:92bca02df485 338 * \brief Function executed on Led 2 Timeout event
mluis 0:92bca02df485 339 */
mluis 0:92bca02df485 340 static void OnLed2TimerEvent( void )
mluis 0:92bca02df485 341 {
mluis 0:92bca02df485 342 TimerStop( &Led2Timer );
mluis 0:92bca02df485 343 Led2StateChanged = true;
mluis 0:92bca02df485 344 }
mluis 0:92bca02df485 345
mluis 0:92bca02df485 346 /*!
mluis 0:92bca02df485 347 * \brief Function to be executed on MAC layer event
mluis 0:92bca02df485 348 */
mluis 0:92bca02df485 349 static void OnMacEvent( LoRaMacEventFlags_t *flags, LoRaMacEventInfo_t *info )
mluis 0:92bca02df485 350 {
mluis 0:92bca02df485 351 if( flags->Bits.JoinAccept == 1 )
mluis 0:92bca02df485 352 {
mluis 0:92bca02df485 353 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 354 TimerStop( &JoinReqTimer );
mluis 0:92bca02df485 355 #endif
mluis 0:92bca02df485 356 IsNetworkJoined = true;
mluis 0:92bca02df485 357 IsNetworkJoinedStatusUpdate = true;
mluis 0:92bca02df485 358 }
mluis 0:92bca02df485 359 else
mluis 0:92bca02df485 360 {
mluis 0:92bca02df485 361 if( flags->Bits.Tx == 1 )
mluis 0:92bca02df485 362 {
mluis 0:92bca02df485 363 }
mluis 0:92bca02df485 364
mluis 0:92bca02df485 365 if( flags->Bits.Rx == 1 )
mluis 0:92bca02df485 366 {
mluis 0:92bca02df485 367 if( flags->Bits.RxData == true )
mluis 0:92bca02df485 368 {
mluis 0:92bca02df485 369 ProcessRxFrame( flags, info );
mluis 0:92bca02df485 370 }
mluis 0:92bca02df485 371
mluis 0:92bca02df485 372 LoRaMacDownlinkStatus.Rssi = info->RxRssi;
mluis 0:92bca02df485 373 if( info->RxSnr & 0x80 ) // The SNR sign bit is 1
mluis 0:92bca02df485 374 {
mluis 0:92bca02df485 375 // Invert and divide by 4
mluis 0:92bca02df485 376 LoRaMacDownlinkStatus.Snr = ( ( ~info->RxSnr + 1 ) & 0xFF ) >> 2;
mluis 0:92bca02df485 377 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
mluis 0:92bca02df485 378 }
mluis 0:92bca02df485 379 else
mluis 0:92bca02df485 380 {
mluis 0:92bca02df485 381 // Divide by 4
mluis 0:92bca02df485 382 LoRaMacDownlinkStatus.Snr = ( info->RxSnr & 0xFF ) >> 2;
mluis 0:92bca02df485 383 }
mluis 0:92bca02df485 384 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 0:92bca02df485 385 LoRaMacDownlinkStatus.RxData = flags->Bits.RxData;
mluis 0:92bca02df485 386 LoRaMacDownlinkStatus.Port = info->RxPort;
mluis 0:92bca02df485 387 LoRaMacDownlinkStatus.Buffer = info->RxBuffer;
mluis 0:92bca02df485 388 LoRaMacDownlinkStatus.BufferSize = info->RxBufferSize;
mluis 0:92bca02df485 389
mluis 0:92bca02df485 390 LoRaMacUplinkStatus.Acked = info->TxAckReceived;
mluis 0:92bca02df485 391 LoRaMacUplinkStatus.Datarate = info->TxDatarate;
mluis 0:92bca02df485 392 LoRaMacUplinkStatus.UplinkCounter = LoRaMacGetUpLinkCounter( ) - 1;
mluis 0:92bca02df485 393
mluis 0:92bca02df485 394 LinkStatusUpdated = true;
mluis 0:92bca02df485 395 TimerStart( &Led2Timer );
mluis 0:92bca02df485 396 }
mluis 0:92bca02df485 397 }
mluis 0:92bca02df485 398 // Schedule a new transmission
mluis 0:92bca02df485 399 ScheduleNextTx = true;
mluis 0:92bca02df485 400 }
mluis 0:92bca02df485 401
mluis 0:92bca02df485 402 /**
mluis 0:92bca02df485 403 * Main application entry point.
mluis 0:92bca02df485 404 */
mluis 0:92bca02df485 405 int main( void )
mluis 0:92bca02df485 406 {
mluis 0:92bca02df485 407 SerialDisplayInit( );
mluis 0:92bca02df485 408
mluis 0:92bca02df485 409 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 410 uint8_t sendFrameStatus = 0;
mluis 0:92bca02df485 411 #endif
mluis 0:92bca02df485 412 bool trySendingFrameAgain = false;
mluis 0:92bca02df485 413
mluis 0:92bca02df485 414 BoardInit( );
mluis 0:92bca02df485 415
mluis 0:92bca02df485 416 LoRaMacEvents.MacEvent = OnMacEvent;
mluis 0:92bca02df485 417 LoRaMacInit( &LoRaMacEvents, &BoardGetBatterieLevel );
mluis 0:92bca02df485 418
mluis 0:92bca02df485 419 IsNetworkJoined = false;
mluis 0:92bca02df485 420
mluis 0:92bca02df485 421 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:92bca02df485 422
mluis 0:92bca02df485 423 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:92bca02df485 424 LoRaMacInitNwkIds( LORAWAN_NETWORK_ID, LORAWAN_DEVICE_ADDRESS, NwkSKey, AppSKey );
mluis 0:92bca02df485 425 IsNetworkJoined = true;
mluis 0:92bca02df485 426
mluis 0:92bca02df485 427 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 0:92bca02df485 428 SerialDisplayUpdateDevAddr( LORAWAN_DEVICE_ADDRESS );
mluis 0:92bca02df485 429 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 0:92bca02df485 430 SerialDisplayUpdateKey( 13, AppSKey );
mluis 0:92bca02df485 431 #else
mluis 0:92bca02df485 432 // Sends a JoinReq Command every 5 seconds until the network is joined
mluis 0:92bca02df485 433 TimerInit( &JoinReqTimer, OnJoinReqTimerEvent );
mluis 0:92bca02df485 434 TimerSetValue( &JoinReqTimer, OVER_THE_AIR_ACTIVATION_DUTYCYCLE );
mluis 0:92bca02df485 435
mluis 0:92bca02df485 436 SerialDisplayUpdateEui( 5, DevEui );
mluis 0:92bca02df485 437 SerialDisplayUpdateEui( 6, AppEui );
mluis 0:92bca02df485 438 SerialDisplayUpdateKey( 7, AppKey );
mluis 0:92bca02df485 439
mluis 0:92bca02df485 440 #endif
mluis 0:92bca02df485 441
mluis 0:92bca02df485 442 SerialDisplayUpdateNetworkIsJoined( IsNetworkJoined );
mluis 0:92bca02df485 443
mluis 0:92bca02df485 444 TxNextPacket = true;
mluis 0:92bca02df485 445 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
mluis 0:92bca02df485 446
mluis 0:92bca02df485 447 TimerInit( &Led1Timer, OnLed1TimerEvent );
mluis 0:92bca02df485 448 TimerSetValue( &Led1Timer, 500000 );
mluis 0:92bca02df485 449
mluis 0:92bca02df485 450 TimerInit( &Led2Timer, OnLed2TimerEvent );
mluis 0:92bca02df485 451 TimerSetValue( &Led2Timer, 500000 );
mluis 0:92bca02df485 452
mluis 0:92bca02df485 453 LoRaMacSetAdrOn( LORAWAN_ADR_ON );
mluis 0:92bca02df485 454 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 0:92bca02df485 455 LoRaMacSetPublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:92bca02df485 456
mluis 0:92bca02df485 457 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:92bca02df485 458 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 0:92bca02df485 459 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:92bca02df485 460
mluis 0:92bca02df485 461 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 0:92bca02df485 462
mluis 0:92bca02df485 463 while( 1 )
mluis 0:92bca02df485 464 {
mluis 0:92bca02df485 465 while( IsNetworkJoined == false )
mluis 0:92bca02df485 466 {
mluis 0:92bca02df485 467 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 0:92bca02df485 468 if( TxNextPacket == true )
mluis 0:92bca02df485 469 {
mluis 0:92bca02df485 470 TxNextPacket = false;
mluis 0:92bca02df485 471
mluis 0:92bca02df485 472 sendFrameStatus = LoRaMacJoinReq( DevEui, AppEui, AppKey );
mluis 0:92bca02df485 473 switch( sendFrameStatus )
mluis 0:92bca02df485 474 {
mluis 0:92bca02df485 475 case 1: // BUSY
mluis 0:92bca02df485 476 break;
mluis 0:92bca02df485 477 case 0: // OK
mluis 0:92bca02df485 478 case 2: // NO_NETWORK_JOINED
mluis 0:92bca02df485 479 case 3: // LENGTH_PORT_ERROR
mluis 0:92bca02df485 480 case 4: // MAC_CMD_ERROR
mluis 0:92bca02df485 481 case 6: // DEVICE_OFF
mluis 0:92bca02df485 482 default:
mluis 0:92bca02df485 483 // Relaunch timer for next trial
mluis 0:92bca02df485 484 TimerStart( &JoinReqTimer );
mluis 0:92bca02df485 485 break;
mluis 0:92bca02df485 486 }
mluis 0:92bca02df485 487 }
mluis 0:92bca02df485 488 SerialRxProcess( );
mluis 0:92bca02df485 489 #endif
mluis 0:92bca02df485 490 }
mluis 0:92bca02df485 491
mluis 0:92bca02df485 492 SerialRxProcess( );
mluis 0:92bca02df485 493
mluis 0:92bca02df485 494 if( IsNetworkJoinedStatusUpdate == true )
mluis 0:92bca02df485 495 {
mluis 0:92bca02df485 496 IsNetworkJoinedStatusUpdate = false;
mluis 0:92bca02df485 497 SerialDisplayUpdateNetworkIsJoined( IsNetworkJoined );
mluis 0:92bca02df485 498 }
mluis 0:92bca02df485 499 if( Led1StateChanged == true )
mluis 0:92bca02df485 500 {
mluis 0:92bca02df485 501 Led1StateChanged = false;
mluis 0:92bca02df485 502 SerialDisplayUpdateLedState( 1, 0 );
mluis 0:92bca02df485 503 }
mluis 0:92bca02df485 504 if( Led2StateChanged == true )
mluis 0:92bca02df485 505 {
mluis 0:92bca02df485 506 Led2StateChanged = false;
mluis 0:92bca02df485 507 SerialDisplayUpdateLedState( 2, 0 );
mluis 0:92bca02df485 508 }
mluis 0:92bca02df485 509 if( Led3StateChanged == true )
mluis 0:92bca02df485 510 {
mluis 0:92bca02df485 511 Led3StateChanged = false;
mluis 0:92bca02df485 512 SerialDisplayUpdateLedState( 3, AppLedStateOn );
mluis 0:92bca02df485 513 }
mluis 0:92bca02df485 514 if( LinkStatusUpdated == true )
mluis 0:92bca02df485 515 {
mluis 0:92bca02df485 516 LinkStatusUpdated = false;
mluis 0:92bca02df485 517 SerialDisplayUpdateLedState( 2, 1 );
mluis 0:92bca02df485 518 SerialDisplayUpdateUplink( LoRaMacUplinkStatus.Acked, LoRaMacUplinkStatus.Datarate, LoRaMacUplinkStatus.UplinkCounter, LoRaMacUplinkStatus.Port, LoRaMacUplinkStatus.Buffer, LoRaMacUplinkStatus.BufferSize );
mluis 0:92bca02df485 519 SerialDisplayUpdateDownlink( LoRaMacDownlinkStatus.RxData, LoRaMacDownlinkStatus.Rssi, LoRaMacDownlinkStatus.Snr, LoRaMacDownlinkStatus.DownlinkCounter, LoRaMacDownlinkStatus.Port, LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
mluis 0:92bca02df485 520 }
mluis 0:92bca02df485 521
mluis 0:92bca02df485 522 if( ScheduleNextTx == true )
mluis 0:92bca02df485 523 {
mluis 0:92bca02df485 524 ScheduleNextTx = false;
mluis 0:92bca02df485 525 // Schedule next packet transmission
mluis 0:92bca02df485 526 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
mluis 0:92bca02df485 527 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
mluis 0:92bca02df485 528 TimerStart( &TxNextPacketTimer );
mluis 0:92bca02df485 529 }
mluis 0:92bca02df485 530
mluis 0:92bca02df485 531 if( trySendingFrameAgain == true )
mluis 0:92bca02df485 532 {
mluis 0:92bca02df485 533 trySendingFrameAgain = SendFrame( );
mluis 0:92bca02df485 534 }
mluis 0:92bca02df485 535 if( TxNextPacket == true )
mluis 0:92bca02df485 536 {
mluis 0:92bca02df485 537 TxNextPacket = false;
mluis 0:92bca02df485 538
mluis 0:92bca02df485 539 SerialDisplayUpdateDonwlinkRxData( false );
mluis 0:92bca02df485 540
mluis 0:92bca02df485 541 PrepareTxFrame( LORAWAN_APP_PORT );
mluis 0:92bca02df485 542
mluis 0:92bca02df485 543 SerialDisplayUpdateLedState( 1, 1 );
mluis 0:92bca02df485 544 TimerStart( &Led1Timer );
mluis 0:92bca02df485 545
mluis 0:92bca02df485 546 trySendingFrameAgain = SendFrame( );
mluis 0:92bca02df485 547
mluis 0:92bca02df485 548 SerialDisplayUpdateUplink( LoRaMacUplinkStatus.Acked, LoRaMacUplinkStatus.Datarate, LoRaMacUplinkStatus.UplinkCounter, LoRaMacUplinkStatus.Port, LoRaMacUplinkStatus.Buffer, LoRaMacUplinkStatus.BufferSize );
mluis 0:92bca02df485 549 }
mluis 0:92bca02df485 550 }
mluis 0:92bca02df485 551 }