MultiTech / libxDot-Custom

Fork of libxDot-dev-mbed5-deprecated by MultiTech

The Connect example can be used as a starting point for an xDot application.

Import programmDot_LoRa_Connect_Example_CUSTOM_AS923

Example configuration of frequencies and datarates for AS923 channel plan.

Change the libmDot-Custom library to libxDot-Custom after importing the above example.

Change the platform for the project to xDot in upper right corner of the compiler page.

Ensure the mbed-os version matches the with the library commit.

Currently the AT Firmware cannot be built online for the xDot.

Creating new channel plans

Copy EU868 or US915 custom channel plan as a starting point

Import librarymDot_Channel_Plans

Channel plans to enable libmDot-Custom

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:
Thu Mar 16 13:23:56 2017 +0000
Revision:
28:3234d66ebb05
Parent:
26:15bf2e4ee3d0
remove weak attribute from printMessage

Who changed what in which revision?

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