Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: LoRaWAN-lib SX1272Lib lib_gps lib_mma8451q lib_mpl3115a2 mbed
Fork of LoRaWAN-NAMote72-Application-Demo_Multitech by
LoRaDeviceStateProc.cpp
00001 /* 00002 / _____) _ | | 00003 ( (____ _____ ____ _| |_ _____ ____| |__ 00004 \____ \| ___ | (_ _) ___ |/ ___) _ \ 00005 _____) ) ____| | | || |_| ____( (___| | | | 00006 (______/|_____)_|_|_| \__)_____)\____)_| |_| 00007 (C)2015 Semtech 00008 00009 Description: Process function calls from various Device states 00010 00011 License: Revised BSD License, see LICENSE.TXT file include in the project 00012 00013 Maintainer: Uttam Bhat 00014 */ 00015 00016 #include "LoRaDeviceStateProc.h" 00017 #include "LoRaMacLayerService.h" 00018 00019 eDevicState DeviceState; 00020 00021 sLoRaMacUplinkStatus LoRaMacUplinkStatus; 00022 00023 sLoRaMacDownlinkStatus LoRaMacDownlinkStatus; 00024 00025 LoRaMacPrimitives_t LoRaPrimitives; 00026 00027 LoRaMacCallback_t LoRaCallbacks; 00028 00029 MibRequestConfirm_t LoRaMibReq; 00030 00031 MlmeReq_t mlmeReq; 00032 00033 00034 /*! 00035 * \brief Function executed on TxNextPacket Timeout event 00036 */ 00037 static void OnTxNextPacketTimerEvent( void ) 00038 { 00039 MibRequestConfirm_t mibReq; 00040 LoRaMacStatus_t status; 00041 00042 TimerStop( &TxNextPacketTimer ); 00043 00044 mibReq.Type = MIB_NETWORK_JOINED; 00045 status = LoRaMacMibGetRequestConfirm( &mibReq ); 00046 00047 if( status == LORAMAC_STATUS_OK ) 00048 { 00049 if( mibReq.Param.IsNetworkJoined == true ) 00050 { 00051 DeviceState = DEVICE_STATE_SEND; 00052 } 00053 else 00054 { 00055 DeviceState = DEVICE_STATE_JOIN; 00056 } 00057 NextTx = true; 00058 } 00059 } 00060 00061 void DeviceInit( void ) 00062 { 00063 LoRaPrimitives.MacMcpsConfirm = McpsConfirm; 00064 LoRaPrimitives.MacMcpsIndication = McpsIndication; 00065 LoRaPrimitives.MacMlmeConfirm = MlmeConfirm; 00066 LoRaCallbacks.GetBatteryLevel = BoardGetBatteryLevel; 00067 LoRaMacInitialization( &LoRaPrimitives, &LoRaCallbacks ); 00068 00069 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent ); 00070 00071 LoRaMibReq.Type = MIB_ADR; 00072 LoRaMibReq.Param.AdrEnable = LORAWAN_ADR_ON; 00073 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00074 00075 LoRaMibReq.Type = MIB_PUBLIC_NETWORK; 00076 LoRaMibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK; 00077 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00078 00079 LoRaMibReq.Type = MIB_CHANNELS_TX_POWER; 00080 LoRaMibReq.Param.ChannelsTxPower = LORAWAN_TX_POWER; 00081 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00082 00083 LoRaMacDownlinkStatus.DownlinkCounter = 0; 00084 } 00085 00086 void DeviceJoinUpdate( void ) 00087 { 00088 LoRaMibReq.Type = MIB_NETWORK_JOINED; 00089 LoRaMacMibGetRequestConfirm( &LoRaMibReq ); 00090 } 00091 00092 void DeviceJoin( void ) 00093 { 00094 #if( OVER_THE_AIR_ACTIVATION != 0 ) 00095 00096 mlmeReq.Type = MLME_JOIN; 00097 00098 mlmeReq.Req.Join.DevEui = DevEui; 00099 mlmeReq.Req.Join.AppEui = AppEui; 00100 mlmeReq.Req.Join.AppKey = AppKey; 00101 00102 if( NextTx == true ) 00103 { 00104 LoRaMacMlmeRequest( &mlmeReq ); 00105 } 00106 00107 #else 00108 // Choose a random device address if not already defined in Config.h 00109 if( DevAddr == 0 ) 00110 { 00111 // Random seed initialization 00112 srand1( BoardGetRandomSeed( ) ); 00113 DevAddr = randr( 0, 0x01FFFFFF ); 00114 } 00115 00116 LoRaMibReq.Type = MIB_NET_ID; 00117 LoRaMibReq.Param.NetID = LORAWAN_NETWORK_ID; 00118 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00119 00120 LoRaMibReq.Type = MIB_DEV_ADDR; 00121 LoRaMibReq.Param.DevAddr = DevAddr; 00122 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00123 00124 LoRaMibReq.Type = MIB_NWK_SKEY; 00125 LoRaMibReq.Param.NwkSKey = NwkSKey; 00126 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00127 00128 LoRaMibReq.Type = MIB_APP_SKEY; 00129 LoRaMibReq.Param.AppSKey = AppSKey; 00130 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00131 00132 LoRaMibReq.Type = MIB_NETWORK_JOINED; 00133 LoRaMibReq.Param.IsNetworkJoined = true; 00134 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00135 00136 #endif 00137 } 00138 00139 /*! 00140 * \brief Prepares the payload of the frame 00141 */ 00142 void PrepareTxFrame( uint8_t port ) 00143 { 00144 MibRequestConfirm_t mibReq; 00145 00146 if( BoardGetBatteryVoltage( ) < LOW_BAT_THRESHOLD ) 00147 { 00148 mibReq.Type = MIB_CHANNELS_TX_POWER; 00149 LoRaMacMibGetRequestConfirm( &mibReq ); 00150 // TX_POWER_30_DBM = 0, TX_POWER_28_DBM = 1, ..., TX_POWER_20_DBM = 5, ..., TX_POWER_10_DBM = 10 00151 // The if condition is then "less than" to check if the power is greater than 20 dBm 00152 if( mibReq.Param.ChannelsTxPower < TX_POWER_20_DBM ) 00153 { 00154 mibReq.Param.ChannelsTxPower = TX_POWER_20_DBM; 00155 LoRaMacMibSetRequestConfirm( &mibReq ); 00156 } 00157 } 00158 00159 if( port == 224 ) 00160 { 00161 RunComplianceTest( ); 00162 } 00163 else 00164 { 00165 PrepareLoRaFrame( port ); 00166 } 00167 } 00168 00169 /*! 00170 * \brief Prepares the payload of the frame 00171 * 00172 * \retval [0: frame could be send, 1: error] 00173 */ 00174 bool SendFrame( void ) 00175 { 00176 McpsReq_t mcpsReq; 00177 LoRaMacTxInfo_t txInfo; 00178 00179 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK ) 00180 { 00181 // Send empty frame in order to flush MAC commands 00182 mcpsReq.Type = MCPS_UNCONFIRMED; 00183 mcpsReq.Req.Unconfirmed.fBuffer = NULL; 00184 mcpsReq.Req.Unconfirmed.fBufferSize = 0; 00185 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE; 00186 00187 LoRaMacUplinkStatus.Acked = false; 00188 LoRaMacUplinkStatus.Port = 0; 00189 LoRaMacUplinkStatus.Buffer = NULL; 00190 LoRaMacUplinkStatus.BufferSize = 0; 00191 } 00192 else 00193 { 00194 LoRaMacUplinkStatus.Acked = false; 00195 LoRaMacUplinkStatus.Port = AppPort; 00196 LoRaMacUplinkStatus.Buffer = AppData; 00197 LoRaMacUplinkStatus.BufferSize = AppDataSize; 00198 00199 if( ( IsTxConfirmed == false ) || ( LoRaMacUplinkStatus.UplinkCounter == 0 ) ) 00200 { 00201 mcpsReq.Type = MCPS_UNCONFIRMED; 00202 mcpsReq.Req.Unconfirmed.fPort = AppPort; 00203 mcpsReq.Req.Unconfirmed.fBuffer = AppData; 00204 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize; 00205 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE; 00206 } 00207 else 00208 { 00209 mcpsReq.Type = MCPS_CONFIRMED; 00210 mcpsReq.Req.Confirmed.fPort = AppPort; 00211 mcpsReq.Req.Confirmed.fBuffer = AppData; 00212 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize; 00213 mcpsReq.Req.Confirmed.NbTrials = 8; 00214 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE; 00215 } 00216 } 00217 00218 LoRaMacUplinkStatus.Type = mcpsReq.Type; 00219 00220 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK ) 00221 { 00222 return false; 00223 } 00224 return true; 00225 }
Generated on Thu Jul 28 2022 06:45:12 by
1.7.2
