Publish for Testing

Dependencies:   SX127x lorawan1v1

Fork of LoRaWAN-grove-cayenne by wayne roberts

Committer:
bootcamps
Date:
Thu Oct 11 23:01:12 2018 +0000
Revision:
12:94b7971c7146
Parent:
8:efe6002910df
Test for LoRaWAN grove cayenne Oct 11th A

Who changed what in which revision?

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