application layer with: button, LED, pot, tempSense

Dependencies:   mbed SX1272Lib

Fork of LoRaWAN-demo-72-bootcamp by Semtech

Use with sx1272 shield with grove peripherals connected:

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

Button

Sends to different payloads: 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

Committer:
dudmuck
Date:
Tue Jan 30 22:49:12 2018 +0000
Revision:
10:52810ecbd83b
Parent:
9:0083afd69815
Child:
11:018e7e28161d
application layer with: button, LED, pot, tempSense

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 0:45496a70a8a5 1 /*
mluis 0:45496a70a8a5 2 / _____) _ | |
mluis 0:45496a70a8a5 3 ( (____ _____ ____ _| |_ _____ ____| |__
mluis 0:45496a70a8a5 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
mluis 0:45496a70a8a5 5 _____) ) ____| | | || |_| ____( (___| | | |
mluis 0:45496a70a8a5 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 0:45496a70a8a5 7 (C)2015 Semtech
mluis 0:45496a70a8a5 8
mluis 0:45496a70a8a5 9 Description: LoRaMac classA device implementation
mluis 0:45496a70a8a5 10
mluis 0:45496a70a8a5 11 License: Revised BSD License, see LICENSE.TXT file include in the project
mluis 0:45496a70a8a5 12
mluis 0:45496a70a8a5 13 Maintainer: Miguel Luis and Gregory Cristian
mluis 0:45496a70a8a5 14 */
mluis 0:45496a70a8a5 15 #include "mbed.h"
mluis 0:45496a70a8a5 16 #include "board.h"
mluis 0:45496a70a8a5 17 #include "radio.h"
mluis 0:45496a70a8a5 18
mluis 0:45496a70a8a5 19 #include "LoRaMac.h"
mluis 9:0083afd69815 20 #include "Commissioning.h"
mluis 0:45496a70a8a5 21 #include "SerialDisplay.h"
mluis 0:45496a70a8a5 22
mluis 0:45496a70a8a5 23 /*!
mluis 9:0083afd69815 24 * Defines the application data transmission duty cycle. 5s, value in [ms].
mluis 0:45496a70a8a5 25 */
mluis 9:0083afd69815 26 #define APP_TX_DUTYCYCLE 5000
mluis 0:45496a70a8a5 27
mluis 0:45496a70a8a5 28 /*!
mluis 0:45496a70a8a5 29 * Defines a random delay for application data transmission duty cycle. 1s,
mluis 9:0083afd69815 30 * value in [ms].
mluis 0:45496a70a8a5 31 */
mluis 9:0083afd69815 32 #define APP_TX_DUTYCYCLE_RND 1000
mluis 0:45496a70a8a5 33
mluis 0:45496a70a8a5 34 /*!
mluis 5:fa113b25f612 35 * Default datarate
mluis 0:45496a70a8a5 36 */
GregCr 2:48d8d4806d48 37 #define LORAWAN_DEFAULT_DATARATE DR_5
mluis 0:45496a70a8a5 38
mluis 0:45496a70a8a5 39 /*!
mluis 0:45496a70a8a5 40 * LoRaWAN confirmed messages
mluis 0:45496a70a8a5 41 */
GregCr 2:48d8d4806d48 42 #define LORAWAN_CONFIRMED_MSG_ON false
mluis 0:45496a70a8a5 43
mluis 0:45496a70a8a5 44 /*!
mluis 0:45496a70a8a5 45 * LoRaWAN Adaptive Data Rate
mluis 0:45496a70a8a5 46 *
mluis 0:45496a70a8a5 47 * \remark Please note that when ADR is enabled the end-device should be static
mluis 0:45496a70a8a5 48 */
mluis 0:45496a70a8a5 49 #define LORAWAN_ADR_ON 1
mluis 0:45496a70a8a5 50
mluis 0:45496a70a8a5 51 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 52
mluis 0:45496a70a8a5 53 #include "LoRaMacTest.h"
mluis 0:45496a70a8a5 54
mluis 0:45496a70a8a5 55 /*!
mluis 0:45496a70a8a5 56 * LoRaWAN ETSI duty cycle control enable/disable
mluis 0:45496a70a8a5 57 *
mluis 0:45496a70a8a5 58 * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
mluis 0:45496a70a8a5 59 */
GregCr 2:48d8d4806d48 60 #define LORAWAN_DUTYCYCLE_ON false
mluis 0:45496a70a8a5 61
mluis 5:fa113b25f612 62 #define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP 1
mluis 5:fa113b25f612 63
mluis 9:0083afd69815 64 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 5:fa113b25f612 65
mluis 5:fa113b25f612 66 #define LC4 { 867100000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:fa113b25f612 67 #define LC5 { 867300000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:fa113b25f612 68 #define LC6 { 867500000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:fa113b25f612 69 #define LC7 { 867700000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:fa113b25f612 70 #define LC8 { 867900000, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
mluis 5:fa113b25f612 71 #define LC9 { 868800000, { ( ( DR_7 << 4 ) | DR_7 ) }, 2 }
mluis 5:fa113b25f612 72 #define LC10 { 868300000, { ( ( DR_6 << 4 ) | DR_6 ) }, 1 }
mluis 5:fa113b25f612 73
mluis 5:fa113b25f612 74 #endif
mluis 5:fa113b25f612 75
mluis 0:45496a70a8a5 76 #endif
mluis 0:45496a70a8a5 77
mluis 0:45496a70a8a5 78 /*!
mluis 0:45496a70a8a5 79 * LoRaWAN application port
mluis 0:45496a70a8a5 80 */
GregCr 3:d4142832d5af 81 #define LORAWAN_APP_PORT 10
mluis 0:45496a70a8a5 82
mluis 0:45496a70a8a5 83 /*!
mluis 0:45496a70a8a5 84 * User application data buffer size
mluis 0:45496a70a8a5 85 */
mluis 0:45496a70a8a5 86 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
mluis 0:45496a70a8a5 87 #define LORAWAN_APP_DATA_SIZE 6
mluis 0:45496a70a8a5 88
mluis 0:45496a70a8a5 89 #else
GregCr 3:d4142832d5af 90 #define LORAWAN_APP_DATA_SIZE 5
mluis 0:45496a70a8a5 91
mluis 0:45496a70a8a5 92 #endif
mluis 0:45496a70a8a5 93
mluis 0:45496a70a8a5 94 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
mluis 0:45496a70a8a5 95 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
mluis 0:45496a70a8a5 96 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
mluis 0:45496a70a8a5 97
mluis 7:ceb4063e6863 98 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:45496a70a8a5 99
mluis 0:45496a70a8a5 100 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
mluis 0:45496a70a8a5 101 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
mluis 0:45496a70a8a5 102
mluis 0:45496a70a8a5 103 /*!
mluis 0:45496a70a8a5 104 * Device address
mluis 0:45496a70a8a5 105 */
mluis 0:45496a70a8a5 106 static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
mluis 0:45496a70a8a5 107
mluis 0:45496a70a8a5 108 #endif
mluis 0:45496a70a8a5 109
mluis 0:45496a70a8a5 110 /*!
mluis 0:45496a70a8a5 111 * Application port
mluis 0:45496a70a8a5 112 */
mluis 0:45496a70a8a5 113 static uint8_t AppPort = LORAWAN_APP_PORT;
mluis 0:45496a70a8a5 114
mluis 0:45496a70a8a5 115 /*!
mluis 0:45496a70a8a5 116 * User application data size
mluis 0:45496a70a8a5 117 */
mluis 0:45496a70a8a5 118 static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
mluis 0:45496a70a8a5 119
mluis 0:45496a70a8a5 120 /*!
mluis 0:45496a70a8a5 121 * User application data buffer size
mluis 0:45496a70a8a5 122 */
mluis 0:45496a70a8a5 123 #define LORAWAN_APP_DATA_MAX_SIZE 64
mluis 0:45496a70a8a5 124
mluis 0:45496a70a8a5 125 /*!
mluis 0:45496a70a8a5 126 * User application data
mluis 0:45496a70a8a5 127 */
mluis 0:45496a70a8a5 128 static uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
mluis 0:45496a70a8a5 129
mluis 0:45496a70a8a5 130 /*!
mluis 0:45496a70a8a5 131 * Indicates if the node is sending confirmed or unconfirmed messages
mluis 0:45496a70a8a5 132 */
mluis 0:45496a70a8a5 133 static uint8_t IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
mluis 0:45496a70a8a5 134
mluis 0:45496a70a8a5 135 /*!
mluis 0:45496a70a8a5 136 * Device states
mluis 0:45496a70a8a5 137 */
dudmuck 10:52810ecbd83b 138 static enum eDeviceState {
dudmuck 10:52810ecbd83b 139 DEVICE_STATE_INIT = 0,
mluis 0:45496a70a8a5 140 DEVICE_STATE_JOIN,
dudmuck 10:52810ecbd83b 141 DEVICE_STATE_JOIN_OK,
mluis 0:45496a70a8a5 142 DEVICE_STATE_SEND,
dudmuck 10:52810ecbd83b 143 DEVICE_STATE_TRIGGER,
mluis 0:45496a70a8a5 144 DEVICE_STATE_SLEEP
dudmuck 10:52810ecbd83b 145 } DeviceState;
mluis 0:45496a70a8a5 146
mluis 0:45496a70a8a5 147 /*!
mluis 0:45496a70a8a5 148 * LoRaWAN compliance tests support data
mluis 0:45496a70a8a5 149 */
dudmuck 10:52810ecbd83b 150 struct ComplianceTest_s {
mluis 0:45496a70a8a5 151 bool Running;
mluis 0:45496a70a8a5 152 uint8_t State;
mluis 0:45496a70a8a5 153 bool IsTxConfirmed;
mluis 0:45496a70a8a5 154 uint8_t AppPort;
mluis 0:45496a70a8a5 155 uint8_t AppDataSize;
mluis 0:45496a70a8a5 156 uint8_t *AppDataBuffer;
mluis 0:45496a70a8a5 157 uint16_t DownLinkCounter;
mluis 0:45496a70a8a5 158 bool LinkCheck;
mluis 0:45496a70a8a5 159 uint8_t DemodMargin;
mluis 0:45496a70a8a5 160 uint8_t NbGateways;
dudmuck 10:52810ecbd83b 161 } ComplianceTest;
mluis 0:45496a70a8a5 162
mluis 0:45496a70a8a5 163 /*
mluis 0:45496a70a8a5 164 * SerialDisplay managment variables
mluis 0:45496a70a8a5 165 */
mluis 0:45496a70a8a5 166
mluis 0:45496a70a8a5 167 /*!
mluis 0:45496a70a8a5 168 * Strucure containing the Uplink status
mluis 0:45496a70a8a5 169 */
dudmuck 10:52810ecbd83b 170 struct sLoRaMacUplinkStatus {
mluis 0:45496a70a8a5 171 uint8_t Acked;
mluis 0:45496a70a8a5 172 int8_t Datarate;
mluis 0:45496a70a8a5 173 uint16_t UplinkCounter;
mluis 0:45496a70a8a5 174 uint8_t Port;
mluis 0:45496a70a8a5 175 uint8_t *Buffer;
mluis 0:45496a70a8a5 176 uint8_t BufferSize;
dudmuck 10:52810ecbd83b 177 } LoRaMacUplinkStatus;
mluis 0:45496a70a8a5 178
mluis 0:45496a70a8a5 179 /*!
mluis 0:45496a70a8a5 180 * Strucure containing the Downlink status
mluis 0:45496a70a8a5 181 */
dudmuck 10:52810ecbd83b 182 struct sLoRaMacDownlinkStatus {
mluis 0:45496a70a8a5 183 int16_t Rssi;
mluis 0:45496a70a8a5 184 int8_t Snr;
mluis 0:45496a70a8a5 185 uint16_t DownlinkCounter;
mluis 0:45496a70a8a5 186 bool RxData;
mluis 0:45496a70a8a5 187 uint8_t Port;
mluis 0:45496a70a8a5 188 uint8_t *Buffer;
mluis 0:45496a70a8a5 189 uint8_t BufferSize;
dudmuck 10:52810ecbd83b 190 } LoRaMacDownlinkStatus;
mluis 0:45496a70a8a5 191 volatile bool DownlinkStatusUpdated = false;
mluis 0:45496a70a8a5 192
mluis 0:45496a70a8a5 193 void SerialDisplayRefresh( void )
mluis 0:45496a70a8a5 194 {
mluis 0:45496a70a8a5 195 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 196
mluis 0:45496a70a8a5 197 SerialDisplayInit( );
mluis 0:45496a70a8a5 198 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:45496a70a8a5 199
mluis 0:45496a70a8a5 200 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 0:45496a70a8a5 201 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 0:45496a70a8a5 202 SerialDisplayUpdateDevAddr( DevAddr );
mluis 0:45496a70a8a5 203 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 0:45496a70a8a5 204 SerialDisplayUpdateKey( 13, AppSKey );
mluis 7:ceb4063e6863 205 #endif
mluis 0:45496a70a8a5 206 SerialDisplayUpdateEui( 5, DevEui );
mluis 0:45496a70a8a5 207 SerialDisplayUpdateEui( 6, AppEui );
mluis 0:45496a70a8a5 208 SerialDisplayUpdateKey( 7, AppKey );
mluis 0:45496a70a8a5 209
mluis 0:45496a70a8a5 210 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 211 LoRaMacMibGetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 212 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
mluis 0:45496a70a8a5 213
mluis 0:45496a70a8a5 214 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:45496a70a8a5 215 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 216 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 0:45496a70a8a5 217 #else
mluis 0:45496a70a8a5 218 SerialDisplayUpdateDutyCycle( false );
mluis 0:45496a70a8a5 219 #endif
mluis 0:45496a70a8a5 220 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
dudmuck 10:52810ecbd83b 221
dudmuck 10:52810ecbd83b 222 //SerialDisplayUpdateLedState( 3, AppLedStateOn );
mluis 0:45496a70a8a5 223 }
mluis 0:45496a70a8a5 224
dudmuck 10:52810ecbd83b 225 uint8_t c_ch;
dudmuck 10:52810ecbd83b 226
mluis 0:45496a70a8a5 227 void SerialRxProcess( void )
mluis 0:45496a70a8a5 228 {
dudmuck 10:52810ecbd83b 229 if( SerialDisplayReadable( ) == true ) {
dudmuck 10:52810ecbd83b 230 char ch = SerialDisplayGetChar();
dudmuck 10:52810ecbd83b 231 if ( ch >= '0' || ch <= '9') {
dudmuck 10:52810ecbd83b 232 c_ch = ch - '0';
dudmuck 10:52810ecbd83b 233 DeviceState = DEVICE_STATE_SEND;
dudmuck 10:52810ecbd83b 234 return;
dudmuck 10:52810ecbd83b 235 }
dudmuck 10:52810ecbd83b 236 switch( ch ) {
mluis 0:45496a70a8a5 237 case 'R':
mluis 0:45496a70a8a5 238 case 'r':
mluis 0:45496a70a8a5 239 // Refresh Serial screen
mluis 0:45496a70a8a5 240 SerialDisplayRefresh( );
mluis 0:45496a70a8a5 241 break;
mluis 0:45496a70a8a5 242 default:
mluis 0:45496a70a8a5 243 break;
mluis 0:45496a70a8a5 244 }
mluis 0:45496a70a8a5 245 }
mluis 0:45496a70a8a5 246 }
mluis 0:45496a70a8a5 247
dudmuck 10:52810ecbd83b 248 #define LPP_DIGITAL_INPUT 0 // 1 byte
dudmuck 10:52810ecbd83b 249 #define LPP_DIGITAL_OUTPUT 1 // 1 byte
dudmuck 10:52810ecbd83b 250 #define LPP_ANALOG_INPUT 2 // 2 bytes, 0.01 signed
dudmuck 10:52810ecbd83b 251 #define LPP_ANALOG_OUTPUT 3 // 2 bytes, 0.01 signed
dudmuck 10:52810ecbd83b 252 #define LPP_LUMINOSITY 101 // 2 bytes, 1 lux unsigned
dudmuck 10:52810ecbd83b 253 #define LPP_PRESENCE 102 // 1 byte, 1
dudmuck 10:52810ecbd83b 254 #define LPP_TEMPERATURE 103 // 2 bytes, 0.1°C signed
dudmuck 10:52810ecbd83b 255 #define LPP_RELATIVE_HUMIDITY 104 // 1 byte, 0.5% unsigned
dudmuck 10:52810ecbd83b 256 #define LPP_ACCELEROMETER 113 // 2 bytes per axis, 0.001G
dudmuck 10:52810ecbd83b 257 #define LPP_BAROMETRIC_PRESSURE 115 // 2 bytes 0.1 hPa Unsigned
dudmuck 10:52810ecbd83b 258 #define LPP_GYROMETER 134 // 2 bytes per axis, 0.01 °/s
dudmuck 10:52810ecbd83b 259 #define LPP_GPS 136 // 3 byte lon/lat 0.0001 °, 3 bytes alt 0.01m
dudmuck 10:52810ecbd83b 260
dudmuck 10:52810ecbd83b 261
dudmuck 10:52810ecbd83b 262 // Data ID + Data Type + Data Size
dudmuck 10:52810ecbd83b 263 #define LPP_DIGITAL_INPUT_SIZE 3
dudmuck 10:52810ecbd83b 264 #define LPP_DIGITAL_OUTPUT_SIZE 3
dudmuck 10:52810ecbd83b 265 #define LPP_ANALOG_INPUT_SIZE 4
dudmuck 10:52810ecbd83b 266 #define LPP_ANALOG_OUTPUT_SIZE 4
dudmuck 10:52810ecbd83b 267 #define LPP_LUMINOSITY_SIZE 4
dudmuck 10:52810ecbd83b 268 #define LPP_PRESENCE_SIZE 3
dudmuck 10:52810ecbd83b 269 #define LPP_TEMPERATURE_SIZE 4
dudmuck 10:52810ecbd83b 270 #define LPP_RELATIVE_HUMIDITY_SIZE 3
dudmuck 10:52810ecbd83b 271 #define LPP_ACCELEROMETER_SIZE 8
dudmuck 10:52810ecbd83b 272 #define LPP_BAROMETRIC_PRESSURE_SIZE 4
dudmuck 10:52810ecbd83b 273 #define LPP_GYROMETER_SIZE 8
dudmuck 10:52810ecbd83b 274 #define LPP_GPS_SIZE 11
dudmuck 10:52810ecbd83b 275
dudmuck 10:52810ecbd83b 276 #define CAYENNE_CH_DOUT 2
dudmuck 10:52810ecbd83b 277 #define CAYENNE_CH_AOUT 3
dudmuck 10:52810ecbd83b 278 #define CAYENNE_CH_TEMP 0
dudmuck 10:52810ecbd83b 279 #define CAYENNE_CH_POT 1
dudmuck 10:52810ecbd83b 280 AnalogIn a1(A1);
dudmuck 10:52810ecbd83b 281 AnalogIn a2(A2);
dudmuck 10:52810ecbd83b 282 AnalogIn a3(A3);
dudmuck 10:52810ecbd83b 283 AnalogIn a4(A4);
dudmuck 10:52810ecbd83b 284
dudmuck 10:52810ecbd83b 285 const unsigned R0 = 100000;
dudmuck 10:52810ecbd83b 286 const unsigned B = 4275;
dudmuck 10:52810ecbd83b 287
dudmuck 10:52810ecbd83b 288 volatile TimerTime_t buttonStartAt;
dudmuck 10:52810ecbd83b 289 DigitalIn d8(D8);
dudmuck 10:52810ecbd83b 290 DigitalOut extLed(D15);
dudmuck 10:52810ecbd83b 291 PwmOut pwm(PB_11);
dudmuck 10:52810ecbd83b 292 volatile int cayenne_ack_ch;
mluis 0:45496a70a8a5 293 /*!
mluis 0:45496a70a8a5 294 * \brief Prepares the payload of the frame
mluis 0:45496a70a8a5 295 */
mluis 0:45496a70a8a5 296 static void PrepareTxFrame( uint8_t port )
mluis 0:45496a70a8a5 297 {
dudmuck 10:52810ecbd83b 298 uint16_t u16, rot;
dudmuck 10:52810ecbd83b 299 float t, f, R;
dudmuck 10:52810ecbd83b 300
dudmuck 10:52810ecbd83b 301 if (c_ch != 0xff) {
dudmuck 10:52810ecbd83b 302 AppDataSize = 0;
dudmuck 10:52810ecbd83b 303 AppData[AppDataSize++] = c_ch;
dudmuck 10:52810ecbd83b 304 switch (c_ch) {
dudmuck 10:52810ecbd83b 305 case CAYENNE_CH_TEMP:
dudmuck 10:52810ecbd83b 306 AppData[AppDataSize++] = LPP_TEMPERATURE;
dudmuck 10:52810ecbd83b 307 u16 = a3.read_u16();
dudmuck 10:52810ecbd83b 308 R = 65535 / u16 - 1.0;
dudmuck 10:52810ecbd83b 309 R = R0 * R;
dudmuck 10:52810ecbd83b 310 t = 1.0/(log(R/R0)/B+1/298.15)-273.15;
dudmuck 10:52810ecbd83b 311 u16 = t * 10; // 0.1C per bit
dudmuck 10:52810ecbd83b 312 AppData[AppDataSize++] = u16 >> 8;
dudmuck 10:52810ecbd83b 313 AppData[AppDataSize++] = u16;
dudmuck 10:52810ecbd83b 314 break;
dudmuck 10:52810ecbd83b 315 case CAYENNE_CH_POT:
dudmuck 10:52810ecbd83b 316 AppData[AppDataSize++] = LPP_ANALOG_INPUT;
dudmuck 10:52810ecbd83b 317 u16 = a1.read_u16(); // pot (rotary angle)
dudmuck 10:52810ecbd83b 318 f = u16 / 198.6; // scale 65535/3.3 to 0.01v per bit
dudmuck 10:52810ecbd83b 319 rot = (uint16_t) f;
dudmuck 10:52810ecbd83b 320 AppData[AppDataSize++] = rot >> 8;
dudmuck 10:52810ecbd83b 321 AppData[AppDataSize++] = rot;
dudmuck 10:52810ecbd83b 322 break;
dudmuck 10:52810ecbd83b 323 case CAYENNE_CH_DOUT:
dudmuck 10:52810ecbd83b 324 AppData[AppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 10:52810ecbd83b 325 AppData[AppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 326 break;
dudmuck 10:52810ecbd83b 327 case CAYENNE_CH_AOUT:
dudmuck 10:52810ecbd83b 328 AppData[AppDataSize++] = LPP_ANALOG_OUTPUT;
dudmuck 10:52810ecbd83b 329 u16 = pwm.read() * 100;
dudmuck 10:52810ecbd83b 330 AppData[AppDataSize++] = u16 >> 8;
dudmuck 10:52810ecbd83b 331 AppData[AppDataSize++] = u16;
dudmuck 10:52810ecbd83b 332 break;
GregCr 2:48d8d4806d48 333 }
dudmuck 10:52810ecbd83b 334 return;
dudmuck 10:52810ecbd83b 335 } else if (cayenne_ack_ch != -1) {
dudmuck 10:52810ecbd83b 336 switch (cayenne_ack_ch) {
dudmuck 10:52810ecbd83b 337 case CAYENNE_CH_DOUT:
dudmuck 10:52810ecbd83b 338 AppData[AppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 10:52810ecbd83b 339 AppData[AppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 340 break;
dudmuck 10:52810ecbd83b 341 case CAYENNE_CH_AOUT:
dudmuck 10:52810ecbd83b 342 AppData[AppDataSize++] = LPP_ANALOG_OUTPUT;
dudmuck 10:52810ecbd83b 343 u16 = pwm.read() * 100;
dudmuck 10:52810ecbd83b 344 AppData[AppDataSize++] = u16 >> 8;
dudmuck 10:52810ecbd83b 345 AppData[AppDataSize++] = u16;
dudmuck 10:52810ecbd83b 346 break;
mluis 0:45496a70a8a5 347 }
dudmuck 10:52810ecbd83b 348 cayenne_ack_ch = -1;
dudmuck 10:52810ecbd83b 349 }
dudmuck 10:52810ecbd83b 350
dudmuck 10:52810ecbd83b 351 while (d8.read() == 1) {
dudmuck 10:52810ecbd83b 352 TimerTime_t duration = TimerGetCurrentTime() - buttonStartAt;
dudmuck 10:52810ecbd83b 353 vt.SetCursorPos( 41, 1 );
dudmuck 10:52810ecbd83b 354 if (duration > 1000) {
dudmuck 10:52810ecbd83b 355 AppDataSize = 0;
dudmuck 10:52810ecbd83b 356 AppData[AppDataSize++] = CAYENNE_CH_DOUT;
dudmuck 10:52810ecbd83b 357 AppData[AppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 10:52810ecbd83b 358 AppData[AppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 359 vt.printf("send outputs ", duration);
dudmuck 10:52810ecbd83b 360 return;
dudmuck 10:52810ecbd83b 361 } else
dudmuck 10:52810ecbd83b 362 vt.printf("dur %u ", duration);
dudmuck 10:52810ecbd83b 363 }
dudmuck 10:52810ecbd83b 364
dudmuck 10:52810ecbd83b 365 switch( port ) {
dudmuck 10:52810ecbd83b 366 case LORAWAN_APP_PORT:
dudmuck 10:52810ecbd83b 367 AppDataSize = 0;
dudmuck 10:52810ecbd83b 368 AppData[AppDataSize++] = CAYENNE_CH_TEMP;
dudmuck 10:52810ecbd83b 369 AppData[AppDataSize++] = LPP_TEMPERATURE;
dudmuck 10:52810ecbd83b 370 u16 = a3.read_u16();
dudmuck 10:52810ecbd83b 371 R = 65535 / u16 - 1.0;
dudmuck 10:52810ecbd83b 372 R = R0 * R;
dudmuck 10:52810ecbd83b 373 t = 1.0/(log(R/R0)/B+1/298.15)-273.15;
dudmuck 10:52810ecbd83b 374 u16 = t * 10; // 0.1C per bit
dudmuck 10:52810ecbd83b 375 AppData[AppDataSize++] = u16 >> 8;
dudmuck 10:52810ecbd83b 376 AppData[AppDataSize++] = u16;
dudmuck 10:52810ecbd83b 377 AppData[AppDataSize++] = CAYENNE_CH_POT;
dudmuck 10:52810ecbd83b 378 AppData[AppDataSize++] = LPP_ANALOG_INPUT;
dudmuck 10:52810ecbd83b 379 u16 = a1.read_u16(); // pot (rotary angle)
dudmuck 10:52810ecbd83b 380 f = u16 / 198.6; // scale 65535/3.3 to 0.01v per bit
dudmuck 10:52810ecbd83b 381 rot = (uint16_t) f;
dudmuck 10:52810ecbd83b 382 AppData[AppDataSize++] = rot >> 8;
dudmuck 10:52810ecbd83b 383 AppData[AppDataSize++] = rot;
dudmuck 10:52810ecbd83b 384
dudmuck 10:52810ecbd83b 385 AppData[AppDataSize++] = CAYENNE_CH_DOUT;
dudmuck 10:52810ecbd83b 386 AppData[AppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 10:52810ecbd83b 387 AppData[AppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 388 vt.SetCursorPos( 41, 1 );
dudmuck 10:52810ecbd83b 389 vt.printf("u16:%u, f:%f, rot:%u t:%.1f\e[K", u16, f, rot, t);
dudmuck 10:52810ecbd83b 390 break;
dudmuck 10:52810ecbd83b 391 case 224:
dudmuck 10:52810ecbd83b 392 if( ComplianceTest.LinkCheck == true ) {
dudmuck 10:52810ecbd83b 393 ComplianceTest.LinkCheck = false;
dudmuck 10:52810ecbd83b 394 AppDataSize = 3;
dudmuck 10:52810ecbd83b 395 AppData[0] = 5;
dudmuck 10:52810ecbd83b 396 AppData[1] = ComplianceTest.DemodMargin;
dudmuck 10:52810ecbd83b 397 AppData[2] = ComplianceTest.NbGateways;
mluis 0:45496a70a8a5 398 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 399 } else {
dudmuck 10:52810ecbd83b 400 switch( ComplianceTest.State ) {
dudmuck 10:52810ecbd83b 401 case 4:
dudmuck 10:52810ecbd83b 402 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 403 break;
dudmuck 10:52810ecbd83b 404 case 1:
dudmuck 10:52810ecbd83b 405 AppDataSize = 2;
dudmuck 10:52810ecbd83b 406 AppData[0] = ComplianceTest.DownLinkCounter >> 8;
dudmuck 10:52810ecbd83b 407 AppData[1] = ComplianceTest.DownLinkCounter;
dudmuck 10:52810ecbd83b 408 break;
dudmuck 10:52810ecbd83b 409 }
mluis 0:45496a70a8a5 410 }
dudmuck 10:52810ecbd83b 411 break;
dudmuck 10:52810ecbd83b 412 default:
dudmuck 10:52810ecbd83b 413 break;
mluis 0:45496a70a8a5 414 }
mluis 0:45496a70a8a5 415 }
mluis 0:45496a70a8a5 416
dudmuck 10:52810ecbd83b 417 void LoRaMacStatus_toString(LoRaMacStatus_t s, char* out)
dudmuck 10:52810ecbd83b 418 {
dudmuck 10:52810ecbd83b 419 switch (s) {
dudmuck 10:52810ecbd83b 420 case LORAMAC_STATUS_PARAMETER_INVALID:
dudmuck 10:52810ecbd83b 421 strcpy(out, "PARAMTER_INVALID");
dudmuck 10:52810ecbd83b 422 break;
dudmuck 10:52810ecbd83b 423 case LORAMAC_STATUS_BUSY:
dudmuck 10:52810ecbd83b 424 strcpy(out, "BUSY");
dudmuck 10:52810ecbd83b 425 break;
dudmuck 10:52810ecbd83b 426 default:
dudmuck 10:52810ecbd83b 427 sprintf(out, "<%u>", s);
dudmuck 10:52810ecbd83b 428 break;
dudmuck 10:52810ecbd83b 429 }
dudmuck 10:52810ecbd83b 430 }
dudmuck 10:52810ecbd83b 431
dudmuck 10:52810ecbd83b 432 volatile unsigned sendCnt = 0;
mluis 0:45496a70a8a5 433 /*!
mluis 0:45496a70a8a5 434 * \brief Prepares the payload of the frame
mluis 0:45496a70a8a5 435 *
mluis 0:45496a70a8a5 436 * \retval [0: frame could be send, 1: error]
mluis 0:45496a70a8a5 437 */
mluis 0:45496a70a8a5 438 static bool SendFrame( void )
mluis 0:45496a70a8a5 439 {
dudmuck 10:52810ecbd83b 440 char str[48];
dudmuck 10:52810ecbd83b 441 LoRaMacStatus_t status;
mluis 0:45496a70a8a5 442 McpsReq_t mcpsReq;
mluis 0:45496a70a8a5 443 LoRaMacTxInfo_t txInfo;
mluis 9:0083afd69815 444
dudmuck 10:52810ecbd83b 445 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK ) {
mluis 0:45496a70a8a5 446 // Send empty frame in order to flush MAC commands
mluis 0:45496a70a8a5 447 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 0:45496a70a8a5 448 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
mluis 0:45496a70a8a5 449 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
mluis 0:45496a70a8a5 450 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 5:fa113b25f612 451
mluis 0:45496a70a8a5 452 LoRaMacUplinkStatus.Acked = false;
mluis 0:45496a70a8a5 453 LoRaMacUplinkStatus.Port = 0;
mluis 0:45496a70a8a5 454 LoRaMacUplinkStatus.Buffer = NULL;
mluis 0:45496a70a8a5 455 LoRaMacUplinkStatus.BufferSize = 0;
mluis 0:45496a70a8a5 456 SerialDisplayUpdateFrameType( false );
dudmuck 10:52810ecbd83b 457 } else {
mluis 0:45496a70a8a5 458 LoRaMacUplinkStatus.Acked = false;
mluis 0:45496a70a8a5 459 LoRaMacUplinkStatus.Port = AppPort;
mluis 0:45496a70a8a5 460 LoRaMacUplinkStatus.Buffer = AppData;
mluis 0:45496a70a8a5 461 LoRaMacUplinkStatus.BufferSize = AppDataSize;
mluis 0:45496a70a8a5 462 SerialDisplayUpdateFrameType( IsTxConfirmed );
mluis 0:45496a70a8a5 463
dudmuck 10:52810ecbd83b 464 if( IsTxConfirmed == false ) {
mluis 0:45496a70a8a5 465 mcpsReq.Type = MCPS_UNCONFIRMED;
mluis 0:45496a70a8a5 466 mcpsReq.Req.Unconfirmed.fPort = AppPort;
mluis 0:45496a70a8a5 467 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
mluis 0:45496a70a8a5 468 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
mluis 0:45496a70a8a5 469 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
dudmuck 10:52810ecbd83b 470 } else {
mluis 0:45496a70a8a5 471 mcpsReq.Type = MCPS_CONFIRMED;
mluis 0:45496a70a8a5 472 mcpsReq.Req.Confirmed.fPort = AppPort;
mluis 0:45496a70a8a5 473 mcpsReq.Req.Confirmed.fBuffer = AppData;
mluis 0:45496a70a8a5 474 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
mluis 4:de084e23d884 475 mcpsReq.Req.Confirmed.NbTrials = 8;
mluis 0:45496a70a8a5 476 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
mluis 0:45496a70a8a5 477 }
mluis 0:45496a70a8a5 478 }
mluis 0:45496a70a8a5 479
dudmuck 10:52810ecbd83b 480 sendCnt++;
dudmuck 10:52810ecbd83b 481 status = LoRaMacMcpsRequest( &mcpsReq );
dudmuck 10:52810ecbd83b 482 if (status == LORAMAC_STATUS_OK) {
dudmuck 10:52810ecbd83b 483 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 484 vt.printf("%u sendFrame() OK\e[K", sendCnt);
dudmuck 10:52810ecbd83b 485 SerialDisplayUpdateUplink(
dudmuck 10:52810ecbd83b 486 LoRaMacUplinkStatus.Acked,
dudmuck 10:52810ecbd83b 487 LoRaMacUplinkStatus.Datarate,
dudmuck 10:52810ecbd83b 488 LoRaMacUplinkStatus.UplinkCounter,
dudmuck 10:52810ecbd83b 489 LoRaMacUplinkStatus.Port,
dudmuck 10:52810ecbd83b 490 LoRaMacUplinkStatus.Buffer,
dudmuck 10:52810ecbd83b 491 LoRaMacUplinkStatus.BufferSize
dudmuck 10:52810ecbd83b 492 );
mluis 0:45496a70a8a5 493 return false;
mluis 0:45496a70a8a5 494 }
dudmuck 10:52810ecbd83b 495 LoRaMacStatus_toString(status, str);
dudmuck 10:52810ecbd83b 496 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 497 vt.printf("%u sendFrame() %s\e[K", sendCnt, str);
mluis 0:45496a70a8a5 498 return true;
mluis 0:45496a70a8a5 499 }
mluis 0:45496a70a8a5 500
dudmuck 10:52810ecbd83b 501 void LoRaMacEventInfoStatus_toString(LoRaMacEventInfoStatus_t s, char* out)
mluis 0:45496a70a8a5 502 {
dudmuck 10:52810ecbd83b 503 switch (s) {
dudmuck 10:52810ecbd83b 504 case LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL:
dudmuck 10:52810ecbd83b 505 strcpy(out, "JOIN_FAIL");
dudmuck 10:52810ecbd83b 506 break;
dudmuck 10:52810ecbd83b 507 case LORAMAC_EVENT_INFO_STATUS_ERROR:
dudmuck 10:52810ecbd83b 508 strcpy(out, "ERROR");
dudmuck 10:52810ecbd83b 509 break;
dudmuck 10:52810ecbd83b 510 case LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT:
dudmuck 10:52810ecbd83b 511 strcpy(out, "RX2_TIMEOUT");
dudmuck 10:52810ecbd83b 512 break;
dudmuck 10:52810ecbd83b 513 case LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL:
dudmuck 10:52810ecbd83b 514 strcpy(out, "ADDRESS_FAIL");
dudmuck 10:52810ecbd83b 515 break;
dudmuck 10:52810ecbd83b 516 case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOSS:
dudmuck 10:52810ecbd83b 517 strcpy(out, "FRAMES_LOSS");
dudmuck 10:52810ecbd83b 518 break;
dudmuck 10:52810ecbd83b 519 case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED:
dudmuck 10:52810ecbd83b 520 strcpy(out, "DOWNLINK_REPEATED");
dudmuck 10:52810ecbd83b 521 break; // confirmed downlink retry?
dudmuck 10:52810ecbd83b 522 case LORAMAC_EVENT_INFO_STATUS_MIC_FAIL:
dudmuck 10:52810ecbd83b 523 strcpy(out, "MIC_FAIL");
dudmuck 10:52810ecbd83b 524 break;
dudmuck 10:52810ecbd83b 525 case LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT:
dudmuck 10:52810ecbd83b 526 strcpy(out, "TX_TIMEOUT");
dudmuck 10:52810ecbd83b 527 break;
dudmuck 10:52810ecbd83b 528 case LORAMAC_EVENT_INFO_STATUS_RX1_ERROR:
dudmuck 10:52810ecbd83b 529 strcpy(out, "RX1_ERROR");
dudmuck 10:52810ecbd83b 530 break;
dudmuck 10:52810ecbd83b 531 case LORAMAC_EVENT_INFO_STATUS_RX2_ERROR:
dudmuck 10:52810ecbd83b 532 strcpy(out, "RX2_ERROR");
dudmuck 10:52810ecbd83b 533 break;
dudmuck 10:52810ecbd83b 534 case LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR:
dudmuck 10:52810ecbd83b 535 strcpy(out, "SIZE");
dudmuck 10:52810ecbd83b 536 break;
mluis 0:45496a70a8a5 537
mluis 0:45496a70a8a5 538
dudmuck 10:52810ecbd83b 539 default:
dudmuck 10:52810ecbd83b 540 sprintf(out, "<%d>", s);
dudmuck 10:52810ecbd83b 541 break;
dudmuck 10:52810ecbd83b 542 }
GregCr 3:d4142832d5af 543 }
GregCr 3:d4142832d5af 544
GregCr 3:d4142832d5af 545 /*!
mluis 0:45496a70a8a5 546 * \brief MCPS-Confirm event function
mluis 0:45496a70a8a5 547 *
mluis 5:fa113b25f612 548 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
mluis 0:45496a70a8a5 549 * containing confirm attributes.
mluis 0:45496a70a8a5 550 */
mluis 5:fa113b25f612 551 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
mluis 0:45496a70a8a5 552 {
dudmuck 10:52810ecbd83b 553 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 554 switch( mcpsConfirm->McpsRequest ) {
dudmuck 10:52810ecbd83b 555 case MCPS_UNCONFIRMED: {
mluis 0:45496a70a8a5 556 // Check Datarate
mluis 0:45496a70a8a5 557 // Check TxPower
mluis 0:45496a70a8a5 558 break;
mluis 0:45496a70a8a5 559 }
dudmuck 10:52810ecbd83b 560 case MCPS_CONFIRMED: {
mluis 0:45496a70a8a5 561 // Check Datarate
mluis 0:45496a70a8a5 562 // Check TxPower
mluis 0:45496a70a8a5 563 // Check AckReceived
mluis 5:fa113b25f612 564 // Check NbTrials
mluis 5:fa113b25f612 565 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
mluis 0:45496a70a8a5 566 break;
mluis 0:45496a70a8a5 567 }
dudmuck 10:52810ecbd83b 568 case MCPS_PROPRIETARY: {
mluis 0:45496a70a8a5 569 break;
mluis 0:45496a70a8a5 570 }
mluis 0:45496a70a8a5 571 default:
mluis 0:45496a70a8a5 572 break;
mluis 0:45496a70a8a5 573 }
mluis 5:fa113b25f612 574 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
mluis 5:fa113b25f612 575 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
dudmuck 10:52810ecbd83b 576 } else {
dudmuck 10:52810ecbd83b 577 char str[48];
dudmuck 10:52810ecbd83b 578 LoRaMacEventInfoStatus_toString(mcpsConfirm->Status, str);
dudmuck 10:52810ecbd83b 579 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 580 vt.printf("mcpsConf %s", str);
mluis 5:fa113b25f612 581
dudmuck 10:52810ecbd83b 582 }
mluis 7:ceb4063e6863 583
dudmuck 10:52810ecbd83b 584 DeviceState = DEVICE_STATE_TRIGGER;
mluis 0:45496a70a8a5 585 }
mluis 0:45496a70a8a5 586
dudmuck 10:52810ecbd83b 587
mluis 0:45496a70a8a5 588 /*!
mluis 0:45496a70a8a5 589 * \brief MCPS-Indication event function
mluis 0:45496a70a8a5 590 *
mluis 5:fa113b25f612 591 * \param [IN] mcpsIndication - Pointer to the indication structure,
mluis 0:45496a70a8a5 592 * containing indication attributes.
mluis 0:45496a70a8a5 593 */
mluis 5:fa113b25f612 594 static void McpsIndication( McpsIndication_t *mcpsIndication )
mluis 0:45496a70a8a5 595 {
dudmuck 10:52810ecbd83b 596 if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 597 char str[48];
dudmuck 10:52810ecbd83b 598 LoRaMacEventInfoStatus_toString(mcpsIndication->Status, str);
dudmuck 10:52810ecbd83b 599 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 600 vt.printf("mcpsInd %s", str);
mluis 0:45496a70a8a5 601 return;
mluis 0:45496a70a8a5 602 }
mluis 0:45496a70a8a5 603
dudmuck 10:52810ecbd83b 604 switch( mcpsIndication->McpsIndication ) {
dudmuck 10:52810ecbd83b 605 case MCPS_UNCONFIRMED: {
mluis 0:45496a70a8a5 606 break;
mluis 0:45496a70a8a5 607 }
dudmuck 10:52810ecbd83b 608 case MCPS_CONFIRMED: {
mluis 0:45496a70a8a5 609 break;
mluis 0:45496a70a8a5 610 }
dudmuck 10:52810ecbd83b 611 case MCPS_PROPRIETARY: {
mluis 0:45496a70a8a5 612 break;
mluis 0:45496a70a8a5 613 }
dudmuck 10:52810ecbd83b 614 case MCPS_MULTICAST: {
mluis 0:45496a70a8a5 615 break;
mluis 0:45496a70a8a5 616 }
mluis 0:45496a70a8a5 617 default:
mluis 0:45496a70a8a5 618 break;
mluis 0:45496a70a8a5 619 }
mluis 0:45496a70a8a5 620
mluis 0:45496a70a8a5 621 // Check Multicast
mluis 0:45496a70a8a5 622 // Check Port
mluis 0:45496a70a8a5 623 // Check Datarate
mluis 0:45496a70a8a5 624 // Check FramePending
mluis 0:45496a70a8a5 625 // Check Buffer
mluis 0:45496a70a8a5 626 // Check BufferSize
mluis 0:45496a70a8a5 627 // Check Rssi
mluis 0:45496a70a8a5 628 // Check Snr
mluis 0:45496a70a8a5 629 // Check RxSlot
mluis 5:fa113b25f612 630 LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
dudmuck 10:52810ecbd83b 631 if( mcpsIndication->Snr & 0x80 ) { // The SNR sign bit is 1
mluis 0:45496a70a8a5 632 // Invert and divide by 4
mluis 5:fa113b25f612 633 LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
mluis 0:45496a70a8a5 634 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
dudmuck 10:52810ecbd83b 635 } else {
mluis 0:45496a70a8a5 636 // Divide by 4
mluis 5:fa113b25f612 637 LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
mluis 0:45496a70a8a5 638 }
mluis 0:45496a70a8a5 639 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 5:fa113b25f612 640 LoRaMacDownlinkStatus.RxData = mcpsIndication->RxData;
mluis 5:fa113b25f612 641 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
mluis 5:fa113b25f612 642 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
mluis 5:fa113b25f612 643 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
mluis 0:45496a70a8a5 644
dudmuck 10:52810ecbd83b 645 if( ComplianceTest.Running == true ) {
mluis 0:45496a70a8a5 646 ComplianceTest.DownLinkCounter++;
mluis 0:45496a70a8a5 647 }
mluis 0:45496a70a8a5 648
dudmuck 10:52810ecbd83b 649 if( mcpsIndication->RxData == true ) {
dudmuck 10:52810ecbd83b 650 unsigned n;
dudmuck 10:52810ecbd83b 651 for (n = 0; n < mcpsIndication->BufferSize; n += 4) {
dudmuck 10:52810ecbd83b 652 uint16_t val = mcpsIndication->Buffer[n+1] << 8;
dudmuck 10:52810ecbd83b 653 val += mcpsIndication->Buffer[n+2];
dudmuck 10:52810ecbd83b 654 cayenne_ack_ch = mcpsIndication->Buffer[n];
dudmuck 10:52810ecbd83b 655 switch (mcpsIndication->Buffer[n]) {
dudmuck 10:52810ecbd83b 656 case CAYENNE_CH_DOUT:
dudmuck 10:52810ecbd83b 657 extLed.write(val);
dudmuck 10:52810ecbd83b 658 break;
dudmuck 10:52810ecbd83b 659 case CAYENNE_CH_AOUT:
dudmuck 10:52810ecbd83b 660 pwm.write(val / 100.0);
dudmuck 10:52810ecbd83b 661 break;
dudmuck 10:52810ecbd83b 662 default:
dudmuck 10:52810ecbd83b 663 break;
GregCr 2:48d8d4806d48 664 }
dudmuck 10:52810ecbd83b 665 }
mluis 9:0083afd69815 666
dudmuck 10:52810ecbd83b 667 switch( mcpsIndication->Port ) {
dudmuck 10:52810ecbd83b 668 case 1: // The application LED can be controlled on port 1 or 2
dudmuck 10:52810ecbd83b 669 case 2:
dudmuck 10:52810ecbd83b 670 if( mcpsIndication->BufferSize == 1 ) {
dudmuck 10:52810ecbd83b 671 //AppLedStateOn = mcpsIndication->Buffer[0] & 0x01;
dudmuck 10:52810ecbd83b 672 //Led3StateChanged = true;
mluis 0:45496a70a8a5 673 }
dudmuck 10:52810ecbd83b 674 break;
dudmuck 10:52810ecbd83b 675 case 224:
dudmuck 10:52810ecbd83b 676 if( ComplianceTest.Running == false ) {
dudmuck 10:52810ecbd83b 677 // Check compliance test enable command (i)
dudmuck 10:52810ecbd83b 678 if( ( mcpsIndication->BufferSize == 4 ) &&
dudmuck 10:52810ecbd83b 679 ( mcpsIndication->Buffer[0] == 0x01 ) &&
dudmuck 10:52810ecbd83b 680 ( mcpsIndication->Buffer[1] == 0x01 ) &&
dudmuck 10:52810ecbd83b 681 ( mcpsIndication->Buffer[2] == 0x01 ) &&
dudmuck 10:52810ecbd83b 682 ( mcpsIndication->Buffer[3] == 0x01 ) ) {
dudmuck 10:52810ecbd83b 683 IsTxConfirmed = false;
dudmuck 10:52810ecbd83b 684 AppPort = 224;
dudmuck 10:52810ecbd83b 685 AppDataSize = 2;
mluis 9:0083afd69815 686 ComplianceTest.DownLinkCounter = 0;
dudmuck 10:52810ecbd83b 687 ComplianceTest.LinkCheck = false;
dudmuck 10:52810ecbd83b 688 ComplianceTest.DemodMargin = 0;
dudmuck 10:52810ecbd83b 689 ComplianceTest.NbGateways = 0;
dudmuck 10:52810ecbd83b 690 ComplianceTest.Running = true;
dudmuck 10:52810ecbd83b 691 ComplianceTest.State = 1;
mluis 9:0083afd69815 692
mluis 9:0083afd69815 693 MibRequestConfirm_t mibReq;
mluis 9:0083afd69815 694 mibReq.Type = MIB_ADR;
dudmuck 10:52810ecbd83b 695 mibReq.Param.AdrEnable = true;
mluis 9:0083afd69815 696 LoRaMacMibSetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 697
mluis 9:0083afd69815 698 #if defined( USE_BAND_868 )
dudmuck 10:52810ecbd83b 699 LoRaMacTestSetDutyCycleOn( false );
dudmuck 10:52810ecbd83b 700 #endif
dudmuck 10:52810ecbd83b 701 }
dudmuck 10:52810ecbd83b 702 } else {
dudmuck 10:52810ecbd83b 703 ComplianceTest.State = mcpsIndication->Buffer[0];
dudmuck 10:52810ecbd83b 704 switch( ComplianceTest.State ) {
dudmuck 10:52810ecbd83b 705 case 0: // Check compliance test disable command (ii)
dudmuck 10:52810ecbd83b 706 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
dudmuck 10:52810ecbd83b 707 AppPort = LORAWAN_APP_PORT;
dudmuck 10:52810ecbd83b 708 AppDataSize = LORAWAN_APP_DATA_SIZE;
dudmuck 10:52810ecbd83b 709 ComplianceTest.DownLinkCounter = 0;
dudmuck 10:52810ecbd83b 710 ComplianceTest.Running = false;
dudmuck 10:52810ecbd83b 711
dudmuck 10:52810ecbd83b 712 MibRequestConfirm_t mibReq;
dudmuck 10:52810ecbd83b 713 mibReq.Type = MIB_ADR;
dudmuck 10:52810ecbd83b 714 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
dudmuck 10:52810ecbd83b 715 LoRaMacMibSetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 716 #if defined( USE_BAND_868 )
dudmuck 10:52810ecbd83b 717 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
dudmuck 10:52810ecbd83b 718 #endif
dudmuck 10:52810ecbd83b 719 break;
dudmuck 10:52810ecbd83b 720 case 1: // (iii, iv)
dudmuck 10:52810ecbd83b 721 AppDataSize = 2;
dudmuck 10:52810ecbd83b 722 break;
dudmuck 10:52810ecbd83b 723 case 2: // Enable confirmed messages (v)
dudmuck 10:52810ecbd83b 724 IsTxConfirmed = true;
dudmuck 10:52810ecbd83b 725 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 726 break;
dudmuck 10:52810ecbd83b 727 case 3: // Disable confirmed messages (vi)
dudmuck 10:52810ecbd83b 728 IsTxConfirmed = false;
dudmuck 10:52810ecbd83b 729 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 730 break;
dudmuck 10:52810ecbd83b 731 case 4: // (vii)
dudmuck 10:52810ecbd83b 732 AppDataSize = mcpsIndication->BufferSize;
dudmuck 10:52810ecbd83b 733
dudmuck 10:52810ecbd83b 734 AppData[0] = 4;
dudmuck 10:52810ecbd83b 735 for( uint8_t i = 1; i < AppDataSize; i++ ) {
dudmuck 10:52810ecbd83b 736 AppData[i] = mcpsIndication->Buffer[i] + 1;
dudmuck 10:52810ecbd83b 737 }
dudmuck 10:52810ecbd83b 738 break;
dudmuck 10:52810ecbd83b 739 case 5: { // (viii)
dudmuck 10:52810ecbd83b 740 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 741 mlmeReq.Type = MLME_LINK_CHECK;
dudmuck 10:52810ecbd83b 742 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 743 }
dudmuck 10:52810ecbd83b 744 break;
dudmuck 10:52810ecbd83b 745 case 6: { // (ix)
dudmuck 10:52810ecbd83b 746 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 747
dudmuck 10:52810ecbd83b 748 // Disable TestMode and revert back to normal operation
dudmuck 10:52810ecbd83b 749 IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
dudmuck 10:52810ecbd83b 750 AppPort = LORAWAN_APP_PORT;
dudmuck 10:52810ecbd83b 751 AppDataSize = LORAWAN_APP_DATA_SIZE;
dudmuck 10:52810ecbd83b 752 ComplianceTest.DownLinkCounter = 0;
dudmuck 10:52810ecbd83b 753 ComplianceTest.Running = false;
dudmuck 10:52810ecbd83b 754
dudmuck 10:52810ecbd83b 755 MibRequestConfirm_t mibReq;
dudmuck 10:52810ecbd83b 756 mibReq.Type = MIB_ADR;
dudmuck 10:52810ecbd83b 757 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
dudmuck 10:52810ecbd83b 758 LoRaMacMibSetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 759 #if defined( USE_BAND_868 )
dudmuck 10:52810ecbd83b 760 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 9:0083afd69815 761 #endif
mluis 9:0083afd69815 762
dudmuck 10:52810ecbd83b 763 mlmeReq.Type = MLME_JOIN;
mluis 7:ceb4063e6863 764
dudmuck 10:52810ecbd83b 765 mlmeReq.Req.Join.DevEui = DevEui;
dudmuck 10:52810ecbd83b 766 mlmeReq.Req.Join.AppEui = AppEui;
dudmuck 10:52810ecbd83b 767 mlmeReq.Req.Join.AppKey = AppKey;
dudmuck 10:52810ecbd83b 768 mlmeReq.Req.Join.NbTrials = 3;
dudmuck 10:52810ecbd83b 769
mluis 9:0083afd69815 770 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 771 DeviceState = DEVICE_STATE_SLEEP;
mluis 9:0083afd69815 772 }
dudmuck 10:52810ecbd83b 773 break;
dudmuck 10:52810ecbd83b 774 case 7: { // (x)
dudmuck 10:52810ecbd83b 775 if( mcpsIndication->BufferSize == 3 ) {
dudmuck 10:52810ecbd83b 776 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 777 mlmeReq.Type = MLME_TXCW;
dudmuck 10:52810ecbd83b 778 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
dudmuck 10:52810ecbd83b 779 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 780 } else if( mcpsIndication->BufferSize == 7 ) {
dudmuck 10:52810ecbd83b 781 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 782 mlmeReq.Type = MLME_TXCW_1;
dudmuck 10:52810ecbd83b 783 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
dudmuck 10:52810ecbd83b 784 mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100;
dudmuck 10:52810ecbd83b 785 mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6];
dudmuck 10:52810ecbd83b 786 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 787 }
dudmuck 10:52810ecbd83b 788 ComplianceTest.State = 1;
mluis 9:0083afd69815 789 }
dudmuck 10:52810ecbd83b 790 break;
dudmuck 10:52810ecbd83b 791 default:
dudmuck 10:52810ecbd83b 792 break;
mluis 9:0083afd69815 793 }
mluis 0:45496a70a8a5 794 }
dudmuck 10:52810ecbd83b 795 break;
dudmuck 10:52810ecbd83b 796 default:
dudmuck 10:52810ecbd83b 797 break;
mluis 0:45496a70a8a5 798 }
mluis 0:45496a70a8a5 799 }
mluis 0:45496a70a8a5 800
mluis 0:45496a70a8a5 801 DownlinkStatusUpdated = true;
mluis 0:45496a70a8a5 802 }
mluis 0:45496a70a8a5 803
dudmuck 10:52810ecbd83b 804
dudmuck 10:52810ecbd83b 805
mluis 0:45496a70a8a5 806 /*!
mluis 0:45496a70a8a5 807 * \brief MLME-Confirm event function
mluis 0:45496a70a8a5 808 *
mluis 5:fa113b25f612 809 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
mluis 0:45496a70a8a5 810 * containing confirm attributes.
mluis 0:45496a70a8a5 811 */
mluis 5:fa113b25f612 812 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mluis 0:45496a70a8a5 813 {
dudmuck 10:52810ecbd83b 814 vt.SetCursorPos( 45, 1 );
dudmuck 10:52810ecbd83b 815 vt.printf("MlmeConfirm() ");
dudmuck 10:52810ecbd83b 816 switch( mlmeConfirm->MlmeRequest ) {
dudmuck 10:52810ecbd83b 817 case MLME_JOIN: {
dudmuck 10:52810ecbd83b 818 vt.printf("MLME_JOIN ");
dudmuck 10:52810ecbd83b 819 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 820 vt.printf("OK");
dudmuck 10:52810ecbd83b 821 DeviceState = DEVICE_STATE_JOIN_OK;
dudmuck 10:52810ecbd83b 822 extLed = 0;
dudmuck 10:52810ecbd83b 823 } else {
dudmuck 10:52810ecbd83b 824 char str[48];
dudmuck 10:52810ecbd83b 825 LoRaMacEventInfoStatus_toString(mlmeConfirm->Status, str);
dudmuck 10:52810ecbd83b 826 vt.printf(str);
mluis 9:0083afd69815 827 // Join was not successful. Try to join again
mluis 9:0083afd69815 828 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 829 }
mluis 9:0083afd69815 830 break;
mluis 9:0083afd69815 831 }
dudmuck 10:52810ecbd83b 832 case MLME_LINK_CHECK: {
dudmuck 10:52810ecbd83b 833 vt.printf("MLME_LINK_CHECK");
dudmuck 10:52810ecbd83b 834 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 835 vt.printf("OK");
mluis 0:45496a70a8a5 836 // Check DemodMargin
mluis 0:45496a70a8a5 837 // Check NbGateways
dudmuck 10:52810ecbd83b 838 if( ComplianceTest.Running == true ) {
mluis 0:45496a70a8a5 839 ComplianceTest.LinkCheck = true;
mluis 5:fa113b25f612 840 ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
mluis 5:fa113b25f612 841 ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
mluis 0:45496a70a8a5 842 }
mluis 0:45496a70a8a5 843 }
mluis 9:0083afd69815 844 break;
mluis 0:45496a70a8a5 845 }
mluis 9:0083afd69815 846 default:
dudmuck 10:52810ecbd83b 847 vt.printf("<%d>", mlmeConfirm->MlmeRequest);
mluis 9:0083afd69815 848 break;
mluis 0:45496a70a8a5 849 }
dudmuck 10:52810ecbd83b 850 vt.printf("\e[K");
dudmuck 10:52810ecbd83b 851 }
dudmuck 10:52810ecbd83b 852
dudmuck 10:52810ecbd83b 853 void foo()
dudmuck 10:52810ecbd83b 854 {
dudmuck 10:52810ecbd83b 855 vt.SetCursorPos( 43, 1 );
dudmuck 10:52810ecbd83b 856 vt.printf("%u d9:%u (%04x %04x %04x %04x)\e[K", DeviceState, d8.read(), a1.read_u16(), a2.read_u16(), a3.read_u16(), a4.read_u16());
mluis 0:45496a70a8a5 857 }
mluis 0:45496a70a8a5 858
dudmuck 10:52810ecbd83b 859 const LoRaMacPrimitives_t LoRaMacPrimitives = {
dudmuck 10:52810ecbd83b 860 McpsConfirm,
dudmuck 10:52810ecbd83b 861 McpsIndication,
dudmuck 10:52810ecbd83b 862 MlmeConfirm
dudmuck 10:52810ecbd83b 863
dudmuck 10:52810ecbd83b 864 };
dudmuck 10:52810ecbd83b 865 const LoRaMacCallback_t LoRaMacCallbacks = {
dudmuck 10:52810ecbd83b 866 BoardGetBatteryLevel
dudmuck 10:52810ecbd83b 867 };
dudmuck 10:52810ecbd83b 868
mluis 0:45496a70a8a5 869 /**
mluis 0:45496a70a8a5 870 * Main application entry point.
mluis 0:45496a70a8a5 871 */
mluis 0:45496a70a8a5 872 int main( void )
mluis 0:45496a70a8a5 873 {
mluis 0:45496a70a8a5 874 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 875
mluis 0:45496a70a8a5 876 BoardInit( );
mluis 0:45496a70a8a5 877 SerialDisplayInit( );
mluis 0:45496a70a8a5 878
mluis 7:ceb4063e6863 879 SerialDisplayUpdateEui( 5, DevEui );
mluis 7:ceb4063e6863 880 SerialDisplayUpdateEui( 6, AppEui );
mluis 7:ceb4063e6863 881 SerialDisplayUpdateKey( 7, AppKey );
mluis 7:ceb4063e6863 882
mluis 7:ceb4063e6863 883 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 7:ceb4063e6863 884 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 7:ceb4063e6863 885 SerialDisplayUpdateDevAddr( DevAddr );
mluis 7:ceb4063e6863 886 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 7:ceb4063e6863 887 SerialDisplayUpdateKey( 13, AppSKey );
mluis 7:ceb4063e6863 888 #endif
mluis 7:ceb4063e6863 889
mluis 0:45496a70a8a5 890 DeviceState = DEVICE_STATE_INIT;
mluis 0:45496a70a8a5 891
dudmuck 10:52810ecbd83b 892 while( 1 ) {
dudmuck 10:52810ecbd83b 893 foo();
mluis 0:45496a70a8a5 894 SerialRxProcess( );
dudmuck 10:52810ecbd83b 895
dudmuck 10:52810ecbd83b 896 if( DownlinkStatusUpdated == true ) {
mluis 0:45496a70a8a5 897 DownlinkStatusUpdated = false;
mluis 0:45496a70a8a5 898 SerialDisplayUpdateDownlink( LoRaMacDownlinkStatus.RxData, LoRaMacDownlinkStatus.Rssi, LoRaMacDownlinkStatus.Snr, LoRaMacDownlinkStatus.DownlinkCounter, LoRaMacDownlinkStatus.Port, LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
mluis 0:45496a70a8a5 899 }
dudmuck 10:52810ecbd83b 900
dudmuck 10:52810ecbd83b 901 switch( DeviceState ) {
dudmuck 10:52810ecbd83b 902 case DEVICE_STATE_INIT: {
dudmuck 10:52810ecbd83b 903 pwm.period(1.0 / 60);
dudmuck 10:52810ecbd83b 904 cayenne_ack_ch = -1;
dudmuck 10:52810ecbd83b 905 c_ch = 0xff;
dudmuck 10:52810ecbd83b 906 d8.mode(PullDown);
dudmuck 10:52810ecbd83b 907
mluis 0:45496a70a8a5 908 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
mluis 0:45496a70a8a5 909
mluis 0:45496a70a8a5 910 mibReq.Type = MIB_ADR;
mluis 0:45496a70a8a5 911 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 0:45496a70a8a5 912 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 913
mluis 0:45496a70a8a5 914 mibReq.Type = MIB_PUBLIC_NETWORK;
mluis 0:45496a70a8a5 915 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
mluis 0:45496a70a8a5 916 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 917
mluis 0:45496a70a8a5 918 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 919 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 0:45496a70a8a5 920 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 5:fa113b25f612 921
mluis 9:0083afd69815 922 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 5:fa113b25f612 923 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
mluis 5:fa113b25f612 924 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
mluis 5:fa113b25f612 925 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
mluis 5:fa113b25f612 926 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
mluis 5:fa113b25f612 927 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
mluis 5:fa113b25f612 928 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
mluis 5:fa113b25f612 929 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
mluis 7:ceb4063e6863 930
mluis 9:0083afd69815 931 mibReq.Type = MIB_RX2_DEFAULT_CHANNEL;
dudmuck 10:52810ecbd83b 932 mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ) {
dudmuck 10:52810ecbd83b 933 869525000, DR_3
dudmuck 10:52810ecbd83b 934 };
mluis 9:0083afd69815 935 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 9:0083afd69815 936
mluis 7:ceb4063e6863 937 mibReq.Type = MIB_RX2_CHANNEL;
dudmuck 10:52810ecbd83b 938 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ) {
dudmuck 10:52810ecbd83b 939 869525000, DR_3
dudmuck 10:52810ecbd83b 940 };
mluis 7:ceb4063e6863 941 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 5:fa113b25f612 942 #endif
mluis 5:fa113b25f612 943
mluis 0:45496a70a8a5 944 #endif
mluis 0:45496a70a8a5 945 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:45496a70a8a5 946 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:45496a70a8a5 947 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:45496a70a8a5 948
mluis 0:45496a70a8a5 949 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 0:45496a70a8a5 950
mluis 0:45496a70a8a5 951 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 952 break;
mluis 0:45496a70a8a5 953 }
dudmuck 10:52810ecbd83b 954 case DEVICE_STATE_JOIN: {
mluis 0:45496a70a8a5 955 #if( OVER_THE_AIR_ACTIVATION != 0 )
dudmuck 10:52810ecbd83b 956 LoRaMacStatus_t s;
mluis 0:45496a70a8a5 957 MlmeReq_t mlmeReq;
mluis 0:45496a70a8a5 958 mlmeReq.Type = MLME_JOIN;
mluis 0:45496a70a8a5 959
mluis 0:45496a70a8a5 960 mlmeReq.Req.Join.DevEui = DevEui;
mluis 0:45496a70a8a5 961 mlmeReq.Req.Join.AppEui = AppEui;
mluis 0:45496a70a8a5 962 mlmeReq.Req.Join.AppKey = AppKey;
mluis 0:45496a70a8a5 963
dudmuck 10:52810ecbd83b 964 s = LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 965 if (s != LORAMAC_STATUS_OK) {
dudmuck 10:52810ecbd83b 966 char str[48];
dudmuck 10:52810ecbd83b 967 LoRaMacStatus_toString(s, str);
dudmuck 10:52810ecbd83b 968 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 969 vt.printf("mlmeReq join %s\e[K", str);
dudmuck 10:52810ecbd83b 970 return -1;
dudmuck 10:52810ecbd83b 971 } else
dudmuck 10:52810ecbd83b 972 DeviceState = DEVICE_STATE_SLEEP;
dudmuck 10:52810ecbd83b 973
dudmuck 10:52810ecbd83b 974 extLed = 1;
mluis 0:45496a70a8a5 975 #else
mluis 0:45496a70a8a5 976 mibReq.Type = MIB_NET_ID;
mluis 0:45496a70a8a5 977 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
mluis 0:45496a70a8a5 978 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 979
mluis 0:45496a70a8a5 980 mibReq.Type = MIB_DEV_ADDR;
mluis 0:45496a70a8a5 981 mibReq.Param.DevAddr = DevAddr;
mluis 0:45496a70a8a5 982 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 983
mluis 0:45496a70a8a5 984 mibReq.Type = MIB_NWK_SKEY;
mluis 0:45496a70a8a5 985 mibReq.Param.NwkSKey = NwkSKey;
mluis 0:45496a70a8a5 986 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 987
mluis 0:45496a70a8a5 988 mibReq.Type = MIB_APP_SKEY;
mluis 0:45496a70a8a5 989 mibReq.Param.AppSKey = AppSKey;
mluis 0:45496a70a8a5 990 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 991
mluis 0:45496a70a8a5 992 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 993 mibReq.Param.IsNetworkJoined = true;
mluis 0:45496a70a8a5 994 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 995 DeviceState = DEVICE_STATE_SEND;
mluis 0:45496a70a8a5 996 #endif
mluis 0:45496a70a8a5 997 break;
mluis 0:45496a70a8a5 998 }
dudmuck 10:52810ecbd83b 999 case DEVICE_STATE_JOIN_OK:
dudmuck 10:52810ecbd83b 1000 MibRequestConfirm_t mibReq;
dudmuck 10:52810ecbd83b 1001 mibReq.Type = MIB_NETWORK_JOINED;
dudmuck 10:52810ecbd83b 1002 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1003 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
dudmuck 10:52810ecbd83b 1004 mibReq.Type = MIB_DEV_ADDR;
dudmuck 10:52810ecbd83b 1005 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1006 SerialDisplayUpdateDevAddr(mibReq.Param.DevAddr);
dudmuck 10:52810ecbd83b 1007 mibReq.Type = MIB_NWK_SKEY;
dudmuck 10:52810ecbd83b 1008 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1009 SerialDisplayUpdateKey( 12, mibReq.Param.NwkSKey );
dudmuck 10:52810ecbd83b 1010 mibReq.Type = MIB_APP_SKEY;
dudmuck 10:52810ecbd83b 1011 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1012 SerialDisplayUpdateKey( 13, mibReq.Param.AppSKey );
dudmuck 10:52810ecbd83b 1013 //SerialDisplayUpdateNwkId( uint8_t id );
dudmuck 10:52810ecbd83b 1014 DeviceState = DEVICE_STATE_TRIGGER;
dudmuck 10:52810ecbd83b 1015 break;
dudmuck 10:52810ecbd83b 1016 case DEVICE_STATE_SEND: {
dudmuck 10:52810ecbd83b 1017 SerialDisplayUpdateUplinkAcked( false );
dudmuck 10:52810ecbd83b 1018 SerialDisplayUpdateDonwlinkRxData( false );
dudmuck 10:52810ecbd83b 1019 PrepareTxFrame( AppPort );
mluis 0:45496a70a8a5 1020
dudmuck 10:52810ecbd83b 1021 SendFrame( );
dudmuck 10:52810ecbd83b 1022
dudmuck 10:52810ecbd83b 1023 DeviceState = DEVICE_STATE_SLEEP;
mluis 0:45496a70a8a5 1024 break;
mluis 0:45496a70a8a5 1025 }
dudmuck 10:52810ecbd83b 1026 case DEVICE_STATE_SLEEP: {
mluis 0:45496a70a8a5 1027 // Wake up through events
mluis 0:45496a70a8a5 1028 break;
mluis 0:45496a70a8a5 1029 }
dudmuck 10:52810ecbd83b 1030 case DEVICE_STATE_TRIGGER:
dudmuck 10:52810ecbd83b 1031 if (d8.read() == 1) {
dudmuck 10:52810ecbd83b 1032 c_ch = 0xff;
dudmuck 10:52810ecbd83b 1033 DeviceState = DEVICE_STATE_SEND;
dudmuck 10:52810ecbd83b 1034 buttonStartAt = TimerGetCurrentTime();
dudmuck 10:52810ecbd83b 1035 }
dudmuck 10:52810ecbd83b 1036 break;
dudmuck 10:52810ecbd83b 1037 default: {
mluis 0:45496a70a8a5 1038 DeviceState = DEVICE_STATE_INIT;
mluis 0:45496a70a8a5 1039 break;
mluis 0:45496a70a8a5 1040 }
dudmuck 10:52810ecbd83b 1041
GregCr 2:48d8d4806d48 1042 }
mluis 5:fa113b25f612 1043
mluis 0:45496a70a8a5 1044 }
mluis 0:45496a70a8a5 1045 }