MultiTech / libmDot-Custom

Fork of libmDot-custom by Jason Reiss

Information

Library has been updated to mbed 5.x

The LoRaWAN Certification test mode implementation is built-in to libmDot code. When a start test mode packet is received the library will not return until test mode has ended.

Warning

This library is currently in BETA release. Unresolved issues may be experienced. Software is provided as is with no expectation of support of bug fixes in the future. Please report issues found through the mbed website or directly to support.multitech.com.

Changing of channel plan parameters may cause the device to no longer respect local RF regulations. Please use caution and respect your local regulations.

In AT Command Firmware remove line 803.

CommandTerminal/CommandTerminal.cpp

        delete[] info->RxBuffer;

Likewise, if your application is handling events from the library asynchronously.

Creating new channel plans

Copy EU868 or US915 custom channel plan as a starting point

Import programmDot_AT_firmware_CUSTOM

AT Firmware with custom channel plan support

EU868 provides a framework for a DYNAMIC channel plan with duty-cycle limitations

US915 provides a framework for a FIXED channel plan

RADIO_POWERS are measured output in dBm for each radio tx power setting.

Additional MAC Commands can be implemented by overriding the HandleMacCommand function.

Steps

  1. Setup datarates, duty-cycle bands and channels in ChannelPlan_* constructor
  2. Modify GetJoinDatarate and CalculateJoinBackoff to change join datarates and backoff
  3. Customize HandleJoinAccept datarates
  4. Use GetRxWindow(int) to define how the device open Rx window 1 and 2
  5. GetNextChannel will pick a channel from the enabled channel at the current datarate before each TX
