guiguitant théo / Serre_POLYTEC_Lora

Dependencies:   mbed

Committer:
guiguitt
Date:
Sat Apr 06 11:31:39 2019 +0000
Revision:
1:c6548df8c4e0
Parent:
0:3fc4a1072bca
Child:
2:e3ff1ae9ee16
code serre polytech et Lora

Who changed what in which revision?

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