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:
Sat Feb 03 00:44:16 2018 +0000
Revision:
11:018e7e28161d
Parent:
10:52810ecbd83b
Child:
12:662ff73ce484
fix temperature sensor calculation

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 */
dudmuck 11:018e7e28161d 118 static uint8_t gAppDataSize = 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 */
dudmuck 11:018e7e28161d 133 static uint8_t gIsTxConfirmed = 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 11:018e7e28161d 225
dudmuck 11:018e7e28161d 226 void LoRaMacStatus_toString(LoRaMacStatus_t s, char* out)
dudmuck 11:018e7e28161d 227 {
dudmuck 11:018e7e28161d 228 switch (s) {
dudmuck 11:018e7e28161d 229 case LORAMAC_STATUS_PARAMETER_INVALID:
dudmuck 11:018e7e28161d 230 strcpy(out, "PARAMTER_INVALID");
dudmuck 11:018e7e28161d 231 break;
dudmuck 11:018e7e28161d 232 case LORAMAC_STATUS_BUSY:
dudmuck 11:018e7e28161d 233 strcpy(out, "BUSY");
dudmuck 11:018e7e28161d 234 break;
dudmuck 11:018e7e28161d 235 default:
dudmuck 11:018e7e28161d 236 sprintf(out, "<%u>", s);
dudmuck 11:018e7e28161d 237 break;
dudmuck 11:018e7e28161d 238 }
dudmuck 11:018e7e28161d 239 }
dudmuck 11:018e7e28161d 240
dudmuck 11:018e7e28161d 241 volatile unsigned sendCnt = 0;
dudmuck 11:018e7e28161d 242 /*!
dudmuck 11:018e7e28161d 243 * \brief Prepares the payload of the frame
dudmuck 11:018e7e28161d 244 *
dudmuck 11:018e7e28161d 245 * \retval [0: frame could be send, 1: error]
dudmuck 11:018e7e28161d 246 */
dudmuck 11:018e7e28161d 247 static bool SendFrame( uint8_t len, bool conf )
dudmuck 11:018e7e28161d 248 {
dudmuck 11:018e7e28161d 249 char str[48];
dudmuck 11:018e7e28161d 250 LoRaMacStatus_t status;
dudmuck 11:018e7e28161d 251 McpsReq_t mcpsReq;
dudmuck 11:018e7e28161d 252 LoRaMacTxInfo_t txInfo;
dudmuck 11:018e7e28161d 253
dudmuck 11:018e7e28161d 254 if( LoRaMacQueryTxPossible( len, &txInfo ) != LORAMAC_STATUS_OK ) {
dudmuck 11:018e7e28161d 255 // Send empty frame in order to flush MAC commands
dudmuck 11:018e7e28161d 256 mcpsReq.Type = MCPS_UNCONFIRMED;
dudmuck 11:018e7e28161d 257 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
dudmuck 11:018e7e28161d 258 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
dudmuck 11:018e7e28161d 259 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
dudmuck 11:018e7e28161d 260
dudmuck 11:018e7e28161d 261 LoRaMacUplinkStatus.Acked = false;
dudmuck 11:018e7e28161d 262 LoRaMacUplinkStatus.Port = 0;
dudmuck 11:018e7e28161d 263 LoRaMacUplinkStatus.Buffer = NULL;
dudmuck 11:018e7e28161d 264 LoRaMacUplinkStatus.BufferSize = 0;
dudmuck 11:018e7e28161d 265 SerialDisplayUpdateFrameType( false );
dudmuck 11:018e7e28161d 266 } else {
dudmuck 11:018e7e28161d 267 LoRaMacUplinkStatus.Acked = false;
dudmuck 11:018e7e28161d 268 LoRaMacUplinkStatus.Port = AppPort;
dudmuck 11:018e7e28161d 269 LoRaMacUplinkStatus.Buffer = AppData;
dudmuck 11:018e7e28161d 270 LoRaMacUplinkStatus.BufferSize = len;//AppDataSize;
dudmuck 11:018e7e28161d 271 SerialDisplayUpdateFrameType( conf/*IsTxConfirmed*/ );
dudmuck 11:018e7e28161d 272
dudmuck 11:018e7e28161d 273 if( conf == false ) {
dudmuck 11:018e7e28161d 274 mcpsReq.Type = MCPS_UNCONFIRMED;
dudmuck 11:018e7e28161d 275 mcpsReq.Req.Unconfirmed.fPort = AppPort;
dudmuck 11:018e7e28161d 276 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
dudmuck 11:018e7e28161d 277 mcpsReq.Req.Unconfirmed.fBufferSize = len;
dudmuck 11:018e7e28161d 278 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
dudmuck 11:018e7e28161d 279 } else {
dudmuck 11:018e7e28161d 280 mcpsReq.Type = MCPS_CONFIRMED;
dudmuck 11:018e7e28161d 281 mcpsReq.Req.Confirmed.fPort = AppPort;
dudmuck 11:018e7e28161d 282 mcpsReq.Req.Confirmed.fBuffer = AppData;
dudmuck 11:018e7e28161d 283 mcpsReq.Req.Confirmed.fBufferSize = len;
dudmuck 11:018e7e28161d 284 mcpsReq.Req.Confirmed.NbTrials = 8;
dudmuck 11:018e7e28161d 285 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
dudmuck 11:018e7e28161d 286 }
dudmuck 11:018e7e28161d 287 }
dudmuck 11:018e7e28161d 288
dudmuck 11:018e7e28161d 289 sendCnt++;
dudmuck 11:018e7e28161d 290 status = LoRaMacMcpsRequest( &mcpsReq );
dudmuck 11:018e7e28161d 291 if (status == LORAMAC_STATUS_OK) {
dudmuck 11:018e7e28161d 292 vt.SetCursorPos( 44, 1 );
dudmuck 11:018e7e28161d 293 vt.printf("%u sendFrame() OK\e[K", sendCnt);
dudmuck 11:018e7e28161d 294 SerialDisplayUpdateUplink(
dudmuck 11:018e7e28161d 295 LoRaMacUplinkStatus.Acked,
dudmuck 11:018e7e28161d 296 LoRaMacUplinkStatus.Datarate,
dudmuck 11:018e7e28161d 297 LoRaMacUplinkStatus.UplinkCounter,
dudmuck 11:018e7e28161d 298 LoRaMacUplinkStatus.Port,
dudmuck 11:018e7e28161d 299 LoRaMacUplinkStatus.Buffer,
dudmuck 11:018e7e28161d 300 LoRaMacUplinkStatus.BufferSize
dudmuck 11:018e7e28161d 301 );
dudmuck 11:018e7e28161d 302 return false;
dudmuck 11:018e7e28161d 303 }
dudmuck 11:018e7e28161d 304 LoRaMacStatus_toString(status, str);
dudmuck 11:018e7e28161d 305 vt.SetCursorPos( 44, 1 );
dudmuck 11:018e7e28161d 306 vt.printf("%u sendFrame() %s\e[K", sendCnt, str);
dudmuck 11:018e7e28161d 307 return true;
dudmuck 11:018e7e28161d 308 }
dudmuck 11:018e7e28161d 309
dudmuck 10:52810ecbd83b 310 uint8_t c_ch;
dudmuck 10:52810ecbd83b 311
mluis 0:45496a70a8a5 312 void SerialRxProcess( void )
mluis 0:45496a70a8a5 313 {
dudmuck 11:018e7e28161d 314 LoRaMacStatus_t status;
dudmuck 11:018e7e28161d 315 MlmeReq_t mlmeReq;
dudmuck 11:018e7e28161d 316
dudmuck 10:52810ecbd83b 317 if( SerialDisplayReadable( ) == true ) {
dudmuck 10:52810ecbd83b 318 char ch = SerialDisplayGetChar();
dudmuck 11:018e7e28161d 319 if ( ch >= '0' && ch <= '9') {
dudmuck 10:52810ecbd83b 320 c_ch = ch - '0';
dudmuck 10:52810ecbd83b 321 DeviceState = DEVICE_STATE_SEND;
dudmuck 10:52810ecbd83b 322 return;
dudmuck 10:52810ecbd83b 323 }
dudmuck 10:52810ecbd83b 324 switch( ch ) {
mluis 0:45496a70a8a5 325 case 'R':
mluis 0:45496a70a8a5 326 case 'r':
mluis 0:45496a70a8a5 327 // Refresh Serial screen
mluis 0:45496a70a8a5 328 SerialDisplayRefresh( );
mluis 0:45496a70a8a5 329 break;
dudmuck 11:018e7e28161d 330 case 'L':
dudmuck 11:018e7e28161d 331 mlmeReq.Type = MLME_LINK_CHECK;
dudmuck 11:018e7e28161d 332 status = LoRaMacMlmeRequest( &mlmeReq );
dudmuck 11:018e7e28161d 333 if (status == LORAMAC_STATUS_OK)
dudmuck 11:018e7e28161d 334 SendFrame(0, false);
dudmuck 11:018e7e28161d 335 break;
mluis 0:45496a70a8a5 336 default:
mluis 0:45496a70a8a5 337 break;
mluis 0:45496a70a8a5 338 }
mluis 0:45496a70a8a5 339 }
mluis 0:45496a70a8a5 340 }
mluis 0:45496a70a8a5 341
dudmuck 10:52810ecbd83b 342 #define LPP_DIGITAL_INPUT 0 // 1 byte
dudmuck 10:52810ecbd83b 343 #define LPP_DIGITAL_OUTPUT 1 // 1 byte
dudmuck 10:52810ecbd83b 344 #define LPP_ANALOG_INPUT 2 // 2 bytes, 0.01 signed
dudmuck 10:52810ecbd83b 345 #define LPP_ANALOG_OUTPUT 3 // 2 bytes, 0.01 signed
dudmuck 10:52810ecbd83b 346 #define LPP_LUMINOSITY 101 // 2 bytes, 1 lux unsigned
dudmuck 10:52810ecbd83b 347 #define LPP_PRESENCE 102 // 1 byte, 1
dudmuck 10:52810ecbd83b 348 #define LPP_TEMPERATURE 103 // 2 bytes, 0.1°C signed
dudmuck 10:52810ecbd83b 349 #define LPP_RELATIVE_HUMIDITY 104 // 1 byte, 0.5% unsigned
dudmuck 10:52810ecbd83b 350 #define LPP_ACCELEROMETER 113 // 2 bytes per axis, 0.001G
dudmuck 10:52810ecbd83b 351 #define LPP_BAROMETRIC_PRESSURE 115 // 2 bytes 0.1 hPa Unsigned
dudmuck 10:52810ecbd83b 352 #define LPP_GYROMETER 134 // 2 bytes per axis, 0.01 °/s
dudmuck 10:52810ecbd83b 353 #define LPP_GPS 136 // 3 byte lon/lat 0.0001 °, 3 bytes alt 0.01m
dudmuck 10:52810ecbd83b 354
dudmuck 10:52810ecbd83b 355
dudmuck 10:52810ecbd83b 356 // Data ID + Data Type + Data Size
dudmuck 10:52810ecbd83b 357 #define LPP_DIGITAL_INPUT_SIZE 3
dudmuck 10:52810ecbd83b 358 #define LPP_DIGITAL_OUTPUT_SIZE 3
dudmuck 10:52810ecbd83b 359 #define LPP_ANALOG_INPUT_SIZE 4
dudmuck 10:52810ecbd83b 360 #define LPP_ANALOG_OUTPUT_SIZE 4
dudmuck 10:52810ecbd83b 361 #define LPP_LUMINOSITY_SIZE 4
dudmuck 10:52810ecbd83b 362 #define LPP_PRESENCE_SIZE 3
dudmuck 10:52810ecbd83b 363 #define LPP_TEMPERATURE_SIZE 4
dudmuck 10:52810ecbd83b 364 #define LPP_RELATIVE_HUMIDITY_SIZE 3
dudmuck 10:52810ecbd83b 365 #define LPP_ACCELEROMETER_SIZE 8
dudmuck 10:52810ecbd83b 366 #define LPP_BAROMETRIC_PRESSURE_SIZE 4
dudmuck 10:52810ecbd83b 367 #define LPP_GYROMETER_SIZE 8
dudmuck 10:52810ecbd83b 368 #define LPP_GPS_SIZE 11
dudmuck 10:52810ecbd83b 369
dudmuck 10:52810ecbd83b 370 #define CAYENNE_CH_DOUT 2
dudmuck 10:52810ecbd83b 371 #define CAYENNE_CH_AOUT 3
dudmuck 10:52810ecbd83b 372 #define CAYENNE_CH_TEMP 0
dudmuck 10:52810ecbd83b 373 #define CAYENNE_CH_POT 1
dudmuck 10:52810ecbd83b 374 AnalogIn a1(A1);
dudmuck 10:52810ecbd83b 375 AnalogIn a2(A2);
dudmuck 10:52810ecbd83b 376 AnalogIn a3(A3);
dudmuck 10:52810ecbd83b 377 AnalogIn a4(A4);
dudmuck 10:52810ecbd83b 378
dudmuck 10:52810ecbd83b 379 const unsigned R0 = 100000;
dudmuck 10:52810ecbd83b 380 const unsigned B = 4275;
dudmuck 10:52810ecbd83b 381
dudmuck 11:018e7e28161d 382
dudmuck 10:52810ecbd83b 383 volatile TimerTime_t buttonStartAt;
dudmuck 10:52810ecbd83b 384 DigitalIn d8(D8);
dudmuck 10:52810ecbd83b 385 DigitalOut extLed(D15);
dudmuck 10:52810ecbd83b 386 PwmOut pwm(PB_11);
dudmuck 10:52810ecbd83b 387 volatile int cayenne_ack_ch;
mluis 0:45496a70a8a5 388 /*!
mluis 0:45496a70a8a5 389 * \brief Prepares the payload of the frame
mluis 0:45496a70a8a5 390 */
mluis 0:45496a70a8a5 391 static void PrepareTxFrame( uint8_t port )
mluis 0:45496a70a8a5 392 {
dudmuck 10:52810ecbd83b 393 uint16_t u16, rot;
dudmuck 10:52810ecbd83b 394 float t, f, R;
dudmuck 10:52810ecbd83b 395
dudmuck 10:52810ecbd83b 396 if (c_ch != 0xff) {
dudmuck 11:018e7e28161d 397 gAppDataSize = 0;
dudmuck 11:018e7e28161d 398 AppData[gAppDataSize++] = c_ch;
dudmuck 10:52810ecbd83b 399 switch (c_ch) {
dudmuck 10:52810ecbd83b 400 case CAYENNE_CH_TEMP:
dudmuck 11:018e7e28161d 401 AppData[gAppDataSize++] = LPP_TEMPERATURE;
dudmuck 11:018e7e28161d 402 u16 = a3.read_u16() >> 4;
dudmuck 11:018e7e28161d 403 R = 4096.0 / u16 - 1.0;
dudmuck 10:52810ecbd83b 404 R = R0 * R;
dudmuck 10:52810ecbd83b 405 t = 1.0/(log(R/R0)/B+1/298.15)-273.15;
dudmuck 10:52810ecbd83b 406 u16 = t * 10; // 0.1C per bit
dudmuck 11:018e7e28161d 407 AppData[gAppDataSize++] = u16 >> 8;
dudmuck 11:018e7e28161d 408 AppData[gAppDataSize++] = u16;
dudmuck 10:52810ecbd83b 409 break;
dudmuck 10:52810ecbd83b 410 case CAYENNE_CH_POT:
dudmuck 11:018e7e28161d 411 AppData[gAppDataSize++] = LPP_ANALOG_INPUT;
dudmuck 10:52810ecbd83b 412 u16 = a1.read_u16(); // pot (rotary angle)
dudmuck 10:52810ecbd83b 413 f = u16 / 198.6; // scale 65535/3.3 to 0.01v per bit
dudmuck 10:52810ecbd83b 414 rot = (uint16_t) f;
dudmuck 11:018e7e28161d 415 AppData[gAppDataSize++] = rot >> 8;
dudmuck 11:018e7e28161d 416 AppData[gAppDataSize++] = rot;
dudmuck 10:52810ecbd83b 417 break;
dudmuck 10:52810ecbd83b 418 case CAYENNE_CH_DOUT:
dudmuck 11:018e7e28161d 419 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 11:018e7e28161d 420 AppData[gAppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 421 break;
dudmuck 10:52810ecbd83b 422 case CAYENNE_CH_AOUT:
dudmuck 11:018e7e28161d 423 AppData[gAppDataSize++] = LPP_ANALOG_OUTPUT;
dudmuck 10:52810ecbd83b 424 u16 = pwm.read() * 100;
dudmuck 11:018e7e28161d 425 AppData[gAppDataSize++] = u16 >> 8;
dudmuck 11:018e7e28161d 426 AppData[gAppDataSize++] = u16;
dudmuck 10:52810ecbd83b 427 break;
GregCr 2:48d8d4806d48 428 }
dudmuck 10:52810ecbd83b 429 return;
dudmuck 10:52810ecbd83b 430 } else if (cayenne_ack_ch != -1) {
dudmuck 10:52810ecbd83b 431 switch (cayenne_ack_ch) {
dudmuck 10:52810ecbd83b 432 case CAYENNE_CH_DOUT:
dudmuck 11:018e7e28161d 433 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 11:018e7e28161d 434 AppData[gAppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 435 break;
dudmuck 10:52810ecbd83b 436 case CAYENNE_CH_AOUT:
dudmuck 11:018e7e28161d 437 AppData[gAppDataSize++] = LPP_ANALOG_OUTPUT;
dudmuck 10:52810ecbd83b 438 u16 = pwm.read() * 100;
dudmuck 11:018e7e28161d 439 AppData[gAppDataSize++] = u16 >> 8;
dudmuck 11:018e7e28161d 440 AppData[gAppDataSize++] = u16;
dudmuck 10:52810ecbd83b 441 break;
mluis 0:45496a70a8a5 442 }
dudmuck 10:52810ecbd83b 443 cayenne_ack_ch = -1;
dudmuck 10:52810ecbd83b 444 }
dudmuck 10:52810ecbd83b 445
dudmuck 10:52810ecbd83b 446 while (d8.read() == 1) {
dudmuck 10:52810ecbd83b 447 TimerTime_t duration = TimerGetCurrentTime() - buttonStartAt;
dudmuck 10:52810ecbd83b 448 vt.SetCursorPos( 41, 1 );
dudmuck 10:52810ecbd83b 449 if (duration > 1000) {
dudmuck 11:018e7e28161d 450 gAppDataSize = 0;
dudmuck 11:018e7e28161d 451 AppData[gAppDataSize++] = CAYENNE_CH_DOUT;
dudmuck 11:018e7e28161d 452 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 11:018e7e28161d 453 AppData[gAppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 454 vt.printf("send outputs ", duration);
dudmuck 10:52810ecbd83b 455 return;
dudmuck 10:52810ecbd83b 456 } else
dudmuck 10:52810ecbd83b 457 vt.printf("dur %u ", duration);
dudmuck 10:52810ecbd83b 458 }
dudmuck 10:52810ecbd83b 459
dudmuck 10:52810ecbd83b 460 switch( port ) {
dudmuck 10:52810ecbd83b 461 case LORAWAN_APP_PORT:
dudmuck 11:018e7e28161d 462 gAppDataSize = 0;
dudmuck 11:018e7e28161d 463 AppData[gAppDataSize++] = CAYENNE_CH_TEMP;
dudmuck 11:018e7e28161d 464 AppData[gAppDataSize++] = LPP_TEMPERATURE;
dudmuck 11:018e7e28161d 465 u16 = a3.read_u16() >> 4;
dudmuck 11:018e7e28161d 466 R = 4096.0 / u16 - 1.0;
dudmuck 10:52810ecbd83b 467 R = R0 * R;
dudmuck 10:52810ecbd83b 468 t = 1.0/(log(R/R0)/B+1/298.15)-273.15;
dudmuck 10:52810ecbd83b 469 u16 = t * 10; // 0.1C per bit
dudmuck 11:018e7e28161d 470 AppData[gAppDataSize++] = u16 >> 8;
dudmuck 11:018e7e28161d 471 AppData[gAppDataSize++] = u16;
dudmuck 11:018e7e28161d 472 AppData[gAppDataSize++] = CAYENNE_CH_POT;
dudmuck 11:018e7e28161d 473 AppData[gAppDataSize++] = LPP_ANALOG_INPUT;
dudmuck 10:52810ecbd83b 474 u16 = a1.read_u16(); // pot (rotary angle)
dudmuck 10:52810ecbd83b 475 f = u16 / 198.6; // scale 65535/3.3 to 0.01v per bit
dudmuck 10:52810ecbd83b 476 rot = (uint16_t) f;
dudmuck 11:018e7e28161d 477 AppData[gAppDataSize++] = rot >> 8;
dudmuck 11:018e7e28161d 478 AppData[gAppDataSize++] = rot;
dudmuck 10:52810ecbd83b 479
dudmuck 11:018e7e28161d 480 AppData[gAppDataSize++] = CAYENNE_CH_DOUT;
dudmuck 11:018e7e28161d 481 AppData[gAppDataSize++] = LPP_DIGITAL_OUTPUT;
dudmuck 11:018e7e28161d 482 AppData[gAppDataSize++] = extLed.read();
dudmuck 10:52810ecbd83b 483 vt.SetCursorPos( 41, 1 );
dudmuck 10:52810ecbd83b 484 vt.printf("u16:%u, f:%f, rot:%u t:%.1f\e[K", u16, f, rot, t);
dudmuck 10:52810ecbd83b 485 break;
dudmuck 10:52810ecbd83b 486 case 224:
dudmuck 10:52810ecbd83b 487 if( ComplianceTest.LinkCheck == true ) {
dudmuck 10:52810ecbd83b 488 ComplianceTest.LinkCheck = false;
dudmuck 11:018e7e28161d 489 gAppDataSize = 3;
dudmuck 10:52810ecbd83b 490 AppData[0] = 5;
dudmuck 10:52810ecbd83b 491 AppData[1] = ComplianceTest.DemodMargin;
dudmuck 10:52810ecbd83b 492 AppData[2] = ComplianceTest.NbGateways;
mluis 0:45496a70a8a5 493 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 494 } else {
dudmuck 10:52810ecbd83b 495 switch( ComplianceTest.State ) {
dudmuck 10:52810ecbd83b 496 case 4:
dudmuck 10:52810ecbd83b 497 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 498 break;
dudmuck 10:52810ecbd83b 499 case 1:
dudmuck 11:018e7e28161d 500 gAppDataSize = 2;
dudmuck 10:52810ecbd83b 501 AppData[0] = ComplianceTest.DownLinkCounter >> 8;
dudmuck 10:52810ecbd83b 502 AppData[1] = ComplianceTest.DownLinkCounter;
dudmuck 10:52810ecbd83b 503 break;
dudmuck 10:52810ecbd83b 504 }
mluis 0:45496a70a8a5 505 }
dudmuck 10:52810ecbd83b 506 break;
dudmuck 10:52810ecbd83b 507 default:
dudmuck 10:52810ecbd83b 508 break;
mluis 0:45496a70a8a5 509 }
mluis 0:45496a70a8a5 510 }
mluis 0:45496a70a8a5 511
mluis 0:45496a70a8a5 512
dudmuck 10:52810ecbd83b 513 void LoRaMacEventInfoStatus_toString(LoRaMacEventInfoStatus_t s, char* out)
mluis 0:45496a70a8a5 514 {
dudmuck 10:52810ecbd83b 515 switch (s) {
dudmuck 10:52810ecbd83b 516 case LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL:
dudmuck 10:52810ecbd83b 517 strcpy(out, "JOIN_FAIL");
dudmuck 10:52810ecbd83b 518 break;
dudmuck 10:52810ecbd83b 519 case LORAMAC_EVENT_INFO_STATUS_ERROR:
dudmuck 10:52810ecbd83b 520 strcpy(out, "ERROR");
dudmuck 10:52810ecbd83b 521 break;
dudmuck 10:52810ecbd83b 522 case LORAMAC_EVENT_INFO_STATUS_RX2_TIMEOUT:
dudmuck 10:52810ecbd83b 523 strcpy(out, "RX2_TIMEOUT");
dudmuck 10:52810ecbd83b 524 break;
dudmuck 10:52810ecbd83b 525 case LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL:
dudmuck 10:52810ecbd83b 526 strcpy(out, "ADDRESS_FAIL");
dudmuck 10:52810ecbd83b 527 break;
dudmuck 10:52810ecbd83b 528 case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOSS:
dudmuck 10:52810ecbd83b 529 strcpy(out, "FRAMES_LOSS");
dudmuck 10:52810ecbd83b 530 break;
dudmuck 10:52810ecbd83b 531 case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED:
dudmuck 10:52810ecbd83b 532 strcpy(out, "DOWNLINK_REPEATED");
dudmuck 10:52810ecbd83b 533 break; // confirmed downlink retry?
dudmuck 10:52810ecbd83b 534 case LORAMAC_EVENT_INFO_STATUS_MIC_FAIL:
dudmuck 10:52810ecbd83b 535 strcpy(out, "MIC_FAIL");
dudmuck 10:52810ecbd83b 536 break;
dudmuck 10:52810ecbd83b 537 case LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT:
dudmuck 10:52810ecbd83b 538 strcpy(out, "TX_TIMEOUT");
dudmuck 10:52810ecbd83b 539 break;
dudmuck 10:52810ecbd83b 540 case LORAMAC_EVENT_INFO_STATUS_RX1_ERROR:
dudmuck 10:52810ecbd83b 541 strcpy(out, "RX1_ERROR");
dudmuck 10:52810ecbd83b 542 break;
dudmuck 10:52810ecbd83b 543 case LORAMAC_EVENT_INFO_STATUS_RX2_ERROR:
dudmuck 10:52810ecbd83b 544 strcpy(out, "RX2_ERROR");
dudmuck 10:52810ecbd83b 545 break;
dudmuck 10:52810ecbd83b 546 case LORAMAC_EVENT_INFO_STATUS_TX_DR_PAYLOAD_SIZE_ERROR:
dudmuck 10:52810ecbd83b 547 strcpy(out, "SIZE");
dudmuck 10:52810ecbd83b 548 break;
mluis 0:45496a70a8a5 549
mluis 0:45496a70a8a5 550
dudmuck 10:52810ecbd83b 551 default:
dudmuck 10:52810ecbd83b 552 sprintf(out, "<%d>", s);
dudmuck 10:52810ecbd83b 553 break;
dudmuck 10:52810ecbd83b 554 }
GregCr 3:d4142832d5af 555 }
GregCr 3:d4142832d5af 556
GregCr 3:d4142832d5af 557 /*!
mluis 0:45496a70a8a5 558 * \brief MCPS-Confirm event function
mluis 0:45496a70a8a5 559 *
mluis 5:fa113b25f612 560 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
mluis 0:45496a70a8a5 561 * containing confirm attributes.
mluis 0:45496a70a8a5 562 */
mluis 5:fa113b25f612 563 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
mluis 0:45496a70a8a5 564 {
dudmuck 10:52810ecbd83b 565 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 566 switch( mcpsConfirm->McpsRequest ) {
dudmuck 10:52810ecbd83b 567 case MCPS_UNCONFIRMED: {
mluis 0:45496a70a8a5 568 // Check Datarate
mluis 0:45496a70a8a5 569 // Check TxPower
mluis 0:45496a70a8a5 570 break;
mluis 0:45496a70a8a5 571 }
dudmuck 10:52810ecbd83b 572 case MCPS_CONFIRMED: {
mluis 0:45496a70a8a5 573 // Check Datarate
mluis 0:45496a70a8a5 574 // Check TxPower
mluis 0:45496a70a8a5 575 // Check AckReceived
mluis 5:fa113b25f612 576 // Check NbTrials
mluis 5:fa113b25f612 577 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
mluis 0:45496a70a8a5 578 break;
mluis 0:45496a70a8a5 579 }
dudmuck 10:52810ecbd83b 580 case MCPS_PROPRIETARY: {
mluis 0:45496a70a8a5 581 break;
mluis 0:45496a70a8a5 582 }
mluis 0:45496a70a8a5 583 default:
mluis 0:45496a70a8a5 584 break;
mluis 0:45496a70a8a5 585 }
mluis 5:fa113b25f612 586 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
mluis 5:fa113b25f612 587 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
dudmuck 10:52810ecbd83b 588 } else {
dudmuck 10:52810ecbd83b 589 char str[48];
dudmuck 10:52810ecbd83b 590 LoRaMacEventInfoStatus_toString(mcpsConfirm->Status, str);
dudmuck 10:52810ecbd83b 591 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 592 vt.printf("mcpsConf %s", str);
mluis 5:fa113b25f612 593
dudmuck 10:52810ecbd83b 594 }
mluis 7:ceb4063e6863 595
dudmuck 10:52810ecbd83b 596 DeviceState = DEVICE_STATE_TRIGGER;
mluis 0:45496a70a8a5 597 }
mluis 0:45496a70a8a5 598
dudmuck 10:52810ecbd83b 599
mluis 0:45496a70a8a5 600 /*!
mluis 0:45496a70a8a5 601 * \brief MCPS-Indication event function
mluis 0:45496a70a8a5 602 *
mluis 5:fa113b25f612 603 * \param [IN] mcpsIndication - Pointer to the indication structure,
mluis 0:45496a70a8a5 604 * containing indication attributes.
mluis 0:45496a70a8a5 605 */
mluis 5:fa113b25f612 606 static void McpsIndication( McpsIndication_t *mcpsIndication )
mluis 0:45496a70a8a5 607 {
dudmuck 10:52810ecbd83b 608 if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 609 char str[48];
dudmuck 10:52810ecbd83b 610 LoRaMacEventInfoStatus_toString(mcpsIndication->Status, str);
dudmuck 10:52810ecbd83b 611 vt.SetCursorPos( 44, 1 );
dudmuck 11:018e7e28161d 612 vt.printf("mcpsInd %s\e[K", str);
mluis 0:45496a70a8a5 613 return;
mluis 0:45496a70a8a5 614 }
mluis 0:45496a70a8a5 615
dudmuck 10:52810ecbd83b 616 switch( mcpsIndication->McpsIndication ) {
dudmuck 10:52810ecbd83b 617 case MCPS_UNCONFIRMED: {
mluis 0:45496a70a8a5 618 break;
mluis 0:45496a70a8a5 619 }
dudmuck 10:52810ecbd83b 620 case MCPS_CONFIRMED: {
mluis 0:45496a70a8a5 621 break;
mluis 0:45496a70a8a5 622 }
dudmuck 10:52810ecbd83b 623 case MCPS_PROPRIETARY: {
mluis 0:45496a70a8a5 624 break;
mluis 0:45496a70a8a5 625 }
dudmuck 10:52810ecbd83b 626 case MCPS_MULTICAST: {
mluis 0:45496a70a8a5 627 break;
mluis 0:45496a70a8a5 628 }
mluis 0:45496a70a8a5 629 default:
mluis 0:45496a70a8a5 630 break;
mluis 0:45496a70a8a5 631 }
mluis 0:45496a70a8a5 632
mluis 0:45496a70a8a5 633 // Check Multicast
mluis 0:45496a70a8a5 634 // Check Port
mluis 0:45496a70a8a5 635 // Check Datarate
mluis 0:45496a70a8a5 636 // Check FramePending
mluis 0:45496a70a8a5 637 // Check Buffer
mluis 0:45496a70a8a5 638 // Check BufferSize
mluis 0:45496a70a8a5 639 // Check Rssi
mluis 0:45496a70a8a5 640 // Check Snr
mluis 0:45496a70a8a5 641 // Check RxSlot
mluis 5:fa113b25f612 642 LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
dudmuck 10:52810ecbd83b 643 if( mcpsIndication->Snr & 0x80 ) { // The SNR sign bit is 1
mluis 0:45496a70a8a5 644 // Invert and divide by 4
mluis 5:fa113b25f612 645 LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
mluis 0:45496a70a8a5 646 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
dudmuck 10:52810ecbd83b 647 } else {
mluis 0:45496a70a8a5 648 // Divide by 4
mluis 5:fa113b25f612 649 LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
mluis 0:45496a70a8a5 650 }
mluis 0:45496a70a8a5 651 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 5:fa113b25f612 652 LoRaMacDownlinkStatus.RxData = mcpsIndication->RxData;
mluis 5:fa113b25f612 653 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
mluis 5:fa113b25f612 654 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
mluis 5:fa113b25f612 655 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
mluis 0:45496a70a8a5 656
dudmuck 10:52810ecbd83b 657 if( ComplianceTest.Running == true ) {
mluis 0:45496a70a8a5 658 ComplianceTest.DownLinkCounter++;
mluis 0:45496a70a8a5 659 }
mluis 0:45496a70a8a5 660
dudmuck 10:52810ecbd83b 661 if( mcpsIndication->RxData == true ) {
dudmuck 10:52810ecbd83b 662 unsigned n;
dudmuck 10:52810ecbd83b 663 for (n = 0; n < mcpsIndication->BufferSize; n += 4) {
dudmuck 10:52810ecbd83b 664 uint16_t val = mcpsIndication->Buffer[n+1] << 8;
dudmuck 10:52810ecbd83b 665 val += mcpsIndication->Buffer[n+2];
dudmuck 10:52810ecbd83b 666 cayenne_ack_ch = mcpsIndication->Buffer[n];
dudmuck 10:52810ecbd83b 667 switch (mcpsIndication->Buffer[n]) {
dudmuck 10:52810ecbd83b 668 case CAYENNE_CH_DOUT:
dudmuck 10:52810ecbd83b 669 extLed.write(val);
dudmuck 10:52810ecbd83b 670 break;
dudmuck 10:52810ecbd83b 671 case CAYENNE_CH_AOUT:
dudmuck 10:52810ecbd83b 672 pwm.write(val / 100.0);
dudmuck 10:52810ecbd83b 673 break;
dudmuck 10:52810ecbd83b 674 default:
dudmuck 10:52810ecbd83b 675 break;
GregCr 2:48d8d4806d48 676 }
dudmuck 10:52810ecbd83b 677 }
mluis 9:0083afd69815 678
dudmuck 10:52810ecbd83b 679 switch( mcpsIndication->Port ) {
dudmuck 10:52810ecbd83b 680 case 1: // The application LED can be controlled on port 1 or 2
dudmuck 10:52810ecbd83b 681 case 2:
dudmuck 10:52810ecbd83b 682 if( mcpsIndication->BufferSize == 1 ) {
dudmuck 10:52810ecbd83b 683 //AppLedStateOn = mcpsIndication->Buffer[0] & 0x01;
dudmuck 10:52810ecbd83b 684 //Led3StateChanged = true;
mluis 0:45496a70a8a5 685 }
dudmuck 10:52810ecbd83b 686 break;
dudmuck 10:52810ecbd83b 687 case 224:
dudmuck 10:52810ecbd83b 688 if( ComplianceTest.Running == false ) {
dudmuck 10:52810ecbd83b 689 // Check compliance test enable command (i)
dudmuck 10:52810ecbd83b 690 if( ( mcpsIndication->BufferSize == 4 ) &&
dudmuck 10:52810ecbd83b 691 ( mcpsIndication->Buffer[0] == 0x01 ) &&
dudmuck 10:52810ecbd83b 692 ( mcpsIndication->Buffer[1] == 0x01 ) &&
dudmuck 10:52810ecbd83b 693 ( mcpsIndication->Buffer[2] == 0x01 ) &&
dudmuck 10:52810ecbd83b 694 ( mcpsIndication->Buffer[3] == 0x01 ) ) {
dudmuck 11:018e7e28161d 695 gIsTxConfirmed = false;
dudmuck 10:52810ecbd83b 696 AppPort = 224;
dudmuck 11:018e7e28161d 697 gAppDataSize = 2;
mluis 9:0083afd69815 698 ComplianceTest.DownLinkCounter = 0;
dudmuck 10:52810ecbd83b 699 ComplianceTest.LinkCheck = false;
dudmuck 10:52810ecbd83b 700 ComplianceTest.DemodMargin = 0;
dudmuck 10:52810ecbd83b 701 ComplianceTest.NbGateways = 0;
dudmuck 10:52810ecbd83b 702 ComplianceTest.Running = true;
dudmuck 10:52810ecbd83b 703 ComplianceTest.State = 1;
mluis 9:0083afd69815 704
mluis 9:0083afd69815 705 MibRequestConfirm_t mibReq;
mluis 9:0083afd69815 706 mibReq.Type = MIB_ADR;
dudmuck 10:52810ecbd83b 707 mibReq.Param.AdrEnable = true;
mluis 9:0083afd69815 708 LoRaMacMibSetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 709
mluis 9:0083afd69815 710 #if defined( USE_BAND_868 )
dudmuck 10:52810ecbd83b 711 LoRaMacTestSetDutyCycleOn( false );
dudmuck 10:52810ecbd83b 712 #endif
dudmuck 10:52810ecbd83b 713 }
dudmuck 10:52810ecbd83b 714 } else {
dudmuck 10:52810ecbd83b 715 ComplianceTest.State = mcpsIndication->Buffer[0];
dudmuck 10:52810ecbd83b 716 switch( ComplianceTest.State ) {
dudmuck 10:52810ecbd83b 717 case 0: // Check compliance test disable command (ii)
dudmuck 11:018e7e28161d 718 gIsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
dudmuck 10:52810ecbd83b 719 AppPort = LORAWAN_APP_PORT;
dudmuck 11:018e7e28161d 720 gAppDataSize = LORAWAN_APP_DATA_SIZE;
dudmuck 10:52810ecbd83b 721 ComplianceTest.DownLinkCounter = 0;
dudmuck 10:52810ecbd83b 722 ComplianceTest.Running = false;
dudmuck 10:52810ecbd83b 723
dudmuck 10:52810ecbd83b 724 MibRequestConfirm_t mibReq;
dudmuck 10:52810ecbd83b 725 mibReq.Type = MIB_ADR;
dudmuck 10:52810ecbd83b 726 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
dudmuck 10:52810ecbd83b 727 LoRaMacMibSetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 728 #if defined( USE_BAND_868 )
dudmuck 10:52810ecbd83b 729 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
dudmuck 10:52810ecbd83b 730 #endif
dudmuck 10:52810ecbd83b 731 break;
dudmuck 10:52810ecbd83b 732 case 1: // (iii, iv)
dudmuck 11:018e7e28161d 733 gAppDataSize = 2;
dudmuck 10:52810ecbd83b 734 break;
dudmuck 10:52810ecbd83b 735 case 2: // Enable confirmed messages (v)
dudmuck 11:018e7e28161d 736 gIsTxConfirmed = true;
dudmuck 10:52810ecbd83b 737 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 738 break;
dudmuck 10:52810ecbd83b 739 case 3: // Disable confirmed messages (vi)
dudmuck 11:018e7e28161d 740 gIsTxConfirmed = false;
dudmuck 10:52810ecbd83b 741 ComplianceTest.State = 1;
dudmuck 10:52810ecbd83b 742 break;
dudmuck 10:52810ecbd83b 743 case 4: // (vii)
dudmuck 11:018e7e28161d 744 gAppDataSize = mcpsIndication->BufferSize;
dudmuck 10:52810ecbd83b 745
dudmuck 10:52810ecbd83b 746 AppData[0] = 4;
dudmuck 11:018e7e28161d 747 for( uint8_t i = 1; i < gAppDataSize; i++ ) {
dudmuck 10:52810ecbd83b 748 AppData[i] = mcpsIndication->Buffer[i] + 1;
dudmuck 10:52810ecbd83b 749 }
dudmuck 10:52810ecbd83b 750 break;
dudmuck 10:52810ecbd83b 751 case 5: { // (viii)
dudmuck 10:52810ecbd83b 752 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 753 mlmeReq.Type = MLME_LINK_CHECK;
dudmuck 10:52810ecbd83b 754 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 755 }
dudmuck 10:52810ecbd83b 756 break;
dudmuck 10:52810ecbd83b 757 case 6: { // (ix)
dudmuck 10:52810ecbd83b 758 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 759
dudmuck 10:52810ecbd83b 760 // Disable TestMode and revert back to normal operation
dudmuck 11:018e7e28161d 761 gIsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
dudmuck 10:52810ecbd83b 762 AppPort = LORAWAN_APP_PORT;
dudmuck 11:018e7e28161d 763 gAppDataSize = LORAWAN_APP_DATA_SIZE;
dudmuck 10:52810ecbd83b 764 ComplianceTest.DownLinkCounter = 0;
dudmuck 10:52810ecbd83b 765 ComplianceTest.Running = false;
dudmuck 10:52810ecbd83b 766
dudmuck 10:52810ecbd83b 767 MibRequestConfirm_t mibReq;
dudmuck 10:52810ecbd83b 768 mibReq.Type = MIB_ADR;
dudmuck 10:52810ecbd83b 769 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
dudmuck 10:52810ecbd83b 770 LoRaMacMibSetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 771 #if defined( USE_BAND_868 )
dudmuck 10:52810ecbd83b 772 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 9:0083afd69815 773 #endif
mluis 9:0083afd69815 774
dudmuck 10:52810ecbd83b 775 mlmeReq.Type = MLME_JOIN;
mluis 7:ceb4063e6863 776
dudmuck 10:52810ecbd83b 777 mlmeReq.Req.Join.DevEui = DevEui;
dudmuck 10:52810ecbd83b 778 mlmeReq.Req.Join.AppEui = AppEui;
dudmuck 10:52810ecbd83b 779 mlmeReq.Req.Join.AppKey = AppKey;
dudmuck 10:52810ecbd83b 780 mlmeReq.Req.Join.NbTrials = 3;
dudmuck 10:52810ecbd83b 781
mluis 9:0083afd69815 782 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 783 DeviceState = DEVICE_STATE_SLEEP;
mluis 9:0083afd69815 784 }
dudmuck 10:52810ecbd83b 785 break;
dudmuck 10:52810ecbd83b 786 case 7: { // (x)
dudmuck 10:52810ecbd83b 787 if( mcpsIndication->BufferSize == 3 ) {
dudmuck 10:52810ecbd83b 788 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 789 mlmeReq.Type = MLME_TXCW;
dudmuck 10:52810ecbd83b 790 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
dudmuck 10:52810ecbd83b 791 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 792 } else if( mcpsIndication->BufferSize == 7 ) {
dudmuck 10:52810ecbd83b 793 MlmeReq_t mlmeReq;
dudmuck 10:52810ecbd83b 794 mlmeReq.Type = MLME_TXCW_1;
dudmuck 10:52810ecbd83b 795 mlmeReq.Req.TxCw.Timeout = ( uint16_t )( ( mcpsIndication->Buffer[1] << 8 ) | mcpsIndication->Buffer[2] );
dudmuck 10:52810ecbd83b 796 mlmeReq.Req.TxCw.Frequency = ( uint32_t )( ( mcpsIndication->Buffer[3] << 16 ) | ( mcpsIndication->Buffer[4] << 8 ) | mcpsIndication->Buffer[5] ) * 100;
dudmuck 10:52810ecbd83b 797 mlmeReq.Req.TxCw.Power = mcpsIndication->Buffer[6];
dudmuck 10:52810ecbd83b 798 LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 799 }
dudmuck 10:52810ecbd83b 800 ComplianceTest.State = 1;
mluis 9:0083afd69815 801 }
dudmuck 10:52810ecbd83b 802 break;
dudmuck 10:52810ecbd83b 803 default:
dudmuck 10:52810ecbd83b 804 break;
mluis 9:0083afd69815 805 }
mluis 0:45496a70a8a5 806 }
dudmuck 10:52810ecbd83b 807 break;
dudmuck 10:52810ecbd83b 808 default:
dudmuck 10:52810ecbd83b 809 break;
mluis 0:45496a70a8a5 810 }
mluis 0:45496a70a8a5 811 }
mluis 0:45496a70a8a5 812
mluis 0:45496a70a8a5 813 DownlinkStatusUpdated = true;
mluis 0:45496a70a8a5 814 }
mluis 0:45496a70a8a5 815
dudmuck 10:52810ecbd83b 816
dudmuck 10:52810ecbd83b 817
mluis 0:45496a70a8a5 818 /*!
mluis 0:45496a70a8a5 819 * \brief MLME-Confirm event function
mluis 0:45496a70a8a5 820 *
mluis 5:fa113b25f612 821 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
mluis 0:45496a70a8a5 822 * containing confirm attributes.
mluis 0:45496a70a8a5 823 */
mluis 5:fa113b25f612 824 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mluis 0:45496a70a8a5 825 {
dudmuck 10:52810ecbd83b 826 vt.SetCursorPos( 45, 1 );
dudmuck 10:52810ecbd83b 827 vt.printf("MlmeConfirm() ");
dudmuck 10:52810ecbd83b 828 switch( mlmeConfirm->MlmeRequest ) {
dudmuck 10:52810ecbd83b 829 case MLME_JOIN: {
dudmuck 10:52810ecbd83b 830 vt.printf("MLME_JOIN ");
dudmuck 10:52810ecbd83b 831 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 832 vt.printf("OK");
dudmuck 10:52810ecbd83b 833 DeviceState = DEVICE_STATE_JOIN_OK;
dudmuck 10:52810ecbd83b 834 extLed = 0;
dudmuck 10:52810ecbd83b 835 } else {
dudmuck 10:52810ecbd83b 836 char str[48];
dudmuck 10:52810ecbd83b 837 LoRaMacEventInfoStatus_toString(mlmeConfirm->Status, str);
dudmuck 10:52810ecbd83b 838 vt.printf(str);
mluis 9:0083afd69815 839 // Join was not successful. Try to join again
mluis 9:0083afd69815 840 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 841 }
mluis 9:0083afd69815 842 break;
mluis 9:0083afd69815 843 }
dudmuck 10:52810ecbd83b 844 case MLME_LINK_CHECK: {
dudmuck 10:52810ecbd83b 845 vt.printf("MLME_LINK_CHECK");
dudmuck 10:52810ecbd83b 846 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK ) {
dudmuck 10:52810ecbd83b 847 vt.printf("OK");
mluis 0:45496a70a8a5 848 // Check DemodMargin
mluis 0:45496a70a8a5 849 // Check NbGateways
dudmuck 10:52810ecbd83b 850 if( ComplianceTest.Running == true ) {
mluis 0:45496a70a8a5 851 ComplianceTest.LinkCheck = true;
mluis 5:fa113b25f612 852 ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
mluis 5:fa113b25f612 853 ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
mluis 0:45496a70a8a5 854 }
mluis 0:45496a70a8a5 855 }
mluis 9:0083afd69815 856 break;
mluis 0:45496a70a8a5 857 }
mluis 9:0083afd69815 858 default:
dudmuck 10:52810ecbd83b 859 vt.printf("<%d>", mlmeConfirm->MlmeRequest);
mluis 9:0083afd69815 860 break;
mluis 0:45496a70a8a5 861 }
dudmuck 10:52810ecbd83b 862 vt.printf("\e[K");
dudmuck 10:52810ecbd83b 863 }
dudmuck 10:52810ecbd83b 864
dudmuck 10:52810ecbd83b 865 void foo()
dudmuck 10:52810ecbd83b 866 {
dudmuck 11:018e7e28161d 867 float R, temp;
dudmuck 11:018e7e28161d 868 uint16_t u16;
dudmuck 11:018e7e28161d 869
dudmuck 10:52810ecbd83b 870 vt.SetCursorPos( 43, 1 );
dudmuck 11:018e7e28161d 871
dudmuck 11:018e7e28161d 872 u16 = a3.read_u16() >> 4;
dudmuck 11:018e7e28161d 873 R = 4096.0 / u16 - 1.0;
dudmuck 11:018e7e28161d 874 R = R0 * R;
dudmuck 11:018e7e28161d 875 temp = 1.0/(log(R/R0)/B+1/298.15)-273.15;
dudmuck 11:018e7e28161d 876
dudmuck 11:018e7e28161d 877 vt.printf("%u d9:%u (%03x %03x %03x %03x) %.2fC\e[K\r\n", DeviceState, d8.read() >> 4, a1.read_u16() >> 4, a2.read_u16() >> 4, a3.read_u16() >> 4, a4.read_u16(), temp);
mluis 0:45496a70a8a5 878 }
mluis 0:45496a70a8a5 879
dudmuck 10:52810ecbd83b 880 const LoRaMacPrimitives_t LoRaMacPrimitives = {
dudmuck 10:52810ecbd83b 881 McpsConfirm,
dudmuck 10:52810ecbd83b 882 McpsIndication,
dudmuck 10:52810ecbd83b 883 MlmeConfirm
dudmuck 10:52810ecbd83b 884
dudmuck 10:52810ecbd83b 885 };
dudmuck 10:52810ecbd83b 886 const LoRaMacCallback_t LoRaMacCallbacks = {
dudmuck 10:52810ecbd83b 887 BoardGetBatteryLevel
dudmuck 10:52810ecbd83b 888 };
dudmuck 10:52810ecbd83b 889
mluis 0:45496a70a8a5 890 /**
mluis 0:45496a70a8a5 891 * Main application entry point.
mluis 0:45496a70a8a5 892 */
mluis 0:45496a70a8a5 893 int main( void )
mluis 0:45496a70a8a5 894 {
mluis 0:45496a70a8a5 895 MibRequestConfirm_t mibReq;
mluis 0:45496a70a8a5 896
mluis 0:45496a70a8a5 897 BoardInit( );
mluis 0:45496a70a8a5 898 SerialDisplayInit( );
mluis 0:45496a70a8a5 899
mluis 7:ceb4063e6863 900 SerialDisplayUpdateEui( 5, DevEui );
mluis 7:ceb4063e6863 901 SerialDisplayUpdateEui( 6, AppEui );
mluis 7:ceb4063e6863 902 SerialDisplayUpdateKey( 7, AppKey );
mluis 7:ceb4063e6863 903
mluis 7:ceb4063e6863 904 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 7:ceb4063e6863 905 SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
mluis 7:ceb4063e6863 906 SerialDisplayUpdateDevAddr( DevAddr );
mluis 7:ceb4063e6863 907 SerialDisplayUpdateKey( 12, NwkSKey );
mluis 7:ceb4063e6863 908 SerialDisplayUpdateKey( 13, AppSKey );
mluis 7:ceb4063e6863 909 #endif
mluis 7:ceb4063e6863 910
mluis 0:45496a70a8a5 911 DeviceState = DEVICE_STATE_INIT;
mluis 0:45496a70a8a5 912
dudmuck 10:52810ecbd83b 913 while( 1 ) {
dudmuck 10:52810ecbd83b 914 foo();
mluis 0:45496a70a8a5 915 SerialRxProcess( );
dudmuck 10:52810ecbd83b 916
dudmuck 10:52810ecbd83b 917 if( DownlinkStatusUpdated == true ) {
mluis 0:45496a70a8a5 918 DownlinkStatusUpdated = false;
mluis 0:45496a70a8a5 919 SerialDisplayUpdateDownlink( LoRaMacDownlinkStatus.RxData, LoRaMacDownlinkStatus.Rssi, LoRaMacDownlinkStatus.Snr, LoRaMacDownlinkStatus.DownlinkCounter, LoRaMacDownlinkStatus.Port, LoRaMacDownlinkStatus.Buffer, LoRaMacDownlinkStatus.BufferSize );
mluis 0:45496a70a8a5 920 }
dudmuck 10:52810ecbd83b 921
dudmuck 10:52810ecbd83b 922 switch( DeviceState ) {
dudmuck 10:52810ecbd83b 923 case DEVICE_STATE_INIT: {
dudmuck 10:52810ecbd83b 924 pwm.period(1.0 / 60);
dudmuck 10:52810ecbd83b 925 cayenne_ack_ch = -1;
dudmuck 10:52810ecbd83b 926 c_ch = 0xff;
dudmuck 10:52810ecbd83b 927 d8.mode(PullDown);
dudmuck 10:52810ecbd83b 928
mluis 0:45496a70a8a5 929 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
mluis 0:45496a70a8a5 930
mluis 0:45496a70a8a5 931 mibReq.Type = MIB_ADR;
mluis 0:45496a70a8a5 932 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
mluis 0:45496a70a8a5 933 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 934
mluis 0:45496a70a8a5 935 mibReq.Type = MIB_PUBLIC_NETWORK;
mluis 0:45496a70a8a5 936 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
mluis 0:45496a70a8a5 937 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 938
mluis 0:45496a70a8a5 939 #if defined( USE_BAND_868 )
mluis 0:45496a70a8a5 940 LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
mluis 0:45496a70a8a5 941 SerialDisplayUpdateDutyCycle( LORAWAN_DUTYCYCLE_ON );
mluis 5:fa113b25f612 942
mluis 9:0083afd69815 943 #if( USE_SEMTECH_DEFAULT_CHANNEL_LINEUP == 1 )
mluis 5:fa113b25f612 944 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
mluis 5:fa113b25f612 945 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
mluis 5:fa113b25f612 946 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
mluis 5:fa113b25f612 947 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
mluis 5:fa113b25f612 948 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
mluis 5:fa113b25f612 949 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
mluis 5:fa113b25f612 950 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
mluis 7:ceb4063e6863 951
mluis 9:0083afd69815 952 mibReq.Type = MIB_RX2_DEFAULT_CHANNEL;
dudmuck 10:52810ecbd83b 953 mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ) {
dudmuck 10:52810ecbd83b 954 869525000, DR_3
dudmuck 10:52810ecbd83b 955 };
mluis 9:0083afd69815 956 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 9:0083afd69815 957
mluis 7:ceb4063e6863 958 mibReq.Type = MIB_RX2_CHANNEL;
dudmuck 10:52810ecbd83b 959 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ) {
dudmuck 10:52810ecbd83b 960 869525000, DR_3
dudmuck 10:52810ecbd83b 961 };
mluis 7:ceb4063e6863 962 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 5:fa113b25f612 963 #endif
mluis 5:fa113b25f612 964
mluis 0:45496a70a8a5 965 #endif
mluis 0:45496a70a8a5 966 SerialDisplayUpdateActivationMode( OVER_THE_AIR_ACTIVATION );
mluis 0:45496a70a8a5 967 SerialDisplayUpdateAdr( LORAWAN_ADR_ON );
mluis 0:45496a70a8a5 968 SerialDisplayUpdatePublicNetwork( LORAWAN_PUBLIC_NETWORK );
mluis 0:45496a70a8a5 969
mluis 0:45496a70a8a5 970 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 0:45496a70a8a5 971
mluis 0:45496a70a8a5 972 DeviceState = DEVICE_STATE_JOIN;
mluis 0:45496a70a8a5 973 break;
mluis 0:45496a70a8a5 974 }
dudmuck 10:52810ecbd83b 975 case DEVICE_STATE_JOIN: {
mluis 0:45496a70a8a5 976 #if( OVER_THE_AIR_ACTIVATION != 0 )
dudmuck 10:52810ecbd83b 977 LoRaMacStatus_t s;
mluis 0:45496a70a8a5 978 MlmeReq_t mlmeReq;
mluis 0:45496a70a8a5 979 mlmeReq.Type = MLME_JOIN;
mluis 0:45496a70a8a5 980
mluis 0:45496a70a8a5 981 mlmeReq.Req.Join.DevEui = DevEui;
mluis 0:45496a70a8a5 982 mlmeReq.Req.Join.AppEui = AppEui;
mluis 0:45496a70a8a5 983 mlmeReq.Req.Join.AppKey = AppKey;
mluis 0:45496a70a8a5 984
dudmuck 10:52810ecbd83b 985 s = LoRaMacMlmeRequest( &mlmeReq );
dudmuck 10:52810ecbd83b 986 if (s != LORAMAC_STATUS_OK) {
dudmuck 10:52810ecbd83b 987 char str[48];
dudmuck 10:52810ecbd83b 988 LoRaMacStatus_toString(s, str);
dudmuck 10:52810ecbd83b 989 vt.SetCursorPos( 44, 1 );
dudmuck 10:52810ecbd83b 990 vt.printf("mlmeReq join %s\e[K", str);
dudmuck 10:52810ecbd83b 991 return -1;
dudmuck 10:52810ecbd83b 992 } else
dudmuck 10:52810ecbd83b 993 DeviceState = DEVICE_STATE_SLEEP;
dudmuck 10:52810ecbd83b 994
dudmuck 10:52810ecbd83b 995 extLed = 1;
mluis 0:45496a70a8a5 996 #else
mluis 0:45496a70a8a5 997 mibReq.Type = MIB_NET_ID;
mluis 0:45496a70a8a5 998 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
mluis 0:45496a70a8a5 999 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 1000
mluis 0:45496a70a8a5 1001 mibReq.Type = MIB_DEV_ADDR;
mluis 0:45496a70a8a5 1002 mibReq.Param.DevAddr = DevAddr;
mluis 0:45496a70a8a5 1003 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 1004
mluis 0:45496a70a8a5 1005 mibReq.Type = MIB_NWK_SKEY;
mluis 0:45496a70a8a5 1006 mibReq.Param.NwkSKey = NwkSKey;
mluis 0:45496a70a8a5 1007 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 1008
mluis 0:45496a70a8a5 1009 mibReq.Type = MIB_APP_SKEY;
mluis 0:45496a70a8a5 1010 mibReq.Param.AppSKey = AppSKey;
mluis 0:45496a70a8a5 1011 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 1012
mluis 0:45496a70a8a5 1013 mibReq.Type = MIB_NETWORK_JOINED;
mluis 0:45496a70a8a5 1014 mibReq.Param.IsNetworkJoined = true;
mluis 0:45496a70a8a5 1015 LoRaMacMibSetRequestConfirm( &mibReq );
mluis 0:45496a70a8a5 1016 DeviceState = DEVICE_STATE_SEND;
mluis 0:45496a70a8a5 1017 #endif
mluis 0:45496a70a8a5 1018 break;
mluis 0:45496a70a8a5 1019 }
dudmuck 10:52810ecbd83b 1020 case DEVICE_STATE_JOIN_OK:
dudmuck 10:52810ecbd83b 1021 MibRequestConfirm_t mibReq;
dudmuck 10:52810ecbd83b 1022 mibReq.Type = MIB_NETWORK_JOINED;
dudmuck 10:52810ecbd83b 1023 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1024 SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
dudmuck 10:52810ecbd83b 1025 mibReq.Type = MIB_DEV_ADDR;
dudmuck 10:52810ecbd83b 1026 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1027 SerialDisplayUpdateDevAddr(mibReq.Param.DevAddr);
dudmuck 10:52810ecbd83b 1028 mibReq.Type = MIB_NWK_SKEY;
dudmuck 10:52810ecbd83b 1029 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1030 SerialDisplayUpdateKey( 12, mibReq.Param.NwkSKey );
dudmuck 10:52810ecbd83b 1031 mibReq.Type = MIB_APP_SKEY;
dudmuck 10:52810ecbd83b 1032 LoRaMacMibGetRequestConfirm( &mibReq );
dudmuck 10:52810ecbd83b 1033 SerialDisplayUpdateKey( 13, mibReq.Param.AppSKey );
dudmuck 10:52810ecbd83b 1034 //SerialDisplayUpdateNwkId( uint8_t id );
dudmuck 10:52810ecbd83b 1035 DeviceState = DEVICE_STATE_TRIGGER;
dudmuck 10:52810ecbd83b 1036 break;
dudmuck 10:52810ecbd83b 1037 case DEVICE_STATE_SEND: {
dudmuck 10:52810ecbd83b 1038 SerialDisplayUpdateUplinkAcked( false );
dudmuck 10:52810ecbd83b 1039 SerialDisplayUpdateDonwlinkRxData( false );
dudmuck 10:52810ecbd83b 1040 PrepareTxFrame( AppPort );
mluis 0:45496a70a8a5 1041
dudmuck 11:018e7e28161d 1042 SendFrame(gAppDataSize, gIsTxConfirmed);
dudmuck 10:52810ecbd83b 1043
dudmuck 10:52810ecbd83b 1044 DeviceState = DEVICE_STATE_SLEEP;
mluis 0:45496a70a8a5 1045 break;
mluis 0:45496a70a8a5 1046 }
dudmuck 10:52810ecbd83b 1047 case DEVICE_STATE_SLEEP: {
mluis 0:45496a70a8a5 1048 // Wake up through events
mluis 0:45496a70a8a5 1049 break;
mluis 0:45496a70a8a5 1050 }
dudmuck 10:52810ecbd83b 1051 case DEVICE_STATE_TRIGGER:
dudmuck 10:52810ecbd83b 1052 if (d8.read() == 1) {
dudmuck 10:52810ecbd83b 1053 c_ch = 0xff;
dudmuck 10:52810ecbd83b 1054 DeviceState = DEVICE_STATE_SEND;
dudmuck 10:52810ecbd83b 1055 buttonStartAt = TimerGetCurrentTime();
dudmuck 10:52810ecbd83b 1056 }
dudmuck 10:52810ecbd83b 1057 break;
dudmuck 10:52810ecbd83b 1058 default: {
mluis 0:45496a70a8a5 1059 DeviceState = DEVICE_STATE_INIT;
mluis 0:45496a70a8a5 1060 break;
mluis 0:45496a70a8a5 1061 }
dudmuck 10:52810ecbd83b 1062
GregCr 2:48d8d4806d48 1063 }
mluis 5:fa113b25f612 1064
mluis 0:45496a70a8a5 1065 }
mluis 0:45496a70a8a5 1066 }