Amir Chaudhary / Mbed 2 deprecated humidity-temp-pressure

Dependencies:   mbed LoRaWAN-lib SX1276Lib

Committer:
uss1994
Date:
Mon Oct 25 18:00:03 2021 +0000
Revision:
10:f3b1186fc0b0
Parent:
9:ee9dcbb9708d
Child:
11:7a7913d47ca6
temp/humidity/pressure w/ watchdog

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