fota lib for mdot
mdot/Lora/Link.h@3:63d10f2375ea, 2018-09-14 (annotated)
- Committer:
- Jenkins@KEILDM1.dc.multitech.prv
- Date:
- Fri Sep 14 15:39:09 2018 -0500
- Revision:
- 3:63d10f2375ea
fota lib updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 1 | /** __ ___ ____ _ ______ __ ____ __ ____ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 2 | * / |/ /_ __/ / /_(_)__/_ __/__ ____/ / / __/_ _____ / /____ __ _ ___ / _/__ ____ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 3 | * / /|_/ / // / / __/ /___// / / -_) __/ _ \ _\ \/ // (_-</ __/ -_) ' \(_-< _/ // _ \/ __/ __ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 4 | * /_/ /_/\_,_/_/\__/_/ /_/ \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 5 | * Copyright (C) 2015 by Multi-Tech Systems /___/ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 6 | * |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 7 | * |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 8 | * @author Jason Reiss |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 9 | * @date 10-31-2015 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 10 | * @brief lora::Link implements uses a channel plan to send and receive through an SX radio driver |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 11 | * |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 12 | * @details |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 13 | * @copyright Copyright (C) 2015 by Multi-Tech Systems. All rights reserved. This project is released under the GNU Lesser General Public License <http://www.gnu.org/licenses/>. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 14 | * |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 15 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 16 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 17 | #ifndef __LORA_LINK_H__ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 18 | #define __LORA_LINK_H__ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 19 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 20 | #include "Lora.h" |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 21 | #include "SxRadio.h" |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 22 | #include "ChannelPlan.h" |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 23 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 24 | namespace lora { |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 25 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 26 | class Link: public SxRadioEvents { |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 27 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 28 | public: |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 29 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 30 | * Create a link object |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 31 | * @param events SxRadioEvents object to pass events to |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 32 | * @param radio SxRadio object for send and receive operations |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 33 | * @param plan ChannelPlan to define Frequencies and Datarates used in send and receive |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 34 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 35 | Link(SxRadioEvents& events, SxRadio& radio, ChannelPlan* plan); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 36 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 37 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 38 | * Link destructor |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 39 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 40 | virtual ~Link(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 41 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 42 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 43 | * Get current state of link |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 44 | * @returns current state |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 45 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 46 | LinkState State(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 47 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 48 | // Event functions called by SxRadio class |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 49 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 50 | /** Event called by SxRadio on end of tx |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 51 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 52 | virtual void TxDone(void); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 53 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 54 | /** Event called by SxRadio on tx timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 55 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 56 | virtual void TxTimeout(void); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 57 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 58 | /** Event called by SxRadio on end of rx |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 59 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 60 | virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 61 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 62 | /** Event called by SxRadio on rx timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 63 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 64 | virtual void RxTimeout(void); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 65 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 66 | /** Event called by SxRadio on rx error |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 67 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 68 | virtual void RxError(void); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 69 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 70 | /** Event called by Mac when bad packet recv |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 71 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 72 | virtual void RxNotValid(void); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 73 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 74 | /** Event called by SxRadio on frequency hop request |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 75 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 76 | virtual void FhssChangeChannel(uint8_t currentChannel); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 77 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 78 | // Link interface functions |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 79 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 80 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 81 | * Send the data in buffer with provided number of attempts or repeats |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 82 | * Radio is set according to current ChannelPlan |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 83 | * @param buffer data to send on radio |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 84 | * @param size number of bytes in buffer to send |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 85 | * @param attempts number of attempts receive an ack of CONFIRMED_FRAME |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 86 | * @param repeats number of times to repeat the packet, only used if attempts == 0 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 87 | * @return LORA_OK if successful |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 88 | * @return LORA_NO_CHANS_ENABLED if there is not an available channel that supports the current datarate |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 89 | * @return LORA_LINK_BUSY or LORA_RADIO_BUSY if not successful |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 90 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 91 | virtual uint8_t Send(const uint8_t* buffer, uint16_t size, uint8_t attempts = 0, uint8_t repeats = 0); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 92 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 93 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 94 | * Open receive window with provided timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 95 | * Radio is set according to current ChannelPlan |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 96 | * @param window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 97 | * @param timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 98 | * @return LORA_OK if window is opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 99 | * @return LORA_RADIO_BUSY if window cannot be opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 100 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 101 | virtual uint8_t Recv(uint8_t window, uint32_t timeout, uint32_t freq = 0, bool force_continuous=false); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 102 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 103 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 104 | * Set the delay between end of tx and start of first rx window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 105 | * Second rx window will be opened 1 second after first |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 106 | * @param delay number of milliseconds |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 107 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 108 | virtual void SetRxDelayMs(uint32_t delay); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 109 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 110 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 111 | * Get the delay between end of tx and start of first rx window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 112 | * Second rx window will be opened 1 second after first |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 113 | * @return number of milliseconds |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 114 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 115 | virtual uint32_t GetRxDelayMs(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 116 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 117 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 118 | * Receive setting from Rx Timing Setup mac command |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 119 | * @param payload buffer containing mac command |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 120 | * @param index of mac command id in buffer |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 121 | * @param size of mac command id and params |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 122 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 123 | virtual uint8_t HandleRxTimingSetup(const uint8_t* payload, uint8_t index, uint8_t size); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 124 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 125 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 126 | * Set the time the MCU is sleeping between tx done and rx1 window open |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 127 | * This is needed to compensate timers which don't run during a stop sleep mode |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 128 | * @param time in milliseconds of the sleep |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 129 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 130 | virtual void SetRx1SleepTime(uint32_t time); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 131 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 132 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 133 | * Get the time the MCU is sleeping between tx done and rx1 window open |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 134 | * @return time in milliseconds of the sleep |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 135 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 136 | uint32_t GetRx1SleepTime(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 137 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 138 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 139 | * Set the time the MCU is sleeping between rx1 window open and rx2 window open |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 140 | * This is needed to compensate timers which don't run during a stop sleep mode |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 141 | * @param time in milliseconds of the sleep |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 142 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 143 | virtual void SetRx2SleepTime(uint32_t time); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 144 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 145 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 146 | * Get the time the MCU is sleeping between rx1 window open and rx2 window open |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 147 | * @return time in milliseconds of the sleep |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 148 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 149 | uint32_t GetRx2SleepTime(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 150 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 151 | // Timer callback functions and events |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 152 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 153 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 154 | * Timer handler for first receive window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 155 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 156 | static void OnRx1WindowTimer(void const *arg); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 157 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 158 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 159 | * Event handler to open first receive window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 160 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 161 | virtual void OnRx1WindowEvent(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 162 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 163 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 164 | * Timer handler for second receive window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 165 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 166 | static void OnRx2WindowTimer(void const *arg); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 167 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 168 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 169 | * Event handler to open second receive window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 170 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 171 | void OnRx2WindowEvent(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 172 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 173 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 174 | * Timer handlers for receive window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 175 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 176 | static void OnRxWindowTimer(void const *arg); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 177 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 178 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 179 | * Event handler to close receive window on timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 180 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 181 | virtual void OnRxWindowEvent(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 182 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 183 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 184 | * Callback for mac layer to notify link when ack has been received |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 185 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 186 | virtual void ReceivedAck(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 187 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 188 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 189 | * Flag indicating if ack was received with last rx packet |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 190 | * @return true if ack was received |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 191 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 192 | bool AckReceived(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 193 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 194 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 195 | * Open a receive window with provided timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 196 | * @param timeout number of milliseconds before window will timeout, 0 == continuous |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 197 | * @return LORA_OK if window is opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 198 | * @return LORA_RADIO_BUSY if window cannot be opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 199 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 200 | virtual uint8_t OpenRxWindow(uint16_t timeout = 0, bool force_continuous=false); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 201 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 202 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 203 | * Open a receive window with provided timeout, frequency and datarate |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 204 | * @param timeout number of milliseconds before window will timeout, 0 == continuous |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 205 | * @param frequecy to listen for |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 206 | * @param datarate to listen for |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 207 | * @return LORA_OK if window is opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 208 | * @return LORA_RADIO_BUSY if window cannot be opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 209 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 210 | virtual uint8_t OpenRxWindow(uint32_t timeout, uint32_t freq, uint8_t datarate); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 211 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 212 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 213 | * Close the receive window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 214 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 215 | void CloseRxWindow(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 216 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 217 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 218 | * Stop Rx2 Window Timer |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 219 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 220 | void StopRx2WindowTimer(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 221 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 222 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 223 | * Cancel pending rx windows |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 224 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 225 | void CancelRxWindows(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 226 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 227 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 228 | * Get link stats for number of up/down packets and missed acks |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 229 | * @return Statistics struct |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 230 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 231 | Statistics& GetStats(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 232 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 233 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 234 | * Set the current channel plan |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 235 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 236 | void SetChannelPlan(ChannelPlan* plan); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 237 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 238 | /** Set the LoRaWAN class operation |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 239 | * @param cls A, B or C |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 240 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 241 | void SetLoraClass(lora::MoteClass cls); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 242 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 243 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 244 | * Reset the internal state of the Link |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 245 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 246 | void ResetState(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 247 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 248 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 249 | * Ack retries attempted during last transmission request |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 250 | * @return number of ack retries attempted |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 251 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 252 | uint8_t TxRetries(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 253 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 254 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 255 | * Reset link statistics |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 256 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 257 | void ResetStats(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 258 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 259 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 260 | * Get the rx window we received the last packet in |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 261 | * @return rx window the last packet was received in |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 262 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 263 | uint8_t GetLastRxWindowUsed(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 264 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 265 | private: |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 266 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 267 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 268 | * Send data in tx buffer with current settings |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 269 | * Used for resending data on missed ack or repeating packets |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 270 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 271 | uint8_t Send(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 272 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 273 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 274 | * Injected SxRadioEvent object |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 275 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 276 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 277 | SxRadioEvents& _events; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 278 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 279 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 280 | * Injected SxRadio object |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 281 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 282 | SxRadio& _radio; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 283 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 284 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 285 | * Injected ChannelPlan object used to send and receive packets |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 286 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 287 | ChannelPlan* _plan; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 288 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 289 | LinkState _state; //!< Current state of Link |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 290 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 291 | // Timers |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 292 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 293 | RtosTimer _rx1WindowTimer; //!< Timer to open first rx window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 294 | RtosTimer _rx2WindowTimer; //!< Timer to open second rx window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 295 | RtosTimer _rxWindowTimer; //!< Timer to close rx window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 296 | RtosTimer _ackTimer; //!< Timer to send next attempt for confirmed frame |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 297 | RtosTimer _repeatTimer; //!< Timer to send next attempt for confirmed frame |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 298 | Timer _fakeRx2Timer; //!< Timer to fake rx2 window for class C |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 299 | bool _ackTimerPending; //!< Flag for resend |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 300 | bool _repeatTimerPending; //!< Flag for resend |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 301 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 302 | // Member variables |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 303 | uint8_t _txBuffer[MAX_PHY_PACKET_SIZE]; //!< Buffer for tx packets |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 304 | uint8_t _txBufferSize; //!< Size of buffer for tx packets |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 305 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 306 | uint32_t _rxDelayMs; //!< Current delay between end of tx and opening of first rx window |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 307 | uint32_t _rx1SleepTime; //!< MCU sleep time before rx1 opens (in ms) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 308 | uint32_t _rx2SleepTime; //!< MCU sleep time before rx2 opens relative to rx1 open (in ms) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 309 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 310 | uint8_t _ackAttemptsMax; //!< Number of attempts to transmit a confirmed packet |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 311 | uint8_t _ackAttempts; //!< Attempt number of current packet |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 312 | uint8_t _repeatsMax; //!< Number of times to repeat a packet |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 313 | uint8_t _repeats; //!< Repeat number of current packet |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 314 | bool _ackReceived; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 315 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 316 | Statistics _stats; //!< Statistics for Up/Down packets and missed ACK's |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 317 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 318 | MoteClass _loraClass; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 319 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 320 | uint8_t _lastRxWndOpened; //!< Last rx window opened |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 321 | uint8_t _lastRxWnd; //!< Rx window last packet was received in |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 322 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 323 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 324 | * Callback for radio thread to signal |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 325 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 326 | virtual void MacEvent(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 327 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 328 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 329 | * Timer handler for ACK timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 330 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 331 | static void OnAckTimeout(void const *arg); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 332 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 333 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 334 | * Event handler for ACK timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 335 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 336 | void OnAckTimeoutEvent(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 337 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 338 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 339 | * Timer handler for ACK timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 340 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 341 | static void OnRepeatTimeout(void const *arg); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 342 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 343 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 344 | * Event handler for ACK timeout |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 345 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 346 | void OnRepeatTimeoutEvent(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 347 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 348 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 349 | * Update link state |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 350 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 351 | void UpdateState(); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 352 | }; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 353 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 354 | } |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 355 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 356 | #endif |