Demonstration of Class-A LoRaWAN device using NAMote-72

Dependencies:   LoRaWAN-lib mbed lib_mpl3115a2 lib_mma8451q lib_gps SX1272Lib

Dependents:   LoRaWAN-NAMote72-BVS-confirmed-tester-0-7v1_copy

LoRaWAN-NAMote72 Application Demo is a Class-A device example project using LoRaWAN-lib and SX1272Lib libraries.

This project is compliant with LoRaWAN V1.0.1 specification.

Comissioning.h (LoRaWAN Network Configuration)

The end-device can be activated in one of the two ways:

Over the Air (OTA) activation can be enabled as shown in the figure below. /media/uploads/ubhat/ota_enable.png

The end-device must be configured with the following parameters:

  • LORAWAN_DEVICE_EUI (8 Bytes) : Fist 3 Bytes is the Organizationally Unique Identifier (OUI) followed by 5 bytes of unique ID. If not defined by user, then the firmware automatically assigns one to the end-device
  • LORAWAN_APPLICATION_EUI (8 Bytes)
  • LORAWAN_APPLICATION_KEY (or DEVKEY) (16 Bytes)

/media/uploads/ubhat/ota_eui.png

Activation by Personalization (ABP) can be enabled as shown in the figure below. /media/uploads/ubhat/abp_enable.png

The end-device must be configured with the following parameters:

  • LORAWAN_DEVICE_ADDRESS (4 Bytes) : If not defined by user, then the firmware automatically assigns one to the end-device
  • LORAWAN_NWKSKEY (16 Bytes)
  • LORAWAN_APPSKEY (16 Bytes)

/media/uploads/ubhat/abp_key.png

Config.h (LoRaWAN Communication Parameters)

  • Mode of Operation : Hybrid If the end-device needs to be configured to operate over 8-channels, then Hybrid Mode needs to be enabled /media/uploads/ubhat/hybridenable.png
  • Mode of Operation : Frequency Hop If the end-device needs to be configured to operate over 64-channels, then Hybrid Mode needs to be disabled
  • Delay between successive JOIN REQUESTs : The delay between successive Join Requests (until the end-device joins the network) can be configured using the parameter OVER_THE_AIR_ACTIVATION_DUTYCYCLE
  • Inter-Frame Delay : One can change the delay between each frame transmission using APP_TX_DUTYCYCLE It is advisable that APP_TX_DUTYCYCLE is greater than or equal to 3sec.
  • Data Rate : The data rate can be configured as per LoRaWAN specification using the paramter LORAWAN_DEFAULT_DATARATE. The range of values are DR_0, DR_1, DR_2, DR_3 and DR_4
  • Confirmed/Unconfirmed Messages : The uplink message or payload can be chosen to be confirmed or unconfirmed using the parameter LORAWAN_CONFIRMED_MSG_ON. When set to 1, the transmitted messages need to be confirmed with an ACK by the network server in the subsequent RX window. When set to 0, no ACK is requested.
  • ADR ON/OFF : The ADR can be enabled or disabled using the parameter LORAWAN_ADR_ON. When set to 1, ADR is enabled and disabled when set to 0.
  • Application Port : The application port can be set using parameter LORAWAN_APP_PORT.
  • Payload Length : The lenght of the payload (in bytes) to be transmitted can be configured using LORAWAN_APP_DATA_SIZE
  • Transmit Power : The transmit power can be configured using LORAWAN_TX_POWER (LoRaMAC verifies if the set power is compliant with the LoRaWAN spec and FCC guidelines)

/media/uploads/ubhat/loraconfig.png

Main.cpp (Device State Machine)

The end-device state machine is defined.

  • Initial State : Device is initialized.
  • Join State : For OTA, Join Request is transmitted to the network until Join Accept is received by the end-device. Join event function is called that sets Red LED ON.
  • Send State : Transmit payload frame is prepared. Tx event is called that blinks the Red LED indicating uplink transmission.
  • Cycle State : Next packet transmission is scheduled

