| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- /*!
- * \file RegionCommon.h
- *
- * \brief Region independent implementations which are common to all regions.
- *
- * \copyright Revised BSD License, see section \ref LICENSE.
- *
- * \code
- * ______ _
- * / _____) _ | |
- * ( (____ _____ ____ _| |_ _____ ____| |__
- * \____ \| ___ | (_ _) ___ |/ ___) _ \
- * _____) ) ____| | | || |_| ____( (___| | | |
- * (______/|_____)_|_|_| \__)_____)\____)_| |_|
- * (C)2013-2017 Semtech
- *
- * ___ _____ _ ___ _ _____ ___ ___ ___ ___
- * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
- * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
- * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
- * embedded.connectivity.solutions===============
- *
- * \endcode
- *
- * \author Miguel Luis ( Semtech )
- *
- * \author Gregory Cristian ( Semtech )
- *
- * \author Daniel Jaeckle ( STACKFORCE )
- *
- * \author Johannes Bruder ( STACKFORCE )
- *
- * \defgroup REGIONCOMMON Common region implementation
- * Region independent implementations which are common to all regions.
- * \{
- */
- #ifndef __REGIONCOMMON_H__
- #define __REGIONCOMMON_H__
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- #include "LoRaMacTypes.h"
- #include "Region.h"
- typedef struct sRegionCommonLinkAdrParams
- {
- /*!
- * Number of repetitions.
- */
- uint8_t NbRep;
- /*!
- * Datarate.
- */
- int8_t Datarate;
- /*!
- * Tx power.
- */
- int8_t TxPower;
- /*!
- * Channels mask control field.
- */
- uint8_t ChMaskCtrl;
- /*!
- * Channels mask field.
- */
- uint16_t ChMask;
- }RegionCommonLinkAdrParams_t;
- typedef struct sRegionCommonLinkAdrReqVerifyParams
- {
- /*!
- * LoRaWAN specification Version
- */
- Version_t Version;
- /*!
- * The current status of the AdrLinkRequest.
- */
- uint8_t Status;
- /*!
- * Set to true, if ADR is enabled.
- */
- bool AdrEnabled;
- /*!
- * The datarate the AdrLinkRequest wants to set.
- */
- int8_t Datarate;
- /*!
- * The TX power the AdrLinkRequest wants to set.
- */
- int8_t TxPower;
- /*!
- * The number of repetitions the AdrLinkRequest wants to set.
- */
- uint8_t NbRep;
- /*!
- * The current datarate the node is using.
- */
- int8_t CurrentDatarate;
- /*!
- * The current TX power the node is using.
- */
- int8_t CurrentTxPower;
- /*!
- * The current number of repetitions the node is using.
- */
- int8_t CurrentNbRep;
- /*!
- * The number of channels.
- */
- uint8_t NbChannels;
- /*!
- * Pointer to the first element of the channels mask.
- */
- uint16_t* ChannelsMask;
- /*!
- * The minimum possible datarate.
- */
- int8_t MinDatarate;
- /*!
- * The maximum possible datarate.
- */
- int8_t MaxDatarate;
- /*!
- * Pointer to the channels.
- */
- ChannelParams_t* Channels;
- /*!
- * The minimum possible TX power.
- */
- int8_t MinTxPower;
- /*!
- * The maximum possible TX power.
- */
- int8_t MaxTxPower;
- }RegionCommonLinkAdrReqVerifyParams_t;
- typedef struct sRegionCommonCalcBackOffParams
- {
- /*!
- * A pointer to region specific channels.
- */
- ChannelParams_t* Channels;
- /*!
- * A pointer to region specific bands.
- */
- Band_t* Bands;
- /*!
- * Set to true, if the last uplink was a join request.
- */
- bool LastTxIsJoinRequest;
- /*!
- * Set to true, if the node is joined.
- */
- bool Joined;
- /*!
- * Set to true, if the duty cycle is enabled.
- */
- bool DutyCycleEnabled;
- /*!
- * The current channel.
- */
- uint8_t Channel;
- /*!
- * The elapsed time since initialization.
- */
- SysTime_t ElapsedTime;
- /*!
- * The time on air of the last Tx frame.
- */
- TimerTime_t TxTimeOnAir;
- }RegionCommonCalcBackOffParams_t;
- typedef struct sRegionCommonRxBeaconSetupParams
- {
- /*!
- * A pointer to the available datarates.
- */
- const uint8_t* Datarates;
- /*!
- * Frequency
- */
- uint32_t Frequency;
- /*!
- * The size of the beacon frame.
- */
- uint8_t BeaconSize;
- /*!
- * The datarate of the beacon.
- */
- uint8_t BeaconDatarate;
- /*!
- * The channel bandwidth of the beacon.
- */
- uint8_t BeaconChannelBW;
- /*!
- * The RX time.
- */
- uint32_t RxTime;
- /*!
- * The symbol timeout of the RX procedure.
- */
- uint16_t SymbolTimeout;
- }RegionCommonRxBeaconSetupParams_t;
- /*!
- * \brief Calculates the join duty cycle.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] elapsedTime Elapsed time since the start of the device.
- *
- * \retval Duty cycle restriction.
- */
- uint16_t RegionCommonGetJoinDc( SysTime_t elapsedTime );
- /*!
- * \brief Verifies, if a value is in a given range.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] value Value to verify, if it is in range.
- *
- * \param [IN] min Minimum possible value.
- *
- * \param [IN] max Maximum possible value.
- *
- * \retval Returns 1 if the value is in range, otherwise 0.
- */
- uint8_t RegionCommonValueInRange( int8_t value, int8_t min, int8_t max );
- /*!
- * \brief Verifies, if a datarate is available on an active channel.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] nbChannels Number of channels.
- *
- * \param [IN] channelsMask The channels mask of the region.
- *
- * \param [IN] dr The datarate to verify.
- *
- * \param [IN] minDr Minimum datarate.
- *
- * \param [IN] maxDr Maximum datarate.
- *
- * \param [IN] channels The channels of the region.
- *
- * \retval Returns true if the datarate is supported, false if not.
- */
- bool RegionCommonChanVerifyDr( uint8_t nbChannels, uint16_t* channelsMask, int8_t dr,
- int8_t minDr, int8_t maxDr, ChannelParams_t* channels );
- /*!
- * \brief Disables a channel in a given channels mask.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] channelsMask The channels mask of the region.
- *
- * \param [IN] id The id of the channels mask to disable.
- *
- * \param [IN] maxChannels Maximum number of channels.
- *
- * \retval Returns true if the channel could be disabled, false if not.
- */
- bool RegionCommonChanDisable( uint16_t* channelsMask, uint8_t id, uint8_t maxChannels );
- /*!
- * \brief Counts the number of active channels in a given channels mask.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] channelsMask The channels mask of the region.
- *
- * \param [IN] startIdx Start index.
- *
- * \param [IN] stopIdx Stop index ( the channels of this index will not be counted ).
- *
- * \retval Returns the number of active channels.
- */
- uint8_t RegionCommonCountChannels( uint16_t* channelsMask, uint8_t startIdx, uint8_t stopIdx );
- /*!
- * \brief Copy a channels mask.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] channelsMaskDest The destination channels mask.
- *
- * \param [IN] channelsMaskSrc The source channels mask.
- *
- * \param [IN] len The index length to copy.
- */
- void RegionCommonChanMaskCopy( uint16_t* channelsMaskDest, uint16_t* channelsMaskSrc, uint8_t len );
- /*!
- * \brief Sets the last tx done property.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] joined Set to true, if the node has joined the network
- *
- * \param [IN] band The band to be updated.
- *
- * \param [IN] lastTxDone The time of the last TX done.
- */
- void RegionCommonSetBandTxDone( bool joined, Band_t* band, TimerTime_t lastTxDone );
- /*!
- * \brief Updates the time-offs of the bands.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] joined Set to true, if the node has joined the network
- *
- * \param [IN] dutyCycle Set to true, if the duty cycle is enabled.
- *
- * \param [IN] bands A pointer to the bands.
- *
- * \param [IN] nbBands The number of bands available.
- *
- * \retval Returns the time which must be waited to perform the next uplink.
- */
- TimerTime_t RegionCommonUpdateBandTimeOff( bool joined, bool dutyCycle, Band_t* bands, uint8_t nbBands );
- /*!
- * \brief Parses the parameter of an LinkAdrRequest.
- * This is a generic function and valid for all regions.
- *
- * \param [IN] payload Pointer to the payload containing the MAC commands. The payload
- * must contain the CMD identifier, following by the parameters.
- *
- * \param [OUT] parseLinkAdr The function fills the structure with the ADR parameters.
- *
- * \retval Returns the length of the ADR request, if a request was found. Otherwise, the
- * function returns 0.
- */
- uint8_t RegionCommonParseLinkAdrReq( uint8_t* payload, RegionCommonLinkAdrParams_t* parseLinkAdr );
- /*!
- * \brief Verifies and updates the datarate, the TX power and the number of repetitions
- * of a LinkAdrRequest. This depends on the configuration of ADR also.
- *
- * \param [IN] verifyParams Pointer to a structure containing input parameters.
- *
- * \param [OUT] dr The updated datarate.
- *
- * \param [OUT] txPow The updated TX power.
- *
- * \param [OUT] nbRep The updated number of repetitions.
- *
- * \retval Returns the status according to the LinkAdrRequest definition.
- */
- uint8_t RegionCommonLinkAdrReqVerifyParams( RegionCommonLinkAdrReqVerifyParams_t* verifyParams, int8_t* dr, int8_t* txPow, uint8_t* nbRep );
- /*!
- * \brief Computes the symbol time for LoRa modulation.
- *
- * \param [IN] phyDr Physical datarate to use.
- *
- * \param [IN] bandwidth Bandwidth to use.
- *
- * \retval Returns the symbol time.
- */
- double RegionCommonComputeSymbolTimeLoRa( uint8_t phyDr, uint32_t bandwidth );
- /*!
- * \brief Computes the symbol time for FSK modulation.
- *
- * \param [IN] phyDr Physical datarate to use.
- *
- * \param [IN] bandwidth Bandwidth to use.
- *
- * \retval Returns the symbol time.
- */
- double RegionCommonComputeSymbolTimeFsk( uint8_t phyDr );
- /*!
- * \brief Computes the RX window timeout and the RX window offset.
- *
- * \param [IN] tSymbol Symbol timeout.
- *
- * \param [IN] minRxSymbols Minimum required number of symbols to detect an Rx frame.
- *
- * \param [IN] rxError System maximum timing error of the receiver. In milliseconds
- * The receiver will turn on in a [-rxError : +rxError] ms interval around RxOffset.
- *
- * \param [IN] wakeUpTime Wakeup time of the system.
- *
- * \param [OUT] windowTimeout RX window timeout.
- *
- * \param [OUT] windowOffset RX window time offset to be applied to the RX delay.
- */
- void RegionCommonComputeRxWindowParameters( double tSymbol, uint8_t minRxSymbols, uint32_t rxError, uint32_t wakeUpTime, uint32_t* windowTimeout, int32_t* windowOffset );
- /*!
- * \brief Computes the txPower, based on the max EIRP and the antenna gain.
- *
- * \remark US915 region uses a conducted power as input value for maxEirp.
- * Thus, the antennaGain parameter must be set to 0.
- *
- * \param [IN] txPower TX power index.
- *
- * \param [IN] maxEirp Maximum EIRP.
- *
- * \param [IN] antennaGain Antenna gain. Referenced to the isotropic antenna.
- * Value is in dBi. ( antennaGain[dBi] = measuredAntennaGain[dBd] + 2.15 )
- *
- * \retval Returns the physical TX power.
- */
- int8_t RegionCommonComputeTxPower( int8_t txPowerIndex, float maxEirp, float antennaGain );
- /*!
- * \brief Calculates the duty cycle for the current band.
- *
- * \param [IN] calcBackOffParams A pointer to the input parameters.
- */
- void RegionCommonCalcBackOff( RegionCommonCalcBackOffParams_t* calcBackOffParams );
- /*!
- * \brief Sets up the radio into RX beacon mode.
- *
- * \param [IN] rxBeaconSetupParams A pointer to the input parameters.
- */
- void RegionCommonRxBeaconSetup( RegionCommonRxBeaconSetupParams_t* rxBeaconSetupParams );
- /*! \} defgroup REGIONCOMMON */
- #ifdef __cplusplus
- }
- #endif
- #endif // __REGIONCOMMON_H__
|