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:
Mon Mar 19 14:46:37 2018 -0700
Revision:
3:fc23bbc14475
Parent:
2:da3c8d5b3f49
Child:
4:72b8fdc9878e
move d8 button to ISR for deep sleep

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