LoRaEventProc.cpp (Events and On-board Application)

Define events during Join, Tx & Rx. Prepare TX packet by appending with appropriate application data.

/media/uploads/ubhat/lora_events.png

  • PrepareLoRaFrame(uint8_t port ) : Prepare LoRa payload frame with on-board application data such as GPS, Temperature, Battery, etc. LoRa.ApplicationCall(AppType ) calls application AppType defined in LoRaApp.cpp. AppType is defined in LoRaApp.h

/media/uploads/ubhat/lora_app.png

LoRaApp.cpp

User-defined applications such as GPS, Temp, Accelerometer, LED indications etc. Event based actions such as LED blink on Tx, LED toggle on downlink etc /media/uploads/ubhat/apptype.png

LoRaDeviceStateProc.cpp

Process function calls corresponding to different Device states /media/uploads/ubhat/device_state.png

LoRaMacLayerService.cpp

Define MAC Layer Services: MLME & MCPS

Serial Terminal Display

By using a serial port connection using applications such as teraterm or putty, one can view the status of the End-Device. Once the End-Device Joins the network, transmission parameters such as payload data, application port, message type etc. are displayed on the terminal.

/media/uploads/ubhat/serial.png

Default Application Payload

This application defaults to sending uplink data to logical port 5. The application payload consists of: /media/uploads/jknapp_smtc/payload.png

Sample Application Payload Calculation for Longitude/Latitude

Payload => 00 19 F6 352BBA A94C20 FFFF

Temperature Calculation

19H => 2510

Temp = 25/2 = 12.5 oC

Battery Level

FFH => 100 %

F6H => 96.5 %

Longitude Calculation

longitude = A94C20H => 1109507210

longitudinal coordinate = -360 + (longitude10 x 180/(223))

longitudinal coordinate = -121.93

Latitude Calculation

latitude = 352BBAH = 348460210

latitude coordinate = (latitude10 x 90/(223-1))

latitude coordinate = 37.39

