for testing STM32L476 Nucleo-64 + Semtech SX1276RF1IAS

Dependencies:   LoRaWAN-demo-76 mbed LoRaWAN-lib SX1276Lib

Fork of LoRaWAN-demo-76 by Semtech

Committer:
rukudias
Date:
Sat Feb 25 14:28:52 2017 +0000
Revision:
9:acdb961c138c
Parent:
7:3173f0508a98
STM32L476 Nucleo-64 + Semtech SX1276RF1IAS hello world app

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