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:
dudmuck
Date:
Tue Aug 16 00:16:25 2016 +0000
Revision:
8:7b1d5fb9cf72
Parent:
7:3173f0508a98
added IKS01A1 temperature sensing

Who changed what in which revision?

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