/*! | |
* \file Region.h | |
* | |
* \brief Region implementation. | |
* | |
* \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 ) | |
* | |
* \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__ | |
#include <stdint.h> | |
#include <stdbool.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, | |
/*! | |
* Next lower datarate. | |
*/ | |
PHY_NEXT_LOWER_TX_DR | |
}PhyAttribute_t; | |
/*! | |
* Enumeration of initialization types. | |
*/ | |
typedef enum eInitType | |
{ | |
/*! | |
* Initializes the region specific data to defaults, according to the | |
* LoRaWAN specification. | |
*/ | |
INIT_TYPE_INIT, | |
/*! | |
* Restores default channels defined by the LoRaWAN specification only. | |
*/ | |
INIT_TYPE_RESTORE, | |
/*! | |
* Initializes the region specific data to the defaults which were set by | |
* the application. | |
*/ | |
INIT_TYPE_APP_DEFAULTS | |
}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; | |
/*! | |
* 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 (in symbols) | |
*/ | |
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. | |
*/ | |
LoRaMacRxSlot_t RxSlot; | |
/*! | |
* The symbol time, in msecs | |
*/ | |
double tsymbol; | |
}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 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. | |
* https://www.semtech.com/uploads/documents/SX1272_settings_for_LoRaWAN_v2.0.pdf | |
* or | |
* https://www.semtech.com/uploads/documents/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] currentDr Current datarate. | |
* | |
* \retval Datarate to apply. | |
*/ | |
int8_t RegionAlternateDr( LoRaMacRegion_t region, int8_t currentDr ); | |
/*! | |
* \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]. | |
*/ | |
LoRaMacStatus_t 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__ |