LoRa on Multitech with Semtech mote

Dependencies:   LoRaWAN-lib SX1272Lib lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo_Multitech by Nagaraj Krishnamurthy

Committer:
ubhat
Date:
Wed Jun 08 22:42:24 2016 +0000
Revision:
8:14521932100a
Parent:
7:92f4f419f91f
Child:
13:6b6f4be13633
minor modifications

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