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:
Thu Mar 29 14:57:14 2018 -0700
Revision:
4:72b8fdc9878e
Parent:
3:fc23bbc14475
Child:
5:53cd6c24a4ab
Add sequence number to digital input channel. Jumper interrupt fired on startup if inserted.

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