Committer:
mluis
Date:
Mon Apr 24 13:47:27 2017 +0000
Revision:
18:18408c3c2d0c
Parent:
15:39a23f5affd1
WARNING: Radio API timings changed from micro-seconds to milliseconds; ; Synchronized with https://github.com/Lora-net/LoRaMac-node git revision e506c246652fa44c3f24cecb89d0707b49ece739; Updated all libraries to the latest versions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ubhat 0:69f2e28d12c1 1 /*
ubhat 0:69f2e28d12c1 2 / _____) _ | |
ubhat 0:69f2e28d12c1 3 ( (____ _____ ____ _| |_ _____ ____| |__
ubhat 0:69f2e28d12c1 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
ubhat 0:69f2e28d12c1 5 _____) ) ____| | | || |_| ____( (___| | | |
ubhat 0:69f2e28d12c1 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
ubhat 0:69f2e28d12c1 7 (C)2015 Semtech
ubhat 0:69f2e28d12c1 8
ubhat 0:69f2e28d12c1 9 Description: Define events during Join, Tx & Rx
ubhat 0:69f2e28d12c1 10 Prepare TX packet by appending with appropriate application data
ubhat 0:69f2e28d12c1 11
ubhat 0:69f2e28d12c1 12 License: Revised BSD License, see LICENSE.TXT file include in the project
ubhat 0:69f2e28d12c1 13
ubhat 0:69f2e28d12c1 14 Maintainer: Uttam Bhat
ubhat 0:69f2e28d12c1 15 */
ubhat 0:69f2e28d12c1 16
ubhat 0:69f2e28d12c1 17 #include "LoRaEventProc.h"
ubhat 0:69f2e28d12c1 18
ubhat 5:6ffeac53b7cb 19 /*!
ubhat 5:6ffeac53b7cb 20 * Defines the application data transmission duty cycle
ubhat 5:6ffeac53b7cb 21 */
ubhat 5:6ffeac53b7cb 22 uint32_t TxDutyCycleTime = APP_TX_DUTYCYCLE;
ubhat 5:6ffeac53b7cb 23
ubhat 0:69f2e28d12c1 24 bool AppLed = 0;
ubhat 0:69f2e28d12c1 25
ubhat 0:69f2e28d12c1 26 /*!
ubhat 0:69f2e28d12c1 27 * \brief Prepares the payload of the frame based on application port
ubhat 0:69f2e28d12c1 28 */
ubhat 0:69f2e28d12c1 29 void PrepareLoRaFrame( uint8_t port )
ubhat 0:69f2e28d12c1 30 {
ubhat 0:69f2e28d12c1 31 switch( port )
mluis 18:18408c3c2d0c 32 {
ubhat 0:69f2e28d12c1 33 case 5:
mluis 18:18408c3c2d0c 34 {
ubhat 0:69f2e28d12c1 35 uint8_t tmp;
ubhat 0:69f2e28d12c1 36 uint8_t tmpLength;
ubhat 0:69f2e28d12c1 37 uint8_t ptrIndex = 0;
mluis 18:18408c3c2d0c 38
ubhat 0:69f2e28d12c1 39 // Point the pointer to position index of Tx Buffer
ubhat 0:69f2e28d12c1 40 LoRaApp.ApplicationPtrPos( ptrIndex );
ubhat 0:69f2e28d12c1 41
ubhat 0:69f2e28d12c1 42 tmp = ( AppLed != 0 ) ? 0x0F : 0x00;
ubhat 0:69f2e28d12c1 43 tmpLength = 1;
mluis 18:18408c3c2d0c 44
mluis 18:18408c3c2d0c 45 LoRaApp.ApplicationAppendData( &tmp, tmpLength ); // Populate lower nibble of 0th Byte with LED state
ubhat 0:69f2e28d12c1 46
ubhat 0:69f2e28d12c1 47 /*!
mluis 18:18408c3c2d0c 48 * Read Temperature
mluis 18:18408c3c2d0c 49 * Appends 1 Byte to TX buffer
mluis 18:18408c3c2d0c 50 */
ubhat 0:69f2e28d12c1 51 LoRaApp.ApplicationCall( AppTemp );
ubhat 0:69f2e28d12c1 52
ubhat 0:69f2e28d12c1 53 /*!
mluis 18:18408c3c2d0c 54 * Read Battery
mluis 18:18408c3c2d0c 55 * Appends 1 Byte to TX buffer
mluis 18:18408c3c2d0c 56 */
ubhat 0:69f2e28d12c1 57 LoRaApp.ApplicationCall( AppBat );
ubhat 0:69f2e28d12c1 58
ubhat 0:69f2e28d12c1 59 /*!
mluis 18:18408c3c2d0c 60 * Read GPS coordinates
mluis 18:18408c3c2d0c 61 * Appends 8 Bytes (3 bytes longitude, 3 bytes latitude, 2 bytes altitude) to TX buffer
mluis 18:18408c3c2d0c 62 */
mluis 18:18408c3c2d0c 63 LoRaApp.ApplicationCall( AppGps );
ubhat 0:69f2e28d12c1 64
ubhat 0:69f2e28d12c1 65 /*!
mluis 18:18408c3c2d0c 66 * Read Accelerometer
mluis 18:18408c3c2d0c 67 * Appends 2 Bytes to TX buffer
mluis 18:18408c3c2d0c 68 * Value Orientation
mluis 18:18408c3c2d0c 69 * 0x99 0x00 horizontal + faceup
mluis 18:18408c3c2d0c 70 * 0x66 0x00 horizontal + facedown
mluis 18:18408c3c2d0c 71 * 0x00 0x11 vertical
mluis 18:18408c3c2d0c 72 */
mluis 18:18408c3c2d0c 73 LoRaApp.ApplicationCall( AppAccl ); // Generate Accelerometer data bytes
ubhat 0:69f2e28d12c1 74
mluis 18:18408c3c2d0c 75 /*!
mluis 18:18408c3c2d0c 76 * Generate Ramp data bytes
mluis 18:18408c3c2d0c 77 * Appends incremental values of 1 Byte each to TX buffer until Full
mluis 18:18408c3c2d0c 78 */
mluis 18:18408c3c2d0c 79 LoRaApp.ApplicationCall( AppRamp );
ubhat 0:69f2e28d12c1 80
ubhat 0:69f2e28d12c1 81 break;
ubhat 0:69f2e28d12c1 82 }
ubhat 6:f8194e691dd4 83
mluis 18:18408c3c2d0c 84 // Senet M2X ORIENTATION Demo
mluis 18:18408c3c2d0c 85 // Set LORAWAN_APP_DATA_SIZE to 2
mluis 18:18408c3c2d0c 86 case 6:
mluis 18:18408c3c2d0c 87 {
mluis 18:18408c3c2d0c 88 uint8_t ptrIndex = 1;
mluis 18:18408c3c2d0c 89
mluis 18:18408c3c2d0c 90 // Point the pointer to position index of Tx Buffer
ubhat 6:f8194e691dd4 91 LoRaApp.ApplicationPtrPos( ptrIndex );
ubhat 7:92f4f419f91f 92
mluis 18:18408c3c2d0c 93 LoRaApp.ApplicationCall( AppAcclSenet ); // Generate Accelerometer data bytes
mluis 18:18408c3c2d0c 94
ubhat 6:f8194e691dd4 95 break;
ubhat 6:f8194e691dd4 96 }
ubhat 13:6b6f4be13633 97
mluis 18:18408c3c2d0c 98 /* Senet GPS Demo
mluis 18:18408c3c2d0c 99 Data Format (in Hex):
mluis 18:18408c3c2d0c 100 [01, 02, Lattitude (3 bytes), Longitude (3 Bytes), Elevation (2 bytes), Tx Power (1 byte)]
mluis 18:18408c3c2d0c 101 */
mluis 18:18408c3c2d0c 102 case 7:
mluis 18:18408c3c2d0c 103 {
ubhat 13:6b6f4be13633 104 uint8_t ptrIndex = 0;
mluis 18:18408c3c2d0c 105 uint8_t tmp[] = { 0x01, 0x02 };
ubhat 13:6b6f4be13633 106
mluis 18:18408c3c2d0c 107 // Point the pointer to position index of Tx Buffer
mluis 18:18408c3c2d0c 108 LoRaApp.ApplicationPtrPos( ptrIndex );
ubhat 13:6b6f4be13633 109
mluis 18:18408c3c2d0c 110 LoRaApp.ApplicationAppendData( tmp, 2 );
ubhat 15:39a23f5affd1 111
mluis 18:18408c3c2d0c 112 LoRaApp.ApplicationCall( AppGps ); // Generate Accelerometer data bytes
mluis 18:18408c3c2d0c 113
mluis 18:18408c3c2d0c 114 uint8_t pow = 30 - 2 * ( ( uint8_t )LoRaMacUplinkStatus.TxPower );
mluis 18:18408c3c2d0c 115 LoRaApp.ApplicationAppendData( &pow, 1 );
ubhat 13:6b6f4be13633 116
ubhat 13:6b6f4be13633 117 break;
ubhat 13:6b6f4be13633 118 }
mluis 18:18408c3c2d0c 119
mluis 18:18408c3c2d0c 120 // Push-Button Demo
mluis 18:18408c3c2d0c 121 case 11:
mluis 18:18408c3c2d0c 122 {
mluis 18:18408c3c2d0c 123 uint8_t ptrIndex = 0;
mluis 18:18408c3c2d0c 124
mluis 18:18408c3c2d0c 125 // Point the pointer to position index of Tx Buffer
mluis 18:18408c3c2d0c 126 LoRaApp.ApplicationPtrPos( ptrIndex );
mluis 18:18408c3c2d0c 127
mluis 18:18408c3c2d0c 128 LoRaApp.ApplicationCall( AppPushButton ); // Transmit uplink counter
mluis 18:18408c3c2d0c 129
mluis 18:18408c3c2d0c 130 break;
mluis 18:18408c3c2d0c 131 }
mluis 18:18408c3c2d0c 132
mluis 18:18408c3c2d0c 133 // Transmit on Vertical Orientation Demo
mluis 18:18408c3c2d0c 134 case 12:
mluis 18:18408c3c2d0c 135 {
mluis 18:18408c3c2d0c 136 uint8_t ptrIndex = 0;
mluis 18:18408c3c2d0c 137
mluis 18:18408c3c2d0c 138 // Point the pointer to position index of Tx Buffer
mluis 18:18408c3c2d0c 139 LoRaApp.ApplicationPtrPos( ptrIndex );
mluis 18:18408c3c2d0c 140
mluis 18:18408c3c2d0c 141 LoRaApp.ApplicationCall( AppPushButton ); // Transmit uplink counter
mluis 18:18408c3c2d0c 142
mluis 18:18408c3c2d0c 143 break;
mluis 18:18408c3c2d0c 144 }
mluis 18:18408c3c2d0c 145
ubhat 0:69f2e28d12c1 146 default:
mluis 18:18408c3c2d0c 147 {
mluis 18:18408c3c2d0c 148 break;
mluis 18:18408c3c2d0c 149 }
ubhat 0:69f2e28d12c1 150 }
ubhat 0:69f2e28d12c1 151 }
ubhat 0:69f2e28d12c1 152
ubhat 5:6ffeac53b7cb 153
ubhat 5:6ffeac53b7cb 154 /*!
ubhat 5:6ffeac53b7cb 155 * \brief Sets Interrupt for next payload transmission
ubhat 5:6ffeac53b7cb 156 */
ubhat 5:6ffeac53b7cb 157 void InitNextTxInterrupt( uint8_t port )
mluis 18:18408c3c2d0c 158 {
ubhat 5:6ffeac53b7cb 159 switch( port )
ubhat 5:6ffeac53b7cb 160 {
ubhat 5:6ffeac53b7cb 161 /* GPS Application Demo
ubhat 5:6ffeac53b7cb 162 Set Timer interrupt for next uplink
ubhat 5:6ffeac53b7cb 163 */
ubhat 5:6ffeac53b7cb 164 case 5:
mluis 18:18408c3c2d0c 165 {
ubhat 5:6ffeac53b7cb 166 }
ubhat 5:6ffeac53b7cb 167
ubhat 5:6ffeac53b7cb 168 /* Senet + M2X demo
ubhat 5:6ffeac53b7cb 169 Set Timer interrupt for next uplink
ubhat 5:6ffeac53b7cb 170 */
ubhat 5:6ffeac53b7cb 171 case 6:
mluis 18:18408c3c2d0c 172 {
ubhat 5:6ffeac53b7cb 173 }
ubhat 5:6ffeac53b7cb 174
ubhat 5:6ffeac53b7cb 175 /* Senet GPS Demo
ubhat 5:6ffeac53b7cb 176 Set Timer interrupt for next uplink
ubhat 5:6ffeac53b7cb 177 */
mluis 18:18408c3c2d0c 178 case 7:
mluis 18:18408c3c2d0c 179 {
ubhat 5:6ffeac53b7cb 180 // Schedule next packet transmission
ubhat 5:6ffeac53b7cb 181 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
ubhat 5:6ffeac53b7cb 182 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
ubhat 5:6ffeac53b7cb 183 TimerStart( &TxNextPacketTimer );
ubhat 5:6ffeac53b7cb 184 break;
ubhat 5:6ffeac53b7cb 185 }
ubhat 5:6ffeac53b7cb 186
ubhat 5:6ffeac53b7cb 187 /* Push Button Demo
ubhat 6:f8194e691dd4 188 Send Packet Immedietly if PC0 = GND
ubhat 5:6ffeac53b7cb 189 */
mluis 18:18408c3c2d0c 190 case 11:
mluis 18:18408c3c2d0c 191 {
ubhat 6:f8194e691dd4 192 volatile bool PushButtonStatus;
ubhat 6:f8194e691dd4 193
ubhat 6:f8194e691dd4 194 PushButtonStatus = PC0;
ubhat 6:f8194e691dd4 195
ubhat 6:f8194e691dd4 196 if(PushButtonStatus == 0)
ubhat 6:f8194e691dd4 197 {
ubhat 6:f8194e691dd4 198 // Send Pkt immedietly if PC = GND
ubhat 6:f8194e691dd4 199 DeviceState = DEVICE_STATE_SEND;
ubhat 6:f8194e691dd4 200 NextTx = true;
ubhat 6:f8194e691dd4 201 }
ubhat 6:f8194e691dd4 202 else
ubhat 6:f8194e691dd4 203 {
ubhat 6:f8194e691dd4 204 // Keep polling
ubhat 6:f8194e691dd4 205 IsTxIntUpdate = true;
ubhat 6:f8194e691dd4 206 }
ubhat 5:6ffeac53b7cb 207 break;
mluis 18:18408c3c2d0c 208 }
ubhat 5:6ffeac53b7cb 209
ubhat 7:92f4f419f91f 210 /* Orientation Demo
ubhat 7:92f4f419f91f 211 Send Packet Immedietly if Mote is Vertical
ubhat 7:92f4f419f91f 212 */
mluis 18:18408c3c2d0c 213 case 12:
mluis 18:18408c3c2d0c 214 {
ubhat 8:14521932100a 215 CheckOrientation( );
mluis 18:18408c3c2d0c 216
ubhat 7:92f4f419f91f 217 if(VerticalStatus == true)
ubhat 7:92f4f419f91f 218 {
ubhat 7:92f4f419f91f 219 // Send Pkt immedietly if PC = GND
ubhat 7:92f4f419f91f 220 DeviceState = DEVICE_STATE_SEND;
ubhat 7:92f4f419f91f 221 NextTx = true;
ubhat 7:92f4f419f91f 222 }
ubhat 7:92f4f419f91f 223 else
ubhat 7:92f4f419f91f 224 {
ubhat 7:92f4f419f91f 225 // Keep polling
ubhat 7:92f4f419f91f 226 IsTxIntUpdate = true;
ubhat 7:92f4f419f91f 227 }
ubhat 7:92f4f419f91f 228 break;
mluis 18:18408c3c2d0c 229 }
ubhat 7:92f4f419f91f 230
ubhat 5:6ffeac53b7cb 231 /* Compliance Test
ubhat 5:6ffeac53b7cb 232 Set Timer interrupt for next uplink
ubhat 5:6ffeac53b7cb 233 */
ubhat 5:6ffeac53b7cb 234 case 224:
mluis 18:18408c3c2d0c 235 {
ubhat 5:6ffeac53b7cb 236 // Schedule next packet transmission
ubhat 5:6ffeac53b7cb 237 TimerSetValue( &TxNextPacketTimer, COMPLIANCE_TX_DUTYCYCLE );
ubhat 5:6ffeac53b7cb 238 TimerStart( &TxNextPacketTimer );
ubhat 5:6ffeac53b7cb 239 break;
ubhat 5:6ffeac53b7cb 240 }
ubhat 5:6ffeac53b7cb 241
ubhat 5:6ffeac53b7cb 242 default:
ubhat 5:6ffeac53b7cb 243 {
ubhat 5:6ffeac53b7cb 244 // Schedule next packet transmission
ubhat 5:6ffeac53b7cb 245 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
ubhat 5:6ffeac53b7cb 246 TimerStart( &TxNextPacketTimer );
ubhat 5:6ffeac53b7cb 247 break;
ubhat 5:6ffeac53b7cb 248 }
ubhat 5:6ffeac53b7cb 249 }
ubhat 5:6ffeac53b7cb 250
ubhat 5:6ffeac53b7cb 251 }
ubhat 5:6ffeac53b7cb 252
ubhat 0:69f2e28d12c1 253 /*!
ubhat 0:69f2e28d12c1 254 * \brief What to do during JOIN process ? blink/toggle LED etc.
ubhat 0:69f2e28d12c1 255 */
ubhat 0:69f2e28d12c1 256 void JoinEvent( void )
ubhat 0:69f2e28d12c1 257 {
ubhat 0:69f2e28d12c1 258 // CtrlLED is defined in LoRaBoardAppIf.h
ubhat 0:69f2e28d12c1 259 // param 1: LED color (Red, Yellow or Green)
ubhat 0:69f2e28d12c1 260 // param 2: LED_ON or LED_OFF
ubhat 0:69f2e28d12c1 261 CtrlLED( Red, LED_ON );
ubhat 0:69f2e28d12c1 262 }
ubhat 0:69f2e28d12c1 263
ubhat 0:69f2e28d12c1 264 /*!
ubhat 0:69f2e28d12c1 265 * \brief What to do during TX ? blink/toggle LED etc.
ubhat 0:69f2e28d12c1 266 */
ubhat 0:69f2e28d12c1 267 void TxEvent( void )
ubhat 0:69f2e28d12c1 268 {
mluis 18:18408c3c2d0c 269 int blinkTime = 25;
ubhat 0:69f2e28d12c1 270
ubhat 0:69f2e28d12c1 271 // Blink Red LED for 25msec
ubhat 0:69f2e28d12c1 272 BlinkLED( Red, blinkTime );
ubhat 0:69f2e28d12c1 273 }
ubhat 0:69f2e28d12c1 274
mluis 18:18408c3c2d0c 275 void RxEvent( void )
ubhat 0:69f2e28d12c1 276 {
ubhat 0:69f2e28d12c1 277 // Toggle yellow LED
mluis 18:18408c3c2d0c 278 ToggleLED( Yellow );
ubhat 0:69f2e28d12c1 279
ubhat 0:69f2e28d12c1 280 // If Rx Data is 0x01 turn on Green LED else if 0x0 Turn Green LED off
ubhat 0:69f2e28d12c1 281 if( LoRaMacDownlinkStatus.BufferSize == 1 )
mluis 18:18408c3c2d0c 282 {
ubhat 0:69f2e28d12c1 283 if( LoRaMacDownlinkStatus.Buffer[0] == 0x01 )
ubhat 0:69f2e28d12c1 284 {
ubhat 0:69f2e28d12c1 285 AppLed = 1;
ubhat 0:69f2e28d12c1 286 }
ubhat 0:69f2e28d12c1 287 else
ubhat 0:69f2e28d12c1 288 {
ubhat 0:69f2e28d12c1 289 if( LoRaMacDownlinkStatus.Buffer[0] == 0x00 )
ubhat 0:69f2e28d12c1 290 {
ubhat 0:69f2e28d12c1 291 AppLed = 0;
ubhat 0:69f2e28d12c1 292 }
ubhat 0:69f2e28d12c1 293 }
ubhat 0:69f2e28d12c1 294 }
ubhat 0:69f2e28d12c1 295
ubhat 0:69f2e28d12c1 296 if( AppLed != 0 )
ubhat 0:69f2e28d12c1 297 {
ubhat 0:69f2e28d12c1 298 // Turn USR_LED ON
ubhat 0:69f2e28d12c1 299 CtrlLED( Usr, LED_ON );
ubhat 0:69f2e28d12c1 300 }
ubhat 0:69f2e28d12c1 301 else
ubhat 0:69f2e28d12c1 302 {
ubhat 0:69f2e28d12c1 303 // Turn USR_LED OFF
ubhat 0:69f2e28d12c1 304 CtrlLED( Usr, LED_OFF );
ubhat 0:69f2e28d12c1 305 }
ubhat 0:69f2e28d12c1 306 }
ubhat 0:69f2e28d12c1 307