Long Range / Mbed 2 deprecated SX1272_LoRaWAN_App_LR

Dependencies:   X_NUCLEO_IKS01A2 driver_mbed_TH02 mbed LoRaWAN-lib-v1_0_1 SX1272Lib

Fork of Training-Aug2018-SX1272-X-NUCLEO-IKS01A2 by Uttam Bhat

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LoRaDeviceStateProc.cpp Source File

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 }