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:
Benedict_Tizzano
Date:
Fri Mar 30 19:02:45 2018 +0000
Revision:
19:e136bd75eabd
Parent:
18:18408c3c2d0c
mQ Branch

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: Process function calls from various Device states
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: Uttam Bhat
ubhat 0:69f2e28d12c1 14 */
ubhat 0:69f2e28d12c1 15
ubhat 0:69f2e28d12c1 16 #include "LoRaDeviceStateProc.h"
ubhat 0:69f2e28d12c1 17 #include "LoRaMacLayerService.h"
ubhat 0:69f2e28d12c1 18
ubhat 0:69f2e28d12c1 19 eDevicState DeviceState;
ubhat 0:69f2e28d12c1 20
ubhat 0:69f2e28d12c1 21 sLoRaMacUplinkStatus LoRaMacUplinkStatus;
ubhat 0:69f2e28d12c1 22
ubhat 0:69f2e28d12c1 23 sLoRaMacDownlinkStatus LoRaMacDownlinkStatus;
ubhat 0:69f2e28d12c1 24
mluis 18:18408c3c2d0c 25 sLoRaMacJoinStatus LoRaMacJoinStatus;
mluis 18:18408c3c2d0c 26
ubhat 0:69f2e28d12c1 27 LoRaMacPrimitives_t LoRaPrimitives;
ubhat 0:69f2e28d12c1 28
ubhat 0:69f2e28d12c1 29 LoRaMacCallback_t LoRaCallbacks;
ubhat 0:69f2e28d12c1 30
ubhat 0:69f2e28d12c1 31 MibRequestConfirm_t LoRaMibReq;
ubhat 0:69f2e28d12c1 32
ubhat 0:69f2e28d12c1 33 MlmeReq_t mlmeReq;
ubhat 0:69f2e28d12c1 34
ubhat 0:69f2e28d12c1 35 /*!
ubhat 0:69f2e28d12c1 36 * \brief Function executed on TxNextPacket Timeout event
ubhat 0:69f2e28d12c1 37 */
ubhat 0:69f2e28d12c1 38 static void OnTxNextPacketTimerEvent( void )
ubhat 0:69f2e28d12c1 39 {
ubhat 0:69f2e28d12c1 40 MibRequestConfirm_t mibReq;
ubhat 0:69f2e28d12c1 41 LoRaMacStatus_t status;
ubhat 0:69f2e28d12c1 42
ubhat 0:69f2e28d12c1 43 TimerStop( &TxNextPacketTimer );
ubhat 0:69f2e28d12c1 44
ubhat 0:69f2e28d12c1 45 mibReq.Type = MIB_NETWORK_JOINED;
ubhat 0:69f2e28d12c1 46 status = LoRaMacMibGetRequestConfirm( &mibReq );
ubhat 0:69f2e28d12c1 47
ubhat 0:69f2e28d12c1 48 if( status == LORAMAC_STATUS_OK )
ubhat 0:69f2e28d12c1 49 {
ubhat 0:69f2e28d12c1 50 if( mibReq.Param.IsNetworkJoined == true )
ubhat 0:69f2e28d12c1 51 {
mluis 18:18408c3c2d0c 52 DeviceState = DEVICE_STATE_SEND;
mluis 18:18408c3c2d0c 53 NextTx = true;
ubhat 0:69f2e28d12c1 54 }
ubhat 0:69f2e28d12c1 55 else
ubhat 0:69f2e28d12c1 56 {
ubhat 0:69f2e28d12c1 57 DeviceState = DEVICE_STATE_JOIN;
ubhat 0:69f2e28d12c1 58 }
ubhat 0:69f2e28d12c1 59 }
ubhat 0:69f2e28d12c1 60 }
ubhat 0:69f2e28d12c1 61
ubhat 0:69f2e28d12c1 62 void DeviceInit( void )
ubhat 0:69f2e28d12c1 63 {
ubhat 0:69f2e28d12c1 64 LoRaPrimitives.MacMcpsConfirm = McpsConfirm;
ubhat 0:69f2e28d12c1 65 LoRaPrimitives.MacMcpsIndication = McpsIndication;
ubhat 0:69f2e28d12c1 66 LoRaPrimitives.MacMlmeConfirm = MlmeConfirm;
ubhat 0:69f2e28d12c1 67 LoRaCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
ubhat 0:69f2e28d12c1 68 LoRaMacInitialization( &LoRaPrimitives, &LoRaCallbacks );
ubhat 0:69f2e28d12c1 69
ubhat 0:69f2e28d12c1 70 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
ubhat 0:69f2e28d12c1 71
ubhat 0:69f2e28d12c1 72 LoRaMibReq.Type = MIB_ADR;
ubhat 0:69f2e28d12c1 73 LoRaMibReq.Param.AdrEnable = LORAWAN_ADR_ON;
ubhat 0:69f2e28d12c1 74 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 75
ubhat 0:69f2e28d12c1 76 LoRaMibReq.Type = MIB_PUBLIC_NETWORK;
ubhat 0:69f2e28d12c1 77 LoRaMibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
ubhat 0:69f2e28d12c1 78 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 79
mluis 18:18408c3c2d0c 80 LoRaMibReq.Type = MIB_CHANNELS_DEFAULT_TX_POWER;
mluis 18:18408c3c2d0c 81 LoRaMibReq.Param.ChannelsDefaultTxPower = LORAWAN_TX_POWER;
mluis 18:18408c3c2d0c 82 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
mluis 18:18408c3c2d0c 83
ubhat 0:69f2e28d12c1 84 LoRaMibReq.Type = MIB_CHANNELS_TX_POWER;
ubhat 0:69f2e28d12c1 85 LoRaMibReq.Param.ChannelsTxPower = LORAWAN_TX_POWER;
ubhat 0:69f2e28d12c1 86 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 87
ubhat 0:69f2e28d12c1 88 LoRaMacDownlinkStatus.DownlinkCounter = 0;
mluis 18:18408c3c2d0c 89
mluis 18:18408c3c2d0c 90 LoRaMacJoinStatus.LastDatarate = -1;
ubhat 0:69f2e28d12c1 91 }
ubhat 0:69f2e28d12c1 92
ubhat 0:69f2e28d12c1 93 void DeviceJoinUpdate( void )
ubhat 0:69f2e28d12c1 94 {
ubhat 0:69f2e28d12c1 95 LoRaMibReq.Type = MIB_NETWORK_JOINED;
mluis 18:18408c3c2d0c 96 LoRaMacMibGetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 97 }
ubhat 0:69f2e28d12c1 98
ubhat 0:69f2e28d12c1 99 void DeviceJoin( void )
ubhat 0:69f2e28d12c1 100 {
mluis 18:18408c3c2d0c 101 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 18:18408c3c2d0c 102 Otaa = true;
ubhat 0:69f2e28d12c1 103
ubhat 0:69f2e28d12c1 104 mlmeReq.Type = MLME_JOIN;
ubhat 0:69f2e28d12c1 105 mlmeReq.Req.Join.DevEui = DevEui;
ubhat 0:69f2e28d12c1 106 mlmeReq.Req.Join.AppEui = AppEui;
ubhat 0:69f2e28d12c1 107 mlmeReq.Req.Join.AppKey = AppKey;
mluis 18:18408c3c2d0c 108 mlmeReq.Req.Join.NbTrials = 3;
ubhat 0:69f2e28d12c1 109
ubhat 0:69f2e28d12c1 110 if( NextTx == true )
ubhat 0:69f2e28d12c1 111 {
ubhat 0:69f2e28d12c1 112 LoRaMacMlmeRequest( &mlmeReq );
ubhat 0:69f2e28d12c1 113 }
mluis 18:18408c3c2d0c 114 #else
mluis 18:18408c3c2d0c 115 Otaa = false;
ubhat 0:69f2e28d12c1 116
ubhat 0:69f2e28d12c1 117 // Choose a random device address if not already defined in Config.h
ubhat 0:69f2e28d12c1 118 if( DevAddr == 0 )
ubhat 0:69f2e28d12c1 119 {
ubhat 0:69f2e28d12c1 120 // Random seed initialization
ubhat 0:69f2e28d12c1 121 srand1( BoardGetRandomSeed( ) );
mluis 18:18408c3c2d0c 122
mluis 18:18408c3c2d0c 123 // Choose a random device address
ubhat 0:69f2e28d12c1 124 DevAddr = randr( 0, 0x01FFFFFF );
ubhat 0:69f2e28d12c1 125 }
ubhat 0:69f2e28d12c1 126
ubhat 0:69f2e28d12c1 127 LoRaMibReq.Type = MIB_NET_ID;
ubhat 0:69f2e28d12c1 128 LoRaMibReq.Param.NetID = LORAWAN_NETWORK_ID;
ubhat 0:69f2e28d12c1 129 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 130
ubhat 0:69f2e28d12c1 131 LoRaMibReq.Type = MIB_DEV_ADDR;
ubhat 0:69f2e28d12c1 132 LoRaMibReq.Param.DevAddr = DevAddr;
ubhat 0:69f2e28d12c1 133 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 134
ubhat 0:69f2e28d12c1 135 LoRaMibReq.Type = MIB_NWK_SKEY;
ubhat 0:69f2e28d12c1 136 LoRaMibReq.Param.NwkSKey = NwkSKey;
ubhat 0:69f2e28d12c1 137 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 138
ubhat 0:69f2e28d12c1 139 LoRaMibReq.Type = MIB_APP_SKEY;
ubhat 0:69f2e28d12c1 140 LoRaMibReq.Param.AppSKey = AppSKey;
ubhat 0:69f2e28d12c1 141 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 142
ubhat 0:69f2e28d12c1 143 LoRaMibReq.Type = MIB_NETWORK_JOINED;
ubhat 0:69f2e28d12c1 144 LoRaMibReq.Param.IsNetworkJoined = true;
ubhat 0:69f2e28d12c1 145 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:69f2e28d12c1 146 #endif
ubhat 0:69f2e28d12c1 147 }
ubhat 0:69f2e28d12c1 148
ubhat 0:69f2e28d12c1 149 /*!
ubhat 0:69f2e28d12c1 150 * \brief Prepares the payload of the frame
ubhat 0:69f2e28d12c1 151 */
ubhat 0:69f2e28d12c1 152 void PrepareTxFrame( uint8_t port )
ubhat 0:69f2e28d12c1 153 {
ubhat 0:69f2e28d12c1 154 MibRequestConfirm_t mibReq;
ubhat 0:69f2e28d12c1 155
ubhat 0:69f2e28d12c1 156 if( BoardGetBatteryVoltage( ) < LOW_BAT_THRESHOLD )
ubhat 0:69f2e28d12c1 157 {
ubhat 0:69f2e28d12c1 158 mibReq.Type = MIB_CHANNELS_TX_POWER;
ubhat 0:69f2e28d12c1 159 LoRaMacMibGetRequestConfirm( &mibReq );
ubhat 0:69f2e28d12c1 160 // TX_POWER_30_DBM = 0, TX_POWER_28_DBM = 1, ..., TX_POWER_20_DBM = 5, ..., TX_POWER_10_DBM = 10
ubhat 0:69f2e28d12c1 161 // The if condition is then "less than" to check if the power is greater than 20 dBm
ubhat 0:69f2e28d12c1 162 if( mibReq.Param.ChannelsTxPower < TX_POWER_20_DBM )
ubhat 0:69f2e28d12c1 163 {
ubhat 0:69f2e28d12c1 164 mibReq.Param.ChannelsTxPower = TX_POWER_20_DBM;
ubhat 0:69f2e28d12c1 165 LoRaMacMibSetRequestConfirm( &mibReq );
ubhat 0:69f2e28d12c1 166 }
ubhat 0:69f2e28d12c1 167 }
ubhat 0:69f2e28d12c1 168
ubhat 0:69f2e28d12c1 169 if( port == 224 )
ubhat 0:69f2e28d12c1 170 {
mluis 18:18408c3c2d0c 171 RunComplianceTest( );
ubhat 0:69f2e28d12c1 172 }
ubhat 0:69f2e28d12c1 173 else
ubhat 0:69f2e28d12c1 174 {
ubhat 0:69f2e28d12c1 175 PrepareLoRaFrame( port );
ubhat 0:69f2e28d12c1 176 }
ubhat 0:69f2e28d12c1 177 }
ubhat 0:69f2e28d12c1 178
ubhat 0:69f2e28d12c1 179 /*!
ubhat 0:69f2e28d12c1 180 * \brief Prepares the payload of the frame
ubhat 0:69f2e28d12c1 181 *
ubhat 0:69f2e28d12c1 182 * \retval [0: frame could be send, 1: error]
ubhat 0:69f2e28d12c1 183 */
ubhat 0:69f2e28d12c1 184 bool SendFrame( void )
ubhat 0:69f2e28d12c1 185 {
ubhat 0:69f2e28d12c1 186 McpsReq_t mcpsReq;
ubhat 0:69f2e28d12c1 187 LoRaMacTxInfo_t txInfo;
ubhat 0:69f2e28d12c1 188
ubhat 0:69f2e28d12c1 189 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
ubhat 0:69f2e28d12c1 190 {
ubhat 0:69f2e28d12c1 191 // Send empty frame in order to flush MAC commands
ubhat 0:69f2e28d12c1 192 mcpsReq.Type = MCPS_UNCONFIRMED;
ubhat 0:69f2e28d12c1 193 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
ubhat 0:69f2e28d12c1 194 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
ubhat 0:69f2e28d12c1 195 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
ubhat 0:69f2e28d12c1 196
ubhat 0:69f2e28d12c1 197 LoRaMacUplinkStatus.Acked = false;
ubhat 0:69f2e28d12c1 198 LoRaMacUplinkStatus.Port = 0;
ubhat 0:69f2e28d12c1 199 LoRaMacUplinkStatus.Buffer = NULL;
mluis 18:18408c3c2d0c 200 LoRaMacUplinkStatus.BufferSize = 0;
ubhat 0:69f2e28d12c1 201 }
ubhat 0:69f2e28d12c1 202 else
ubhat 0:69f2e28d12c1 203 {
ubhat 0:69f2e28d12c1 204 LoRaMacUplinkStatus.Acked = false;
ubhat 0:69f2e28d12c1 205 LoRaMacUplinkStatus.Port = AppPort;
ubhat 0:69f2e28d12c1 206 LoRaMacUplinkStatus.Buffer = AppData;
ubhat 0:69f2e28d12c1 207 LoRaMacUplinkStatus.BufferSize = AppDataSize;
ubhat 0:69f2e28d12c1 208
ubhat 0:69f2e28d12c1 209 if( ( IsTxConfirmed == false ) || ( LoRaMacUplinkStatus.UplinkCounter == 0 ) )
ubhat 0:69f2e28d12c1 210 {
ubhat 0:69f2e28d12c1 211 mcpsReq.Type = MCPS_UNCONFIRMED;
ubhat 0:69f2e28d12c1 212 mcpsReq.Req.Unconfirmed.fPort = AppPort;
ubhat 0:69f2e28d12c1 213 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
ubhat 0:69f2e28d12c1 214 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
ubhat 0:69f2e28d12c1 215 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
ubhat 0:69f2e28d12c1 216 }
ubhat 0:69f2e28d12c1 217 else
ubhat 0:69f2e28d12c1 218 {
ubhat 0:69f2e28d12c1 219 mcpsReq.Type = MCPS_CONFIRMED;
ubhat 0:69f2e28d12c1 220 mcpsReq.Req.Confirmed.fPort = AppPort;
ubhat 0:69f2e28d12c1 221 mcpsReq.Req.Confirmed.fBuffer = AppData;
ubhat 0:69f2e28d12c1 222 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
ubhat 0:69f2e28d12c1 223 mcpsReq.Req.Confirmed.NbTrials = 8;
ubhat 0:69f2e28d12c1 224 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
ubhat 0:69f2e28d12c1 225 }
ubhat 0:69f2e28d12c1 226 }
ubhat 0:69f2e28d12c1 227
ubhat 0:69f2e28d12c1 228 LoRaMacUplinkStatus.Type = mcpsReq.Type;
ubhat 0:69f2e28d12c1 229
ubhat 0:69f2e28d12c1 230 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
ubhat 0:69f2e28d12c1 231 {
ubhat 0:69f2e28d12c1 232 return false;
ubhat 0:69f2e28d12c1 233 }
ubhat 0:69f2e28d12c1 234 return true;
mluis 18:18408c3c2d0c 235 }