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:
Sat Sep 17 18:00:18 2016 +0000
Revision:
18:aa39c917aa3f
Parent:
16:9bd6cacde447
Child:
21:f77f883a080e
update library archive; change license notice in EU868.cpp and US915.cpp

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