LoRaWAN demo application using grove peripherals generating Cayenne LPP

Dependencies:   lorawan1v1

radio chip selection

Radio chip driver is not included, because two options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

Grove peripherals -> Cayenne demo

Read LoRaWAN-1.1 page for configuration instructions.

This project adds support for Murata discovery board, in addition to LoRa shields on NUCLEO boards.

Use with sx1272 shield with grove peripherals connected:

D8 D9: ButtonRX TXA3 A4: TempSense
D6 D7:SCL SDA : LEDA1 A2: Pot

Button

Sends two different payload types: short press (under 1 sec)
long press: held down > 1 sec.

serial console keys

115200bps, 8N1
Enter key not used
Keys '0' to '3': cayenne channel number
'0': pot (rotary sensor)
'1': temperature
'2': digital out
'3': analog out

DevEUI configuration

For use on networks which force you to use DevEUI defined by network, comment out HardwareIDtoDevEUI().
HardwareIDtoDevEUI() obtains DevEUI from the CPU unique hardware serial number. However, some networks may force you to use their DevEUI value.

Committer:
Wayne Roberts
Date:
Wed Jul 25 09:55:31 2018 -0700
Revision:
11:09556b27dbce
Parent:
8:efe6002910df
mbed-os to branch latest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:62e456e60083 1 /*
Wayne Roberts 0:62e456e60083 2 / _____) _ | |
Wayne Roberts 0:62e456e60083 3 ( (____ _____ ____ _| |_ _____ ____| |__
Wayne Roberts 0:62e456e60083 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
Wayne Roberts 0:62e456e60083 5 _____) ) ____| | | || |_| ____( (___| | | |
Wayne Roberts 0:62e456e60083 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
Wayne Roberts 0:62e456e60083 7 (C)2018 Semtech
Wayne Roberts 0:62e456e60083 8
Wayne Roberts 0:62e456e60083 9 Description: LoRaMac classB device implementation
Wayne Roberts 0:62e456e60083 10
Wayne Roberts 0:62e456e60083 11 License: Revised BSD License, see LICENSE.TXT file include in the project
Wayne Roberts 0:62e456e60083 12
Wayne Roberts 0:62e456e60083 13 */
Wayne Roberts 0:62e456e60083 14
wroberts@semtech.com 5:53cd6c24a4ab 15 #include "LoRaMac1v1.h"
Wayne Roberts 0:62e456e60083 16 #include "SerialDisplay.h"
Wayne Roberts 0:62e456e60083 17 #include "LoRaMacString.h"
Wayne Roberts 0:62e456e60083 18 #ifdef ENABLE_VT100
Wayne Roberts 0:62e456e60083 19
Wayne Roberts 0:62e456e60083 20 /*!
Wayne Roberts 0:62e456e60083 21 * Defines the application data transmission duty cycle. 5s, value in [ms].
Wayne Roberts 0:62e456e60083 22 */
Wayne Roberts 0:62e456e60083 23 #define APP_TX_DUTYCYCLE_us 8000000
Wayne Roberts 0:62e456e60083 24
Wayne Roberts 0:62e456e60083 25 /*!
Wayne Roberts 0:62e456e60083 26 * Defines a random delay for application data transmission duty cycle. 1s,
Wayne Roberts 0:62e456e60083 27 * value in [ms].
Wayne Roberts 0:62e456e60083 28 */
Wayne Roberts 0:62e456e60083 29 #define APP_TX_DUTYCYCLE_RND_us 2000000
Wayne Roberts 0:62e456e60083 30
Wayne Roberts 0:62e456e60083 31 /*!
Wayne Roberts 0:62e456e60083 32 * Default datarate
Wayne Roberts 0:62e456e60083 33 */
Wayne Roberts 0:62e456e60083 34
Wayne Roberts 0:62e456e60083 35 #if defined( USE_BAND_ARIB_8CH )
Wayne Roberts 0:62e456e60083 36 #define LORAWAN_DEFAULT_DATARATE DR_3
Wayne Roberts 0:62e456e60083 37 #else
Wayne Roberts 0:62e456e60083 38 #define LORAWAN_DEFAULT_DATARATE DR_0
Wayne Roberts 0:62e456e60083 39 #endif
Wayne Roberts 0:62e456e60083 40
Wayne Roberts 0:62e456e60083 41 /*!
Wayne Roberts 0:62e456e60083 42 * LoRaWAN confirmed messages
Wayne Roberts 0:62e456e60083 43 */
Wayne Roberts 4:72b8fdc9878e 44 #define LORAWAN_CONFIRMED_MSG_ON false
Wayne Roberts 0:62e456e60083 45
Wayne Roberts 0:62e456e60083 46 /*!
Wayne Roberts 0:62e456e60083 47 * LoRaWAN Adaptive Data Rate
Wayne Roberts 0:62e456e60083 48 *
Wayne Roberts 0:62e456e60083 49 * \remark Please note that when ADR is enabled the end-device should be static
Wayne Roberts 0:62e456e60083 50 */
Wayne Roberts 0:62e456e60083 51 #define LORAWAN_ADR_ON 1
Wayne Roberts 0:62e456e60083 52
Wayne Roberts 0:62e456e60083 53 #if defined( USE_BAND_868 )
Wayne Roberts 0:62e456e60083 54
Wayne Roberts 0:62e456e60083 55 /*!
Wayne Roberts 0:62e456e60083 56 * LoRaWAN ETSI duty cycle control enable/disable
Wayne Roberts 0:62e456e60083 57 *
Wayne Roberts 0:62e456e60083 58 * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
Wayne Roberts 0:62e456e60083 59 */
Wayne Roberts 0:62e456e60083 60 #define LORAWAN_DUTYCYCLE_ON false
Wayne Roberts 0:62e456e60083 61
Wayne Roberts 0:62e456e60083 62 #define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP 1
Wayne Roberts 0:62e456e60083 63
Wayne Roberts 0:62e456e60083 64 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
Wayne Roberts 0:62e456e60083 65
Wayne Roberts 0:62e456e60083 66 #define LC4 { 867100000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
Wayne Roberts 0:62e456e60083 67 #define LC5 { 867300000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
Wayne Roberts 0:62e456e60083 68 #define LC6 { 867500000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
Wayne Roberts 0:62e456e60083 69 #define LC7 { 867700000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
Wayne Roberts 0:62e456e60083 70 #define LC8 { 867900000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
Wayne Roberts 0:62e456e60083 71 #define LC9 { 868800000, { ( ( DR_7 << 4 ) | DR_7 ) }, 2 }
Wayne Roberts 0:62e456e60083 72 #define LC10 { 868300000, { ( ( DR_6 << 4 ) | DR_6 ) }, 1 }
Wayne Roberts 0:62e456e60083 73
Wayne Roberts 0:62e456e60083 74 #endif
Wayne Roberts 0:62e456e60083 75
Wayne Roberts 0:62e456e60083 76 #endif
Wayne Roberts 0:62e456e60083 77
Wayne Roberts 0:62e456e60083 78 /*!
Wayne Roberts 0:62e456e60083 79 * LoRaWAN application port
Wayne Roberts 0:62e456e60083 80 */
Wayne Roberts 0:62e456e60083 81 #define LORAWAN_APP_PORT 2
Wayne Roberts 0:62e456e60083 82
Wayne Roberts 0:62e456e60083 83 /*!
Wayne Roberts 0:62e456e60083 84 * User application data buffer size
Wayne Roberts 0:62e456e60083 85 */
Wayne Roberts 0:62e456e60083 86 #define LORAWAN_APP_DATA_SIZE 3
Wayne Roberts 0:62e456e60083 87
Wayne Roberts 0:62e456e60083 88
Wayne Roberts 0:62e456e60083 89 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 90 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
Wayne Roberts 0:62e456e60083 91 static const uint8_t JoinEui[] = LORAWAN_JOIN_EUI;
Wayne Roberts 0:62e456e60083 92 static const uint8_t NwkKey[] = LORAWAN_ROOT_NWKKEY;
Wayne Roberts 0:62e456e60083 93 #ifdef LORAWAN_ROOT_APPKEY
Wayne Roberts 0:62e456e60083 94 static const uint8_t AppKey[] = LORAWAN_ROOT_APPKEY;
Wayne Roberts 0:62e456e60083 95 #endif
Wayne Roberts 0:62e456e60083 96 #else
Wayne Roberts 0:62e456e60083 97 static const uint8_t FNwkSIntKey[] = LORAWAN_FNwkSIntKey;
Wayne Roberts 0:62e456e60083 98 static const uint8_t AppSKey[] = LORAWAN_APPSKEY;
Wayne Roberts 0:62e456e60083 99 static const uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
Wayne Roberts 0:62e456e60083 100 #if defined(LORAWAN_SNwkSIntKey) && defined(LORAWAN_NwkSEncKey)
Wayne Roberts 0:62e456e60083 101 static const uint8_t SNwkSIntKey[] = LORAWAN_SNwkSIntKey;
Wayne Roberts 0:62e456e60083 102 static const uint8_t NwkSEncKey[] = LORAWAN_NwkSEncKey;
Wayne Roberts 0:62e456e60083 103 #endif
Wayne Roberts 0:62e456e60083 104 #endif
Wayne Roberts 0:62e456e60083 105
Wayne Roberts 0:62e456e60083 106 /*!
Wayne Roberts 0:62e456e60083 107 * Application port
Wayne Roberts 0:62e456e60083 108 */
Wayne Roberts 0:62e456e60083 109 static uint8_t AppPort = LORAWAN_APP_PORT;
Wayne Roberts 0:62e456e60083 110
Wayne Roberts 0:62e456e60083 111 /*!
Wayne Roberts 0:62e456e60083 112 * User application data size
Wayne Roberts 0:62e456e60083 113 */
Wayne Roberts 0:62e456e60083 114 static uint8_t gAppDataSize = LORAWAN_APP_DATA_SIZE;
Wayne Roberts 0:62e456e60083 115
Wayne Roberts 0:62e456e60083 116 /*!
Wayne Roberts 0:62e456e60083 117 * User application data buffer size
Wayne Roberts 0:62e456e60083 118 */
Wayne Roberts 0:62e456e60083 119 #define LORAWAN_APP_DATA_MAX_SIZE 64
Wayne Roberts 0:62e456e60083 120
Wayne Roberts 0:62e456e60083 121 /*!
Wayne Roberts 0:62e456e60083 122 * User application data
Wayne Roberts 0:62e456e60083 123 */
Wayne Roberts 0:62e456e60083 124 static uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
Wayne Roberts 0:62e456e60083 125
Wayne Roberts 0:62e456e60083 126 /*!
Wayne Roberts 0:62e456e60083 127 * Indicates if the node is sending confirmed or unconfirmed messages
Wayne Roberts 0:62e456e60083 128 */
Wayne Roberts 0:62e456e60083 129 static uint8_t gIsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
Wayne Roberts 0:62e456e60083 130
Wayne Roberts 0:62e456e60083 131 /*!
Wayne Roberts 0:62e456e60083 132 * Timer to handle the application data transmission duty cycle
Wayne Roberts 0:62e456e60083 133 *
Wayne Roberts 0:62e456e60083 134 */
Wayne Roberts 0:62e456e60083 135 LowPowerTimeout tx_timeout;
Wayne Roberts 0:62e456e60083 136
Wayne Roberts 0:62e456e60083 137 /*!
Wayne Roberts 0:62e456e60083 138 * Indicates if a new packet can be sent
Wayne Roberts 0:62e456e60083 139 */
Wayne Roberts 0:62e456e60083 140 static volatile struct {
Wayne Roberts 0:62e456e60083 141 uint8_t gmi : 1;
Wayne Roberts 0:62e456e60083 142 uint8_t gmc : 1;
Wayne Roberts 0:62e456e60083 143 } flags;
Wayne Roberts 0:62e456e60083 144
Wayne Roberts 0:62e456e60083 145 /*!
Wayne Roberts 0:62e456e60083 146 * Device states
Wayne Roberts 0:62e456e60083 147 */
Wayne Roberts 0:62e456e60083 148 volatile enum eDevicState
Wayne Roberts 0:62e456e60083 149 {
Wayne Roberts 0:62e456e60083 150 /* 0 */ DEVICE_STATE_INIT = 0,
Wayne Roberts 0:62e456e60083 151 /* 1 */ DEVICE_STATE_SEND,
Wayne Roberts 0:62e456e60083 152 /* 2 */ DEVICE_STATE_TRIGGER,
Wayne Roberts 0:62e456e60083 153 /* 3 */ DEVICE_STATE_SLEEP,
Wayne Roberts 0:62e456e60083 154 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 155 /* 4 */ DEVICE_STATE_JOIN,
Wayne Roberts 0:62e456e60083 156 /* 5 */ DEVICE_STATE_JOIN_OK
Wayne Roberts 0:62e456e60083 157 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 158 } DeviceState, WakeUpState;
Wayne Roberts 0:62e456e60083 159
Wayne Roberts 0:62e456e60083 160 #if defined(TARGET_MOTE_L152RC) && !defined(TARGET_FF_ARDUINO)
Wayne Roberts 0:62e456e60083 161 #define TARGET_FF_ARDUINO
Wayne Roberts 0:62e456e60083 162 #endif
Wayne Roberts 0:62e456e60083 163
Wayne Roberts 0:62e456e60083 164 #if defined(TARGET_FF_ARDUINO)
Wayne Roberts 6:795461780e10 165 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 6:795461780e10 166 #define LED_GREEN LED1
Wayne Roberts 6:795461780e10 167 #define LED_RED2 LED2 // next to LD7
Wayne Roberts 6:795461780e10 168 #define LED_BLUE LED3
Wayne Roberts 6:795461780e10 169 #define LED_RED4 LED4
Wayne Roberts 6:795461780e10 170 InterruptIn button_pin(USER_BUTTON);
Wayne Roberts 6:795461780e10 171 #define BUTTON_PRESSED 0
Wayne Roberts 6:795461780e10 172 DigitalOut extLed(LED_RED4);
Wayne Roberts 6:795461780e10 173 AnalogIn ain_temp(PA_0);
Wayne Roberts 6:795461780e10 174 #else
Wayne Roberts 6:795461780e10 175 InterruptIn button_pin(D8);
Wayne Roberts 6:795461780e10 176 #define BUTTON_PRESSED 1
Wayne Roberts 6:795461780e10 177 DigitalOut extLed(D15);
Wayne Roberts 6:795461780e10 178 AnalogIn ain_pot(A1);
Wayne Roberts 6:795461780e10 179 AnalogIn ain_temp(A3);
Wayne Roberts 6:795461780e10 180 #endif
Wayne Roberts 0:62e456e60083 181 #endif /* TARGET_FF_ARDUINO */
Wayne Roberts 0:62e456e60083 182
Wayne Roberts 0:62e456e60083 183 #if defined(TARGET_FF_MORPHO) && !defined(TARGET_DISCO_L072CZ_LRWAN1)
Wayne Roberts 0:62e456e60083 184 #define JUMPER_ENABLE
Wayne Roberts 0:62e456e60083 185 #endif /* */
Wayne Roberts 0:62e456e60083 186
Wayne Roberts 0:62e456e60083 187 #ifdef JUMPER_ENABLE
Wayne Roberts 0:62e456e60083 188 #define TX_INTERVAL_US 15000000
Wayne Roberts 0:62e456e60083 189 DigitalOut jumper_out(PC_10);
Wayne Roberts 0:62e456e60083 190 InterruptIn jumper_in(PC_12);
Wayne Roberts 0:62e456e60083 191 #endif /* JUMPER_ENABLE */
Wayne Roberts 0:62e456e60083 192
Wayne Roberts 0:62e456e60083 193 uint8_t c_ch;
Wayne Roberts 0:62e456e60083 194 us_timestamp_t buttonStartAt;
Wayne Roberts 0:62e456e60083 195 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 8:efe6002910df 196 PwmOut pwm(PA_0);
Wayne Roberts 8:efe6002910df 197 #define _PWM_
Wayne Roberts 8:efe6002910df 198 #elif defined(TARGET_FF_ARDUINO) && defined(TARGET_FAMILY_STM32)
Wayne Roberts 8:efe6002910df 199 PwmOut pwm(PB_11);
Wayne Roberts 8:efe6002910df 200 #define _PWM_
Wayne Roberts 8:efe6002910df 201 #elif defined(TARGET_NRF52_DK)
Wayne Roberts 8:efe6002910df 202 //PwmOut pwm(P0_0);
Wayne Roberts 8:efe6002910df 203 #undef _PWM_
Wayne Roberts 8:efe6002910df 204 #else
Wayne Roberts 8:efe6002910df 205 #error define_PWM_pin_for_this_target
Wayne Roberts 8:efe6002910df 206 #endif /* */
Wayne Roberts 0:62e456e60083 207 volatile int cayenne_ack_ch;
Wayne Roberts 0:62e456e60083 208
Wayne Roberts 0:62e456e60083 209 /*!
Wayne Roberts 0:62e456e60083 210 * LoRaWAN compliance tests support data
Wayne Roberts 0:62e456e60083 211 */
Wayne Roberts 0:62e456e60083 212 struct ComplianceTest_s
Wayne Roberts 0:62e456e60083 213 {
Wayne Roberts 0:62e456e60083 214 bool Running;
Wayne Roberts 0:62e456e60083 215 uint8_t State;
Wayne Roberts 0:62e456e60083 216 bool IsTxConfirmed;
Wayne Roberts 0:62e456e60083 217 uint8_t AppPort;
Wayne Roberts 0:62e456e60083 218 uint8_t AppDataSize;
Wayne Roberts 0:62e456e60083 219 uint8_t *AppDataBuffer;
Wayne Roberts 0:62e456e60083 220 uint16_t DownLinkCounter;
Wayne Roberts 0:62e456e60083 221 bool LinkCheck;
Wayne Roberts 0:62e456e60083 222 uint8_t DemodMargin;
Wayne Roberts 0:62e456e60083 223 uint8_t NbGateways;
Wayne Roberts 0:62e456e60083 224 }ComplianceTest;
Wayne Roberts 0:62e456e60083 225
Wayne Roberts 0:62e456e60083 226 McpsIndication_t gmi;
Wayne Roberts 0:62e456e60083 227
Wayne Roberts 0:62e456e60083 228 McpsConfirm_t gmc;
Wayne Roberts 0:62e456e60083 229
Wayne Roberts 0:62e456e60083 230 #ifdef JUMPER_ENABLE
Wayne Roberts 0:62e456e60083 231 void autoUplink()
Wayne Roberts 0:62e456e60083 232 {
Wayne Roberts 0:62e456e60083 233 if (jumper_in.read() == 1) {
Wayne Roberts 0:62e456e60083 234 tx_timeout.attach_us(autoUplink, TX_INTERVAL_US);
Wayne Roberts 0:62e456e60083 235 }
Wayne Roberts 0:62e456e60083 236
Wayne Roberts 0:62e456e60083 237 c_ch = 0xff;
Wayne Roberts 0:62e456e60083 238 DeviceState = DEVICE_STATE_SEND;
Wayne Roberts 0:62e456e60083 239 }
Wayne Roberts 0:62e456e60083 240
Wayne Roberts 0:62e456e60083 241 void jumper_callback()
Wayne Roberts 0:62e456e60083 242 {
Wayne Roberts 0:62e456e60083 243 tx_timeout.attach_us(autoUplink, TX_INTERVAL_US);
Wayne Roberts 0:62e456e60083 244 }
Wayne Roberts 0:62e456e60083 245 #endif /* JUMPER_ENABLE */
Wayne Roberts 0:62e456e60083 246
Wayne Roberts 0:62e456e60083 247 static void
Wayne Roberts 0:62e456e60083 248 clearIndications()
Wayne Roberts 0:62e456e60083 249 {
Wayne Roberts 0:62e456e60083 250 vt.SetCursorPos(ROW_MCPS_CONF, 1);
Wayne Roberts 0:62e456e60083 251 vt.printf("\e[K");
Wayne Roberts 0:62e456e60083 252 vt.SetCursorPos(ROW_MCPS_IND, 1);
Wayne Roberts 0:62e456e60083 253 vt.printf("\e[K");
Wayne Roberts 0:62e456e60083 254 vt.SetCursorPos(ROW_MLME_IND, 1);
Wayne Roberts 0:62e456e60083 255 vt.printf("\e[K");
Wayne Roberts 0:62e456e60083 256 vt.SetCursorPos(ROW_MLME_CONF, 1);
Wayne Roberts 0:62e456e60083 257 vt.printf("\e[K");
Wayne Roberts 0:62e456e60083 258
Wayne Roberts 0:62e456e60083 259 vt.SetCursorPos(ROW_MIC+3, 1);
Wayne Roberts 0:62e456e60083 260 vt.printf("\e[K");
Wayne Roberts 0:62e456e60083 261 }
Wayne Roberts 0:62e456e60083 262
Wayne Roberts 0:62e456e60083 263 #define LPP_DIGITAL_INPUT 0 // 1 byte
Wayne Roberts 0:62e456e60083 264 #define LPP_DIGITAL_OUTPUT 1 // 1 byte
Wayne Roberts 0:62e456e60083 265 #define LPP_ANALOG_INPUT 2 // 2 bytes, 0.01 signed
Wayne Roberts 0:62e456e60083 266 #define LPP_ANALOG_OUTPUT 3 // 2 bytes, 0.01 signed
Wayne Roberts 0:62e456e60083 267 #define LPP_LUMINOSITY 101 // 2 bytes, 1 lux unsigned
Wayne Roberts 0:62e456e60083 268 #define LPP_PRESENCE 102 // 1 byte, 1
Wayne Roberts 0:62e456e60083 269 #define LPP_TEMPERATURE 103 // 2 bytes, 0.1°C signed
Wayne Roberts 0:62e456e60083 270 #define LPP_RELATIVE_HUMIDITY 104 // 1 byte, 0.5% unsigned
Wayne Roberts 0:62e456e60083 271 #define LPP_ACCELEROMETER 113 // 2 bytes per axis, 0.001G
Wayne Roberts 0:62e456e60083 272 #define LPP_BAROMETRIC_PRESSURE 115 // 2 bytes 0.1 hPa Unsigned
Wayne Roberts 0:62e456e60083 273 #define LPP_GYROMETER 134 // 2 bytes per axis, 0.01 °/s
Wayne Roberts 0:62e456e60083 274 #define LPP_GPS 136 // 3 byte lon/lat 0.0001 °, 3 bytes alt 0.01m
Wayne Roberts 0:62e456e60083 275
Wayne Roberts 0:62e456e60083 276
Wayne Roberts 0:62e456e60083 277 // Data ID + Data Type + Data Size
Wayne Roberts 0:62e456e60083 278 #define LPP_DIGITAL_INPUT_SIZE 3
Wayne Roberts 0:62e456e60083 279 #define LPP_DIGITAL_OUTPUT_SIZE 3
Wayne Roberts 0:62e456e60083 280 #define LPP_ANALOG_INPUT_SIZE 4
Wayne Roberts 0:62e456e60083 281 #define LPP_ANALOG_OUTPUT_SIZE 4
Wayne Roberts 0:62e456e60083 282 #define LPP_LUMINOSITY_SIZE 4
Wayne Roberts 0:62e456e60083 283 #define LPP_PRESENCE_SIZE 3
Wayne Roberts 0:62e456e60083 284 #define LPP_TEMPERATURE_SIZE 4
Wayne Roberts 0:62e456e60083 285 #define LPP_RELATIVE_HUMIDITY_SIZE 3
Wayne Roberts 0:62e456e60083 286 #define LPP_ACCELEROMETER_SIZE 8
Wayne Roberts 0:62e456e60083 287 #define LPP_BAROMETRIC_PRESSURE_SIZE 4
Wayne Roberts 0:62e456e60083 288 #define LPP_GYROMETER_SIZE 8
Wayne Roberts 0:62e456e60083 289 #define LPP_GPS_SIZE 11
Wayne Roberts 0:62e456e60083 290
Wayne Roberts 0:62e456e60083 291 #define CAYENNE_CH_DOUT 2
Wayne Roberts 0:62e456e60083 292 #define CAYENNE_CH_AOUT 3
Wayne Roberts 0:62e456e60083 293 #define CAYENNE_CH_TEMP 0
Wayne Roberts 6:795461780e10 294 #ifndef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 6:795461780e10 295 #define CAYENNE_CH_POT 1
Wayne Roberts 6:795461780e10 296 #endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
Wayne Roberts 4:72b8fdc9878e 297 #define CAYENNE_CH_DIN 4
Wayne Roberts 0:62e456e60083 298
Wayne Roberts 0:62e456e60083 299
Wayne Roberts 0:62e456e60083 300 const unsigned R0 = 100000;
Wayne Roberts 0:62e456e60083 301 const unsigned B = 4275;
Wayne Roberts 4:72b8fdc9878e 302 volatile bool dout_downlink;
Wayne Roberts 0:62e456e60083 303
Wayne Roberts 0:62e456e60083 304 /*!
Wayne Roberts 0:62e456e60083 305 * \brief Prepares the payload of the frame
Wayne Roberts 0:62e456e60083 306 */
Wayne Roberts 0:62e456e60083 307 static void PrepareTxFrame( uint8_t port )
Wayne Roberts 0:62e456e60083 308 {
Wayne Roberts 0:62e456e60083 309 uint16_t u16, rot;
Wayne Roberts 0:62e456e60083 310 float t, f, R;
Wayne Roberts 4:72b8fdc9878e 311 static uint8_t seq;
Wayne Roberts 0:62e456e60083 312
Wayne Roberts 0:62e456e60083 313 if (c_ch != 0xff) {
Wayne Roberts 0:62e456e60083 314 gAppDataSize = 0;
Wayne Roberts 0:62e456e60083 315 AppData[gAppDataSize++] = c_ch;
Wayne Roberts 0:62e456e60083 316 switch (c_ch) {
Wayne Roberts 0:62e456e60083 317 case CAYENNE_CH_TEMP:
Wayne Roberts 0:62e456e60083 318 AppData[gAppDataSize++] = LPP_TEMPERATURE;
Wayne Roberts 6:795461780e10 319 u16 = ain_temp.read_u16() >> 4;
Wayne Roberts 0:62e456e60083 320 R = 4096.0 / u16 - 1.0;
Wayne Roberts 0:62e456e60083 321 R = R0 * R;
Wayne Roberts 0:62e456e60083 322 t = 1.0/(log(R/R0)/B+1/298.15)-273.15;
Wayne Roberts 0:62e456e60083 323 u16 = t * 10; // 0.1C per bit
Wayne Roberts 0:62e456e60083 324 AppData[gAppDataSize++] = u16 >> 8;
Wayne Roberts 0:62e456e60083 325 AppData[gAppDataSize++] = u16;
Wayne Roberts 0:62e456e60083 326 break;
Wayne Roberts 6:795461780e10 327 #ifndef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 0:62e456e60083 328 case CAYENNE_CH_POT:
Wayne Roberts 0:62e456e60083 329 AppData[gAppDataSize++] = LPP_ANALOG_INPUT;
Wayne Roberts 6:795461780e10 330 u16 = ain_pot.read_u16(); // pot (rotary angle)
Wayne Roberts 0:62e456e60083 331 f = u16 / 198.6; // scale 65535/3.3 to 0.01v per bit
Wayne Roberts 0:62e456e60083 332 rot = (uint16_t) f;
Wayne Roberts 0:62e456e60083 333 AppData[gAppDataSize++] = rot >> 8;
Wayne Roberts 0:62e456e60083 334 AppData[gAppDataSize++] = rot;
Wayne Roberts 0:62e456e60083 335 break;
Wayne Roberts 6:795461780e10 336 #endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
Wayne Roberts 0:62e456e60083 337 case CAYENNE_CH_DOUT:
Wayne Roberts 0:62e456e60083 338 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
Wayne Roberts 0:62e456e60083 339 AppData[gAppDataSize++] = extLed.read();
Wayne Roberts 0:62e456e60083 340 break;
Wayne Roberts 0:62e456e60083 341 case CAYENNE_CH_AOUT:
Wayne Roberts 0:62e456e60083 342 AppData[gAppDataSize++] = LPP_ANALOG_OUTPUT;
Wayne Roberts 8:efe6002910df 343 #ifdef _PWM_
Wayne Roberts 0:62e456e60083 344 u16 = pwm.read() * 100;
Wayne Roberts 8:efe6002910df 345 #endif /* _PWM_ */
Wayne Roberts 0:62e456e60083 346 AppData[gAppDataSize++] = u16 >> 8;
Wayne Roberts 0:62e456e60083 347 AppData[gAppDataSize++] = u16;
Wayne Roberts 0:62e456e60083 348 break;
Wayne Roberts 0:62e456e60083 349 }
Wayne Roberts 0:62e456e60083 350 return;
Wayne Roberts 0:62e456e60083 351 } else if (cayenne_ack_ch != -1) {
Wayne Roberts 0:62e456e60083 352 switch (cayenne_ack_ch) {
Wayne Roberts 0:62e456e60083 353 case CAYENNE_CH_DOUT:
Wayne Roberts 0:62e456e60083 354 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
Wayne Roberts 0:62e456e60083 355 AppData[gAppDataSize++] = extLed.read();
Wayne Roberts 0:62e456e60083 356 break;
Wayne Roberts 0:62e456e60083 357 case CAYENNE_CH_AOUT:
Wayne Roberts 0:62e456e60083 358 AppData[gAppDataSize++] = LPP_ANALOG_OUTPUT;
Wayne Roberts 8:efe6002910df 359 #ifdef _PWM_
Wayne Roberts 0:62e456e60083 360 u16 = pwm.read() * 100;
Wayne Roberts 8:efe6002910df 361 #endif /* _PWM_ */
Wayne Roberts 0:62e456e60083 362 AppData[gAppDataSize++] = u16 >> 8;
Wayne Roberts 0:62e456e60083 363 AppData[gAppDataSize++] = u16;
Wayne Roberts 0:62e456e60083 364 break;
Wayne Roberts 0:62e456e60083 365 }
Wayne Roberts 0:62e456e60083 366 cayenne_ack_ch = -1;
Wayne Roberts 0:62e456e60083 367 }
Wayne Roberts 0:62e456e60083 368
Wayne Roberts 6:795461780e10 369 while (button_pin.read() == BUTTON_PRESSED) {
Wayne Roberts 0:62e456e60083 370 us_timestamp_t duration = LoRaMacReadTimer() - buttonStartAt;
Wayne Roberts 0:62e456e60083 371 if (duration > 1000000) {
Wayne Roberts 0:62e456e60083 372 gAppDataSize = 0;
Wayne Roberts 0:62e456e60083 373 AppData[gAppDataSize++] = CAYENNE_CH_DOUT;
Wayne Roberts 0:62e456e60083 374 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
Wayne Roberts 0:62e456e60083 375 AppData[gAppDataSize++] = extLed.read();
Wayne Roberts 0:62e456e60083 376 return;
Wayne Roberts 0:62e456e60083 377 }
Wayne Roberts 0:62e456e60083 378 }
Wayne Roberts 0:62e456e60083 379
Wayne Roberts 0:62e456e60083 380 switch( port ) {
Wayne Roberts 0:62e456e60083 381 case LORAWAN_APP_PORT:
Wayne Roberts 0:62e456e60083 382 gAppDataSize = 0;
Wayne Roberts 0:62e456e60083 383 AppData[gAppDataSize++] = CAYENNE_CH_TEMP;
Wayne Roberts 0:62e456e60083 384 AppData[gAppDataSize++] = LPP_TEMPERATURE;
Wayne Roberts 6:795461780e10 385
Wayne Roberts 6:795461780e10 386 //vt.SetCursorPos( ROW_END-1, 1 );
Wayne Roberts 6:795461780e10 387
Wayne Roberts 6:795461780e10 388 u16 = ain_temp.read_u16() >> 4;
Wayne Roberts 6:795461780e10 389 //vt.printf("0x%03x ", u16);
Wayne Roberts 0:62e456e60083 390 R = 4096.0 / u16 - 1.0;
Wayne Roberts 0:62e456e60083 391 R = R0 * R;
Wayne Roberts 0:62e456e60083 392 t = 1.0/(log(R/R0)/B+1/298.15)-273.15;
Wayne Roberts 6:795461780e10 393 //vt.printf("%.1fC\e[K", t);
Wayne Roberts 0:62e456e60083 394 u16 = t * 10; // 0.1C per bit
Wayne Roberts 0:62e456e60083 395 AppData[gAppDataSize++] = u16 >> 8;
Wayne Roberts 0:62e456e60083 396 AppData[gAppDataSize++] = u16;
Wayne Roberts 6:795461780e10 397 #ifndef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 0:62e456e60083 398 AppData[gAppDataSize++] = CAYENNE_CH_POT;
Wayne Roberts 0:62e456e60083 399 AppData[gAppDataSize++] = LPP_ANALOG_INPUT;
Wayne Roberts 6:795461780e10 400 u16 = ain_pot.read_u16(); // pot (rotary angle)
Wayne Roberts 0:62e456e60083 401 f = u16 / 198.6; // scale 65535/3.3 to 0.01v per bit
Wayne Roberts 0:62e456e60083 402 rot = (uint16_t) f;
Wayne Roberts 0:62e456e60083 403 AppData[gAppDataSize++] = rot >> 8;
Wayne Roberts 0:62e456e60083 404 AppData[gAppDataSize++] = rot;
Wayne Roberts 6:795461780e10 405 #endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
Wayne Roberts 0:62e456e60083 406
Wayne Roberts 4:72b8fdc9878e 407 /* limited packet size: either ack downlink, or send sequence number */
Wayne Roberts 4:72b8fdc9878e 408 if (dout_downlink) {
Wayne Roberts 4:72b8fdc9878e 409 AppData[gAppDataSize++] = CAYENNE_CH_DOUT;
Wayne Roberts 4:72b8fdc9878e 410 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
Wayne Roberts 4:72b8fdc9878e 411 AppData[gAppDataSize++] = extLed.read();
Wayne Roberts 4:72b8fdc9878e 412 dout_downlink = false;
Wayne Roberts 4:72b8fdc9878e 413 } else {
Wayne Roberts 4:72b8fdc9878e 414 AppData[gAppDataSize++] = CAYENNE_CH_DIN;
Wayne Roberts 4:72b8fdc9878e 415 AppData[gAppDataSize++] = LPP_DIGITAL_INPUT;
Wayne Roberts 4:72b8fdc9878e 416 AppData[gAppDataSize++] = seq++;
Wayne Roberts 4:72b8fdc9878e 417 }
Wayne Roberts 0:62e456e60083 418 break;
Wayne Roberts 0:62e456e60083 419 case 224:
Wayne Roberts 0:62e456e60083 420 if( ComplianceTest.LinkCheck == true ) {
Wayne Roberts 0:62e456e60083 421 ComplianceTest.LinkCheck = false;
Wayne Roberts 0:62e456e60083 422 gAppDataSize = 3;
Wayne Roberts 0:62e456e60083 423 AppData[0] = 5;
Wayne Roberts 0:62e456e60083 424 AppData[1] = ComplianceTest.DemodMargin;
Wayne Roberts 0:62e456e60083 425 AppData[2] = ComplianceTest.NbGateways;
Wayne Roberts 0:62e456e60083 426 ComplianceTest.State = 1;
Wayne Roberts 0:62e456e60083 427 } else {
Wayne Roberts 0:62e456e60083 428 switch( ComplianceTest.State ) {
Wayne Roberts 0:62e456e60083 429 case 4:
Wayne Roberts 0:62e456e60083 430 ComplianceTest.State = 1;
Wayne Roberts 0:62e456e60083 431 break;
Wayne Roberts 0:62e456e60083 432 case 1:
Wayne Roberts 0:62e456e60083 433 gAppDataSize = 2;
Wayne Roberts 0:62e456e60083 434 AppData[0] = ComplianceTest.DownLinkCounter >> 8;
Wayne Roberts 0:62e456e60083 435 AppData[1] = ComplianceTest.DownLinkCounter;
Wayne Roberts 0:62e456e60083 436 break;
Wayne Roberts 0:62e456e60083 437 }
Wayne Roberts 0:62e456e60083 438 }
Wayne Roberts 0:62e456e60083 439 break;
Wayne Roberts 0:62e456e60083 440 default:
Wayne Roberts 0:62e456e60083 441 break;
Wayne Roberts 0:62e456e60083 442 }
Wayne Roberts 0:62e456e60083 443 }
Wayne Roberts 0:62e456e60083 444
Wayne Roberts 3:fc23bbc14475 445
Wayne Roberts 0:62e456e60083 446 /*!
Wayne Roberts 0:62e456e60083 447 * \brief Prepares the payload of the frame
Wayne Roberts 0:62e456e60083 448 *
Wayne Roberts 0:62e456e60083 449 * \retval [0: frame could be send, 1: error]
Wayne Roberts 0:62e456e60083 450 */
Wayne Roberts 0:62e456e60083 451 static LoRaMacStatus_t SendFrame(bool IsTxConfirmed, uint8_t AppDataSize)
Wayne Roberts 0:62e456e60083 452 {
Wayne Roberts 0:62e456e60083 453 LoRaMacStatus_t status;
Wayne Roberts 0:62e456e60083 454 char str[64];
Wayne Roberts 0:62e456e60083 455 McpsReq_t mcpsReq;
Wayne Roberts 0:62e456e60083 456 LoRaMacTxInfo_t txInfo;
Wayne Roberts 0:62e456e60083 457
Wayne Roberts 0:62e456e60083 458 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
Wayne Roberts 0:62e456e60083 459 {
Wayne Roberts 0:62e456e60083 460 // Send empty frame in order to flush MAC commands
Wayne Roberts 0:62e456e60083 461 mcpsReq.Type = MCPS_UNCONFIRMED;
Wayne Roberts 0:62e456e60083 462 mcpsReq.Req.fBuffer = NULL;
Wayne Roberts 0:62e456e60083 463 mcpsReq.Req.fBufferSize = 0;
Wayne Roberts 0:62e456e60083 464 mcpsReq.Req.Datarate = LORAWAN_DEFAULT_DATARATE;
Wayne Roberts 0:62e456e60083 465 }
Wayne Roberts 0:62e456e60083 466 else
Wayne Roberts 0:62e456e60083 467 {
Wayne Roberts 0:62e456e60083 468 SerialDisplayUpdateFrameType(IsTxConfirmed);
Wayne Roberts 0:62e456e60083 469 if( IsTxConfirmed == false )
Wayne Roberts 0:62e456e60083 470 {
Wayne Roberts 0:62e456e60083 471 mcpsReq.Type = MCPS_UNCONFIRMED;
Wayne Roberts 0:62e456e60083 472 mcpsReq.Req.fPort = AppPort;
Wayne Roberts 0:62e456e60083 473 mcpsReq.Req.fBuffer = AppData;
Wayne Roberts 0:62e456e60083 474 mcpsReq.Req.fBufferSize = AppDataSize;
Wayne Roberts 0:62e456e60083 475 mcpsReq.Req.Datarate = LORAWAN_DEFAULT_DATARATE;
Wayne Roberts 0:62e456e60083 476 }
Wayne Roberts 0:62e456e60083 477 else
Wayne Roberts 0:62e456e60083 478 {
Wayne Roberts 0:62e456e60083 479 mcpsReq.Type = MCPS_CONFIRMED;
Wayne Roberts 0:62e456e60083 480 mcpsReq.Req.fPort = AppPort;
Wayne Roberts 0:62e456e60083 481 mcpsReq.Req.fBuffer = AppData;
Wayne Roberts 0:62e456e60083 482 mcpsReq.Req.fBufferSize = AppDataSize;
Wayne Roberts 0:62e456e60083 483 mcpsReq.Req.Datarate = LORAWAN_DEFAULT_DATARATE;
Wayne Roberts 0:62e456e60083 484 }
Wayne Roberts 0:62e456e60083 485 }
Wayne Roberts 0:62e456e60083 486
Wayne Roberts 0:62e456e60083 487 clearIndications();
Wayne Roberts 0:62e456e60083 488 status = LoRaMacMcpsRequest( &mcpsReq );
Wayne Roberts 0:62e456e60083 489 if (status == LORAMAC_STATUS_OK) {
Wayne Roberts 0:62e456e60083 490 SerialDisplayUplink(mcpsReq.Req.fPort, AppData, mcpsReq.Req.fBufferSize);
Wayne Roberts 0:62e456e60083 491 vt.SetCursorPos( ROW_END, 1 );
Wayne Roberts 0:62e456e60083 492 vt.printf("sendFrame() OK %u\e[K", AppDataSize);
Wayne Roberts 0:62e456e60083 493 } else {
Wayne Roberts 0:62e456e60083 494 LoRaMacStatus_to_string(status, str);
Wayne Roberts 0:62e456e60083 495 vt.SetCursorPos( ROW_END, 1 );
Wayne Roberts 0:62e456e60083 496 vt.printf("sendFrame() %s rx%d\e[K", str, LoRaMacGetRxSlot());
Wayne Roberts 0:62e456e60083 497 }
Wayne Roberts 0:62e456e60083 498
Wayne Roberts 0:62e456e60083 499 return status;
Wayne Roberts 0:62e456e60083 500 } // ..SendFrame()
Wayne Roberts 0:62e456e60083 501
Wayne Roberts 0:62e456e60083 502 /*!
Wayne Roberts 0:62e456e60083 503 * \brief MCPS-Confirm event function
Wayne Roberts 0:62e456e60083 504 *
Wayne Roberts 0:62e456e60083 505 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
Wayne Roberts 0:62e456e60083 506 * containing confirm attributes.
Wayne Roberts 0:62e456e60083 507 */
Wayne Roberts 0:62e456e60083 508 static void McpsConfirm( const McpsConfirm_t *mcpsConfirm )
Wayne Roberts 0:62e456e60083 509 {
Wayne Roberts 0:62e456e60083 510 char str[64];
Wayne Roberts 0:62e456e60083 511
Wayne Roberts 0:62e456e60083 512 vt.SetCursorPos( ROW_MCPS_CONF, 1);
Wayne Roberts 0:62e456e60083 513 vt.printf("McpsConfirm up:%uhz ", mcpsConfirm->UpLinkFreqHz);
Wayne Roberts 0:62e456e60083 514 LoRaMacEventInfoStatus_to_string(mcpsConfirm->Status, str);
Wayne Roberts 0:62e456e60083 515 if (mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK)
Wayne Roberts 0:62e456e60083 516 vt.printf("%s \e[K", str);
Wayne Roberts 0:62e456e60083 517 else
Wayne Roberts 0:62e456e60083 518 vt.printf("\e[31m%s\e[0m \e[K", str);
Wayne Roberts 0:62e456e60083 519
Wayne Roberts 0:62e456e60083 520 if (mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK)
Wayne Roberts 0:62e456e60083 521 {
Wayne Roberts 0:62e456e60083 522 switch( mcpsConfirm->McpsRequest )
Wayne Roberts 0:62e456e60083 523 {
Wayne Roberts 0:62e456e60083 524 case MCPS_UNCONFIRMED:
Wayne Roberts 0:62e456e60083 525 {
Wayne Roberts 0:62e456e60083 526 // Check Datarate
Wayne Roberts 0:62e456e60083 527 // Check TxPower
Wayne Roberts 0:62e456e60083 528 break;
Wayne Roberts 0:62e456e60083 529 }
Wayne Roberts 0:62e456e60083 530 case MCPS_CONFIRMED:
Wayne Roberts 0:62e456e60083 531 {
Wayne Roberts 0:62e456e60083 532 // Check Datarate
Wayne Roberts 0:62e456e60083 533 // Check TxPower
Wayne Roberts 0:62e456e60083 534 // Check AckReceived
Wayne Roberts 0:62e456e60083 535 // Check NbTrials
Wayne Roberts 0:62e456e60083 536 //LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
Wayne Roberts 0:62e456e60083 537 break;
Wayne Roberts 0:62e456e60083 538 }
Wayne Roberts 0:62e456e60083 539 case MCPS_PROPRIETARY:
Wayne Roberts 0:62e456e60083 540 {
Wayne Roberts 0:62e456e60083 541 break;
Wayne Roberts 0:62e456e60083 542 }
Wayne Roberts 0:62e456e60083 543 default:
Wayne Roberts 0:62e456e60083 544 break;
Wayne Roberts 0:62e456e60083 545 }
Wayne Roberts 0:62e456e60083 546 } else {
Wayne Roberts 0:62e456e60083 547 /* fail */
Wayne Roberts 0:62e456e60083 548 }
Wayne Roberts 0:62e456e60083 549 memcpy(&gmc, mcpsConfirm, sizeof(McpsConfirm_t));
Wayne Roberts 0:62e456e60083 550 flags.gmc = true;
Wayne Roberts 0:62e456e60083 551
Wayne Roberts 0:62e456e60083 552 DeviceState = DEVICE_STATE_TRIGGER;
Wayne Roberts 0:62e456e60083 553 } // ..McpsConfirm()
Wayne Roberts 0:62e456e60083 554
Wayne Roberts 0:62e456e60083 555
Wayne Roberts 0:62e456e60083 556 /*!
Wayne Roberts 0:62e456e60083 557 * \brief MCPS-Indication event function
Wayne Roberts 0:62e456e60083 558 *
Wayne Roberts 0:62e456e60083 559 * \param [IN] mcpsIndication - Pointer to the indication structure,
Wayne Roberts 0:62e456e60083 560 * containing indication attributes.
Wayne Roberts 0:62e456e60083 561 */
Wayne Roberts 0:62e456e60083 562 static void McpsIndication( const McpsIndication_t *mcpsIndication )
Wayne Roberts 0:62e456e60083 563 {
Wayne Roberts 0:62e456e60083 564 char str[64];
Wayne Roberts 0:62e456e60083 565
Wayne Roberts 0:62e456e60083 566 memcpy(&gmi, mcpsIndication, sizeof(McpsIndication_t));
Wayne Roberts 0:62e456e60083 567 flags.gmi = true;
Wayne Roberts 0:62e456e60083 568
Wayne Roberts 0:62e456e60083 569 vt.SetCursorPos(ROW_MCPS_CONF, 1);
Wayne Roberts 0:62e456e60083 570 vt.printf("\e[K"); // clear stale mcpsconf if retrying
Wayne Roberts 0:62e456e60083 571
Wayne Roberts 0:62e456e60083 572 vt.SetCursorPos( ROW_MCPS_IND, 0);
Wayne Roberts 2:da3c8d5b3f49 573 vt.printf("McpsIndication rx%d ADR_ACK_CNT:%u ", mcpsIndication->RxSlot, mcpsIndication->ADR_ACK_CNT);
Wayne Roberts 0:62e456e60083 574 if (mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK)
Wayne Roberts 0:62e456e60083 575 {
Wayne Roberts 0:62e456e60083 576 LoRaMacEventInfoStatus_to_string(mcpsIndication->Status, str);
Wayne Roberts 2:da3c8d5b3f49 577 vt.printf("\e[31m%s\e[0m\e[K", str);
Wayne Roberts 0:62e456e60083 578 return;
Wayne Roberts 0:62e456e60083 579 }
Wayne Roberts 2:da3c8d5b3f49 580 vt.printf("OK\e[K");
Wayne Roberts 0:62e456e60083 581
Wayne Roberts 0:62e456e60083 582 switch( mcpsIndication->McpsIndication )
Wayne Roberts 0:62e456e60083 583 {
Wayne Roberts 0:62e456e60083 584 case MCPS_UNCONFIRMED:
Wayne Roberts 0:62e456e60083 585 {
Wayne Roberts 0:62e456e60083 586 break;
Wayne Roberts 0:62e456e60083 587 }
Wayne Roberts 0:62e456e60083 588 case MCPS_CONFIRMED:
Wayne Roberts 0:62e456e60083 589 {
Wayne Roberts 0:62e456e60083 590 /* ack sent by mac layer */
Wayne Roberts 0:62e456e60083 591 break;
Wayne Roberts 0:62e456e60083 592 }
Wayne Roberts 0:62e456e60083 593 case MCPS_PROPRIETARY:
Wayne Roberts 0:62e456e60083 594 {
Wayne Roberts 0:62e456e60083 595 break;
Wayne Roberts 0:62e456e60083 596 }
Wayne Roberts 0:62e456e60083 597 case MCPS_MULTICAST:
Wayne Roberts 0:62e456e60083 598 {
Wayne Roberts 0:62e456e60083 599 break;
Wayne Roberts 0:62e456e60083 600 }
Wayne Roberts 0:62e456e60083 601 default:
Wayne Roberts 0:62e456e60083 602 break;
Wayne Roberts 0:62e456e60083 603 }
Wayne Roberts 0:62e456e60083 604
Wayne Roberts 0:62e456e60083 605 // Check Multicast
Wayne Roberts 0:62e456e60083 606 // Check Port
Wayne Roberts 0:62e456e60083 607 // Check Datarate
Wayne Roberts 0:62e456e60083 608 // Check FramePending
Wayne Roberts 0:62e456e60083 609 // Check Buffer
Wayne Roberts 0:62e456e60083 610 // Check BufferSize
Wayne Roberts 0:62e456e60083 611 // Check Rssi
Wayne Roberts 0:62e456e60083 612 // Check Snr
Wayne Roberts 0:62e456e60083 613 // Check RxSlot
Wayne Roberts 0:62e456e60083 614
Wayne Roberts 0:62e456e60083 615
Wayne Roberts 0:62e456e60083 616 if( ComplianceTest.Running == true )
Wayne Roberts 0:62e456e60083 617 {
Wayne Roberts 0:62e456e60083 618 ComplianceTest.DownLinkCounter++;
Wayne Roberts 0:62e456e60083 619 }
Wayne Roberts 0:62e456e60083 620
Wayne Roberts 0:62e456e60083 621 if( mcpsIndication->RxData == true )
Wayne Roberts 0:62e456e60083 622 {
Wayne Roberts 0:62e456e60083 623 unsigned n;
Wayne Roberts 0:62e456e60083 624 for (n = 0; n < mcpsIndication->BufferSize; n += 4) {
Wayne Roberts 0:62e456e60083 625 uint16_t val = mcpsIndication->Buffer[n+1] << 8;
Wayne Roberts 0:62e456e60083 626 val += mcpsIndication->Buffer[n+2];
Wayne Roberts 0:62e456e60083 627 cayenne_ack_ch = mcpsIndication->Buffer[n];
Wayne Roberts 0:62e456e60083 628 switch (mcpsIndication->Buffer[n]) {
Wayne Roberts 0:62e456e60083 629 case CAYENNE_CH_DOUT:
Wayne Roberts 0:62e456e60083 630 extLed.write(val);
Wayne Roberts 4:72b8fdc9878e 631 dout_downlink = true;
Wayne Roberts 0:62e456e60083 632 break;
Wayne Roberts 0:62e456e60083 633 case CAYENNE_CH_AOUT:
Wayne Roberts 8:efe6002910df 634 #ifdef _PWM_
Wayne Roberts 0:62e456e60083 635 pwm.write(val / 100.0);
Wayne Roberts 8:efe6002910df 636 #endif /* _PWM_ */
Wayne Roberts 0:62e456e60083 637 break;
Wayne Roberts 0:62e456e60083 638 default:
Wayne Roberts 0:62e456e60083 639 break;
Wayne Roberts 0:62e456e60083 640 }
Wayne Roberts 0:62e456e60083 641 }
Wayne Roberts 0:62e456e60083 642
Wayne Roberts 0:62e456e60083 643 switch( mcpsIndication->Port )
Wayne Roberts 0:62e456e60083 644 {
Wayne Roberts 0:62e456e60083 645 case 1: // The application LED can be controlled on port 1 or 2
Wayne Roberts 0:62e456e60083 646 case 2:
Wayne Roberts 0:62e456e60083 647 break;
Wayne Roberts 0:62e456e60083 648 case 224:
Wayne Roberts 0:62e456e60083 649 if( ComplianceTest.Running == false )
Wayne Roberts 0:62e456e60083 650 {
Wayne Roberts 0:62e456e60083 651 // Check compliance test enable command (i)
Wayne Roberts 0:62e456e60083 652 if( ( mcpsIndication->BufferSize == 4 ) &&
Wayne Roberts 0:62e456e60083 653 ( mcpsIndication->Buffer[0] == 0x01 ) &&
Wayne Roberts 0:62e456e60083 654 ( mcpsIndication->Buffer[1] == 0x01 ) &&
Wayne Roberts 0:62e456e60083 655 ( mcpsIndication->Buffer[2] == 0x01 ) &&
Wayne Roberts 0:62e456e60083 656 ( mcpsIndication->Buffer[3] == 0x01 ) )
Wayne Roberts 0:62e456e60083 657 {
Wayne Roberts 0:62e456e60083 658 gIsTxConfirmed = false;
Wayne Roberts 0:62e456e60083 659 AppPort = 224;
Wayne Roberts 0:62e456e60083 660 gAppDataSize = 2;
Wayne Roberts 0:62e456e60083 661 ComplianceTest.DownLinkCounter = 0;
Wayne Roberts 0:62e456e60083 662 ComplianceTest.LinkCheck = false;
Wayne Roberts 0:62e456e60083 663 ComplianceTest.DemodMargin = 0;
Wayne Roberts 0:62e456e60083 664 ComplianceTest.NbGateways = 0;
Wayne Roberts 0:62e456e60083 665 ComplianceTest.Running = true;
Wayne Roberts 0:62e456e60083 666 ComplianceTest.State = 1;
Wayne Roberts 0:62e456e60083 667
Wayne Roberts 0:62e456e60083 668 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 669 mibReq.Type = MIB_ADR;
Wayne Roberts 0:62e456e60083 670 mibReq.Param.AdrEnable = true;
Wayne Roberts 0:62e456e60083 671 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 672
Wayne Roberts 0:62e456e60083 673 #if defined( USE_BAND_868 )
Wayne Roberts 0:62e456e60083 674 DutyCycleOn = false;
Wayne Roberts 0:62e456e60083 675 #endif
Wayne Roberts 0:62e456e60083 676 }
Wayne Roberts 0:62e456e60083 677 }
Wayne Roberts 0:62e456e60083 678 else
Wayne Roberts 0:62e456e60083 679 {
Wayne Roberts 0:62e456e60083 680 ComplianceTest.State = mcpsIndication->Buffer[0];
Wayne Roberts 0:62e456e60083 681 switch( ComplianceTest.State )
Wayne Roberts 0:62e456e60083 682 {
Wayne Roberts 0:62e456e60083 683 case 0: // Check compliance test disable command (ii)
Wayne Roberts 0:62e456e60083 684 gIsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
Wayne Roberts 0:62e456e60083 685 AppPort = LORAWAN_APP_PORT;
Wayne Roberts 0:62e456e60083 686 gAppDataSize = LORAWAN_APP_DATA_SIZE;
Wayne Roberts 0:62e456e60083 687 ComplianceTest.DownLinkCounter = 0;
Wayne Roberts 0:62e456e60083 688 ComplianceTest.Running = false;
Wayne Roberts 0:62e456e60083 689
Wayne Roberts 0:62e456e60083 690 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 691 mibReq.Type = MIB_ADR;
Wayne Roberts 0:62e456e60083 692 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
Wayne Roberts 0:62e456e60083 693 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 694 #if defined( USE_BAND_868 )
Wayne Roberts 0:62e456e60083 695 DutyCycleOn = LORAWAN_DUTYCYCLE_ON;
Wayne Roberts 0:62e456e60083 696 #endif
Wayne Roberts 0:62e456e60083 697 break;
Wayne Roberts 0:62e456e60083 698 case 1: // (iii, iv)
Wayne Roberts 0:62e456e60083 699 gAppDataSize = 2;
Wayne Roberts 0:62e456e60083 700 break;
Wayne Roberts 0:62e456e60083 701 case 2: // Enable confirmed messages (v)
Wayne Roberts 0:62e456e60083 702 gIsTxConfirmed = true;
Wayne Roberts 0:62e456e60083 703 ComplianceTest.State = 1;
Wayne Roberts 0:62e456e60083 704 break;
Wayne Roberts 0:62e456e60083 705 case 3: // Disable confirmed messages (vi)
Wayne Roberts 0:62e456e60083 706 gIsTxConfirmed = false;
Wayne Roberts 0:62e456e60083 707 ComplianceTest.State = 1;
Wayne Roberts 0:62e456e60083 708 break;
Wayne Roberts 0:62e456e60083 709 case 4: // (vii)
Wayne Roberts 0:62e456e60083 710 gAppDataSize = mcpsIndication->BufferSize;
Wayne Roberts 0:62e456e60083 711
Wayne Roberts 0:62e456e60083 712 AppData[0] = 4;
Wayne Roberts 0:62e456e60083 713 for( uint8_t i = 1; i < gAppDataSize; i++ )
Wayne Roberts 0:62e456e60083 714 {
Wayne Roberts 0:62e456e60083 715 AppData[i] = mcpsIndication->Buffer[i] + 1;
Wayne Roberts 0:62e456e60083 716 }
Wayne Roberts 0:62e456e60083 717 break;
Wayne Roberts 0:62e456e60083 718 case 5: // (viii)
Wayne Roberts 0:62e456e60083 719 {
Wayne Roberts 0:62e456e60083 720 MlmeReq_t mlmeReq;
Wayne Roberts 0:62e456e60083 721 mlmeReq.Type = MLME_LINK_CHECK;
Wayne Roberts 0:62e456e60083 722 LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 723 }
Wayne Roberts 0:62e456e60083 724 break;
Wayne Roberts 0:62e456e60083 725 case 6: // (ix)
Wayne Roberts 0:62e456e60083 726 {
Wayne Roberts 0:62e456e60083 727 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 728 MlmeReq_t mlmeReq = {};
Wayne Roberts 0:62e456e60083 729
Wayne Roberts 0:62e456e60083 730 // Disable TestMode and revert back to normal operation
Wayne Roberts 0:62e456e60083 731 gIsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
Wayne Roberts 0:62e456e60083 732 AppPort = LORAWAN_APP_PORT;
Wayne Roberts 0:62e456e60083 733 gAppDataSize = LORAWAN_APP_DATA_SIZE;
Wayne Roberts 0:62e456e60083 734 ComplianceTest.DownLinkCounter = 0;
Wayne Roberts 0:62e456e60083 735 ComplianceTest.Running = false;
Wayne Roberts 0:62e456e60083 736
Wayne Roberts 0:62e456e60083 737 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 738 mibReq.Type = MIB_ADR;
Wayne Roberts 0:62e456e60083 739 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
Wayne Roberts 0:62e456e60083 740 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 741 #if defined( USE_BAND_868 )
Wayne Roberts 0:62e456e60083 742 DutyCycleOn = LORAWAN_DUTYCYCLE_ON;
Wayne Roberts 0:62e456e60083 743 #endif
Wayne Roberts 0:62e456e60083 744
Wayne Roberts 0:62e456e60083 745 mlmeReq.Type = MLME_JOIN;
Wayne Roberts 0:62e456e60083 746
Wayne Roberts 0:62e456e60083 747 mlmeReq.Req.Join.DevEui = DevEui;
Wayne Roberts 0:62e456e60083 748 mlmeReq.Req.Join.JoinEui = JoinEui;
Wayne Roberts 0:62e456e60083 749 mlmeReq.Req.Join.NwkKey = NwkKey;
Wayne Roberts 0:62e456e60083 750 #ifdef LORAWAN_ROOT_APPKEY
Wayne Roberts 0:62e456e60083 751 mlmeReq.Req.Join.AppKey = AppKey;
Wayne Roberts 0:62e456e60083 752 #endif /* LORAWAN_ROOT_APPKEY */
Wayne Roberts 0:62e456e60083 753
Wayne Roberts 0:62e456e60083 754 LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 755 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 756 DeviceState = DEVICE_STATE_SLEEP;
Wayne Roberts 0:62e456e60083 757 }
Wayne Roberts 0:62e456e60083 758 break;
Wayne Roberts 0:62e456e60083 759 case 7: // Switch end device Class
Wayne Roberts 0:62e456e60083 760 {
Wayne Roberts 0:62e456e60083 761 MlmeReq_t mlmeReq;
Wayne Roberts 0:62e456e60083 762
Wayne Roberts 0:62e456e60083 763 mlmeReq.Type = MLME_SWITCH_CLASS;
Wayne Roberts 0:62e456e60083 764
Wayne Roberts 0:62e456e60083 765 // CLASS_A = 0, CLASS_B = 1, CLASS_C = 2
Wayne Roberts 0:62e456e60083 766 mlmeReq.Req.SwitchClass.Class = ( DeviceClass_t )mcpsIndication->Buffer[1];
Wayne Roberts 0:62e456e60083 767
Wayne Roberts 0:62e456e60083 768 LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 769
Wayne Roberts 0:62e456e60083 770 PrepareTxFrame( AppPort );
Wayne Roberts 0:62e456e60083 771 /*status =*/ SendFrame(gIsTxConfirmed, gAppDataSize);
Wayne Roberts 0:62e456e60083 772 }
Wayne Roberts 0:62e456e60083 773 break;
Wayne Roberts 0:62e456e60083 774 case 8: // Send PingSlotInfoReq
Wayne Roberts 0:62e456e60083 775 {
Wayne Roberts 0:62e456e60083 776 MlmeReq_t mlmeReq;
Wayne Roberts 0:62e456e60083 777
Wayne Roberts 0:62e456e60083 778 mlmeReq.Type = MLME_PING_SLOT_INFO;
Wayne Roberts 0:62e456e60083 779
Wayne Roberts 0:62e456e60083 780 mlmeReq.Req.PingSlotInfo.Value = mcpsIndication->Buffer[1];
Wayne Roberts 0:62e456e60083 781
Wayne Roberts 0:62e456e60083 782 LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 783 PrepareTxFrame( AppPort );
Wayne Roberts 0:62e456e60083 784 /*status =*/ SendFrame(gIsTxConfirmed, gAppDataSize);
Wayne Roberts 0:62e456e60083 785 }
Wayne Roberts 0:62e456e60083 786 break;
Wayne Roberts 0:62e456e60083 787 case 9: // Send BeaconTimingReq
Wayne Roberts 0:62e456e60083 788 {
Wayne Roberts 0:62e456e60083 789 MlmeReq_t mlmeReq;
Wayne Roberts 0:62e456e60083 790
Wayne Roberts 0:62e456e60083 791 mlmeReq.Type = MLME_BEACON_TIMING;
Wayne Roberts 0:62e456e60083 792
Wayne Roberts 0:62e456e60083 793 LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 794 PrepareTxFrame( AppPort );
Wayne Roberts 0:62e456e60083 795 /*status =*/ SendFrame(gIsTxConfirmed, gAppDataSize);
Wayne Roberts 0:62e456e60083 796 }
Wayne Roberts 0:62e456e60083 797 break;
Wayne Roberts 0:62e456e60083 798 default:
Wayne Roberts 0:62e456e60083 799 break;
Wayne Roberts 0:62e456e60083 800 }
Wayne Roberts 0:62e456e60083 801 }
Wayne Roberts 0:62e456e60083 802 break;
Wayne Roberts 0:62e456e60083 803 default:
Wayne Roberts 0:62e456e60083 804 break;
Wayne Roberts 0:62e456e60083 805 }
Wayne Roberts 0:62e456e60083 806
Wayne Roberts 0:62e456e60083 807 }
Wayne Roberts 0:62e456e60083 808
Wayne Roberts 0:62e456e60083 809 } // ..McpsIndication()
Wayne Roberts 0:62e456e60083 810
Wayne Roberts 0:62e456e60083 811 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 812 void
Wayne Roberts 0:62e456e60083 813 join(uint8_t tries)
Wayne Roberts 0:62e456e60083 814 {
Wayne Roberts 0:62e456e60083 815 char str[64];
Wayne Roberts 0:62e456e60083 816 LoRaMacStatus_t status;
Wayne Roberts 0:62e456e60083 817 MlmeReq_t mlmeReq = { };
Wayne Roberts 0:62e456e60083 818
Wayne Roberts 0:62e456e60083 819 mlmeReq.Type = MLME_JOIN;
Wayne Roberts 0:62e456e60083 820
Wayne Roberts 0:62e456e60083 821 clearIndications();
Wayne Roberts 0:62e456e60083 822 #ifdef LORAWAN_ROOT_APPKEY
Wayne Roberts 0:62e456e60083 823 mlmeReq.Req.Join.AppKey = AppKey;
Wayne Roberts 0:62e456e60083 824 #endif
Wayne Roberts 0:62e456e60083 825 mlmeReq.Req.Join.DevEui = DevEui;
Wayne Roberts 0:62e456e60083 826 mlmeReq.Req.Join.JoinEui = JoinEui;
Wayne Roberts 0:62e456e60083 827 mlmeReq.Req.Join.NwkKey = NwkKey;
Wayne Roberts 0:62e456e60083 828 mlmeReq.Req.Join.NbTrials = tries;
Wayne Roberts 0:62e456e60083 829 status = LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 830 if (status != LORAMAC_STATUS_OK) {
Wayne Roberts 0:62e456e60083 831 LoRaMacStatus_to_string(status, str);
Wayne Roberts 0:62e456e60083 832 } else
Wayne Roberts 0:62e456e60083 833 extLed = 1;
Wayne Roberts 0:62e456e60083 834 }
Wayne Roberts 0:62e456e60083 835 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 836
Wayne Roberts 0:62e456e60083 837 /*!
Wayne Roberts 0:62e456e60083 838 * \brief MLME-Confirm event function
Wayne Roberts 0:62e456e60083 839 *
Wayne Roberts 0:62e456e60083 840 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
Wayne Roberts 0:62e456e60083 841 * containing confirm attributes.
Wayne Roberts 0:62e456e60083 842 */
Wayne Roberts 0:62e456e60083 843 static void MlmeConfirm( const MlmeConfirm_t *mlmeConfirm )
Wayne Roberts 0:62e456e60083 844 {
Wayne Roberts 0:62e456e60083 845 char str[64];
Wayne Roberts 0:62e456e60083 846 static uint8_t failCnt = 0;
Wayne Roberts 0:62e456e60083 847
Wayne Roberts 0:62e456e60083 848 vt.SetCursorPos(ROW_MLME_CONF, 1);
Wayne Roberts 0:62e456e60083 849 Mlme_to_string(mlmeConfirm->MlmeRequest, str);
Wayne Roberts 0:62e456e60083 850 vt.printf("MlmeConfirm %s ", str);
Wayne Roberts 0:62e456e60083 851 LoRaMacEventInfoStatus_to_string(mlmeConfirm->Status, str);
Wayne Roberts 0:62e456e60083 852 if (mlmeConfirm->Status != LORAMAC_EVENT_INFO_STATUS_OK)
Wayne Roberts 0:62e456e60083 853 vt.printf("\e[31m%s \e[0m \e[K", str);
Wayne Roberts 0:62e456e60083 854 else
Wayne Roberts 0:62e456e60083 855 vt.printf("%s \e[K", str);
Wayne Roberts 0:62e456e60083 856
Wayne Roberts 0:62e456e60083 857 #if defined(LORAWAN_ROOT_APPKEY) && defined(LORAWAN_JOIN_EUI)
Wayne Roberts 0:62e456e60083 858 /* 1v1 joinNonce is incrementing non-volatile value */
Wayne Roberts 0:62e456e60083 859 if (mlmeConfirm->MlmeRequest == MLME_JOIN) {
Wayne Roberts 0:62e456e60083 860 vt.printf(" rxJoinNonce:%u vs %u",
Wayne Roberts 0:62e456e60083 861 mlmeConfirm->fields.join.rxJoinNonce,
Wayne Roberts 0:62e456e60083 862 mlmeConfirm->fields.join.myJoinNonce
Wayne Roberts 0:62e456e60083 863 );
Wayne Roberts 0:62e456e60083 864 }
Wayne Roberts 0:62e456e60083 865 #endif /* LORAWAN_ROOT_APPKEY */
Wayne Roberts 0:62e456e60083 866
Wayne Roberts 0:62e456e60083 867 if (mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK)
Wayne Roberts 0:62e456e60083 868 {
Wayne Roberts 0:62e456e60083 869 failCnt = 0;
Wayne Roberts 0:62e456e60083 870 switch (mlmeConfirm->MlmeRequest)
Wayne Roberts 0:62e456e60083 871 {
Wayne Roberts 0:62e456e60083 872 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 873 case MLME_JOIN:
Wayne Roberts 0:62e456e60083 874 {
Wayne Roberts 0:62e456e60083 875 // Status is OK, node has joined the network
Wayne Roberts 0:62e456e60083 876 /* collect any mac cmds from server until expected channel mask */
Wayne Roberts 0:62e456e60083 877 extLed = 0;
Wayne Roberts 0:62e456e60083 878 DeviceState = DEVICE_STATE_JOIN_OK;
Wayne Roberts 0:62e456e60083 879 break;
Wayne Roberts 0:62e456e60083 880 }
Wayne Roberts 0:62e456e60083 881 #endif /* LORAWAN_JOIN_EUI*/
Wayne Roberts 0:62e456e60083 882 case MLME_LINK_CHECK:
Wayne Roberts 0:62e456e60083 883 {
Wayne Roberts 0:62e456e60083 884 // Check DemodMargin
Wayne Roberts 0:62e456e60083 885 // Check NbGateways
Wayne Roberts 0:62e456e60083 886 if( ComplianceTest.Running == true )
Wayne Roberts 0:62e456e60083 887 {
Wayne Roberts 0:62e456e60083 888 ComplianceTest.LinkCheck = true;
Wayne Roberts 0:62e456e60083 889 ComplianceTest.DemodMargin = mlmeConfirm->fields.link.DemodMargin;
Wayne Roberts 0:62e456e60083 890 ComplianceTest.NbGateways = mlmeConfirm->fields.link.NbGateways;
Wayne Roberts 0:62e456e60083 891 }
Wayne Roberts 0:62e456e60083 892 break;
Wayne Roberts 0:62e456e60083 893 }
Wayne Roberts 0:62e456e60083 894 case MLME_TIME_REQ:
Wayne Roberts 0:62e456e60083 895 break;
Wayne Roberts 0:62e456e60083 896 default:
Wayne Roberts 0:62e456e60083 897 /* TODO: handle unknown MLME request */
Wayne Roberts 0:62e456e60083 898 DeviceState = DEVICE_STATE_SLEEP;
Wayne Roberts 0:62e456e60083 899 break;
Wayne Roberts 0:62e456e60083 900 }
Wayne Roberts 0:62e456e60083 901 }
Wayne Roberts 0:62e456e60083 902 else // not ok...
Wayne Roberts 0:62e456e60083 903 {
Wayne Roberts 0:62e456e60083 904 failCnt++;
Wayne Roberts 0:62e456e60083 905
Wayne Roberts 0:62e456e60083 906 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 907 if (failCnt > 5) {
Wayne Roberts 0:62e456e60083 908 join(1);
Wayne Roberts 0:62e456e60083 909 return;
Wayne Roberts 0:62e456e60083 910 }
Wayne Roberts 0:62e456e60083 911 #endif
Wayne Roberts 0:62e456e60083 912
Wayne Roberts 0:62e456e60083 913 switch( mlmeConfirm->MlmeRequest )
Wayne Roberts 0:62e456e60083 914 {
Wayne Roberts 0:62e456e60083 915 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 916 case MLME_JOIN:
Wayne Roberts 0:62e456e60083 917 {
Wayne Roberts 0:62e456e60083 918 // Join failed, restart join procedure
Wayne Roberts 0:62e456e60083 919 break;
Wayne Roberts 0:62e456e60083 920 }
Wayne Roberts 0:62e456e60083 921 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 922 case MLME_LINK_CHECK:
Wayne Roberts 0:62e456e60083 923 DeviceState = DEVICE_STATE_SLEEP;
Wayne Roberts 0:62e456e60083 924 break;
Wayne Roberts 0:62e456e60083 925 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 926 case MLME_REJOIN_0:
Wayne Roberts 0:62e456e60083 927 break;
Wayne Roberts 0:62e456e60083 928 case MLME_REJOIN_2:
Wayne Roberts 0:62e456e60083 929 break;
Wayne Roberts 0:62e456e60083 930 case MLME_TIME_REQ:
Wayne Roberts 0:62e456e60083 931 break;
Wayne Roberts 0:62e456e60083 932 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 933 default:
Wayne Roberts 0:62e456e60083 934 DeviceState = DEVICE_STATE_SLEEP;
Wayne Roberts 0:62e456e60083 935 break;
Wayne Roberts 0:62e456e60083 936 }
Wayne Roberts 0:62e456e60083 937 }
Wayne Roberts 0:62e456e60083 938 } // ..MlmeConfirm
Wayne Roberts 0:62e456e60083 939
Wayne Roberts 0:62e456e60083 940 static void MlmeIndication( const MlmeIndication_t *MlmeIndication )
Wayne Roberts 0:62e456e60083 941 {
Wayne Roberts 0:62e456e60083 942 char str[48];
Wayne Roberts 0:62e456e60083 943 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 944
Wayne Roberts 0:62e456e60083 945 vt.SetCursorPos(ROW_MLME_IND, 1);
dudmuck 1:3c1d13a0489e 946 Mlme_to_string(MlmeIndication->MlmeIndication, str);
Wayne Roberts 8:efe6002910df 947 vt.printf("MlmeIndication %s ", str);
Wayne Roberts 8:efe6002910df 948 #ifdef TARGET_STM32
Wayne Roberts 8:efe6002910df 949 vt.printf(" %08x ", RCC->CSR);
Wayne Roberts 8:efe6002910df 950 #endif /* TARGET_STM32 */
Wayne Roberts 0:62e456e60083 951 LoRaMacEventInfoStatus_to_string(MlmeIndication->Status, str);
Wayne Roberts 0:62e456e60083 952 if (MlmeIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK)
Wayne Roberts 0:62e456e60083 953 vt.printf("\e[31m%s \e[0m \e[K", str);
Wayne Roberts 0:62e456e60083 954 else
Wayne Roberts 0:62e456e60083 955 vt.printf("%s \e[K", str);
Wayne Roberts 0:62e456e60083 956
Wayne Roberts 0:62e456e60083 957 switch( MlmeIndication->MlmeIndication )
Wayne Roberts 0:62e456e60083 958 {
Wayne Roberts 0:62e456e60083 959 case MLME_SWITCH_CLASS:
Wayne Roberts 0:62e456e60083 960 {
Wayne Roberts 0:62e456e60083 961 /* mac gave up on beacon */
Wayne Roberts 0:62e456e60083 962 mibReq.Type = MIB_DEVICE_CLASS;
Wayne Roberts 0:62e456e60083 963 mibReq.Param.Class = CLASS_A;
Wayne Roberts 0:62e456e60083 964 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 965
Wayne Roberts 0:62e456e60083 966 // Switch to class A again
Wayne Roberts 0:62e456e60083 967 DeviceState = DEVICE_STATE_SLEEP; // class-B manual switch
Wayne Roberts 0:62e456e60083 968 break;
Wayne Roberts 0:62e456e60083 969 }
Wayne Roberts 0:62e456e60083 970 case MLME_BEACON:
Wayne Roberts 0:62e456e60083 971 {
Wayne Roberts 0:62e456e60083 972 LoRaMacEventInfoStatus_to_string(MlmeIndication->Status, str);
Wayne Roberts 0:62e456e60083 973 break;
Wayne Roberts 0:62e456e60083 974
Wayne Roberts 0:62e456e60083 975 }
Wayne Roberts 0:62e456e60083 976 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 977 case MLME_JOIN:
Wayne Roberts 0:62e456e60083 978 vt.printf("%uhz try%u", MlmeIndication->freqHz, MlmeIndication->JoinRequestTrials);
Wayne Roberts 0:62e456e60083 979 break;
Wayne Roberts 0:62e456e60083 980 #endif /* !LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 981 default:
Wayne Roberts 0:62e456e60083 982 break;
Wayne Roberts 0:62e456e60083 983 }
Wayne Roberts 0:62e456e60083 984
Wayne Roberts 0:62e456e60083 985 } // ..MlmeIndication()
Wayne Roberts 0:62e456e60083 986
Wayne Roberts 0:62e456e60083 987 uint8_t periodicity;
Wayne Roberts 0:62e456e60083 988
Wayne Roberts 0:62e456e60083 989 void SerialDisplayRefresh( void )
Wayne Roberts 0:62e456e60083 990 {
Wayne Roberts 0:62e456e60083 991 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 992 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 993 #endif
Wayne Roberts 0:62e456e60083 994
Wayne Roberts 0:62e456e60083 995 SerialDisplayInit( );
Wayne Roberts 0:62e456e60083 996 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 997 SerialDisplayUpdateActivationMode(true);
Wayne Roberts 0:62e456e60083 998 SerialDisplayUpdateEui( ROW_DEVEUI, DevEui);
Wayne Roberts 0:62e456e60083 999 SerialDisplayUpdateEui( ROW_JOINEUI, JoinEui);
Wayne Roberts 0:62e456e60083 1000 SerialDisplayUpdateKey( ROW_NWKKEY, NwkKey);
Wayne Roberts 0:62e456e60083 1001
Wayne Roberts 0:62e456e60083 1002 #ifdef LORAWAN_ROOT_APPKEY
Wayne Roberts 0:62e456e60083 1003 SerialDisplayUpdateKey(ROW_APPKEY, AppKey);
Wayne Roberts 0:62e456e60083 1004 #endif
Wayne Roberts 0:62e456e60083 1005
Wayne Roberts 0:62e456e60083 1006 mibReq.Type = MIB_NETWORK_JOINED;
Wayne Roberts 0:62e456e60083 1007 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1008 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
Wayne Roberts 0:62e456e60083 1009 #else
Wayne Roberts 0:62e456e60083 1010 //SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
Wayne Roberts 0:62e456e60083 1011 SerialDisplayUpdateDevAddr( DevAddr );
Wayne Roberts 0:62e456e60083 1012 SerialDisplayUpdateKey( ROW_FNwkSIntKey, FNwkSIntKey);
Wayne Roberts 0:62e456e60083 1013 SerialDisplayUpdateKey( ROW_AppSKey, AppSKey );
Wayne Roberts 0:62e456e60083 1014 #if defined(LORAWAN_SNwkSIntKey) && defined(LORAWAN_NwkSEncKey)
Wayne Roberts 0:62e456e60083 1015 SerialDisplayUpdateKey(ROW_NwkSEncKey, NwkSEncKey);
Wayne Roberts 0:62e456e60083 1016 SerialDisplayUpdateKey(ROW_SNwkSIntKey, SNwkSIntKey);
Wayne Roberts 0:62e456e60083 1017 #endif /* 1v1 ABP */
Wayne Roberts 0:62e456e60083 1018
Wayne Roberts 0:62e456e60083 1019 vt.SetCursorPos( ROW_END, 1 );
Wayne Roberts 0:62e456e60083 1020 vt.printf("FCntUp:%08x", eeprom_read(EEPROM_FCNTUP));
Wayne Roberts 0:62e456e60083 1021 vt.printf(" AFCntDown:%08x", get_fcntdwn(true));
Wayne Roberts 0:62e456e60083 1022 vt.printf(" NFCntDown:%08x", get_fcntdwn(false));
Wayne Roberts 0:62e456e60083 1023 #endif
Wayne Roberts 0:62e456e60083 1024
Wayne Roberts 0:62e456e60083 1025
Wayne Roberts 0:62e456e60083 1026 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
Wayne Roberts 0:62e456e60083 1027 #if defined( USE_BAND_868 )
Wayne Roberts 0:62e456e60083 1028 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
Wayne Roberts 0:62e456e60083 1029 #else
Wayne Roberts 0:62e456e60083 1030 SerialDisplayUpdateDutyCycle( false );
Wayne Roberts 0:62e456e60083 1031 #endif
Wayne Roberts 0:62e456e60083 1032 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
Wayne Roberts 0:62e456e60083 1033
Wayne Roberts 0:62e456e60083 1034 //SerialDisplayUpdateLedState( 3, AppLedStateOn );
Wayne Roberts 0:62e456e60083 1035 }
Wayne Roberts 0:62e456e60083 1036
Wayne Roberts 0:62e456e60083 1037 void SerialRxProcess( void )
Wayne Roberts 0:62e456e60083 1038 {
Wayne Roberts 0:62e456e60083 1039 LoRaMacStatus_t status;
Wayne Roberts 0:62e456e60083 1040 MlmeReq_t mlmeReq;
Wayne Roberts 0:62e456e60083 1041 #ifndef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 1042 static uint8_t icnt = 0;
Wayne Roberts 0:62e456e60083 1043 #endif
Wayne Roberts 0:62e456e60083 1044
Wayne Roberts 0:62e456e60083 1045 if( SerialDisplayReadable( ) == true ) {
Wayne Roberts 0:62e456e60083 1046 char ch = SerialDisplayGetChar();
Wayne Roberts 0:62e456e60083 1047 #ifndef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 1048 if (ch == 'I') {
Wayne Roberts 0:62e456e60083 1049 if (++icnt == 3) {
Wayne Roberts 0:62e456e60083 1050 vt.SetCursorPos( ROW_END, 1 );
Wayne Roberts 0:62e456e60083 1051 vt.printf("reset-fcnts\e[K");
Wayne Roberts 0:62e456e60083 1052 eeprom_clear(EEPROM_AFCNTDWN);
Wayne Roberts 0:62e456e60083 1053 eeprom_clear(EEPROM_NFCNTDWN);
Wayne Roberts 0:62e456e60083 1054 eeprom_clear(EEPROM_FCNTUP);
Wayne Roberts 0:62e456e60083 1055 }
Wayne Roberts 0:62e456e60083 1056 } else
Wayne Roberts 0:62e456e60083 1057 icnt = 0;
Wayne Roberts 0:62e456e60083 1058 #endif /* !LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 1059
Wayne Roberts 0:62e456e60083 1060 if ( ch >= '0' && ch <= '9') {
Wayne Roberts 0:62e456e60083 1061 c_ch = ch - '0';
Wayne Roberts 0:62e456e60083 1062 DeviceState = DEVICE_STATE_SEND;
Wayne Roberts 0:62e456e60083 1063 return;
Wayne Roberts 0:62e456e60083 1064 }
Wayne Roberts 0:62e456e60083 1065 switch( ch ) {
Wayne Roberts 0:62e456e60083 1066 case 'R':
Wayne Roberts 0:62e456e60083 1067 case 'r':
Wayne Roberts 0:62e456e60083 1068 // Refresh Serial screen
Wayne Roberts 0:62e456e60083 1069 SerialDisplayRefresh( );
Wayne Roberts 0:62e456e60083 1070 break;
Wayne Roberts 0:62e456e60083 1071 case 'L':
Wayne Roberts 0:62e456e60083 1072 clearIndications();
Wayne Roberts 0:62e456e60083 1073 mlmeReq.Type = MLME_LINK_CHECK;
Wayne Roberts 0:62e456e60083 1074 status = LoRaMacMlmeRequest( &mlmeReq );
Wayne Roberts 0:62e456e60083 1075 if (status == LORAMAC_STATUS_OK)
Wayne Roberts 0:62e456e60083 1076 SendFrame(0, false);
Wayne Roberts 0:62e456e60083 1077 break;
Wayne Roberts 0:62e456e60083 1078 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 1079 case 'j':
Wayne Roberts 0:62e456e60083 1080 DeviceState = DEVICE_STATE_JOIN;
Wayne Roberts 0:62e456e60083 1081 break;
Wayne Roberts 0:62e456e60083 1082 #endif
Wayne Roberts 0:62e456e60083 1083 default:
Wayne Roberts 0:62e456e60083 1084 break;
Wayne Roberts 0:62e456e60083 1085 }
Wayne Roberts 0:62e456e60083 1086 }
Wayne Roberts 0:62e456e60083 1087 }
Wayne Roberts 0:62e456e60083 1088
Wayne Roberts 6:795461780e10 1089 static void button_isr()
Wayne Roberts 3:fc23bbc14475 1090 {
Wayne Roberts 3:fc23bbc14475 1091 c_ch = 0xff;
Wayne Roberts 3:fc23bbc14475 1092 DeviceState = DEVICE_STATE_SEND;
Wayne Roberts 3:fc23bbc14475 1093 buttonStartAt = LoRaMacReadTimer();
Wayne Roberts 3:fc23bbc14475 1094 }
Wayne Roberts 0:62e456e60083 1095
Wayne Roberts 0:62e456e60083 1096 static const LoRaMacPrimitives_t LoRaMacPrimitives = {
Wayne Roberts 0:62e456e60083 1097 McpsConfirm,
Wayne Roberts 0:62e456e60083 1098 McpsIndication,
Wayne Roberts 0:62e456e60083 1099 MlmeConfirm,
Wayne Roberts 0:62e456e60083 1100 MlmeIndication
Wayne Roberts 0:62e456e60083 1101 };
Wayne Roberts 0:62e456e60083 1102
Wayne Roberts 0:62e456e60083 1103 static const LoRaMacCallback_t LoRaMacCallbacks = {
Wayne Roberts 0:62e456e60083 1104 BoardGetBatteryLevel,
Wayne Roberts 0:62e456e60083 1105 NULL
Wayne Roberts 0:62e456e60083 1106 };
Wayne Roberts 0:62e456e60083 1107
Wayne Roberts 0:62e456e60083 1108 /**
Wayne Roberts 0:62e456e60083 1109 * Main application entry point.
Wayne Roberts 0:62e456e60083 1110 */
Wayne Roberts 0:62e456e60083 1111 int main()
Wayne Roberts 0:62e456e60083 1112 {
Wayne Roberts 2:da3c8d5b3f49 1113 LoRaMacStatus_t status;
Wayne Roberts 0:62e456e60083 1114 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 1115
Wayne Roberts 0:62e456e60083 1116 DeviceState = DEVICE_STATE_INIT;
Wayne Roberts 0:62e456e60083 1117
Wayne Roberts 0:62e456e60083 1118 if (sleep_manager_can_deep_sleep())
Wayne Roberts 0:62e456e60083 1119 sleep_manager_lock_deep_sleep(); // prevent deep sleep
Wayne Roberts 0:62e456e60083 1120
Wayne Roberts 0:62e456e60083 1121 #ifdef JUMPER_ENABLE
Wayne Roberts 0:62e456e60083 1122 jumper_out = 1;
Wayne Roberts 0:62e456e60083 1123 jumper_in.mode(PullDown);
Wayne Roberts 0:62e456e60083 1124 jumper_in.rise(jumper_callback);
Wayne Roberts 4:72b8fdc9878e 1125 // Q: does InterruptIn.rise() call immediately if already high?
Wayne Roberts 4:72b8fdc9878e 1126 if (jumper_in.read())
Wayne Roberts 4:72b8fdc9878e 1127 jumper_callback(); // A: probably not
Wayne Roberts 0:62e456e60083 1128 #endif /* JUMPER_ENABLE */
Wayne Roberts 0:62e456e60083 1129
Wayne Roberts 0:62e456e60083 1130 while( 1 )
Wayne Roberts 0:62e456e60083 1131 {
Wayne Roberts 0:62e456e60083 1132 SerialRxProcess( );
Wayne Roberts 0:62e456e60083 1133
Wayne Roberts 0:62e456e60083 1134 if (flags.gmi) {
Wayne Roberts 0:62e456e60083 1135 flags.gmi = false;
Wayne Roberts 0:62e456e60083 1136 SerialDisplayMcpsIndication(&gmi);
Wayne Roberts 0:62e456e60083 1137 }
Wayne Roberts 0:62e456e60083 1138
Wayne Roberts 0:62e456e60083 1139 if (flags.gmc) {
Wayne Roberts 0:62e456e60083 1140 flags.gmc = false;
Wayne Roberts 0:62e456e60083 1141 SerialDisplayMcpsConfirm(&gmc);
Wayne Roberts 0:62e456e60083 1142 }
Wayne Roberts 0:62e456e60083 1143
Wayne Roberts 0:62e456e60083 1144 switch( DeviceState )
Wayne Roberts 0:62e456e60083 1145 {
Wayne Roberts 0:62e456e60083 1146 case DEVICE_STATE_INIT:
Wayne Roberts 0:62e456e60083 1147 {
Wayne Roberts 2:da3c8d5b3f49 1148 status = LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
dudmuck 1:3c1d13a0489e 1149 if (LORAMAC_STATUS_OK != status) {
dudmuck 1:3c1d13a0489e 1150 char str[48];
dudmuck 1:3c1d13a0489e 1151 LoRaMacStatus_to_string(status, str);
dudmuck 1:3c1d13a0489e 1152 vt.SetCursorPos(1, 1);
dudmuck 1:3c1d13a0489e 1153 vt.printf("MacInit: %s\e[K", str);
dudmuck 1:3c1d13a0489e 1154 for (;;) asm("nop");
dudmuck 1:3c1d13a0489e 1155 }
dudmuck 1:3c1d13a0489e 1156
Wayne Roberts 8:efe6002910df 1157 #ifdef _PWM_
Wayne Roberts 0:62e456e60083 1158 pwm.period(1.0 / 60);
Wayne Roberts 8:efe6002910df 1159 #endif /* _PWM_ */
Wayne Roberts 0:62e456e60083 1160 cayenne_ack_ch = -1;
Wayne Roberts 0:62e456e60083 1161 c_ch = 0xff;
Wayne Roberts 6:795461780e10 1162 button_pin.mode(PullDown);
Wayne Roberts 6:795461780e10 1163 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 6:795461780e10 1164 button_pin.fall(button_isr);
Wayne Roberts 6:795461780e10 1165 #else
Wayne Roberts 6:795461780e10 1166 button_pin.rise(button_isr);
Wayne Roberts 6:795461780e10 1167 #endif
Wayne Roberts 0:62e456e60083 1168
Wayne Roberts 0:62e456e60083 1169 mibReq.Type = MIB_ADR;
Wayne Roberts 0:62e456e60083 1170 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
Wayne Roberts 0:62e456e60083 1171 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1172
Wayne Roberts 0:62e456e60083 1173 mibReq.Type = MIB_PUBLIC_NETWORK;
Wayne Roberts 0:62e456e60083 1174 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
Wayne Roberts 0:62e456e60083 1175 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1176
Wayne Roberts 0:62e456e60083 1177 #if defined( USE_BAND_868 )
Wayne Roberts 0:62e456e60083 1178 DutyCycleOn = LORAWAN_DUTYCYCLE_ON ;
Wayne Roberts 0:62e456e60083 1179 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
Wayne Roberts 0:62e456e60083 1180 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
Wayne Roberts 0:62e456e60083 1181 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
Wayne Roberts 0:62e456e60083 1182 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
Wayne Roberts 0:62e456e60083 1183 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
Wayne Roberts 0:62e456e60083 1184 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
Wayne Roberts 0:62e456e60083 1185 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
Wayne Roberts 0:62e456e60083 1186 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
Wayne Roberts 0:62e456e60083 1187
Wayne Roberts 0:62e456e60083 1188 mibReq.Type = MIB_RX2_CHANNEL;
Wayne Roberts 0:62e456e60083 1189 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
Wayne Roberts 0:62e456e60083 1190 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1191 #endif
Wayne Roberts 0:62e456e60083 1192
Wayne Roberts 0:62e456e60083 1193 #endif
Wayne Roberts 0:62e456e60083 1194
Wayne Roberts 0:62e456e60083 1195 SerialDisplayRefresh();
Wayne Roberts 0:62e456e60083 1196 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 1197
Wayne Roberts 0:62e456e60083 1198 #ifndef SENETCO /* for senet, use network provided DevEUI */
Wayne Roberts 0:62e456e60083 1199 // Initialize LoRaMac device unique ID
Wayne Roberts 0:62e456e60083 1200 HardwareIDtoDevEUI(DevEui);
Wayne Roberts 0:62e456e60083 1201 #ifdef LORAWAN_ROOT_APPKEY
Wayne Roberts 0:62e456e60083 1202 // inverted DevEui provisioned as v1.1 on server (non-inv = lorawan1v0)
Wayne Roberts 0:62e456e60083 1203 for (int i = 0; i < 8; i++)
Wayne Roberts 0:62e456e60083 1204 DevEui[i] ^= 0xff;
Wayne Roberts 0:62e456e60083 1205 #endif /* LORAWAN_ROOT_APPKEY */
Wayne Roberts 0:62e456e60083 1206 #endif /* !SENETCO */
Wayne Roberts 0:62e456e60083 1207 SerialDisplayUpdateEui( 5, DevEui );
Wayne Roberts 0:62e456e60083 1208 DeviceState = DEVICE_STATE_JOIN;
Wayne Roberts 0:62e456e60083 1209 #else /* ABP... */
Wayne Roberts 0:62e456e60083 1210
Wayne Roberts 0:62e456e60083 1211 mibReq.Type = MIB_DEV_ADDR;
Wayne Roberts 0:62e456e60083 1212 mibReq.Param.DevAddr = DevAddr;
Wayne Roberts 0:62e456e60083 1213 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1214 SerialDisplayUpdateDevAddr(DevAddr);
Wayne Roberts 0:62e456e60083 1215
Wayne Roberts 0:62e456e60083 1216 mibReq.Type = MIB_APP_SKEY;
Wayne Roberts 0:62e456e60083 1217 mibReq.Param.key = AppSKey;
Wayne Roberts 0:62e456e60083 1218 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1219 SerialDisplayUpdateKey(ROW_AppSKey, AppSKey);
Wayne Roberts 0:62e456e60083 1220
Wayne Roberts 0:62e456e60083 1221 #if defined(LORAWAN_SNwkSIntKey) && defined(LORAWAN_NwkSEncKey)
Wayne Roberts 0:62e456e60083 1222 /* lorawan 1v1 ABP */
Wayne Roberts 0:62e456e60083 1223 mibReq.Type = MIB_NwkSEncKey;
Wayne Roberts 2:da3c8d5b3f49 1224 mibReq.Param.key = NwkSEncKey;
Wayne Roberts 0:62e456e60083 1225 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1226 SerialDisplayUpdateKey(ROW_NwkSEncKey, NwkSEncKey);
Wayne Roberts 0:62e456e60083 1227
Wayne Roberts 0:62e456e60083 1228 mibReq.Type = MIB_SNwkSIntKey;
Wayne Roberts 2:da3c8d5b3f49 1229 mibReq.Param.key = SNwkSIntKey;
Wayne Roberts 0:62e456e60083 1230 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1231 SerialDisplayUpdateKey(ROW_SNwkSIntKey, SNwkSIntKey);
Wayne Roberts 0:62e456e60083 1232
Wayne Roberts 0:62e456e60083 1233 mibReq.Type = MIB_FNwkSIntKey;
Wayne Roberts 0:62e456e60083 1234 mibReq.Param.key = FNwkSIntKey;
Wayne Roberts 0:62e456e60083 1235 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1236 SerialDisplayUpdateKey(ROW_FNwkSIntKey, mibReq.Param.key);
Wayne Roberts 0:62e456e60083 1237 #else
Wayne Roberts 0:62e456e60083 1238 /* lorawan 1v0 ABP */
Wayne Roberts 0:62e456e60083 1239 mibReq.Type = MIB_NwkSKey;
Wayne Roberts 0:62e456e60083 1240 mibReq.Param.key = FNwkSIntKey;
Wayne Roberts 0:62e456e60083 1241 LoRaMacMibSetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1242 SerialDisplayUpdateKey(ROW_FNwkSIntKey, mibReq.Param.key);
Wayne Roberts 0:62e456e60083 1243 #endif
Wayne Roberts 0:62e456e60083 1244
Wayne Roberts 0:62e456e60083 1245 DeviceState = DEVICE_STATE_TRIGGER;
Wayne Roberts 0:62e456e60083 1246 #endif /* !LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 1247 break;
Wayne Roberts 0:62e456e60083 1248 }
Wayne Roberts 0:62e456e60083 1249 #ifdef LORAWAN_JOIN_EUI
Wayne Roberts 0:62e456e60083 1250 case DEVICE_STATE_JOIN:
Wayne Roberts 0:62e456e60083 1251 {
Wayne Roberts 0:62e456e60083 1252 join(8);
Wayne Roberts 0:62e456e60083 1253 DeviceState = DEVICE_STATE_SLEEP;
Wayne Roberts 0:62e456e60083 1254 break;
Wayne Roberts 0:62e456e60083 1255 }
Wayne Roberts 0:62e456e60083 1256 case DEVICE_STATE_JOIN_OK:
Wayne Roberts 0:62e456e60083 1257 MibRequestConfirm_t mibReq;
Wayne Roberts 0:62e456e60083 1258 mibReq.Type = MIB_NETWORK_JOINED;
Wayne Roberts 0:62e456e60083 1259 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1260 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
Wayne Roberts 0:62e456e60083 1261 mibReq.Type = MIB_DEV_ADDR;
Wayne Roberts 0:62e456e60083 1262 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1263 SerialDisplayUpdateDevAddr(mibReq.Param.DevAddr);
Wayne Roberts 0:62e456e60083 1264 mibReq.Type = MIB_FNwkSIntKey;
Wayne Roberts 0:62e456e60083 1265 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1266 SerialDisplayUpdateKey( ROW_FNwkSIntKey, mibReq.Param.key );
Wayne Roberts 0:62e456e60083 1267 mibReq.Type = MIB_APP_SKEY;
Wayne Roberts 0:62e456e60083 1268 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1269 SerialDisplayUpdateKey( ROW_AppSKey, mibReq.Param.key );
Wayne Roberts 0:62e456e60083 1270
Wayne Roberts 0:62e456e60083 1271 #ifdef LORAWAN_ROOT_APPKEY
Wayne Roberts 0:62e456e60083 1272 mibReq.Type = MIB_SNwkSIntKey;
Wayne Roberts 0:62e456e60083 1273 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1274 SerialDisplayUpdateKey(ROW_SNwkSIntKey, mibReq.Param.key);
Wayne Roberts 0:62e456e60083 1275 mibReq.Type = MIB_NwkSEncKey;
Wayne Roberts 0:62e456e60083 1276 LoRaMacMibGetRequestConfirm( &mibReq );
Wayne Roberts 0:62e456e60083 1277 SerialDisplayUpdateKey(ROW_NwkSEncKey, mibReq.Param.key);
Wayne Roberts 0:62e456e60083 1278 #endif /* LORAWAN_ROOT_APPKEY */
Wayne Roberts 0:62e456e60083 1279 DeviceState = DEVICE_STATE_TRIGGER;
Wayne Roberts 0:62e456e60083 1280 break;
Wayne Roberts 0:62e456e60083 1281 #endif /* LORAWAN_JOIN_EUI */
Wayne Roberts 0:62e456e60083 1282 case DEVICE_STATE_SEND:
Wayne Roberts 0:62e456e60083 1283 SerialDisplayUpdateUplinkAcked( false );
Wayne Roberts 0:62e456e60083 1284 SerialDisplayUpdateDonwlinkRxData( false );
Wayne Roberts 0:62e456e60083 1285 PrepareTxFrame( AppPort );
Wayne Roberts 2:da3c8d5b3f49 1286 status = SendFrame(gIsTxConfirmed, gAppDataSize);
Wayne Roberts 2:da3c8d5b3f49 1287 if (status == LORAMAC_STATUS_OK) {
Wayne Roberts 2:da3c8d5b3f49 1288 /* McpsConfirm or McpsIndication callback will continue */
Wayne Roberts 2:da3c8d5b3f49 1289 DeviceState = DEVICE_STATE_SLEEP;
Wayne Roberts 2:da3c8d5b3f49 1290 } else
Wayne Roberts 2:da3c8d5b3f49 1291 DeviceState = DEVICE_STATE_TRIGGER;
Wayne Roberts 0:62e456e60083 1292 break;
Wayne Roberts 0:62e456e60083 1293 case DEVICE_STATE_SLEEP:
Wayne Roberts 0:62e456e60083 1294 {
Wayne Roberts 0:62e456e60083 1295 // Wake up through events
Wayne Roberts 0:62e456e60083 1296 sleep_manager_sleep_auto();
Wayne Roberts 0:62e456e60083 1297 break;
Wayne Roberts 0:62e456e60083 1298 }
Wayne Roberts 0:62e456e60083 1299 case DEVICE_STATE_TRIGGER:
Wayne Roberts 3:fc23bbc14475 1300 /* wait button ISR */
Wayne Roberts 0:62e456e60083 1301 sleep_manager_sleep_auto();
Wayne Roberts 0:62e456e60083 1302 break;
Wayne Roberts 0:62e456e60083 1303 default:
Wayne Roberts 0:62e456e60083 1304 DeviceState = DEVICE_STATE_INIT;
Wayne Roberts 0:62e456e60083 1305 break;
Wayne Roberts 0:62e456e60083 1306 } // ..switch( DeviceState )
Wayne Roberts 0:62e456e60083 1307
Wayne Roberts 3:fc23bbc14475 1308 LoRaMacUserContext();
Wayne Roberts 0:62e456e60083 1309 } // ..while( 1 )
Wayne Roberts 0:62e456e60083 1310 }
Wayne Roberts 0:62e456e60083 1311 #endif /* ENABLE_VT100 */