Committer:
jreiss
Date:
Mon Aug 29 14:04:09 2016 +0000
Revision:
16:9bd6cacde447
Child:
18:aa39c917aa3f
Change to custom channel plan libmDot

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jreiss 16:9bd6cacde447 1 /** __ ___ ____ _ ______ __ ____ __ ____
jreiss 16:9bd6cacde447 2 * / |/ /_ __/ / /_(_)__/_ __/__ ____/ / / __/_ _____ / /____ __ _ ___ / _/__ ____
jreiss 16:9bd6cacde447 3 * / /|_/ / // / / __/ /___// / / -_) __/ _ \ _\ \/ // (_-</ __/ -_) ' \(_-< _/ // _ \/ __/ __
jreiss 16:9bd6cacde447 4 * /_/ /_/\_,_/_/\__/_/ /_/ \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/
jreiss 16:9bd6cacde447 5 * Copyright (C) 2015 by Multi-Tech Systems /___/
jreiss 16:9bd6cacde447 6 *
jreiss 16:9bd6cacde447 7 *
jreiss 16:9bd6cacde447 8 * @author Jason Reiss
jreiss 16:9bd6cacde447 9 * @date 10-31-2015
jreiss 16:9bd6cacde447 10 * @brief lora::ChannelPlan provides an interface for LoRaWAN channel schemes
jreiss 16:9bd6cacde447 11 *
jreiss 16:9bd6cacde447 12 * @details
jreiss 16:9bd6cacde447 13 *
jreiss 16:9bd6cacde447 14 */
jreiss 16:9bd6cacde447 15
jreiss 16:9bd6cacde447 16 #ifndef __CHANNEL_STRATEGY_H__
jreiss 16:9bd6cacde447 17 #define __CHANNEL_STRATEGY_H__
jreiss 16:9bd6cacde447 18
jreiss 16:9bd6cacde447 19 #include "Lora.h"
jreiss 16:9bd6cacde447 20 #include "SxRadio.h"
jreiss 16:9bd6cacde447 21 #include <vector>
jreiss 16:9bd6cacde447 22
jreiss 16:9bd6cacde447 23 namespace lora {
jreiss 16:9bd6cacde447 24
jreiss 16:9bd6cacde447 25 class ChannelPlan {
jreiss 16:9bd6cacde447 26 public:
jreiss 16:9bd6cacde447 27
jreiss 16:9bd6cacde447 28 /**
jreiss 16:9bd6cacde447 29 * ChannelPlan constructor
jreiss 16:9bd6cacde447 30 * @param radio SxRadio object used to set Tx/Rx config
jreiss 16:9bd6cacde447 31 * @param settings Settings object
jreiss 16:9bd6cacde447 32 */
jreiss 16:9bd6cacde447 33 ChannelPlan(SxRadio& radio, Settings& settings);
jreiss 16:9bd6cacde447 34
jreiss 16:9bd6cacde447 35 /**
jreiss 16:9bd6cacde447 36 * ChannelPlan destructor
jreiss 16:9bd6cacde447 37 */
jreiss 16:9bd6cacde447 38 virtual ~ChannelPlan();
jreiss 16:9bd6cacde447 39
jreiss 16:9bd6cacde447 40 /**
jreiss 16:9bd6cacde447 41 * Initialize channels, datarates and duty cycle bands according to current channel plan in settings
jreiss 16:9bd6cacde447 42 */
jreiss 16:9bd6cacde447 43 virtual void Init();
jreiss 16:9bd6cacde447 44
jreiss 16:9bd6cacde447 45 /**
jreiss 16:9bd6cacde447 46 * Get the next channel to use to transmit
jreiss 16:9bd6cacde447 47 * @return LORA_OK if channel was found
jreiss 16:9bd6cacde447 48 * @return LORA_NO_CHANS_ENABLED
jreiss 16:9bd6cacde447 49 */
jreiss 16:9bd6cacde447 50 virtual uint8_t GetNextChannel();
jreiss 16:9bd6cacde447 51
jreiss 16:9bd6cacde447 52 /**
jreiss 16:9bd6cacde447 53 * Set the number of channels in the plan
jreiss 16:9bd6cacde447 54 */
jreiss 16:9bd6cacde447 55 virtual void SetNumberOfChannels(uint8_t channels, bool resize = true);
jreiss 16:9bd6cacde447 56
jreiss 16:9bd6cacde447 57 /**
jreiss 16:9bd6cacde447 58 * Get the number of channels in the plan
jreiss 16:9bd6cacde447 59 */
jreiss 16:9bd6cacde447 60 virtual uint8_t GetNumberOfChannels();
jreiss 16:9bd6cacde447 61
jreiss 16:9bd6cacde447 62 /**
jreiss 16:9bd6cacde447 63 * Check if channel is enabled
jreiss 16:9bd6cacde447 64 * @return true if enabled
jreiss 16:9bd6cacde447 65 */
jreiss 16:9bd6cacde447 66 virtual bool IsChannelEnabled(uint8_t channel);
jreiss 16:9bd6cacde447 67
jreiss 16:9bd6cacde447 68 /**
jreiss 16:9bd6cacde447 69 * Set a 16 bit channel mask with offset
jreiss 16:9bd6cacde447 70 * @param index of mask to set 0:0-15, 1:16-31 ...
jreiss 16:9bd6cacde447 71 * @param mask 16 bit mask of enabled channels
jreiss 16:9bd6cacde447 72 * @return true
jreiss 16:9bd6cacde447 73 */
jreiss 16:9bd6cacde447 74 virtual bool SetChannelMask(uint8_t index, uint16_t mask);
jreiss 16:9bd6cacde447 75
jreiss 16:9bd6cacde447 76 /**
jreiss 16:9bd6cacde447 77 * Get the channel mask of currently enabled channels
jreiss 16:9bd6cacde447 78 * @return vector containing channel bit masks
jreiss 16:9bd6cacde447 79 */
jreiss 16:9bd6cacde447 80 virtual std::vector<uint16_t> GetChannelMask();
jreiss 16:9bd6cacde447 81
jreiss 16:9bd6cacde447 82 /**
jreiss 16:9bd6cacde447 83 * Add a channel to the ChannelPlan
jreiss 16:9bd6cacde447 84 * @param index of channel, use -1 to add to end
jreiss 16:9bd6cacde447 85 * @param channel settings to add
jreiss 16:9bd6cacde447 86 */
jreiss 16:9bd6cacde447 87 virtual uint8_t AddChannel(int8_t index, Channel channel);
jreiss 16:9bd6cacde447 88
jreiss 16:9bd6cacde447 89 /**
jreiss 16:9bd6cacde447 90 * Get channel at index
jreiss 16:9bd6cacde447 91 * @return Channel
jreiss 16:9bd6cacde447 92 */
jreiss 16:9bd6cacde447 93 virtual Channel GetChannel(int8_t index);
jreiss 16:9bd6cacde447 94
jreiss 16:9bd6cacde447 95 /**
jreiss 16:9bd6cacde447 96 * Set number of datarates in ChannelPlan
jreiss 16:9bd6cacde447 97 * @param datarates
jreiss 16:9bd6cacde447 98 */
jreiss 16:9bd6cacde447 99 virtual void SetNumberOfDatarates(uint8_t datarates);
jreiss 16:9bd6cacde447 100
jreiss 16:9bd6cacde447 101 /**
jreiss 16:9bd6cacde447 102 * Add a datarate to the ChannelPlan
jreiss 16:9bd6cacde447 103 * @param index of datarate, use -1 to add to end
jreiss 16:9bd6cacde447 104 * @param datarate settings to add
jreiss 16:9bd6cacde447 105 */
jreiss 16:9bd6cacde447 106 virtual uint8_t AddDatarate(int8_t index, Datarate datarate);
jreiss 16:9bd6cacde447 107
jreiss 16:9bd6cacde447 108 /**
jreiss 16:9bd6cacde447 109 * Get datarate at index
jreiss 16:9bd6cacde447 110 * @return Datarate
jreiss 16:9bd6cacde447 111 */
jreiss 16:9bd6cacde447 112 virtual Datarate GetDatarate(int8_t index);
jreiss 16:9bd6cacde447 113
jreiss 16:9bd6cacde447 114 /**
jreiss 16:9bd6cacde447 115 * Get max payload size for current datarate
jreiss 16:9bd6cacde447 116 * @return size in bytes
jreiss 16:9bd6cacde447 117 */
jreiss 16:9bd6cacde447 118 virtual uint8_t GetMaxPayloadSize();
jreiss 16:9bd6cacde447 119
jreiss 16:9bd6cacde447 120 /**
jreiss 16:9bd6cacde447 121 * Get rx window settings for requested window
jreiss 16:9bd6cacde447 122 * RX_1, RX_2, RX_BEACON, RX_SLOT
jreiss 16:9bd6cacde447 123 * @param window
jreiss 16:9bd6cacde447 124 * @return RxWindow
jreiss 16:9bd6cacde447 125 */
jreiss 16:9bd6cacde447 126 virtual RxWindow GetRxWindow(uint8_t window);
jreiss 16:9bd6cacde447 127
jreiss 16:9bd6cacde447 128 /**
jreiss 16:9bd6cacde447 129 * Get current channel to use for transmitting
jreiss 16:9bd6cacde447 130 * @param channel index of channel
jreiss 16:9bd6cacde447 131 * @return LORA_OK
jreiss 16:9bd6cacde447 132 */
jreiss 16:9bd6cacde447 133 virtual uint8_t SetTxChannel(uint8_t channel);
jreiss 16:9bd6cacde447 134
jreiss 16:9bd6cacde447 135 /**
jreiss 16:9bd6cacde447 136 * Get datarate to use on the join request
jreiss 16:9bd6cacde447 137 * @return datarate index
jreiss 16:9bd6cacde447 138 */
jreiss 16:9bd6cacde447 139 virtual uint8_t GetJoinDatarate();
jreiss 16:9bd6cacde447 140
jreiss 16:9bd6cacde447 141
jreiss 16:9bd6cacde447 142 /**
jreiss 16:9bd6cacde447 143 * Calculate the next time a join request is possible
jreiss 16:9bd6cacde447 144 * @param size of join frame
jreiss 16:9bd6cacde447 145 * @returns LORA_OK
jreiss 16:9bd6cacde447 146 */
jreiss 16:9bd6cacde447 147 virtual uint8_t CalculateJoinBackoff(uint8_t size);
jreiss 16:9bd6cacde447 148
jreiss 16:9bd6cacde447 149 /**
jreiss 16:9bd6cacde447 150 * Get the current datarate
jreiss 16:9bd6cacde447 151 * @return Datarate
jreiss 16:9bd6cacde447 152 */
jreiss 16:9bd6cacde447 153 virtual Datarate GetTxDatarate();
jreiss 16:9bd6cacde447 154
jreiss 16:9bd6cacde447 155 /**
jreiss 16:9bd6cacde447 156 * Set the current datarate
jreiss 16:9bd6cacde447 157 * @param index of datarate
jreiss 16:9bd6cacde447 158 * @return LORA_OK
jreiss 16:9bd6cacde447 159 */
jreiss 16:9bd6cacde447 160 virtual uint8_t SetTxDatarate(uint8_t index);
jreiss 16:9bd6cacde447 161
jreiss 16:9bd6cacde447 162 /**
jreiss 16:9bd6cacde447 163 * Set the datarate offset used for first receive window
jreiss 16:9bd6cacde447 164 * @param offset
jreiss 16:9bd6cacde447 165 * @return LORA_OK
jreiss 16:9bd6cacde447 166 */
jreiss 16:9bd6cacde447 167 virtual uint8_t SetRx1Offset(uint8_t offset);
jreiss 16:9bd6cacde447 168
jreiss 16:9bd6cacde447 169 /**
jreiss 16:9bd6cacde447 170 * Set the frequency for second receive window
jreiss 16:9bd6cacde447 171 * @param freq
jreiss 16:9bd6cacde447 172 * @return LORA_OK
jreiss 16:9bd6cacde447 173 */
jreiss 16:9bd6cacde447 174 virtual uint8_t SetRx2Frequency(uint32_t freq);
jreiss 16:9bd6cacde447 175
jreiss 16:9bd6cacde447 176 /**
jreiss 16:9bd6cacde447 177 * Set the datarate index used for second receive window
jreiss 16:9bd6cacde447 178 * @param index
jreiss 16:9bd6cacde447 179 * @return LORA_OK
jreiss 16:9bd6cacde447 180 */
jreiss 16:9bd6cacde447 181 virtual uint8_t SetRx2DatarateIndex(uint8_t index);
jreiss 16:9bd6cacde447 182
jreiss 16:9bd6cacde447 183 /**
jreiss 16:9bd6cacde447 184 * Get next channel and set the SxRadio tx config with current settings
jreiss 16:9bd6cacde447 185 * @return LORA_OK
jreiss 16:9bd6cacde447 186 */
jreiss 16:9bd6cacde447 187 virtual uint8_t SetTxConfig();
jreiss 16:9bd6cacde447 188
jreiss 16:9bd6cacde447 189 /**
jreiss 16:9bd6cacde447 190 * Set the SxRadio rx config provided window
jreiss 16:9bd6cacde447 191 * @param window to be opened
jreiss 16:9bd6cacde447 192 * @param continuous keep window open
jreiss 16:9bd6cacde447 193 * @return LORA_OK
jreiss 16:9bd6cacde447 194 */
jreiss 16:9bd6cacde447 195 virtual uint8_t SetRxConfig(uint8_t window, bool continuous);
jreiss 16:9bd6cacde447 196
jreiss 16:9bd6cacde447 197 /**
jreiss 16:9bd6cacde447 198 * Set channel group if supported by plan
jreiss 16:9bd6cacde447 199 * @param group
jreiss 16:9bd6cacde447 200 * @return LORA_OK
jreiss 16:9bd6cacde447 201 */
jreiss 16:9bd6cacde447 202 virtual uint8_t SetChannelGroup(uint8_t group);
jreiss 16:9bd6cacde447 203
jreiss 16:9bd6cacde447 204 /**
jreiss 16:9bd6cacde447 205 * Get channel group if supported by plan
jreiss 16:9bd6cacde447 206 * @param group 0-8 or 0 if not supported
jreiss 16:9bd6cacde447 207 * @return LORA_OK
jreiss 16:9bd6cacde447 208 */
jreiss 16:9bd6cacde447 209 virtual uint8_t GetChannelGroup();
jreiss 16:9bd6cacde447 210
jreiss 16:9bd6cacde447 211 /**
jreiss 16:9bd6cacde447 212 * Reset the ack counter used to lower datarate if ACK's are missed
jreiss 16:9bd6cacde447 213 */
jreiss 16:9bd6cacde447 214 virtual void ResetAckCounter();
jreiss 16:9bd6cacde447 215
jreiss 16:9bd6cacde447 216 /**
jreiss 16:9bd6cacde447 217 * Callback for radio to request channel change when frequency hopping
jreiss 16:9bd6cacde447 218 * @param currentChannel
jreiss 16:9bd6cacde447 219 */
jreiss 16:9bd6cacde447 220 virtual void FhssChangeChannel(uint8_t currentChannel);
jreiss 16:9bd6cacde447 221
jreiss 16:9bd6cacde447 222 /**
jreiss 16:9bd6cacde447 223 * Callback for ACK timeout event
jreiss 16:9bd6cacde447 224 * @return LORA_OK
jreiss 16:9bd6cacde447 225 */
jreiss 16:9bd6cacde447 226 virtual uint8_t HandleAckTimeout();
jreiss 16:9bd6cacde447 227
jreiss 16:9bd6cacde447 228 /**
jreiss 16:9bd6cacde447 229 * Callback for Join Accept packet to load optional channels
jreiss 16:9bd6cacde447 230 * @return LORA_OK
jreiss 16:9bd6cacde447 231 */
jreiss 16:9bd6cacde447 232 virtual uint8_t HandleJoinAccept(const uint8_t* buffer, uint8_t size);
jreiss 16:9bd6cacde447 233
jreiss 16:9bd6cacde447 234 /**
jreiss 16:9bd6cacde447 235 * Callback to for rx parameter setup ServerCommand
jreiss 16:9bd6cacde447 236 * @param payload packet data
jreiss 16:9bd6cacde447 237 * @param index of start of command buffer
jreiss 16:9bd6cacde447 238 * @param size number of bytes in command buffer
jreiss 16:9bd6cacde447 239 * @param[out] status to be returned in MoteCommand answer
jreiss 16:9bd6cacde447 240 * @return LORA_OK
jreiss 16:9bd6cacde447 241 */
jreiss 16:9bd6cacde447 242 virtual uint8_t HandleRxParamSetup(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
jreiss 16:9bd6cacde447 243
jreiss 16:9bd6cacde447 244 /**
jreiss 16:9bd6cacde447 245 * Callback to for new channel ServerCommand
jreiss 16:9bd6cacde447 246 * @param payload packet data
jreiss 16:9bd6cacde447 247 * @param index of start of command buffer
jreiss 16:9bd6cacde447 248 * @param size number of bytes in command buffer
jreiss 16:9bd6cacde447 249 * @param[out] status to be returned in MoteCommand answer
jreiss 16:9bd6cacde447 250 * @return LORA_OK
jreiss 16:9bd6cacde447 251 */
jreiss 16:9bd6cacde447 252 virtual uint8_t HandleNewChannel(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
jreiss 16:9bd6cacde447 253
jreiss 16:9bd6cacde447 254 /**
jreiss 16:9bd6cacde447 255 * Callback to for ping slot channel request ServerCommand
jreiss 16:9bd6cacde447 256 * @param payload packet data
jreiss 16:9bd6cacde447 257 * @param index of start of command buffer
jreiss 16:9bd6cacde447 258 * @param size number of bytes in command buffer
jreiss 16:9bd6cacde447 259 * @param[out] status to be returned in MoteCommand answer
jreiss 16:9bd6cacde447 260 * @return LORA_OK
jreiss 16:9bd6cacde447 261 */
jreiss 16:9bd6cacde447 262 virtual uint8_t HandlePingSlotChannelReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
jreiss 16:9bd6cacde447 263
jreiss 16:9bd6cacde447 264 /**
jreiss 16:9bd6cacde447 265 * Callback to for beacon frequency request ServerCommand
jreiss 16:9bd6cacde447 266 * @param payload packet data
jreiss 16:9bd6cacde447 267 * @param index of start of command buffer
jreiss 16:9bd6cacde447 268 * @param size number of bytes in command buffer
jreiss 16:9bd6cacde447 269 * @param[out] status to be returned in MoteCommand answer
jreiss 16:9bd6cacde447 270 * @return LORA_OK
jreiss 16:9bd6cacde447 271 */
jreiss 16:9bd6cacde447 272 virtual uint8_t HandleBeaconFrequencyReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
jreiss 16:9bd6cacde447 273
jreiss 16:9bd6cacde447 274 /**
jreiss 16:9bd6cacde447 275 * Callback to for adaptive datarate ServerCommand
jreiss 16:9bd6cacde447 276 * @param payload packet data
jreiss 16:9bd6cacde447 277 * @param index of start of command buffer
jreiss 16:9bd6cacde447 278 * @param size number of bytes in command buffer
jreiss 16:9bd6cacde447 279 * @param[out] status to be returned in MoteCommand answer
jreiss 16:9bd6cacde447 280 * @return LORA_OK
jreiss 16:9bd6cacde447 281 */
jreiss 16:9bd6cacde447 282 virtual uint8_t HandleAdrCommand(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
jreiss 16:9bd6cacde447 283
jreiss 16:9bd6cacde447 284 /**
jreiss 16:9bd6cacde447 285 * Check that Rf Frequency is within channel plan range
jreiss 16:9bd6cacde447 286 * @param freq frequency in Hz
jreiss 16:9bd6cacde447 287 * @return true if valid frequency
jreiss 16:9bd6cacde447 288 */
jreiss 16:9bd6cacde447 289 virtual bool CheckRfFrequency(uint32_t freq);
jreiss 16:9bd6cacde447 290
jreiss 16:9bd6cacde447 291 /**
jreiss 16:9bd6cacde447 292 * Flag for ADR
jreiss 16:9bd6cacde447 293 * @return true if ADR is enable in settings
jreiss 16:9bd6cacde447 294 */
jreiss 16:9bd6cacde447 295 virtual bool IsAdrEnabled();
jreiss 16:9bd6cacde447 296
jreiss 16:9bd6cacde447 297 /**
jreiss 16:9bd6cacde447 298 * Flag if ADR ACK should be sent in next packet
jreiss 16:9bd6cacde447 299 * @return true when flag should be set
jreiss 16:9bd6cacde447 300 */
jreiss 16:9bd6cacde447 301 virtual bool AdrAckReq();
jreiss 16:9bd6cacde447 302
jreiss 16:9bd6cacde447 303 /**
jreiss 16:9bd6cacde447 304 * Increment the ADR counter to track when ADR ACK request should be sent
jreiss 16:9bd6cacde447 305 * @return current value
jreiss 16:9bd6cacde447 306 */
jreiss 16:9bd6cacde447 307 virtual uint8_t IncAdrCounter();
jreiss 16:9bd6cacde447 308
jreiss 16:9bd6cacde447 309 /**
jreiss 16:9bd6cacde447 310 * Reset the ADR counter when valid downlink is received from network server
jreiss 16:9bd6cacde447 311 */
jreiss 16:9bd6cacde447 312 virtual void ResetAdrCounter();
jreiss 16:9bd6cacde447 313
jreiss 16:9bd6cacde447 314 /**
jreiss 16:9bd6cacde447 315 * Get the time the radio must be off air to comply with regulations
jreiss 16:9bd6cacde447 316 * Time to wait may be dependent on duty-cycle restrictions per channel
jreiss 16:9bd6cacde447 317 * Or duty-cycle of join requests if OTAA is being attempted
jreiss 16:9bd6cacde447 318 * @return ms of time to wait for next tx opportunity
jreiss 16:9bd6cacde447 319 */
jreiss 16:9bd6cacde447 320 virtual uint32_t GetTimeOffAir();
jreiss 16:9bd6cacde447 321
jreiss 16:9bd6cacde447 322 /**
jreiss 16:9bd6cacde447 323 * Get the channels in use by current channel plan
jreiss 16:9bd6cacde447 324 * @return channel frequencies
jreiss 16:9bd6cacde447 325 */
jreiss 16:9bd6cacde447 326 virtual std::vector<uint32_t> GetChannels();
jreiss 16:9bd6cacde447 327
jreiss 16:9bd6cacde447 328 /**
jreiss 16:9bd6cacde447 329 * Get the channel datarate ranges in use by current channel plan
jreiss 16:9bd6cacde447 330 * @return channel datarate ranges
jreiss 16:9bd6cacde447 331 */
jreiss 16:9bd6cacde447 332 virtual std::vector<uint8_t> GetChannelRanges();
jreiss 16:9bd6cacde447 333
jreiss 16:9bd6cacde447 334 /**
jreiss 16:9bd6cacde447 335 * Set the time off air for the given duty band
jreiss 16:9bd6cacde447 336 * @param band index
jreiss 16:9bd6cacde447 337 * @param time off air in ms
jreiss 16:9bd6cacde447 338 */
jreiss 16:9bd6cacde447 339 virtual void SetDutyBandTimeOff(uint8_t band, uint32_t timeoff);
jreiss 16:9bd6cacde447 340
jreiss 16:9bd6cacde447 341 /**
jreiss 16:9bd6cacde447 342 * Get the time off air for the given duty band
jreiss 16:9bd6cacde447 343 * @param band index
jreiss 16:9bd6cacde447 344 * @return time off air in ms
jreiss 16:9bd6cacde447 345 */
jreiss 16:9bd6cacde447 346 virtual uint32_t GetDutyBandTimeOff(uint8_t band);
jreiss 16:9bd6cacde447 347
jreiss 16:9bd6cacde447 348 /**
jreiss 16:9bd6cacde447 349 * Get the number of duty bands in the current channel plan
jreiss 16:9bd6cacde447 350 * @return number of bands
jreiss 16:9bd6cacde447 351 */
jreiss 16:9bd6cacde447 352 virtual uint8_t GetNumDutyBands();
jreiss 16:9bd6cacde447 353
jreiss 16:9bd6cacde447 354 /**
jreiss 16:9bd6cacde447 355 * Get the duty band index for the given frequency
jreiss 16:9bd6cacde447 356 * @param freq frequency in Hz
jreiss 16:9bd6cacde447 357 * @return index of duty band
jreiss 16:9bd6cacde447 358 */
jreiss 16:9bd6cacde447 359 virtual int8_t GetDutyBand(uint32_t freq);
jreiss 16:9bd6cacde447 360
jreiss 16:9bd6cacde447 361 /**
jreiss 16:9bd6cacde447 362 * Add duty band
jreiss 16:9bd6cacde447 363 * @param index of duty band or -1 to append
jreiss 16:9bd6cacde447 364 * @param band DutyBand definition
jreiss 16:9bd6cacde447 365 * @return LORA_OK
jreiss 16:9bd6cacde447 366 */
jreiss 16:9bd6cacde447 367 virtual uint8_t AddDutyBand(int8_t index, DutyBand band);
jreiss 16:9bd6cacde447 368
jreiss 16:9bd6cacde447 369 /**
jreiss 16:9bd6cacde447 370 * Update duty cycle with current settings
jreiss 16:9bd6cacde447 371 */
jreiss 16:9bd6cacde447 372 virtual void UpdateDutyCycle(uint8_t bytes);
jreiss 16:9bd6cacde447 373
jreiss 16:9bd6cacde447 374 /**
jreiss 16:9bd6cacde447 375 * Update duty cycle with at given frequency and time on air
jreiss 16:9bd6cacde447 376 * @param freq frequency
jreiss 16:9bd6cacde447 377 * @param time_on_air_ms tx time on air
jreiss 16:9bd6cacde447 378 */
jreiss 16:9bd6cacde447 379 virtual void UpdateDutyCycle(uint32_t freq, uint32_t time_on_air_ms);
jreiss 16:9bd6cacde447 380
jreiss 16:9bd6cacde447 381 /**
jreiss 16:9bd6cacde447 382 * Get time on air with current settings
jreiss 16:9bd6cacde447 383 * @param bytes number of bytes to be sent
jreiss 16:9bd6cacde447 384 */
jreiss 16:9bd6cacde447 385 virtual uint32_t GetTimeOnAir(uint8_t bytes);
jreiss 16:9bd6cacde447 386
jreiss 16:9bd6cacde447 387 /**
jreiss 16:9bd6cacde447 388 * Reset the duty timers with the current time off air
jreiss 16:9bd6cacde447 389 */
jreiss 16:9bd6cacde447 390 virtual void ResetDutyCycleTimer();
jreiss 16:9bd6cacde447 391
jreiss 16:9bd6cacde447 392 /**
jreiss 16:9bd6cacde447 393 * Print log message for given rx window
jreiss 16:9bd6cacde447 394 * @param wnd 1 or 2
jreiss 16:9bd6cacde447 395 */
jreiss 16:9bd6cacde447 396 virtual void LogRxWindow(uint8_t wnd);
jreiss 16:9bd6cacde447 397
jreiss 16:9bd6cacde447 398 /**
jreiss 16:9bd6cacde447 399 * Indicator of P2P mode
jreiss 16:9bd6cacde447 400 * @return true if enabled
jreiss 16:9bd6cacde447 401 */
jreiss 16:9bd6cacde447 402 virtual bool P2PEnabled();
jreiss 16:9bd6cacde447 403
jreiss 16:9bd6cacde447 404 /**
jreiss 16:9bd6cacde447 405 * Ack timeout for P2P mode
jreiss 16:9bd6cacde447 406 * @return timeout in ms
jreiss 16:9bd6cacde447 407 */
jreiss 16:9bd6cacde447 408 virtual uint16_t P2PTimeout();
jreiss 16:9bd6cacde447 409
jreiss 16:9bd6cacde447 410 /**
jreiss 16:9bd6cacde447 411 * Ack backoff for P2P mode
jreiss 16:9bd6cacde447 412 * @return backoff in ms
jreiss 16:9bd6cacde447 413 */
jreiss 16:9bd6cacde447 414 virtual uint16_t P2PBackoff();
jreiss 16:9bd6cacde447 415
jreiss 16:9bd6cacde447 416 /**
jreiss 16:9bd6cacde447 417 * Enable the default channels of the channel plan
jreiss 16:9bd6cacde447 418 */
jreiss 16:9bd6cacde447 419 virtual void EnableDefaultChannels();
jreiss 16:9bd6cacde447 420
jreiss 16:9bd6cacde447 421 /**
jreiss 16:9bd6cacde447 422 * Callback for radio thread to signal
jreiss 16:9bd6cacde447 423 */
jreiss 16:9bd6cacde447 424 virtual void MacEvent();
jreiss 16:9bd6cacde447 425
jreiss 16:9bd6cacde447 426 virtual void DecrementDatarate();
jreiss 16:9bd6cacde447 427 virtual void IncrementDatarate();
jreiss 16:9bd6cacde447 428
jreiss 16:9bd6cacde447 429 protected:
jreiss 16:9bd6cacde447 430
jreiss 16:9bd6cacde447 431 SxRadio& _radio; //!< Injected SxRadio dependency
jreiss 16:9bd6cacde447 432 Settings& _settings; //!< Current settings
jreiss 16:9bd6cacde447 433
jreiss 16:9bd6cacde447 434 uint8_t _txChannel; //!< Current channel for transmit
jreiss 16:9bd6cacde447 435 uint8_t _txChannelGroup; //!< Current channel group for hybrid operation
jreiss 16:9bd6cacde447 436
jreiss 16:9bd6cacde447 437 std::vector<Datarate> _datarates; //!< List of datarates
jreiss 16:9bd6cacde447 438
jreiss 16:9bd6cacde447 439 std::vector<Channel> _channels; //!< List of channels for transmit
jreiss 16:9bd6cacde447 440
jreiss 16:9bd6cacde447 441 std::vector<DutyBand> _dutyBands; //!< List of duty bands to limit radio time on air
jreiss 16:9bd6cacde447 442
jreiss 16:9bd6cacde447 443 uint8_t _maxTxPower; //!< Max Tx power for channel Plan
jreiss 16:9bd6cacde447 444 uint8_t _minTxPower;
jreiss 16:9bd6cacde447 445
jreiss 16:9bd6cacde447 446 uint32_t _minFrequency; //!< Minimum Frequency
jreiss 16:9bd6cacde447 447 uint32_t _maxFrequency; //!< Maximum Frequency
jreiss 16:9bd6cacde447 448
jreiss 16:9bd6cacde447 449 Channel _beaconChannel; //!< Beacon window settings
jreiss 16:9bd6cacde447 450 Channel _beaconRxChannel; //!< Beacon slot rx window settings
jreiss 16:9bd6cacde447 451
jreiss 16:9bd6cacde447 452 uint8_t _minDatarate; //!< Minimum datarate to accept in ADR request
jreiss 16:9bd6cacde447 453 uint8_t _maxDatarate; //!< Maximum datarate to accept in ADR request
jreiss 16:9bd6cacde447 454
jreiss 16:9bd6cacde447 455 uint8_t _minRx2Datarate; //!< Minimum datarate to accept in for Rx2
jreiss 16:9bd6cacde447 456 uint8_t _maxRx2Datarate; //!< Maximum datarate to accept in for Rx2
jreiss 16:9bd6cacde447 457 uint8_t _minDatarateOffset; //!< Minimum datarate offset to accept
jreiss 16:9bd6cacde447 458 uint8_t _maxDatarateOffset; //!< Maximum datarate offset to accept
jreiss 16:9bd6cacde447 459
jreiss 16:9bd6cacde447 460 uint32_t _freqUBase125k; //!< Start of 125K uplink channels
jreiss 16:9bd6cacde447 461 uint32_t _freqUStep125k; //!< Step between 125K uplink channels
jreiss 16:9bd6cacde447 462 uint32_t _freqUBase500k; //!< Start of 500K uplink channels
jreiss 16:9bd6cacde447 463 uint32_t _freqUStep500k; //!< Step between 500K uplink channels
jreiss 16:9bd6cacde447 464 uint32_t _freqDBase500k; //!< Start of 500K downlink channels
jreiss 16:9bd6cacde447 465 uint32_t _freqDStep500k; //!< Step between 500K downlink channels
jreiss 16:9bd6cacde447 466
jreiss 16:9bd6cacde447 467 uint8_t _numChans; //!< Number of total channels in plan
jreiss 16:9bd6cacde447 468 uint8_t _numChans125k; //!< Number of 125K channels in plan
jreiss 16:9bd6cacde447 469 uint8_t _numChans500k; //!< Number of 500K channels in plan
jreiss 16:9bd6cacde447 470
jreiss 16:9bd6cacde447 471 std::vector<uint16_t> _channelMask; //!< Bit mask for currently enabled channels
jreiss 16:9bd6cacde447 472
jreiss 16:9bd6cacde447 473 Timer _dutyCycleTimer; //!< Timer for tracking time-off-air
jreiss 16:9bd6cacde447 474 RtosTimer _txDutyTimer; //!< Event timer for expiration of time-off-air
jreiss 16:9bd6cacde447 475
jreiss 16:9bd6cacde447 476 bool _txDutyCyclePending; //!< Flag for pending duty cycle event
jreiss 16:9bd6cacde447 477
jreiss 16:9bd6cacde447 478 static void OnTxDutyCycleEvent(const void* arg); //!< Rtos callback for duty cycle event
jreiss 16:9bd6cacde447 479 void OnTxDutyCycleEventBottom(); //!< Callback for duty cycle event
jreiss 16:9bd6cacde447 480
jreiss 16:9bd6cacde447 481 static const uint8_t* TX_POWERS; //!< List of available tx powers
jreiss 16:9bd6cacde447 482 static const uint8_t* RADIO_POWERS; //!< List of available tx powers
jreiss 16:9bd6cacde447 483 static const uint8_t* MAX_PAYLOAD_SIZE; //!< List of max payload sizes for each datarate
jreiss 16:9bd6cacde447 484 static const uint8_t* MAX_PAYLOAD_SIZE_REPEATER; //!< List of repeater compatible max payload sizes for each datarate
jreiss 16:9bd6cacde447 485
jreiss 16:9bd6cacde447 486 static const uint8_t EU868_TX_POWERS[6]; //!< List of available tx powers
jreiss 16:9bd6cacde447 487 static const uint8_t EU868_RADIO_POWERS[21]; //!< List of calibrated tx powers
jreiss 16:9bd6cacde447 488 static const uint8_t EU868_MAX_PAYLOAD_SIZE[]; //!< List of max payload sizes for each datarate
jreiss 16:9bd6cacde447 489 static const uint8_t EU868_MAX_PAYLOAD_SIZE_REPEATER[]; //!< List of repeater compatible max payload sizes for each datarate
jreiss 16:9bd6cacde447 490
jreiss 16:9bd6cacde447 491 static const uint8_t US915_TX_POWERS[11]; //!< List of available tx powers
jreiss 16:9bd6cacde447 492 static const uint8_t US915_RADIO_POWERS[21]; //!< List of calibrated tx powers
jreiss 16:9bd6cacde447 493 static const uint8_t US915_MAX_PAYLOAD_SIZE[]; //!< List of max payload sizes for each datarate
jreiss 16:9bd6cacde447 494 static const uint8_t US915_MAX_PAYLOAD_SIZE_REPEATER[]; //!< List of repeater compatible max payload sizes for each datarate
jreiss 16:9bd6cacde447 495
jreiss 16:9bd6cacde447 496 static const uint8_t AU915_TX_POWERS[11]; //!< List of available tx powers
jreiss 16:9bd6cacde447 497 static const uint8_t AU915_RADIO_POWERS[21]; //!< List of calibrated tx powers
jreiss 16:9bd6cacde447 498 static const uint8_t AU915_MAX_PAYLOAD_SIZE[]; //!< List of max payload sizes for each datarate
jreiss 16:9bd6cacde447 499 static const uint8_t AU915_MAX_PAYLOAD_SIZE_REPEATER[]; //!< List of repeater compatible max payload sizes for each datarate
jreiss 16:9bd6cacde447 500 };
jreiss 16:9bd6cacde447 501 }
jreiss 16:9bd6cacde447 502
jreiss 16:9bd6cacde447 503 #endif
jreiss 16:9bd6cacde447 504