Stable version of the xDot library for mbed 5. This version of the library is suitable for deployment scenarios.

Dependents:   Dot-Examples XDOT-Devicewise Dot-Examples-delujoc Dot-Examples_receive ... more

Fork of libxDot-dev-mbed5-deprecated by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ChannelPlan_EU868.h Source File

ChannelPlan_EU868.h

00001 /**   __  ___     ____  _    ______        __     ____         __                  ____
00002  *   /  |/  /_ __/ / /_(_)__/_  __/__ ____/ /    / __/_ _____ / /____ __ _  ___   /  _/__  ____
00003  *  / /|_/ / // / / __/ /___// / / -_) __/ _ \  _\ \/ // (_-</ __/ -_)  ' \(_-<  _/ // _ \/ __/ __
00004  * /_/  /_/\_,_/_/\__/_/    /_/  \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/
00005  * Copyright (C) 2015 by Multi-Tech Systems        /___/
00006  *
00007  *
00008  * @author Jason Reiss
00009  * @date   10-31-2015
00010  * @brief  lora::ChannelPlan provides an interface for LoRaWAN channel schemes
00011  *
00012  * @details
00013  *
00014  */
00015 
00016 #ifndef __CHANNEL_PLAN_EU868_H__
00017 #define __CHANNEL_PLAN_EU868_H__
00018 
00019 #include "Lora.h"
00020 #include "SxRadio.h"
00021 #include <vector>
00022 #include "ChannelPlan.h"
00023 
00024 namespace lora {
00025 
00026     const uint8_t EU868_125K_NUM_CHANS = 16;                    //!< Number of 125k channels in EU868 channel plan
00027     const uint8_t EU868_DEFAULT_NUM_CHANS = 3;                  //!< Number of defualt channels in EU868 channel plan
00028     const uint32_t EU868_125K_FREQ_BASE = 868100000;            //!< Frequency base for 125k EU868 uplink channels
00029     const uint32_t EU868_125K_FREQ_STEP = 200000;               //!< Frequency step for 125k EU868 uplink channels
00030     const uint32_t EU868_RX2_FREQ = 869525000;                  //!< Frequency default for second rx window in EU868
00031 
00032     const uint8_t EU868_TX_POWER_MAX = 14;                      //!< Max power for EU868 channel plan
00033 
00034     // 0.1% duty cycle 863-868
00035     // Limiting to 865-868 allows for 1% duty cycle
00036     const uint32_t EU868_MILLI_FREQ_MIN = 865000000;
00037     const uint32_t EU868_MILLI_FREQ_MAX = 868000000;
00038 
00039     const uint32_t EU868_MILLI_1_FREQ_MIN = 868700000;
00040     const uint32_t EU868_MILLI_1_FREQ_MAX = 869200000;
00041 
00042     // 1% duty cycle
00043     const uint32_t EU868_CENTI_FREQ_MIN = 868000000;
00044     const uint32_t EU868_CENTI_FREQ_MAX = 868600000;
00045 
00046     // 10% duty cycle
00047     const uint32_t EU868_DECI_FREQ_MIN = 869400000;
00048     const uint32_t EU868_DECI_FREQ_MAX = 869650000;
00049 
00050     // Below 7dBm there is no duty cycle for these frequencies
00051     // Up to 14dBm there is 1% duty cycle
00052     const uint32_t EU868_VAR_FREQ_MIN = 869700000;
00053     const uint32_t EU868_VAR_FREQ_MAX = 870000000;
00054 
00055     const uint32_t EU868_FREQ_MIN = 863000000;
00056     const uint32_t EU868_FREQ_MAX = 870000000;
00057 
00058     const uint8_t EU868_MIN_DATARATE = (uint8_t) DR_0;           //!< Minimum transmit datarate for EU868
00059     const uint8_t EU868_MAX_DATARATE = (uint8_t) DR_7;           //!< Maximum transmit datarate for EU868
00060 
00061     const uint8_t EU868_MIN_DATARATE_OFFSET = (uint8_t) 0;       //!< Minimum transmit datarate for US915
00062     const uint8_t EU868_MAX_DATARATE_OFFSET = (uint8_t) 5;       //!< Maximum transmit datarate for US915
00063 
00064     const uint8_t  EU868_BEACON_DR = DR_3;                       //!< Default beacon datarate
00065     const uint32_t EU868_BEACON_FREQ = 869525000U;               //!< Default beacon broadcast frequency
00066 
00067     class ChannelPlan_EU868 : public lora::ChannelPlan {
00068         public:
00069             /**
00070              * ChannelPlan constructor
00071              * @param radio SxRadio object used to set Tx/Rx config
00072              * @param settings Settings object
00073              */
00074             ChannelPlan_EU868();
00075             ChannelPlan_EU868(Settings* settings);
00076             ChannelPlan_EU868(SxRadio* radio, Settings* settings);
00077 
00078             /**
00079              * ChannelPlan destructor
00080              */
00081             virtual ~ChannelPlan_EU868();
00082 
00083             /**
00084              * Initialize channels, datarates and duty cycle bands according to current channel plan in settings
00085              */
00086             virtual void Init();
00087 
00088             /**
00089              * Get the next channel to use to transmit
00090              * @return LORA_OK if channel was found
00091              * @return LORA_NO_CHANS_ENABLED
00092              */
00093             virtual uint8_t GetNextChannel();
00094 
00095             /**
00096              * Add a channel to the ChannelPlan
00097              * @param index of channel, use -1 to add to end
00098              * @param channel settings to add
00099              */
00100             virtual uint8_t AddChannel(int8_t index, Channel channel);
00101 
00102             /**
00103              * Get channel at index
00104              * @return Channel
00105              */
00106             virtual Channel GetChannel(int8_t index);
00107 
00108             /**
00109              * Get rx window settings for requested window
00110              * RX_1, RX_2, RX_BEACON, RX_SLOT
00111              * @param window
00112              * @return RxWindow
00113              */
00114             virtual RxWindow GetRxWindow(uint8_t window, int8_t id = 0);
00115 
00116             /**
00117              * Get datarate to use on the join request
00118              * @return datarate index
00119              */
00120             virtual uint8_t GetJoinDatarate();
00121 
00122             /**
00123              * Calculate the next time a join request is possible
00124              * @param size of join frame
00125              * @returns LORA_OK
00126              */
00127             virtual uint8_t CalculateJoinBackoff(uint8_t size);
00128 
00129             /**
00130              * Get next channel and set the SxRadio tx config with current settings
00131              * @return LORA_OK
00132              */
00133             virtual uint8_t SetTxConfig();
00134 
00135             /**
00136              * Set frequency sub band if supported by plan
00137              * @param sub_band
00138              * @return LORA_OK
00139              */
00140             virtual uint8_t SetFrequencySubBand(uint8_t sub_band);
00141 
00142             /**
00143              * Callback for Join Accept packet to load optional channels
00144              * @return LORA_OK
00145              */
00146             virtual uint8_t HandleJoinAccept(const uint8_t* buffer, uint8_t size);
00147 
00148             /**
00149              * Callback to for rx parameter setup ServerCommand
00150              * @param payload packet data
00151              * @param index of start of command buffer
00152              * @param size number of bytes in command buffer
00153              * @param[out] status to be returned in MoteCommand answer
00154              * @return LORA_OK
00155              */
00156             virtual uint8_t HandleRxParamSetup(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
00157 
00158             /**
00159              * Callback to for new channel ServerCommand
00160              * @param payload packet data
00161              * @param index of start of command buffer
00162              * @param size number of bytes in command buffer
00163              * @param[out] status to be returned in MoteCommand answer
00164              * @return LORA_OK
00165              */
00166             virtual uint8_t HandleNewChannel(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
00167 
00168             /**
00169              * Callback to for ping slot channel request ServerCommand
00170              * @param payload packet data
00171              * @param index of start of command buffer
00172              * @param size number of bytes in command buffer
00173              * @param[out] status to be returned in MoteCommand answer
00174              * @return LORA_OK
00175              */
00176             virtual uint8_t HandlePingSlotChannelReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
00177 
00178             /**
00179              * Callback to for beacon frequency request ServerCommand
00180              * @param payload packet data
00181              * @param index of start of command buffer
00182              * @param size number of bytes in command buffer
00183              * @param[out] status to be returned in MoteCommand answer
00184              * @return LORA_OK
00185              */
00186             virtual uint8_t HandleBeaconFrequencyReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
00187 
00188             /**
00189              * Callback to for adaptive datarate ServerCommand
00190              * @param payload packet data
00191              * @param index of start of command buffer
00192              * @param size number of bytes in command buffer
00193              * @param[out] status to be returned in MoteCommand answer
00194              * @return LORA_OK
00195              */
00196             virtual uint8_t HandleAdrCommand(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
00197 
00198             /**
00199              * Validate the configuration after multiple ADR commands have been applied
00200              * @return status to be returned in MoteCommand answer
00201              */
00202             virtual uint8_t ValidateAdrConfiguration();
00203 
00204             /**
00205              * Update duty cycle with at given frequency and time on air
00206              * @param freq frequency
00207              * @param time_on_air_ms tx time on air
00208              */
00209             virtual void UpdateDutyCycle(uint32_t freq, uint32_t time_on_air_ms);
00210 
00211             /**
00212              * Get the time the radio must be off air to comply with regulations
00213              * Time to wait may be dependent on duty-cycle restrictions per channel
00214              * Or duty-cycle of join requests if OTAA is being attempted
00215              * @return ms of time to wait for next tx opportunity
00216              */
00217             virtual uint32_t GetTimeOffAir();
00218 
00219             /**
00220              * Get the channels in use by current channel plan
00221              * @return channel frequencies
00222              */
00223             virtual std::vector<uint32_t> GetChannels();
00224 
00225             /**
00226              * Get the channel datarate ranges in use by current channel plan
00227              * @return channel datarate ranges
00228              */
00229             virtual std::vector<uint8_t> GetChannelRanges();
00230 
00231             /**
00232              * Print log message for given rx window
00233              * @param wnd 1 or 2
00234              */
00235             virtual void LogRxWindow(uint8_t wnd);
00236 
00237             /**
00238              * Enable the default channels of the channel plan
00239              */
00240             virtual void EnableDefaultChannels();
00241 
00242             /**
00243              * Check if this packet is a beacon and if so extract parameters needed
00244              * @param payload of potential beacon
00245              * @param size of the packet
00246              * @param [out] data extracted from the beacon if this packet was indeed a beacon
00247              * @return true if this packet is beacon, false if not
00248              */
00249             virtual uint8_t DecodeBeacon(const uint8_t* payload,
00250                                       size_t size,
00251                                       BeaconData_t& data);
00252 
00253         protected:
00254 
00255             static const uint8_t EU868_TX_POWERS[8];                    //!< List of available tx powers
00256             static const uint8_t EU868_RADIO_POWERS[21];                 //!< List of calibrated tx powers
00257             static const uint8_t EU868_MAX_PAYLOAD_SIZE[];              //!< List of max payload sizes for each datarate
00258             static const uint8_t EU868_MAX_PAYLOAD_SIZE_REPEATER[];     //!< List of repeater compatible max payload sizes for each datarate
00259 
00260             typedef struct __attribute__((packed)) {
00261                 uint8_t RFU[2];
00262                 uint8_t Time[4];
00263                 uint8_t CRC1[2];
00264                 uint8_t GwSpecific[7];
00265                 uint8_t CRC2[2];
00266             } BCNPayload;
00267     };
00268 }
00269 
00270 #endif //__CHANNEL_PLAN_EU868_H__