mQ Branch for NA mote testing

Dependencies:   LoRaWAN-lib SX1272Lib-mQ lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo by Semtech

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