Nagaraj Krishnamurthy / LoRaWAN-NAMote72-Application-Demo_IoTium

Dependencies:   LoRaWAN-lib SX1272Lib lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo_Multitech by Nagaraj Krishnamurthy

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 
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 }