B3M38SPD seminar project - beehive monitor with LoRa reporting
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1492 lines
35 KiB

/*!
* \file Region.h
*
* \brief Region implementation.
*
* \copyright Revised BSD License, see section \ref LICENSE.
*
* \code
* ______ _
* / _____) _ | |
* ( (____ _____ ____ _| |_ _____ ____| |__
* \____ \| ___ | (_ _) ___ |/ ___) _ \
* _____) ) ____| | | || |_| ____( (___| | | |
* (______/|_____)_|_|_| \__)_____)\____)_| |_|
* (C)2013 Semtech
*
* ___ _____ _ ___ _ _____ ___ ___ ___ ___
* / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
* \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
* |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
* embedded.connectivity.solutions===============
*
* \endcode
*
* \author Miguel Luis ( Semtech )
*
* \author Gregory Cristian ( Semtech )
*
* \author Daniel Jaeckle ( STACKFORCE )
*
* \defgroup REGION Region implementation
* This is the common API to access the specific
* regional implementations.
*
* Preprocessor options:
* - LoRaWAN regions can be activated by defining the related preprocessor
* definition. It is possible to define more than one region.
* The following regions are supported:
* - #define REGION_AS923
* - #define REGION_AU915
* - #define REGION_CN470
* - #define REGION_CN779
* - #define REGION_EU433
* - #define REGION_EU868
* - #define REGION_KR920
* - #define REGION_IN865
* - #define REGION_US915
* - #define REGION_US915_HYBRID
*
* \{
*/
#ifndef __REGION_H__
#define __REGION_H__
/*!
* Macro to compute bit of a channel index.
*/
#define LC( channelIndex ) ( uint16_t )( 1 << ( channelIndex - 1 ) )
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF12 - BW125
* AU915 | SF10 - BW125
* CN470 | SF12 - BW125
* CN779 | SF12 - BW125
* EU433 | SF12 - BW125
* EU868 | SF12 - BW125
* IN865 | SF12 - BW125
* KR920 | SF12 - BW125
* US915 | SF10 - BW125
* US915_HYBRID | SF10 - BW125
*/
#define DR_0 0
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF11 - BW125
* AU915 | SF9 - BW125
* CN470 | SF11 - BW125
* CN779 | SF11 - BW125
* EU433 | SF11 - BW125
* EU868 | SF11 - BW125
* IN865 | SF11 - BW125
* KR920 | SF11 - BW125
* US915 | SF9 - BW125
* US915_HYBRID | SF9 - BW125
*/
#define DR_1 1
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF10 - BW125
* AU915 | SF8 - BW125
* CN470 | SF10 - BW125
* CN779 | SF10 - BW125
* EU433 | SF10 - BW125
* EU868 | SF10 - BW125
* IN865 | SF10 - BW125
* KR920 | SF10 - BW125
* US915 | SF8 - BW125
* US915_HYBRID | SF8 - BW125
*/
#define DR_2 2
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF9 - BW125
* AU915 | SF7 - BW125
* CN470 | SF9 - BW125
* CN779 | SF9 - BW125
* EU433 | SF9 - BW125
* EU868 | SF9 - BW125
* IN865 | SF9 - BW125
* KR920 | SF9 - BW125
* US915 | SF7 - BW125
* US915_HYBRID | SF7 - BW125
*/
#define DR_3 3
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF8 - BW125
* AU915 | SF8 - BW500
* CN470 | SF8 - BW125
* CN779 | SF8 - BW125
* EU433 | SF8 - BW125
* EU868 | SF8 - BW125
* IN865 | SF8 - BW125
* KR920 | SF8 - BW125
* US915 | SF8 - BW500
* US915_HYBRID | SF8 - BW500
*/
#define DR_4 4
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF7 - BW125
* AU915 | RFU
* CN470 | SF7 - BW125
* CN779 | SF7 - BW125
* EU433 | SF7 - BW125
* EU868 | SF7 - BW125
* IN865 | SF7 - BW125
* KR920 | SF7 - BW125
* US915 | RFU
* US915_HYBRID | RFU
*/
#define DR_5 5
/*!
* Region | SF
* ------------ | :-----:
* AS923 | SF7 - BW250
* AU915 | RFU
* CN470 | SF12 - BW125
* CN779 | SF7 - BW250
* EU433 | SF7 - BW250
* EU868 | SF7 - BW250
* IN865 | SF7 - BW250
* KR920 | RFU
* US915 | RFU
* US915_HYBRID | RFU
*/
#define DR_6 6
/*!
* Region | SF
* ------------ | :-----:
* AS923 | FSK
* AU915 | RFU
* CN470 | SF12 - BW125
* CN779 | FSK
* EU433 | FSK
* EU868 | FSK
* IN865 | FSK
* KR920 | RFU
* US915 | RFU
* US915_HYBRID | RFU
*/
#define DR_7 7
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | SF12 - BW500
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | SF12 - BW500
* US915_HYBRID | SF12 - BW500
*/
#define DR_8 8
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | SF11 - BW500
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | SF11 - BW500
* US915_HYBRID | SF11 - BW500
*/
#define DR_9 9
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | SF10 - BW500
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | SF10 - BW500
* US915_HYBRID | SF10 - BW500
*/
#define DR_10 10
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | SF9 - BW500
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | SF9 - BW500
* US915_HYBRID | SF9 - BW500
*/
#define DR_11 11
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | SF8 - BW500
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | SF8 - BW500
* US915_HYBRID | SF8 - BW500
*/
#define DR_12 12
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | SF7 - BW500
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | SF7 - BW500
* US915_HYBRID | SF7 - BW500
*/
#define DR_13 13
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | RFU
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | RFU
* US915_HYBRID | RFU
*/
#define DR_14 14
/*!
* Region | SF
* ------------ | :-----:
* AS923 | RFU
* AU915 | RFU
* CN470 | RFU
* CN779 | RFU
* EU433 | RFU
* EU868 | RFU
* IN865 | RFU
* KR920 | RFU
* US915 | RFU
* US915_HYBRID | RFU
*/
#define DR_15 15
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP
* AU915 | Max EIRP
* CN470 | Max EIRP
* CN779 | Max EIRP
* EU433 | Max EIRP
* EU868 | Max EIRP
* IN865 | Max EIRP
* KR920 | Max EIRP
* US915 | Max ERP
* US915_HYBRID | Max ERP
*/
#define TX_POWER_0 0
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 2
* AU915 | Max EIRP - 2
* CN470 | Max EIRP - 2
* CN779 | Max EIRP - 2
* EU433 | Max EIRP - 2
* EU868 | Max EIRP - 2
* IN865 | Max EIRP - 2
* KR920 | Max EIRP - 2
* US915 | Max ERP - 2
* US915_HYBRID | Max ERP - 2
*/
#define TX_POWER_1 1
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 4
* AU915 | Max EIRP - 4
* CN470 | Max EIRP - 4
* CN779 | Max EIRP - 4
* EU433 | Max EIRP - 4
* EU868 | Max EIRP - 4
* IN865 | Max EIRP - 4
* KR920 | Max EIRP - 4
* US915 | Max ERP - 4
* US915_HYBRID | Max ERP - 4
*/
#define TX_POWER_2 2
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 6
* AU915 | Max EIRP - 6
* CN470 | Max EIRP - 6
* CN779 | Max EIRP - 6
* EU433 | Max EIRP - 6
* EU868 | Max EIRP - 6
* IN865 | Max EIRP - 6
* KR920 | Max EIRP - 6
* US915 | Max ERP - 6
* US915_HYBRID | Max ERP - 6
*/
#define TX_POWER_3 3
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 8
* AU915 | Max EIRP - 8
* CN470 | Max EIRP - 8
* CN779 | Max EIRP - 8
* EU433 | Max EIRP - 8
* EU868 | Max EIRP - 8
* IN865 | Max EIRP - 8
* KR920 | Max EIRP - 8
* US915 | Max ERP - 8
* US915_HYBRID | Max ERP - 8
*/
#define TX_POWER_4 4
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 10
* AU915 | Max EIRP - 10
* CN470 | Max EIRP - 10
* CN779 | Max EIRP - 10
* EU433 | Max EIRP - 10
* EU868 | Max EIRP - 10
* IN865 | Max EIRP - 10
* KR920 | Max EIRP - 10
* US915 | Max ERP - 10
* US915_HYBRID | Max ERP - 10
*/
#define TX_POWER_5 5
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 12
* AU915 | Max EIRP - 12
* CN470 | Max EIRP - 12
* CN779 | -
* EU433 | -
* EU868 | Max EIRP - 12
* IN865 | Max EIRP - 12
* KR920 | Max EIRP - 12
* US915 | Max ERP - 12
* US915_HYBRID | Max ERP - 12
*/
#define TX_POWER_6 6
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | Max EIRP - 14
* AU915 | Max EIRP - 14
* CN470 | Max EIRP - 14
* CN779 | -
* EU433 | -
* EU868 | Max EIRP - 14
* IN865 | Max EIRP - 14
* KR920 | Max EIRP - 14
* US915 | Max ERP - 14
* US915_HYBRID | Max ERP - 14
*/
#define TX_POWER_7 7
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | -
* AU915 | Max EIRP - 16
* CN470 | -
* CN779 | -
* EU433 | -
* EU868 | -
* IN865 | Max EIRP - 16
* KR920 | -
* US915 | Max ERP - 16
* US915_HYBRID | Max ERP -16
*/
#define TX_POWER_8 8
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | -
* AU915 | Max EIRP - 18
* CN470 | -
* CN779 | -
* EU433 | -
* EU868 | -
* IN865 | Max EIRP - 18
* KR920 | -
* US915 | Max ERP - 16
* US915_HYBRID | Max ERP - 16
*/
#define TX_POWER_9 9
/*!
* Region | dBM
* ------------ | :-----:
* AS923 | -
* AU915 | Max EIRP - 20
* CN470 | -
* CN779 | -
* EU433 | -
* EU868 | -
* IN865 | Max EIRP - 20
* KR920 | -
* US915 | Max ERP - 10
* US915_HYBRID | Max ERP - 10
*/
#define TX_POWER_10 10
/*!
* RFU
*/
#define TX_POWER_11 11
/*!
* RFU
*/
#define TX_POWER_12 12
/*!
* RFU
*/
#define TX_POWER_13 13
/*!
* RFU
*/
#define TX_POWER_14 14
/*!
* RFU
*/
#define TX_POWER_15 15
/*!
* Enumeration of phy attributes.
*/
typedef enum ePhyAttribute
{
/*!
* Minimum RX datarate.
*/
PHY_MIN_RX_DR,
/*!
* Minimum TX datarate.
*/
PHY_MIN_TX_DR,
/*!
* Maximum RX datarate.
*/
PHY_MAX_RX_DR,
/*!
* Maximum TX datarate.
*/
PHY_MAX_TX_DR,
/*!
* TX datarate.
*/
PHY_TX_DR,
/*!
* Default TX datarate.
*/
PHY_DEF_TX_DR,
/*!
* RX datarate.
*/
PHY_RX_DR,
/*!
* TX power.
*/
PHY_TX_POWER,
/*!
* Default TX power.
*/
PHY_DEF_TX_POWER,
/*!
* Maximum payload possible.
*/
PHY_MAX_PAYLOAD,
/*!
* Maximum payload possible when repeater support is enabled.
*/
PHY_MAX_PAYLOAD_REPEATER,
/*!
* Duty cycle.
*/
PHY_DUTY_CYCLE,
/*!
* Maximum receive window duration.
*/
PHY_MAX_RX_WINDOW,
/*!
* Receive delay for window 1.
*/
PHY_RECEIVE_DELAY1,
/*!
* Receive delay for window 2.
*/
PHY_RECEIVE_DELAY2,
/*!
* Join accept delay for window 1.
*/
PHY_JOIN_ACCEPT_DELAY1,
/*!
* Join accept delay for window 2.
*/
PHY_JOIN_ACCEPT_DELAY2,
/*!
* Maximum frame counter gap.
*/
PHY_MAX_FCNT_GAP,
/*!
* Acknowledgement time out.
*/
PHY_ACK_TIMEOUT,
/*!
* Default datarate offset for window 1.
*/
PHY_DEF_DR1_OFFSET,
/*!
* Default receive window 2 frequency.
*/
PHY_DEF_RX2_FREQUENCY,
/*!
* Default receive window 2 datarate.
*/
PHY_DEF_RX2_DR,
/*!
* Channels mask.
*/
PHY_CHANNELS_MASK,
/*!
* Channels default mask.
*/
PHY_CHANNELS_DEFAULT_MASK,
/*!
* Maximum number of supported channels
*/
PHY_MAX_NB_CHANNELS,
/*!
* Channels.
*/
PHY_CHANNELS,
/*!
* Default value of the uplink dwell time.
*/
PHY_DEF_UPLINK_DWELL_TIME,
/*!
* Default value of the downlink dwell time.
*/
PHY_DEF_DOWNLINK_DWELL_TIME,
/*!
* Default value of the MaxEIRP.
*/
PHY_DEF_MAX_EIRP,
/*!
* Default value of the antenna gain.
*/
PHY_DEF_ANTENNA_GAIN,
/*!
* Value for the number of join trials.
*/
PHY_NB_JOIN_TRIALS,
/*!
* Default value for the number of join trials.
*/
PHY_DEF_NB_JOIN_TRIALS,
/*!
* Next lower datarate.
*/
PHY_NEXT_LOWER_TX_DR
}PhyAttribute_t;
/*!
* Enumeration of initialization types.
*/
typedef enum eInitType
{
/*!
* Performs an initialization and overwrites all existing data.
*/
INIT_TYPE_INIT,
/*!
* Restores default channels only.
*/
INIT_TYPE_RESTORE
}InitType_t;
typedef enum eChannelsMask
{
/*!
* The channels mask.
*/
CHANNELS_MASK,
/*!
* The channels default mask.
*/
CHANNELS_DEFAULT_MASK
}ChannelsMask_t;
/*!
* Union for the structure uGetPhyParams
*/
typedef union uPhyParam
{
/*!
* A parameter value.
*/
uint32_t Value;
/*!
* A floating point value.
*/
float fValue;
/*!
* Pointer to the channels mask.
*/
uint16_t* ChannelsMask;
/*!
* Pointer to the channels.
*/
ChannelParams_t* Channels;
}PhyParam_t;
/*!
* Parameter structure for the function RegionGetPhyParam.
*/
typedef struct sGetPhyParams
{
/*!
* Setup the parameter to get.
*/
PhyAttribute_t Attribute;
/*!
* Datarate.
* The parameter is needed for the following queries:
* PHY_MAX_PAYLOAD, PHY_MAX_PAYLOAD_REPEATER, PHY_NEXT_LOWER_TX_DR.
*/
int8_t Datarate;
/*!
* Uplink dwell time.
* The parameter is needed for the following queries:
* PHY_MIN_TX_DR, PHY_MAX_PAYLOAD, PHY_MAX_PAYLOAD_REPEATER, PHY_NEXT_LOWER_TX_DR.
*/
uint8_t UplinkDwellTime;
/*!
* Downlink dwell time.
* The parameter is needed for the following queries:
* PHY_MIN_RX_DR, PHY_MAX_PAYLOAD, PHY_MAX_PAYLOAD_REPEATER.
*/
uint8_t DownlinkDwellTime;
}GetPhyParams_t;
/*!
* Parameter structure for the function RegionSetBandTxDone.
*/
typedef struct sSetBandTxDoneParams
{
/*!
* Channel to update.
*/
uint8_t Channel;
/*!
* Joined Set to true, if the node has joined the network
*/
bool Joined;
/*!
* Last TX done time.
*/
TimerTime_t LastTxDoneTime;
}SetBandTxDoneParams_t;
/*!
* Parameter structure for the function RegionVerify.
*/
typedef union uVerifyParams
{
/*!
* TX power to verify.
*/
int8_t TxPower;
/*!
* Set to true, if the duty cycle is enabled, otherwise false.
*/
bool DutyCycle;
/*!
* The number of join trials.
*/
uint8_t NbJoinTrials;
/*!
* Datarate to verify.
*/
struct sDatarateParams
{
/*!
* Datarate to verify.
*/
int8_t Datarate;
/*!
* The downlink dwell time.
*/
uint8_t DownlinkDwellTime;
/*!
* The up link dwell time.
*/
uint8_t UplinkDwellTime;
}DatarateParams;
}VerifyParams_t;
/*!
* Parameter structure for the function RegionApplyCFList.
*/
typedef struct sApplyCFListParams
{
/*!
* Payload which contains the CF list.
*/
uint8_t* Payload;
/*!
* Size of the payload.
*/
uint8_t Size;
}ApplyCFListParams_t;
/*!
* Parameter structure for the function RegionChanMaskSet.
*/
typedef struct sChanMaskSetParams
{
/*!
* Pointer to the channels mask which should be set.
*/
uint16_t* ChannelsMaskIn;
/*!
* Pointer to the channels mask which should be set.
*/
ChannelsMask_t ChannelsMaskType;
}ChanMaskSetParams_t;
/*!
* Parameter structure for the function RegionAdrNext.
*/
typedef struct sAdrNextParams
{
/*!
* Set to true, if the function should update the channels mask.
*/
bool UpdateChanMask;
/*!
* Set to true, if ADR is enabled.
*/
bool AdrEnabled;
/*!
* ADR ack counter.
*/
uint32_t AdrAckCounter;
/*!
* Datarate used currently.
*/
int8_t Datarate;
/*!
* TX power used currently.
*/
int8_t TxPower;
/*!
* UplinkDwellTime
*/
uint8_t UplinkDwellTime;
}AdrNextParams_t;
/*!
* Parameter structure for the function RegionRxConfig.
*/
typedef struct sRxConfigParams
{
/*!
* The RX channel.
*/
uint8_t Channel;
/*!
* RX datarate.
*/
int8_t Datarate;
/*!
* RX bandwidth.
*/
uint8_t Bandwidth;
/*!
* RX datarate offset.
*/
int8_t DrOffset;
/*!
* RX frequency.
*/
uint32_t Frequency;
/*!
* RX window timeout
*/
uint32_t WindowTimeout;
/*!
* RX window offset
*/
int32_t WindowOffset;
/*!
* Downlink dwell time.
*/
uint8_t DownlinkDwellTime;
/*!
* Set to true, if a repeater is supported.
*/
bool RepeaterSupport;
/*!
* Set to true, if RX should be continuous.
*/
bool RxContinuous;
/*!
* Sets the RX window. 0: RX window 1, 1: RX window 2.
*/
bool Window;
}RxConfigParams_t;
/*!
* Parameter structure for the function RegionTxConfig.
*/
typedef struct sTxConfigParams
{
/*!
* The TX channel.
*/
uint8_t Channel;
/*!
* The TX datarate.
*/
int8_t Datarate;
/*!
* The TX power.
*/
int8_t TxPower;
/*!
* The Max EIRP, if applicable.
*/
float MaxEirp;
/*!
* The antenna gain, if applicable.
*/
float AntennaGain;
/*!
* Frame length to setup.
*/
uint16_t PktLen;
}TxConfigParams_t;
/*!
* Parameter structure for the function RegionLinkAdrReq.
*/
typedef struct sLinkAdrReqParams
{
/*!
* Pointer to the payload which contains the MAC commands.
*/
uint8_t* Payload;
/*!
* Size of the payload.
*/
uint8_t PayloadSize;
/*!
* Uplink dwell time.
*/
uint8_t UplinkDwellTime;
/*!
* Set to true, if ADR is enabled.
*/
bool AdrEnabled;
/*!
* The current datarate.
*/
int8_t CurrentDatarate;
/*!
* The current TX power.
*/
int8_t CurrentTxPower;
/*!
* The current number of repetitions.
*/
uint8_t CurrentNbRep;
}LinkAdrReqParams_t;
/*!
* Parameter structure for the function RegionRxParamSetupReq.
*/
typedef struct sRxParamSetupReqParams
{
/*!
* The datarate to setup.
*/
int8_t Datarate;
/*!
* Datarate offset.
*/
int8_t DrOffset;
/*!
* The frequency to setup.
*/
uint32_t Frequency;
}RxParamSetupReqParams_t;
/*!
* Parameter structure for the function RegionNewChannelReq.
*/
typedef struct sNewChannelReqParams
{
/*!
* Pointer to the new channels.
*/
ChannelParams_t* NewChannel;
/*!
* Channel id.
*/
int8_t ChannelId;
}NewChannelReqParams_t;
/*!
* Parameter structure for the function RegionTxParamSetupReq.
*/
typedef struct sTxParamSetupReqParams
{
/*!
* Uplink dwell time.
*/
uint8_t UplinkDwellTime;
/*!
* Downlink dwell time.
*/
uint8_t DownlinkDwellTime;
/*!
* Max EIRP.
*/
uint8_t MaxEirp;
}TxParamSetupReqParams_t;
/*!
* Parameter structure for the function RegionDlChannelReq.
*/
typedef struct sDlChannelReqParams
{
/*!
* Channel Id to add the frequency.
*/
uint8_t ChannelId;
/*!
* Alternative frequency for the Rx1 window.
*/
uint32_t Rx1Frequency;
}DlChannelReqParams_t;
/*!
* Parameter structure for the function RegionAlternateDr.
*/
typedef struct sAlternateDrParams
{
/*!
* Number of trials.
*/
uint16_t NbTrials;
}AlternateDrParams_t;
/*!
* Parameter structure for the function RegionCalcBackOff.
*/
typedef struct sCalcBackOffParams
{
/*!
* Set to true, if the node has already joined a network, otherwise false.
*/
bool Joined;
/*!
* Joined Set to true, if the last uplink was a join request
*/
bool LastTxIsJoinRequest;
/*!
* Set to true, if the duty cycle is enabled, otherwise false.
*/
bool DutyCycleEnabled;
/*!
* Current channel index.
*/
uint8_t Channel;
/*!
* Elapsed time since the start of the node.
*/
TimerTime_t ElapsedTime;
/*!
* Time-on-air of the last transmission.
*/
TimerTime_t TxTimeOnAir;
}CalcBackOffParams_t;
/*!
* Parameter structure for the function RegionNextChannel.
*/
typedef struct sNextChanParams
{
/*!
* Aggregated time-off time.
*/
TimerTime_t AggrTimeOff;
/*!
* Time of the last aggregated TX.
*/
TimerTime_t LastAggrTx;
/*!
* Current datarate.
*/
int8_t Datarate;
/*!
* Set to true, if the node has already joined a network, otherwise false.
*/
bool Joined;
/*!
* Set to true, if the duty cycle is enabled, otherwise false.
*/
bool DutyCycleEnabled;
}NextChanParams_t;
/*!
* Parameter structure for the function RegionChannelsAdd.
*/
typedef struct sChannelAddParams
{
/*!
* Pointer to the new channel to add.
*/
ChannelParams_t* NewChannel;
/*!
* Channel id to add.
*/
uint8_t ChannelId;
}ChannelAddParams_t;
/*!
* Parameter structure for the function RegionChannelsRemove.
*/
typedef struct sChannelRemoveParams
{
/*!
* Channel id to remove.
*/
uint8_t ChannelId;
}ChannelRemoveParams_t;
/*!
* Parameter structure for the function RegionContinuousWave.
*/
typedef struct sContinuousWaveParams
{
/*!
* Current channel index.
*/
uint8_t Channel;
/*!
* Datarate. Used to limit the TX power.
*/
int8_t Datarate;
/*!
* The TX power to setup.
*/
int8_t TxPower;
/*!
* Max EIRP, if applicable.
*/
float MaxEirp;
/*!
* The antenna gain, if applicable.
*/
float AntennaGain;
/*!
* Specifies the time the radio will stay in CW mode.
*/
uint16_t Timeout;
}ContinuousWaveParams_t;
/*!
* \brief The function verifies if a region is active or not. If a region
* is not active, it cannot be used.
*
* \param [IN] region LoRaWAN region.
*
* \retval Return true, if the region is supported.
*/
bool RegionIsActive( LoRaMacRegion_t region );
/*!
* \brief The function gets a value of a specific phy attribute.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] getPhy Pointer to the function parameters.
*
* \retval Returns a structure containing the PHY parameter.
*/
PhyParam_t RegionGetPhyParam( LoRaMacRegion_t region, GetPhyParams_t* getPhy );
/*!
* \brief Updates the last TX done parameters of the current channel.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] txDone Pointer to the function parameters.
*/
void RegionSetBandTxDone( LoRaMacRegion_t region, SetBandTxDoneParams_t* txDone );
/*!
* \brief Initializes the channels masks and the channels.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] type Sets the initialization type.
*/
void RegionInitDefaults( LoRaMacRegion_t region, InitType_t type );
/*!
* \brief Verifies a parameter.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] verify Pointer to the function parameters.
*
* \param [IN] type Sets the initialization type.
*
* \retval Returns true, if the parameter is valid.
*/
bool RegionVerify( LoRaMacRegion_t region, VerifyParams_t* verify, PhyAttribute_t phyAttribute );
/*!
* \brief The function parses the input buffer and sets up the channels of the
* CF list.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] applyCFList Pointer to the function parameters.
*/
void RegionApplyCFList( LoRaMacRegion_t region, ApplyCFListParams_t* applyCFList );
/*!
* \brief Sets a channels mask.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] chanMaskSet Pointer to the function parameters.
*
* \retval Returns true, if the channels mask could be set.
*/
bool RegionChanMaskSet( LoRaMacRegion_t region, ChanMaskSetParams_t* chanMaskSet );
/*!
* \brief Calculates the next datarate to set, when ADR is on or off.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] adrNext Pointer to the function parameters.
*
* \param [OUT] drOut The calculated datarate for the next TX.
*
* \param [OUT] txPowOut The TX power for the next TX.
*
* \param [OUT] adrAckCounter The calculated ADR acknowledgement counter.
*
* \retval Returns true, if an ADR request should be performed.
*/
bool RegionAdrNext( LoRaMacRegion_t region, AdrNextParams_t* adrNext, int8_t* drOut, int8_t* txPowOut, uint32_t* adrAckCounter );
/*!
* \brief Configuration of the RX windows.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] rxConfig Pointer to the function parameters.
*
* \param [OUT] datarate The datarate index which was set.
*
* \retval Returns true, if the configuration was applied successfully.
*/
bool RegionRxConfig( LoRaMacRegion_t region, RxConfigParams_t* rxConfig, int8_t* datarate );
/*
* Rx window precise timing
*
* For more details please consult the following document, chapter 3.1.2.
* http://www.semtech.com/images/datasheet/SX1272_settings_for_LoRaWAN_v2.0.pdf
* or
* http://www.semtech.com/images/datasheet/SX1276_settings_for_LoRaWAN_v2.0.pdf
*
* Downlink start: T = Tx + 1s (+/- 20 us)
* |
* TRxEarly | TRxLate
* | | |
* | | +---+---+---+---+---+---+---+---+
* | | | Latest Rx window |
* | | +---+---+---+---+---+---+---+---+
* | | |
* +---+---+---+---+---+---+---+---+
* | Earliest Rx window |
* +---+---+---+---+---+---+---+---+
* |
* +---+---+---+---+---+---+---+---+
*Downlink preamble 8 symbols | | | | | | | | |
* +---+---+---+---+---+---+---+---+
*
* Worst case Rx window timings
*
* TRxLate = DEFAULT_MIN_RX_SYMBOLS * tSymbol - RADIO_WAKEUP_TIME
* TRxEarly = 8 - DEFAULT_MIN_RX_SYMBOLS * tSymbol - RxWindowTimeout - RADIO_WAKEUP_TIME
*
* TRxLate - TRxEarly = 2 * DEFAULT_SYSTEM_MAX_RX_ERROR
*
* RxOffset = ( TRxLate + TRxEarly ) / 2
*
* RxWindowTimeout = ( 2 * DEFAULT_MIN_RX_SYMBOLS - 8 ) * tSymbol + 2 * DEFAULT_SYSTEM_MAX_RX_ERROR
* RxOffset = 4 * tSymbol - RxWindowTimeout / 2 - RADIO_WAKE_UP_TIME
*
* Minimal value of RxWindowTimeout must be 5 symbols which implies that the system always tolerates at least an error of 1.5 * tSymbol
*/
/*!
* Computes the Rx window timeout and offset.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] datarate Rx window datarate index to be used
*
* \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 [OUT]rxConfigParams Returns updated WindowTimeout and WindowOffset fields.
*/
void RegionComputeRxWindowParameters( LoRaMacRegion_t region, int8_t datarate, uint8_t minRxSymbols, uint32_t rxError, RxConfigParams_t *rxConfigParams );
/*!
* \brief TX configuration.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] txConfig Pointer to the function parameters.
*
* \param [OUT] txPower The tx power index which was set.
*
* \param [OUT] txTimeOnAir The time-on-air of the frame.
*
* \retval Returns true, if the configuration was applied successfully.
*/
bool RegionTxConfig( LoRaMacRegion_t region, TxConfigParams_t* txConfig, int8_t* txPower, TimerTime_t* txTimeOnAir );
/*!
* \brief The function processes a Link ADR Request.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] linkAdrReq Pointer to the function parameters.
*
* \param [OUT] drOut The datarate which was applied.
*
* \param [OUT] txPowOut The TX power which was applied.
*
* \param [OUT] nbRepOut The number of repetitions to apply.
*
* \param [OUT] nbBytesParsed The number bytes which were parsed.
*
* \retval Returns the status of the operation, according to the LoRaMAC specification.
*/
uint8_t RegionLinkAdrReq( LoRaMacRegion_t region, LinkAdrReqParams_t* linkAdrReq, int8_t* drOut, int8_t* txPowOut, uint8_t* nbRepOut, uint8_t* nbBytesParsed );
/*!
* \brief The function processes a RX Parameter Setup Request.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] rxParamSetupReq Pointer to the function parameters.
*
* \retval Returns the status of the operation, according to the LoRaMAC specification.
*/
uint8_t RegionRxParamSetupReq( LoRaMacRegion_t region, RxParamSetupReqParams_t* rxParamSetupReq );
/*!
* \brief The function processes a New Channel Request.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] newChannelReq Pointer to the function parameters.
*
* \retval Returns the status of the operation, according to the LoRaMAC specification.
*/
uint8_t RegionNewChannelReq( LoRaMacRegion_t region, NewChannelReqParams_t* newChannelReq );
/*!
* \brief The function processes a TX ParamSetup Request.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] txParamSetupReq Pointer to the function parameters.
*
* \retval Returns the status of the operation, according to the LoRaMAC specification.
* Returns -1, if the functionality is not implemented. In this case, the end node
* shall ignore the command.
*/
int8_t RegionTxParamSetupReq( LoRaMacRegion_t region, TxParamSetupReqParams_t* txParamSetupReq );
/*!
* \brief The function processes a DlChannel Request.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] dlChannelReq Pointer to the function parameters.
*
* \retval Returns the status of the operation, according to the LoRaMAC specification.
*/
uint8_t RegionDlChannelReq( LoRaMacRegion_t region, DlChannelReqParams_t* dlChannelReq );
/*!
* \brief Alternates the datarate of the channel for the join request.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] alternateDr Pointer to the function parameters.
*
* \retval Datarate to apply.
*/
int8_t RegionAlternateDr( LoRaMacRegion_t region, AlternateDrParams_t* alternateDr );
/*!
* \brief Calculates the back-off time.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] calcBackOff Pointer to the function parameters.
*/
void RegionCalcBackOff( LoRaMacRegion_t region, CalcBackOffParams_t* calcBackOff );
/*!
* \brief Searches and set the next random available channel
*
* \param [IN] region LoRaWAN region.
*
* \param [OUT] channel Next channel to use for TX.
*
* \param [OUT] time Time to wait for the next transmission according to the duty
* cycle.
*
* \param [OUT] aggregatedTimeOff Updates the aggregated time off.
*
* \retval Function status [1: OK, 0: Unable to find a channel on the current datarate].
*/
bool RegionNextChannel( LoRaMacRegion_t region, NextChanParams_t* nextChanParams, uint8_t* channel, TimerTime_t* time, TimerTime_t* aggregatedTimeOff );
/*!
* \brief Adds a channel.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] channelAdd Pointer to the function parameters.
*
* \retval Status of the operation.
*/
LoRaMacStatus_t RegionChannelAdd( LoRaMacRegion_t region, ChannelAddParams_t* channelAdd );
/*!
* \brief Removes a channel.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] channelRemove Pointer to the function parameters.
*
* \retval Returns true, if the channel was removed successfully.
*/
bool RegionChannelsRemove( LoRaMacRegion_t region, ChannelRemoveParams_t* channelRemove );
/*!
* \brief Sets the radio into continuous wave mode.
*
* \param [IN] region LoRaWAN region.
*
* \param [IN] continuousWave Pointer to the function parameters.
*/
void RegionSetContinuousWave( LoRaMacRegion_t region, ContinuousWaveParams_t* continuousWave );
/*!
* \brief Computes new datarate according to the given offset
*
* \param [IN] downlinkDwellTime Downlink dwell time configuration. 0: No limit, 1: 400ms
*
* \param [IN] dr Current datarate
*
* \param [IN] drOffset Offset to be applied
*
* \retval newDr Computed datarate.
*/
uint8_t RegionApplyDrOffset( LoRaMacRegion_t region, uint8_t downlinkDwellTime, int8_t dr, int8_t drOffset );
/*! \} defgroup REGION */
#endif // __REGION_H__