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:
ubhat
Date:
Tue May 17 00:21:55 2016 +0000
Revision:
0:69f2e28d12c1
Child:
5:6ffeac53b7cb
Project for LoRa Bootcamp

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: LoRaMac classA device implementation
ubhat 0:69f2e28d12c1 10
ubhat 0:69f2e28d12c1 11 License: Revised BSD License, see LICENSE.TXT file include in the project
ubhat 0:69f2e28d12c1 12
ubhat 0:69f2e28d12c1 13 Maintainer: Miguel Luis and Gregory Cristian
ubhat 0:69f2e28d12c1 14 */
ubhat 0:69f2e28d12c1 15 #include "mbed.h"
ubhat 0:69f2e28d12c1 16 #include "board.h"
ubhat 0:69f2e28d12c1 17 #include "radio.h"
ubhat 0:69f2e28d12c1 18
ubhat 0:69f2e28d12c1 19 #include "LoRaMac.h"
ubhat 0:69f2e28d12c1 20 #include "Comissioning.h"
ubhat 0:69f2e28d12c1 21 #include "SerialDisplay.h"
ubhat 0:69f2e28d12c1 22 #include "ComplianceTest.h"
ubhat 0:69f2e28d12c1 23 #include "LoRaDeviceStateProc.h"
ubhat 0:69f2e28d12c1 24 #include "LoRaEventProc.h"
ubhat 0:69f2e28d12c1 25 #include "LoRaApp.h"
ubhat 0:69f2e28d12c1 26
ubhat 0:69f2e28d12c1 27 /*!
ubhat 0:69f2e28d12c1 28 * Defines a random delay for application data transmission duty cycle. 1s,
ubhat 0:69f2e28d12c1 29 * value in [us].
ubhat 0:69f2e28d12c1 30 */
ubhat 0:69f2e28d12c1 31 #define APP_TX_DUTYCYCLE_RND 1000000
ubhat 0:69f2e28d12c1 32
ubhat 0:69f2e28d12c1 33
ubhat 0:69f2e28d12c1 34 #if( OVER_THE_AIR_ACTIVATION != 0 )
ubhat 0:69f2e28d12c1 35
ubhat 0:69f2e28d12c1 36 uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
ubhat 0:69f2e28d12c1 37 uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
ubhat 0:69f2e28d12c1 38 uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
ubhat 0:69f2e28d12c1 39
ubhat 0:69f2e28d12c1 40 #else
ubhat 0:69f2e28d12c1 41
ubhat 0:69f2e28d12c1 42 uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
ubhat 0:69f2e28d12c1 43 uint8_t AppSKey[] = LORAWAN_APPSKEY;
ubhat 0:69f2e28d12c1 44
ubhat 0:69f2e28d12c1 45 /*!
ubhat 0:69f2e28d12c1 46 * Device address
ubhat 0:69f2e28d12c1 47 */
ubhat 0:69f2e28d12c1 48 uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
ubhat 0:69f2e28d12c1 49
ubhat 0:69f2e28d12c1 50 #endif
ubhat 0:69f2e28d12c1 51
ubhat 0:69f2e28d12c1 52 /*!
ubhat 0:69f2e28d12c1 53 * Application port
ubhat 0:69f2e28d12c1 54 */
ubhat 0:69f2e28d12c1 55 uint8_t AppPort = LORAWAN_APP_PORT;
ubhat 0:69f2e28d12c1 56
ubhat 0:69f2e28d12c1 57 /*!
ubhat 0:69f2e28d12c1 58 * User application data size
ubhat 0:69f2e28d12c1 59 */
ubhat 0:69f2e28d12c1 60 uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
ubhat 0:69f2e28d12c1 61
ubhat 0:69f2e28d12c1 62 /*!
ubhat 0:69f2e28d12c1 63 * User application data
ubhat 0:69f2e28d12c1 64 */
ubhat 0:69f2e28d12c1 65 uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
ubhat 0:69f2e28d12c1 66
ubhat 0:69f2e28d12c1 67 /*!
ubhat 0:69f2e28d12c1 68 * Application to handle functions
ubhat 0:69f2e28d12c1 69 */
ubhat 0:69f2e28d12c1 70 Application LoRaApp( AppData );
ubhat 0:69f2e28d12c1 71
ubhat 0:69f2e28d12c1 72 /*!
ubhat 0:69f2e28d12c1 73 * Indicates if the node is sending confirmed or unconfirmed messages
ubhat 0:69f2e28d12c1 74 */
ubhat 0:69f2e28d12c1 75 uint8_t IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
ubhat 0:69f2e28d12c1 76
ubhat 0:69f2e28d12c1 77 /*!
ubhat 0:69f2e28d12c1 78 * Defines the application data transmission duty cycle
ubhat 0:69f2e28d12c1 79 */
ubhat 0:69f2e28d12c1 80 static uint32_t TxDutyCycleTime;
ubhat 0:69f2e28d12c1 81
ubhat 0:69f2e28d12c1 82 /*!
ubhat 0:69f2e28d12c1 83 * Timer to handle the application data transmission duty cycle
ubhat 0:69f2e28d12c1 84 */
ubhat 0:69f2e28d12c1 85 TimerEvent_t TxNextPacketTimer;
ubhat 0:69f2e28d12c1 86
ubhat 0:69f2e28d12c1 87 /*!
ubhat 0:69f2e28d12c1 88 * Indicates if a new packet can be sent
ubhat 0:69f2e28d12c1 89 */
ubhat 0:69f2e28d12c1 90 bool NextTx = true;
ubhat 0:69f2e28d12c1 91
ubhat 0:69f2e28d12c1 92 /*!
ubhat 0:69f2e28d12c1 93 * LoRaWAN compliance tests support data
ubhat 0:69f2e28d12c1 94 */
ubhat 0:69f2e28d12c1 95 ComplianceTest_s ComplianceTest;
ubhat 0:69f2e28d12c1 96
ubhat 0:69f2e28d12c1 97 /*!
ubhat 0:69f2e28d12c1 98 * Indicates if the MAC layer network join status has changed.
ubhat 0:69f2e28d12c1 99 */
ubhat 0:69f2e28d12c1 100 bool IsNetworkJoinedStatusUpdate = false;
ubhat 0:69f2e28d12c1 101
ubhat 0:69f2e28d12c1 102 /*!
ubhat 0:69f2e28d12c1 103 * Indicates if the message sent.
ubhat 0:69f2e28d12c1 104 */
ubhat 0:69f2e28d12c1 105 bool IsTxUpdate = false;
ubhat 0:69f2e28d12c1 106
ubhat 0:69f2e28d12c1 107 /*!
ubhat 0:69f2e28d12c1 108 * Indicates if the message received in the RX window.
ubhat 0:69f2e28d12c1 109 */
ubhat 0:69f2e28d12c1 110 bool IsRxUpdate = false;
ubhat 0:69f2e28d12c1 111
ubhat 0:69f2e28d12c1 112
ubhat 0:69f2e28d12c1 113 /**
ubhat 0:69f2e28d12c1 114 * Main application entry point.
ubhat 0:69f2e28d12c1 115 */
ubhat 0:69f2e28d12c1 116 int main( void )
ubhat 0:69f2e28d12c1 117 {
ubhat 0:69f2e28d12c1 118
ubhat 0:69f2e28d12c1 119 // Initialize board peripherals
ubhat 0:69f2e28d12c1 120 BoardInit( );
ubhat 0:69f2e28d12c1 121
ubhat 0:69f2e28d12c1 122 // Initialize Device state
ubhat 0:69f2e28d12c1 123 DeviceState = DEVICE_STATE_INIT;
ubhat 0:69f2e28d12c1 124
ubhat 0:69f2e28d12c1 125 while( 1 )
ubhat 0:69f2e28d12c1 126 {
ubhat 0:69f2e28d12c1 127 Gps.service( );
ubhat 0:69f2e28d12c1 128 if( IsNetworkJoinedStatusUpdate == true )
ubhat 0:69f2e28d12c1 129 {
ubhat 0:69f2e28d12c1 130 IsNetworkJoinedStatusUpdate = false;
ubhat 0:69f2e28d12c1 131
ubhat 0:69f2e28d12c1 132 DeviceJoinUpdate( );
ubhat 0:69f2e28d12c1 133 }
ubhat 0:69f2e28d12c1 134
ubhat 0:69f2e28d12c1 135 if( IsTxUpdate == true )
ubhat 0:69f2e28d12c1 136 {
ubhat 0:69f2e28d12c1 137 // If downlink received then update Serial Terminal and execute Rx event
ubhat 0:69f2e28d12c1 138 IsTxUpdate = false;
ubhat 0:69f2e28d12c1 139 // Update serial terminal
ubhat 0:69f2e28d12c1 140 SerialDisplayTxUpdate( );
ubhat 0:69f2e28d12c1 141 }
ubhat 0:69f2e28d12c1 142
ubhat 0:69f2e28d12c1 143 if( IsRxUpdate == true )
ubhat 0:69f2e28d12c1 144 {
ubhat 0:69f2e28d12c1 145 // If downlink received then update Serial Terminal and execute Rx event
ubhat 0:69f2e28d12c1 146 IsRxUpdate = false;
ubhat 0:69f2e28d12c1 147 RxEvent( );
ubhat 0:69f2e28d12c1 148 SerialDisplayRxUpdate( );
ubhat 0:69f2e28d12c1 149 }
ubhat 0:69f2e28d12c1 150
ubhat 0:69f2e28d12c1 151 switch( DeviceState )
ubhat 0:69f2e28d12c1 152 {
ubhat 0:69f2e28d12c1 153 case DEVICE_STATE_INIT:
ubhat 0:69f2e28d12c1 154 {
ubhat 0:69f2e28d12c1 155 // Initialize MAC, MAC services, Primitives
ubhat 0:69f2e28d12c1 156 DeviceInit( );
ubhat 0:69f2e28d12c1 157
ubhat 0:69f2e28d12c1 158 // Change Device state
ubhat 0:69f2e28d12c1 159 DeviceState = DEVICE_STATE_JOIN;
ubhat 0:69f2e28d12c1 160 break;
ubhat 0:69f2e28d12c1 161 }
ubhat 0:69f2e28d12c1 162 case DEVICE_STATE_JOIN:
ubhat 0:69f2e28d12c1 163 {
ubhat 0:69f2e28d12c1 164 #if( OVER_THE_AIR_ACTIVATION != 0 ) // OTA
ubhat 0:69f2e28d12c1 165
ubhat 0:69f2e28d12c1 166 // Generate DevEUI if not defined by User
ubhat 0:69f2e28d12c1 167 BoardGetDevEUI( DevEui );
ubhat 0:69f2e28d12c1 168
ubhat 0:69f2e28d12c1 169 // Join N/w server
ubhat 0:69f2e28d12c1 170 DeviceJoin( );
ubhat 0:69f2e28d12c1 171
ubhat 0:69f2e28d12c1 172 // Show on serial terminal
ubhat 0:69f2e28d12c1 173 SerialDisplayJoinUpdate( );
ubhat 0:69f2e28d12c1 174
ubhat 0:69f2e28d12c1 175 // Execute Join event
ubhat 0:69f2e28d12c1 176 JoinEvent( );
ubhat 0:69f2e28d12c1 177
ubhat 0:69f2e28d12c1 178 // Schedule next packet transmission
ubhat 0:69f2e28d12c1 179 TxDutyCycleTime = OVER_THE_AIR_ACTIVATION_DUTYCYCLE;
ubhat 0:69f2e28d12c1 180 DeviceState = DEVICE_STATE_SLEEP;
ubhat 0:69f2e28d12c1 181
ubhat 0:69f2e28d12c1 182 #else // ABP
ubhat 0:69f2e28d12c1 183 DeviceJoin( );
ubhat 0:69f2e28d12c1 184
ubhat 0:69f2e28d12c1 185 DeviceState = DEVICE_STATE_SEND;
ubhat 0:69f2e28d12c1 186 #endif
ubhat 0:69f2e28d12c1 187 IsNetworkJoinedStatusUpdate = true;
ubhat 0:69f2e28d12c1 188 break;
ubhat 0:69f2e28d12c1 189 }
ubhat 0:69f2e28d12c1 190 case DEVICE_STATE_SEND:
ubhat 0:69f2e28d12c1 191 {
ubhat 0:69f2e28d12c1 192 if( NextTx == true )
ubhat 0:69f2e28d12c1 193 {
ubhat 0:69f2e28d12c1 194 // Prepare payload frame based on application port
ubhat 0:69f2e28d12c1 195 PrepareTxFrame( AppPort );
ubhat 0:69f2e28d12c1 196
ubhat 0:69f2e28d12c1 197 // Send payload over the air
ubhat 0:69f2e28d12c1 198 NextTx = SendFrame( );
ubhat 0:69f2e28d12c1 199
ubhat 0:69f2e28d12c1 200 // Execute transmit event
ubhat 0:69f2e28d12c1 201 TxEvent( );
ubhat 0:69f2e28d12c1 202 }
ubhat 0:69f2e28d12c1 203 if( ComplianceTest.Running == true )
ubhat 0:69f2e28d12c1 204 {
ubhat 0:69f2e28d12c1 205 // Schedule next packet transmission as soon as possible
ubhat 0:69f2e28d12c1 206 TxDutyCycleTime = COMPLIANCE_TX_DUTYCYCLE;
ubhat 0:69f2e28d12c1 207 }
ubhat 0:69f2e28d12c1 208 else
ubhat 0:69f2e28d12c1 209 {
ubhat 0:69f2e28d12c1 210 // Schedule next packet transmission
ubhat 0:69f2e28d12c1 211 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
ubhat 0:69f2e28d12c1 212 }
ubhat 0:69f2e28d12c1 213 DeviceState = DEVICE_STATE_SLEEP;
ubhat 0:69f2e28d12c1 214 break;
ubhat 0:69f2e28d12c1 215 }
ubhat 0:69f2e28d12c1 216 case DEVICE_STATE_CYCLE:
ubhat 0:69f2e28d12c1 217 {
ubhat 0:69f2e28d12c1 218 // Schedule next packet transmission
ubhat 0:69f2e28d12c1 219 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
ubhat 0:69f2e28d12c1 220 TimerStart( &TxNextPacketTimer );
ubhat 0:69f2e28d12c1 221
ubhat 0:69f2e28d12c1 222 DeviceState = DEVICE_STATE_SLEEP;
ubhat 0:69f2e28d12c1 223 break;
ubhat 0:69f2e28d12c1 224 }
ubhat 0:69f2e28d12c1 225 case DEVICE_STATE_SLEEP:
ubhat 0:69f2e28d12c1 226 {
ubhat 0:69f2e28d12c1 227 // Wake up through events
ubhat 0:69f2e28d12c1 228 break;
ubhat 0:69f2e28d12c1 229 }
ubhat 0:69f2e28d12c1 230 default:
ubhat 0:69f2e28d12c1 231 {
ubhat 0:69f2e28d12c1 232 DeviceState = DEVICE_STATE_INIT;
ubhat 0:69f2e28d12c1 233 break;
ubhat 0:69f2e28d12c1 234 }
ubhat 0:69f2e28d12c1 235 }
ubhat 0:69f2e28d12c1 236 }
ubhat 0:69f2e28d12c1 237 }