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