LoRaWAN demo application using grove peripherals generating Cayenne LPP

Dependencies:   lorawan1v1

radio chip selection

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

Grove peripherals -> Cayenne demo

Read LoRaWAN-1.1 page for configuration instructions.

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

Use with sx1272 shield with grove peripherals connected:

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

Button

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

serial console keys

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

DevEUI configuration

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

Committer:
Wayne Roberts
Date:
Wed Apr 11 14:50:01 2018 -0700
Revision:
6:795461780e10
Parent:
5:53cd6c24a4ab
Child:
8:efe6002910df
DISCO_L072CZ_LRWAN1: USER_BUTTON for sending uplinks

Who changed what in which revision?

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