fota lib for mdot

Dependents:   UQ_LoraWAN

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?

UserRevisionLine numberNew 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