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: X_NUCLEO_IKS01A2 driver_mbed_TH02 mbed LoRaWAN-lib-v1_0_1 SX1272Lib
Fork of Training-Aug2018-SX1272-X-NUCLEO-IKS01A2 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 uint16_t ChannelMaskTemp[6] = {0}; 00034 00035 /*! 00036 * \brief Function executed on TxNextPacket Timeout event 00037 */ 00038 static void OnTxNextPacketTimerEvent( void ) 00039 { 00040 MibRequestConfirm_t mibReq; 00041 LoRaMacStatus_t status; 00042 00043 TimerStop( &TxNextPacketTimer ); 00044 00045 mibReq.Type = MIB_NETWORK_JOINED; 00046 status = LoRaMacMibGetRequestConfirm( &mibReq ); 00047 00048 if( status == LORAMAC_STATUS_OK ) 00049 { 00050 if( mibReq.Param.IsNetworkJoined == true ) 00051 { 00052 DeviceState = DEVICE_STATE_SEND; 00053 } 00054 else 00055 { 00056 DeviceState = DEVICE_STATE_JOIN; 00057 } 00058 NextTx = true; 00059 } 00060 } 00061 00062 void DeviceInit( void ) 00063 { 00064 LoRaPrimitives.MacMcpsConfirm = McpsConfirm; 00065 LoRaPrimitives.MacMcpsIndication = McpsIndication; 00066 LoRaPrimitives.MacMlmeConfirm = MlmeConfirm; 00067 LoRaCallbacks.GetBatteryLevel = BoardGetBatteryLevel; 00068 LoRaMacInitialization( &LoRaPrimitives, &LoRaCallbacks ); 00069 00070 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent ); 00071 00072 LoRaMibReq.Type = MIB_ADR; 00073 LoRaMibReq.Param.AdrEnable = LORAWAN_ADR_ON; 00074 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00075 00076 LoRaMibReq.Type = MIB_PUBLIC_NETWORK; 00077 LoRaMibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK; 00078 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00079 00080 LoRaMibReq.Type = MIB_CHANNELS_TX_POWER; 00081 LoRaMibReq.Param.ChannelsTxPower = LORAWAN_TX_POWER; 00082 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00083 00084 LoRaMibReq.Type = MIB_CHANNELS_MASK; 00085 LoRaMibReq.Param.ChannelsMask = ChannelMaskTemp; 00086 00087 #ifdef USE_BAND_915_HYBRID_BLOCK_A 00088 00089 ChannelMaskTemp[0] = 0x00FF; 00090 ChannelMaskTemp[1] = 0x0000; 00091 ChannelMaskTemp[2] = 0x0000; 00092 ChannelMaskTemp[3] = 0x0000; 00093 ChannelMaskTemp[4] = 0x0001; 00094 00095 #elif defined USE_BAND_915_HYBRID_BLOCK_B 00096 00097 ChannelMaskTemp[0] = 0xFF00; 00098 ChannelMaskTemp[1] = 0x0000; 00099 ChannelMaskTemp[2] = 0x0000; 00100 ChannelMaskTemp[3] = 0x0000; 00101 ChannelMaskTemp[4] = 0x0002; 00102 00103 #elif defined USE_BAND_915_HYBRID_BLOCK_C 00104 00105 ChannelMaskTemp[0] = 0x0000; 00106 ChannelMaskTemp[1] = 0x00FF; 00107 ChannelMaskTemp[2] = 0x0000; 00108 ChannelMaskTemp[3] = 0x0000; 00109 ChannelMaskTemp[4] = 0x0004; 00110 00111 #elif defined USE_BAND_915_HYBRID_BLOCK_D 00112 00113 ChannelMaskTemp[0] = 0x0000; 00114 ChannelMaskTemp[1] = 0xFF00; 00115 ChannelMaskTemp[2] = 0x0000; 00116 ChannelMaskTemp[3] = 0x0000; 00117 ChannelMaskTemp[4] = 0x0008; 00118 00119 #elif defined USE_BAND_915_HYBRID_BLOCK_E 00120 00121 ChannelMaskTemp[0] = 0x0000; 00122 ChannelMaskTemp[1] = 0x0000; 00123 ChannelMaskTemp[2] = 0x00FF; 00124 ChannelMaskTemp[3] = 0x0000; 00125 ChannelMaskTemp[4] = 0x0010; 00126 00127 #elif defined USE_BAND_915_HYBRID_BLOCK_F 00128 00129 ChannelMaskTemp[0] = 0x0000; 00130 ChannelMaskTemp[1] = 0x0000; 00131 ChannelMaskTemp[2] = 0xFF00; 00132 ChannelMaskTemp[3] = 0x0000; 00133 ChannelMaskTemp[4] = 0x0020; 00134 00135 #elif defined USE_BAND_915_HYBRID_BLOCK_G 00136 00137 ChannelMaskTemp[0] = 0x0000; 00138 ChannelMaskTemp[1] = 0x0000; 00139 ChannelMaskTemp[2] = 0x0000; 00140 ChannelMaskTemp[3] = 0x00FF; 00141 ChannelMaskTemp[4] = 0x0040; 00142 00143 #elif defined USE_BAND_915_HYBRID_BLOCK_H 00144 00145 ChannelMaskTemp[0] = 0x0000; 00146 ChannelMaskTemp[1] = 0x0000; 00147 ChannelMaskTemp[2] = 0x0000; 00148 ChannelMaskTemp[3] = 0xFF00; 00149 ChannelMaskTemp[4] = 0x0080; 00150 00151 #elif defined USE_BAND_915 00152 00153 ChannelMaskTemp[0] = 0xFFFF; 00154 ChannelMaskTemp[1] = 0xFFFF; 00155 ChannelMaskTemp[2] = 0xFFFF; 00156 ChannelMaskTemp[3] = 0xFFFF; 00157 ChannelMaskTemp[4] = 0x00FF; 00158 ChannelMaskTemp[5] = 0x0000; 00159 00160 #endif 00161 00162 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00163 00164 LoRaMacDownlinkStatus.DownlinkCounter = 0; 00165 } 00166 00167 void DeviceJoinUpdate( void ) 00168 { 00169 LoRaMibReq.Type = MIB_NETWORK_JOINED; 00170 LoRaMacMibGetRequestConfirm( &LoRaMibReq ); 00171 } 00172 00173 void DeviceJoin( void ) 00174 { 00175 #if( OVER_THE_AIR_ACTIVATION != 0 ) 00176 00177 mlmeReq.Type = MLME_JOIN; 00178 00179 mlmeReq.Req.Join.DevEui = DevEui; 00180 mlmeReq.Req.Join.AppEui = AppEui; 00181 mlmeReq.Req.Join.AppKey = AppKey; 00182 00183 if( NextTx == true ) 00184 { 00185 LoRaMacMlmeRequest( &mlmeReq ); 00186 } 00187 00188 #else 00189 // Choose a random device address if not already defined in Config.h 00190 if( DevAddr == 0 ) 00191 { 00192 // Random seed initialization 00193 srand1( BoardGetRandomSeed( ) ); 00194 DevAddr = randr( 0, 0x01FFFFFF ); 00195 } 00196 00197 LoRaMibReq.Type = MIB_NET_ID; 00198 LoRaMibReq.Param.NetID = LORAWAN_NETWORK_ID; 00199 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00200 00201 LoRaMibReq.Type = MIB_DEV_ADDR; 00202 LoRaMibReq.Param.DevAddr = DevAddr; 00203 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00204 00205 LoRaMibReq.Type = MIB_NWK_SKEY; 00206 LoRaMibReq.Param.NwkSKey = NwkSKey; 00207 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00208 00209 LoRaMibReq.Type = MIB_APP_SKEY; 00210 LoRaMibReq.Param.AppSKey = AppSKey; 00211 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00212 00213 LoRaMibReq.Type = MIB_NETWORK_JOINED; 00214 LoRaMibReq.Param.IsNetworkJoined = true; 00215 LoRaMacMibSetRequestConfirm( &LoRaMibReq ); 00216 00217 #endif 00218 } 00219 00220 /*! 00221 * \brief Prepares the payload of the frame 00222 */ 00223 void PrepareTxFrame( uint8_t port ) 00224 { 00225 MibRequestConfirm_t mibReq; 00226 00227 if( BoardGetBatteryLevel( ) < LOW_BAT_THRESHOLD ) 00228 { 00229 mibReq.Type = MIB_CHANNELS_TX_POWER; 00230 LoRaMacMibGetRequestConfirm( &mibReq ); 00231 // TX_POWER_30_DBM = 0, TX_POWER_28_DBM = 1, ..., TX_POWER_20_DBM = 5, ..., TX_POWER_10_DBM = 10 00232 // The if condition is then "less than" to check if the power is greater than 20 dBm 00233 if( mibReq.Param.ChannelsTxPower < TX_POWER_20_DBM ) 00234 { 00235 mibReq.Param.ChannelsTxPower = TX_POWER_20_DBM; 00236 LoRaMacMibSetRequestConfirm( &mibReq ); 00237 } 00238 } 00239 00240 if( port == 224 ) 00241 { 00242 RunComplianceTest( ); 00243 } 00244 else 00245 { 00246 PrepareLoRaFrame( port ); 00247 } 00248 } 00249 00250 /*! 00251 * \brief Prepares the payload of the frame 00252 * 00253 * \retval [0: frame could be send, 1: error] 00254 */ 00255 bool SendFrame( void ) 00256 { 00257 McpsReq_t mcpsReq; 00258 LoRaMacTxInfo_t txInfo; 00259 00260 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK ) 00261 { 00262 // Send empty frame in order to flush MAC commands 00263 mcpsReq.Type = MCPS_UNCONFIRMED; 00264 mcpsReq.Req.Unconfirmed.fBuffer = NULL; 00265 mcpsReq.Req.Unconfirmed.fBufferSize = 0; 00266 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE; 00267 00268 LoRaMacUplinkStatus.Acked = false; 00269 LoRaMacUplinkStatus.Port = 0; 00270 LoRaMacUplinkStatus.Buffer = NULL; 00271 LoRaMacUplinkStatus.BufferSize = 0; 00272 } 00273 else 00274 { 00275 LoRaMacUplinkStatus.Acked = false; 00276 LoRaMacUplinkStatus.Port = AppPort; 00277 LoRaMacUplinkStatus.Buffer = AppData; 00278 LoRaMacUplinkStatus.BufferSize = AppDataSize; 00279 00280 if( ( IsTxConfirmed == false ) || ( LoRaMacUplinkStatus.UplinkCounter == 0 ) ) 00281 { 00282 mcpsReq.Type = MCPS_UNCONFIRMED; 00283 mcpsReq.Req.Unconfirmed.fPort = AppPort; 00284 mcpsReq.Req.Unconfirmed.fBuffer = AppData; 00285 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize; 00286 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE; 00287 } 00288 else 00289 { 00290 mcpsReq.Type = MCPS_CONFIRMED; 00291 mcpsReq.Req.Confirmed.fPort = AppPort; 00292 mcpsReq.Req.Confirmed.fBuffer = AppData; 00293 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize; 00294 mcpsReq.Req.Confirmed.NbTrials = 8; 00295 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE; 00296 } 00297 } 00298 00299 LoRaMacUplinkStatus.Type = mcpsReq.Type; 00300 00301 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK ) 00302 { 00303 return false; 00304 } 00305 return true; 00306 }
Generated on Tue Jul 12 2022 20:36:27 by
1.7.2
