khang_91

Committer:
nguyenhoang9x5555
Date:
Tue Jun 23 07:26:42 2020 +0000
Revision:
183:16414698889c
phienbanthunghiem

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nguyenhoang9x5555 183:16414698889c 1 /** __ ___ ____ _ ______ __ ____ __ ____
nguyenhoang9x5555 183:16414698889c 2 * / |/ /_ __/ / /_(_)__/_ __/__ ____/ / / __/_ _____ / /____ __ _ ___ / _/__ ____
nguyenhoang9x5555 183:16414698889c 3 * / /|_/ / // / / __/ /___// / / -_) __/ _ \ _\ \/ // (_-</ __/ -_) ' \(_-< _/ // _ \/ __/ __
nguyenhoang9x5555 183:16414698889c 4 * /_/ /_/\_,_/_/\__/_/ /_/ \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/
nguyenhoang9x5555 183:16414698889c 5 * Copyright (C) 2015 by Multi-Tech Systems /___/
nguyenhoang9x5555 183:16414698889c 6 *
nguyenhoang9x5555 183:16414698889c 7 *
nguyenhoang9x5555 183:16414698889c 8 * @author Jason Reiss
nguyenhoang9x5555 183:16414698889c 9 * @date 10-31-2015
nguyenhoang9x5555 183:16414698889c 10 * @brief lora::ChannelPlan provides an interface for LoRaWAN channel schemes
nguyenhoang9x5555 183:16414698889c 11 *
nguyenhoang9x5555 183:16414698889c 12 * @details
nguyenhoang9x5555 183:16414698889c 13 *
nguyenhoang9x5555 183:16414698889c 14 */
nguyenhoang9x5555 183:16414698889c 15
nguyenhoang9x5555 183:16414698889c 16 #ifndef __CHANNEL_PLAN_VI919_H__
nguyenhoang9x5555 183:16414698889c 17 #define __CHANNEL_PLAN_VI919_H__
nguyenhoang9x5555 183:16414698889c 18
nguyenhoang9x5555 183:16414698889c 19 #include "Lora.h"
nguyenhoang9x5555 183:16414698889c 20 #include "SxRadio.h"
nguyenhoang9x5555 183:16414698889c 21 #include <vector>
nguyenhoang9x5555 183:16414698889c 22 #include "ChannelPlan.h"
nguyenhoang9x5555 183:16414698889c 23
nguyenhoang9x5555 183:16414698889c 24 namespace lora {
nguyenhoang9x5555 183:16414698889c 25
nguyenhoang9x5555 183:16414698889c 26 const uint8_t VI919_125K_NUM_CHANS = 16; //!< Number of 125k channels in VI919 channel plan
nguyenhoang9x5555 183:16414698889c 27 const uint8_t VI919_DEFAULT_NUM_CHANS = 2; //!< Number of default channels in VI919 channel plan
nguyenhoang9x5555 183:16414698889c 28 const uint32_t VI919_125K_FREQ_BASE = 923200000; //!< Frequency base for 125k VI919 uplink channels
nguyenhoang9x5555 183:16414698889c 29 const uint32_t VI919_125K_FREQ_STEP = 200000; //!< Frequency step for 125k VI919 uplink channels
nguyenhoang9x5555 183:16414698889c 30 const uint32_t VI919_RX2_FREQ = 923200000; //!< Frequency default for second rx window in VI919
nguyenhoang9x5555 183:16414698889c 31 const uint8_t VI919_BEACON_DR = DR_3; //!< Default beacon datarate
nguyenhoang9x5555 183:16414698889c 32 const uint32_t VI919_BEACON_FREQ = 923400000U; //!< Default beacon broadcast frequency
nguyenhoang9x5555 183:16414698889c 33
nguyenhoang9x5555 183:16414698889c 34 class ChannelPlan_VI919: public lora::ChannelPlan {
nguyenhoang9x5555 183:16414698889c 35 public:
nguyenhoang9x5555 183:16414698889c 36 /**
nguyenhoang9x5555 183:16414698889c 37 * ChannelPlan constructor
nguyenhoang9x5555 183:16414698889c 38 * @param radio SxRadio object used to set Tx/Rx config
nguyenhoang9x5555 183:16414698889c 39 * @param settings Settings object
nguyenhoang9x5555 183:16414698889c 40 */
nguyenhoang9x5555 183:16414698889c 41 ChannelPlan_VI919();
nguyenhoang9x5555 183:16414698889c 42 ChannelPlan_VI919(Settings* settings);
nguyenhoang9x5555 183:16414698889c 43 ChannelPlan_VI919(SxRadio* radio, Settings* settings);
nguyenhoang9x5555 183:16414698889c 44
nguyenhoang9x5555 183:16414698889c 45 /**
nguyenhoang9x5555 183:16414698889c 46 * ChannelPlan destructor
nguyenhoang9x5555 183:16414698889c 47 */
nguyenhoang9x5555 183:16414698889c 48 virtual ~ChannelPlan_VI919();
nguyenhoang9x5555 183:16414698889c 49
nguyenhoang9x5555 183:16414698889c 50 /**
nguyenhoang9x5555 183:16414698889c 51 * Initialize channels, datarates and duty cycle bands according to current channel plan in settings
nguyenhoang9x5555 183:16414698889c 52 */
nguyenhoang9x5555 183:16414698889c 53 virtual void Init();
nguyenhoang9x5555 183:16414698889c 54
nguyenhoang9x5555 183:16414698889c 55 /**
nguyenhoang9x5555 183:16414698889c 56 * Get the next channel to use to transmit
nguyenhoang9x5555 183:16414698889c 57 * @return LORA_OK if channel was found
nguyenhoang9x5555 183:16414698889c 58 * @return LORA_NO_CHANS_ENABLED
nguyenhoang9x5555 183:16414698889c 59 */
nguyenhoang9x5555 183:16414698889c 60 virtual uint8_t GetNextChannel();
nguyenhoang9x5555 183:16414698889c 61
nguyenhoang9x5555 183:16414698889c 62 /**
nguyenhoang9x5555 183:16414698889c 63 * Add a channel to the ChannelPlan
nguyenhoang9x5555 183:16414698889c 64 * @param index of channel, use -1 to add to end
nguyenhoang9x5555 183:16414698889c 65 * @param channel settings to add
nguyenhoang9x5555 183:16414698889c 66 */
nguyenhoang9x5555 183:16414698889c 67 virtual uint8_t AddChannel(int8_t index, Channel channel);
nguyenhoang9x5555 183:16414698889c 68
nguyenhoang9x5555 183:16414698889c 69 /**
nguyenhoang9x5555 183:16414698889c 70 * Get channel at index
nguyenhoang9x5555 183:16414698889c 71 * @return Channel
nguyenhoang9x5555 183:16414698889c 72 */
nguyenhoang9x5555 183:16414698889c 73 virtual Channel GetChannel(int8_t index);
nguyenhoang9x5555 183:16414698889c 74
nguyenhoang9x5555 183:16414698889c 75 /**
nguyenhoang9x5555 183:16414698889c 76 * Get rx window settings for requested window
nguyenhoang9x5555 183:16414698889c 77 * RX_1, RX_2, RX_BEACON, RX_SLOT
nguyenhoang9x5555 183:16414698889c 78 * @param window
nguyenhoang9x5555 183:16414698889c 79 * @return RxWindow
nguyenhoang9x5555 183:16414698889c 80 */
nguyenhoang9x5555 183:16414698889c 81 virtual RxWindow GetRxWindow(uint8_t window);
nguyenhoang9x5555 183:16414698889c 82
nguyenhoang9x5555 183:16414698889c 83 /**
nguyenhoang9x5555 183:16414698889c 84 * Get datarate to use on the join request
nguyenhoang9x5555 183:16414698889c 85 * @return datarate index
nguyenhoang9x5555 183:16414698889c 86 */
nguyenhoang9x5555 183:16414698889c 87 virtual uint8_t GetJoinDatarate();
nguyenhoang9x5555 183:16414698889c 88
nguyenhoang9x5555 183:16414698889c 89 /**
nguyenhoang9x5555 183:16414698889c 90 * Calculate the next time a join request is possible
nguyenhoang9x5555 183:16414698889c 91 * @param size of join frame
nguyenhoang9x5555 183:16414698889c 92 * @returns LORA_OK
nguyenhoang9x5555 183:16414698889c 93 */
nguyenhoang9x5555 183:16414698889c 94 virtual uint8_t CalculateJoinBackoff(uint8_t size);
nguyenhoang9x5555 183:16414698889c 95
nguyenhoang9x5555 183:16414698889c 96 /**
nguyenhoang9x5555 183:16414698889c 97 * Get next channel and set the SxRadio tx config with current settings
nguyenhoang9x5555 183:16414698889c 98 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 99 */
nguyenhoang9x5555 183:16414698889c 100 virtual uint8_t SetTxConfig();
nguyenhoang9x5555 183:16414698889c 101
nguyenhoang9x5555 183:16414698889c 102 /**
nguyenhoang9x5555 183:16414698889c 103 * Set the SxRadio rx config provided window
nguyenhoang9x5555 183:16414698889c 104 * @param window to be opened
nguyenhoang9x5555 183:16414698889c 105 * @param continuous keep window open
nguyenhoang9x5555 183:16414698889c 106 * @param wnd_growth factor to increase the rx window by
nguyenhoang9x5555 183:16414698889c 107 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 108 */
nguyenhoang9x5555 183:16414698889c 109 virtual uint8_t SetRxConfig(uint8_t window, bool continuous, uint16_t wnd_growth);
nguyenhoang9x5555 183:16414698889c 110
nguyenhoang9x5555 183:16414698889c 111 /**
nguyenhoang9x5555 183:16414698889c 112 * Set frequency sub band if supported by plan
nguyenhoang9x5555 183:16414698889c 113 * @param sub_band
nguyenhoang9x5555 183:16414698889c 114 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 115 */
nguyenhoang9x5555 183:16414698889c 116 virtual uint8_t SetFrequencySubBand(uint8_t sub_band);
nguyenhoang9x5555 183:16414698889c 117
nguyenhoang9x5555 183:16414698889c 118 /**
nguyenhoang9x5555 183:16414698889c 119 * Callback for ACK timeout event
nguyenhoang9x5555 183:16414698889c 120 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 121 */
nguyenhoang9x5555 183:16414698889c 122 virtual uint8_t HandleAckTimeout();
nguyenhoang9x5555 183:16414698889c 123
nguyenhoang9x5555 183:16414698889c 124 /**
nguyenhoang9x5555 183:16414698889c 125 * Callback for Join Accept packet to load optional channels
nguyenhoang9x5555 183:16414698889c 126 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 127 */
nguyenhoang9x5555 183:16414698889c 128 virtual uint8_t HandleJoinAccept(const uint8_t* buffer, uint8_t size);
nguyenhoang9x5555 183:16414698889c 129
nguyenhoang9x5555 183:16414698889c 130 /**
nguyenhoang9x5555 183:16414698889c 131 * Callback to for rx parameter setup ServerCommand
nguyenhoang9x5555 183:16414698889c 132 * @param payload packet data
nguyenhoang9x5555 183:16414698889c 133 * @param index of start of command buffer
nguyenhoang9x5555 183:16414698889c 134 * @param size number of bytes in command buffer
nguyenhoang9x5555 183:16414698889c 135 * @param[out] status to be returned in MoteCommand answer
nguyenhoang9x5555 183:16414698889c 136 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 137 */
nguyenhoang9x5555 183:16414698889c 138 virtual uint8_t HandleRxParamSetup(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
nguyenhoang9x5555 183:16414698889c 139
nguyenhoang9x5555 183:16414698889c 140 /**
nguyenhoang9x5555 183:16414698889c 141 * Callback to for new channel ServerCommand
nguyenhoang9x5555 183:16414698889c 142 * @param payload packet data
nguyenhoang9x5555 183:16414698889c 143 * @param index of start of command buffer
nguyenhoang9x5555 183:16414698889c 144 * @param size number of bytes in command buffer
nguyenhoang9x5555 183:16414698889c 145 * @param[out] status to be returned in MoteCommand answer
nguyenhoang9x5555 183:16414698889c 146 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 147 */
nguyenhoang9x5555 183:16414698889c 148 virtual uint8_t HandleNewChannel(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
nguyenhoang9x5555 183:16414698889c 149
nguyenhoang9x5555 183:16414698889c 150 /**
nguyenhoang9x5555 183:16414698889c 151 * Callback to for ping slot channel request ServerCommand
nguyenhoang9x5555 183:16414698889c 152 * @param payload packet data
nguyenhoang9x5555 183:16414698889c 153 * @param index of start of command buffer
nguyenhoang9x5555 183:16414698889c 154 * @param size number of bytes in command buffer
nguyenhoang9x5555 183:16414698889c 155 * @param[out] status to be returned in MoteCommand answer
nguyenhoang9x5555 183:16414698889c 156 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 157 */
nguyenhoang9x5555 183:16414698889c 158 virtual uint8_t HandlePingSlotChannelReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
nguyenhoang9x5555 183:16414698889c 159
nguyenhoang9x5555 183:16414698889c 160 /**
nguyenhoang9x5555 183:16414698889c 161 * Callback to for beacon frequency request ServerCommand
nguyenhoang9x5555 183:16414698889c 162 * @param payload packet data
nguyenhoang9x5555 183:16414698889c 163 * @param index of start of command buffer
nguyenhoang9x5555 183:16414698889c 164 * @param size number of bytes in command buffer
nguyenhoang9x5555 183:16414698889c 165 * @param[out] status to be returned in MoteCommand answer
nguyenhoang9x5555 183:16414698889c 166 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 167 */
nguyenhoang9x5555 183:16414698889c 168 virtual uint8_t HandleBeaconFrequencyReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
nguyenhoang9x5555 183:16414698889c 169
nguyenhoang9x5555 183:16414698889c 170 /**
nguyenhoang9x5555 183:16414698889c 171 * Callback to for adaptive datarate ServerCommand
nguyenhoang9x5555 183:16414698889c 172 * @param payload packet data
nguyenhoang9x5555 183:16414698889c 173 * @param index of start of command buffer
nguyenhoang9x5555 183:16414698889c 174 * @param size number of bytes in command buffer
nguyenhoang9x5555 183:16414698889c 175 * @param[out] status to be returned in MoteCommand answer
nguyenhoang9x5555 183:16414698889c 176 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 177 */
nguyenhoang9x5555 183:16414698889c 178 virtual uint8_t HandleAdrCommand(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status);
nguyenhoang9x5555 183:16414698889c 179
nguyenhoang9x5555 183:16414698889c 180 /**
nguyenhoang9x5555 183:16414698889c 181 * Validate the configuration after multiple ADR commands have been applied
nguyenhoang9x5555 183:16414698889c 182 * @return status to be returned in MoteCommand answer
nguyenhoang9x5555 183:16414698889c 183 */
nguyenhoang9x5555 183:16414698889c 184 virtual uint8_t ValidateAdrConfiguration();
nguyenhoang9x5555 183:16414698889c 185
nguyenhoang9x5555 183:16414698889c 186 /**
nguyenhoang9x5555 183:16414698889c 187 * Update duty cycle with at given frequency and time on air
nguyenhoang9x5555 183:16414698889c 188 * @param freq frequency
nguyenhoang9x5555 183:16414698889c 189 * @param time_on_air_ms tx time on air
nguyenhoang9x5555 183:16414698889c 190 */
nguyenhoang9x5555 183:16414698889c 191 virtual void UpdateDutyCycle(uint32_t freq, uint32_t time_on_air_ms);
nguyenhoang9x5555 183:16414698889c 192
nguyenhoang9x5555 183:16414698889c 193 /**
nguyenhoang9x5555 183:16414698889c 194 * Get the time the radio must be off air to comply with regulations
nguyenhoang9x5555 183:16414698889c 195 * Time to wait may be dependent on duty-cycle restrictions per channel
nguyenhoang9x5555 183:16414698889c 196 * Or duty-cycle of join requests if OTAA is being attempted
nguyenhoang9x5555 183:16414698889c 197 * @return ms of time to wait for next tx opportunity
nguyenhoang9x5555 183:16414698889c 198 */
nguyenhoang9x5555 183:16414698889c 199 virtual uint32_t GetTimeOffAir();
nguyenhoang9x5555 183:16414698889c 200
nguyenhoang9x5555 183:16414698889c 201 /**
nguyenhoang9x5555 183:16414698889c 202 * Get the channels in use by current channel plan
nguyenhoang9x5555 183:16414698889c 203 * @return channel frequencies
nguyenhoang9x5555 183:16414698889c 204 */
nguyenhoang9x5555 183:16414698889c 205 virtual std::vector<uint32_t> GetChannels();
nguyenhoang9x5555 183:16414698889c 206
nguyenhoang9x5555 183:16414698889c 207 /**
nguyenhoang9x5555 183:16414698889c 208 * Get the channel datarate ranges in use by current channel plan
nguyenhoang9x5555 183:16414698889c 209 * @return channel datarate ranges
nguyenhoang9x5555 183:16414698889c 210 */
nguyenhoang9x5555 183:16414698889c 211 virtual std::vector<uint8_t> GetChannelRanges();
nguyenhoang9x5555 183:16414698889c 212
nguyenhoang9x5555 183:16414698889c 213 /**
nguyenhoang9x5555 183:16414698889c 214 * Print log message for given rx window
nguyenhoang9x5555 183:16414698889c 215 * @param wnd 1 or 2
nguyenhoang9x5555 183:16414698889c 216 */
nguyenhoang9x5555 183:16414698889c 217 virtual void LogRxWindow(uint8_t wnd);
nguyenhoang9x5555 183:16414698889c 218
nguyenhoang9x5555 183:16414698889c 219 /**
nguyenhoang9x5555 183:16414698889c 220 * Enable the default channels of the channel plan
nguyenhoang9x5555 183:16414698889c 221 */
nguyenhoang9x5555 183:16414698889c 222 virtual void EnableDefaultChannels();
nguyenhoang9x5555 183:16414698889c 223
nguyenhoang9x5555 183:16414698889c 224 /**
nguyenhoang9x5555 183:16414698889c 225 * Called when MAC layer doesn't know about a command.
nguyenhoang9x5555 183:16414698889c 226 * Use to add custom or new mac command handling
nguyenhoang9x5555 183:16414698889c 227 * @return LORA_OK
nguyenhoang9x5555 183:16414698889c 228 */
nguyenhoang9x5555 183:16414698889c 229 virtual uint8_t HandleMacCommand(uint8_t* payload, uint8_t& index);
nguyenhoang9x5555 183:16414698889c 230
nguyenhoang9x5555 183:16414698889c 231 /**
nguyenhoang9x5555 183:16414698889c 232 * Get max payload size for current datarate
nguyenhoang9x5555 183:16414698889c 233 * @return size in bytes
nguyenhoang9x5555 183:16414698889c 234 */
nguyenhoang9x5555 183:16414698889c 235 virtual uint8_t GetMaxPayloadSize();
nguyenhoang9x5555 183:16414698889c 236
nguyenhoang9x5555 183:16414698889c 237 /**
nguyenhoang9x5555 183:16414698889c 238 * Decrements the datarate based on TxDwellTime
nguyenhoang9x5555 183:16414698889c 239 */
nguyenhoang9x5555 183:16414698889c 240 virtual void DecrementDatarate();
nguyenhoang9x5555 183:16414698889c 241
nguyenhoang9x5555 183:16414698889c 242 /**
nguyenhoang9x5555 183:16414698889c 243 * Check if this packet is a beacon and if so extract parameters needed
nguyenhoang9x5555 183:16414698889c 244 * @param payload of potential beacon
nguyenhoang9x5555 183:16414698889c 245 * @param size of the packet
nguyenhoang9x5555 183:16414698889c 246 * @param [out] data extracted from the beacon if this packet was indeed a beacon
nguyenhoang9x5555 183:16414698889c 247 * @return true if this packet is beacon, false if not
nguyenhoang9x5555 183:16414698889c 248 */
nguyenhoang9x5555 183:16414698889c 249 virtual bool DecodeBeacon(const uint8_t* payload,
nguyenhoang9x5555 183:16414698889c 250 size_t size,
nguyenhoang9x5555 183:16414698889c 251 BeaconData_t& data);
nguyenhoang9x5555 183:16414698889c 252
nguyenhoang9x5555 183:16414698889c 253 protected:
nguyenhoang9x5555 183:16414698889c 254
nguyenhoang9x5555 183:16414698889c 255 static const uint8_t VI919_TX_POWERS[8]; //!< List of available tx powers
nguyenhoang9x5555 183:16414698889c 256 static const uint8_t VI919_RADIO_POWERS[21]; //!< List of calibrated tx powers
nguyenhoang9x5555 183:16414698889c 257 static const uint8_t VI919_MAX_PAYLOAD_SIZE[]; //!< List of max payload sizes for each datarate
nguyenhoang9x5555 183:16414698889c 258 static const uint8_t VI919_MAX_PAYLOAD_SIZE_400[]; //!< List of max payload sizes for each datarate
nguyenhoang9x5555 183:16414698889c 259 static const uint8_t VI919_MAX_PAYLOAD_SIZE_REPEATER[]; //!< List of repeater compatible max payload sizes for each datarate
nguyenhoang9x5555 183:16414698889c 260 static const uint8_t VI919_MAX_PAYLOAD_SIZE_REPEATER_400[]; //!< List of repeater compatible max payload sizes for each datarate
nguyenhoang9x5555 183:16414698889c 261
nguyenhoang9x5555 183:16414698889c 262 typedef struct __attribute__((packed)) {
nguyenhoang9x5555 183:16414698889c 263 uint8_t RFU[2];
nguyenhoang9x5555 183:16414698889c 264 uint8_t Time[4];
nguyenhoang9x5555 183:16414698889c 265 uint8_t CRC1[2];
nguyenhoang9x5555 183:16414698889c 266 uint8_t GwSpecific[7];
nguyenhoang9x5555 183:16414698889c 267 uint8_t CRC2[2];
nguyenhoang9x5555 183:16414698889c 268 } BCNPayload;
nguyenhoang9x5555 183:16414698889c 269 };
nguyenhoang9x5555 183:16414698889c 270 }
nguyenhoang9x5555 183:16414698889c 271
nguyenhoang9x5555 183:16414698889c 272 #endif //__CHANNEL_PLAN_VI919_H__