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::Mac implements the Mac layer providing mote addressing and packet encryption
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 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 14 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 15
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 16 #ifndef __LORA_MAC_H__
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 17 #define __LORA_MAC_H__
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 18
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 19 #include "Lora.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 20 #include "ChannelPlan.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 21 #include "SxRadio.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 22 #include "SxRadio1272.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 23 #include "SxRadioEvents.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 24 #include "MacEvents.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 25 #include "Crypto.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 26 #include "Link.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 27
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 28 namespace lora {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 29
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 30 class Mac: public SxRadioEvents, public Crypto {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 31 public:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 32
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 33 virtual ~Mac();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 34
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 35 Mac(SxRadio& radio, MacEvents* events, ChannelPlan* plan, Settings& settings);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 36
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 37 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 38 * Send a Join Request packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 39 * @param devEUI
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 40 * @param appEUI
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 41 * @param appKey
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 42 * @return LORA_OK if successful
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 43 * @return LORA_LINK_BUSY
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 44 * @return LORA_RADIO_BUSY
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 45 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 46 uint8_t Join(const uint8_t* devEUI, const uint8_t* appEUI, const uint8_t* appKey);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 47
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 48 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 49 * Send a packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 50 * @param port app port to send with payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 51 * @param payload data to send
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 52 * @param size of payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 53 * @param attempts number of attempts to receive an ACK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 54 * @param repeats number of times to repeat packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 55 * @return LORA_OK if successful
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 56 * @return LORA_MAX_PAYLOAD_EXCEEDED if payload size exceeds datarate maximum
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 57 * @return LORA_NO_CHANS_ENABLED if there is not an available channel that supports the current datarate
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 58 * @return LORA_LINK_BUSY if link was busy
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 59 * @return LORA_RADIO_BUSY if radio was busy
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 60 * @return LORA_BUFFER_FULL if mac commands filled the packet, client should resend the packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 61 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 62 uint8_t Send(uint8_t port, const uint8_t* payload, uint16_t size, uint8_t attempts = 0, uint8_t repeats = 0);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 63
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 64 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 65 * Prepare frame to be sent over link
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 66 * @param port to send data to
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 67 * @param payload to send
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 68 * @param size of payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 69 * @param attempts 0:Unconfirmed, 1-8:Confirmed
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 70 * @return LORA_OK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 71 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 72 uint8_t PrepareFrame(uint8_t port, const uint8_t* payload, uint8_t size, uint8_t attempts);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 73
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 74 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 75 * Reset the mac commands buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 76 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 77 void ResetMacCommands();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 78
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 79 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 80 * Add a mac command to be sent with next packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 81 * @param cmd id of command
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 82 * @param pc number of parameters
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 83 * @param pv array of parameters
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 84 * @return LORA_OK if successful
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 85 * @return LORA_COMMAND_BUFFER_FULL
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 86 * @return LORA_UNKNOWN_MAC_COMMAND
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 87 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 88 uint8_t AddMacCommand(uint8_t cmd, uint8_t pc, uint8_t* pv);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 89
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 90 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 91 * Handle mac command received from server
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 92 * @param payload received on radio
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 93 * @param index of mac command id
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 94 * @param size of mac command list
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 95 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 96 uint8_t HandleMacCommands(uint8_t* payload, uint8_t index, uint8_t size);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 97
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 98 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 99 * Handle Join Accept packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 100 * @param payload received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 101 * @param size of payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 102 * @return LORA_OK if successful
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 103 * @return LORA_JOIN_ERROR if already joined or MIC fails
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 104 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 105 uint8_t HandleJoinAccept(uint8_t* payload, uint8_t size);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 106
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 107 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 108 * Handle Packet receipt
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 109 * Verifies Address and MIC, checks the Frame Control bits for ACK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 110 * Then decrypts the payload and handles any Mac Commands
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 111 * @param payload received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 112 * @param size of payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 113 * @param[out] port data was received on
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 114 * @param[out] length of user data in payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 115 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 116 uint8_t HandleDownlinkPacket(uint8_t* payload, uint8_t size, uint8_t& port, uint8_t& length);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 117
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 118 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 119 * Check for ACK from server in received packet and notifies Link if present
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 120 * @param fCtrl frame control byte of packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 121 * @return LORA_OK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 122 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 123 uint8_t CheckFrameControl(DownlinkControl fCtrl);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 124
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 125 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 126 * Verify that packet address is intended for mote or in list of multicast addresses
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 127 * @param payload received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 128 * @param size of payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 129 * @param[out] address found in header of packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 130 * @param[out] networkSessionKey associated with address
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 131 * @param[out] dataSessionKey associated with address
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 132 * @return LORA_OK if successful
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 133 * @return LORA_ADDRESS_ERROR if address is not found
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 134 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 135 uint8_t VerifyAddress(uint8_t* payload, uint8_t size, uint32_t& address, uint8_t* networkSessionKey, uint8_t* dataSessionKey);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 136
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 137 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 138 * Verify that MIC can be computed with network session key
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 139 * Frame counter is checked for reset and rollover
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 140 * @param payload received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 141 * @param size of payload
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 142 * @param address found in header of packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 143 * @param networkSessionKey
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 144 * @return LORA_OK if successful
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 145 * @return LORA_MIC_ERROR
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 146 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 147 uint8_t VerifyMIC(uint8_t* payload, uint8_t size, uint32_t address, uint8_t* networkSessionKey);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 148
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 149 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 150 * Event called by Link on start of any tx
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 151 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 152 virtual void TxStart(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 153
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 154 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 155 * Event called by Link on tx done
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 156 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 157 virtual void TxDone(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 158
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 159 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 160 * Event called by Link on tx timeout
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 161 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 162 virtual void TxTimeout(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 163
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 164 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 165 * Event called by Link on rx done
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 166 * @param payload of received packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 167 * @param size of received packet in bytes
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 168 * @param rssi of received packet in dBm
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 169 * @param snr of received packet two's complement in 1/4 dB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 170 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 171 virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 172
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 173 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 174 * Event called by Link on rx timeout
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 175 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 176 virtual void RxTimeout(void);
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 called by Link on rx error
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 180 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 181 virtual void RxError(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 182
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 183 virtual void LinkIdle(void);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 184
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 185 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 186 * Current join status
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 187 * @return true if joined to lora network
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 188 * @return false if not joined
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 189 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 190 bool IsJoined();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 191
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 192 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 193 * Set the dev nonce
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 194 * The dev nonce is used for deriving session keys and part of the data send on a join request
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 195 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 196 void SetDeviceNonce(uint16_t nonce);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 197
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 198 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 199 * Get the dev nonce
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 200 * The dev nonce is used for deriving session keys and part of the data send on a join request
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 201 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 202 uint16_t GetDeviceNonce();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 203
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 204 void SetLoraClass(MoteClass cls);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 205
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 206 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 207 * Get the current device MoteClass
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 208 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 209 MoteClass GetLoraClass();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 210
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 211 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 212 * Get the SNR of the last received packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 213 * @returns snr in dB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 214 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 215 int8_t GetSNR();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 216
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 217 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 218 * Get the RSSI of the last received packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 219 * @returns rssi in dB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 220 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 221 int16_t GetRSSI();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 222
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 223 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 224 * Update the statistics with the last received RSSI and SNR
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 225 * The avg, min and max RSSI and SNR will also be updated
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 226 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 227 void UpdateStats(int16_t rssi, int16_t snr);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 228
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 229 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 230 * Get the number of mac command bytes ready to be sent in the next packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 231 * @return size of buffer in bytes
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 232 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 233 uint8_t GetMacCommandBufferSize();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 234
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 235 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 236 * Get the buffer for mac command bytes ready to be sent in the next packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 237 * @return pointer to command buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 238 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 239 const uint8_t* GetMacCommandBuffer();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 240
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 241 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 242 * Clear the buffer for mac command bytes to be sent in the next packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 243 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 244 void ClearMacCommandBuffer();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 245
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 246 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 247 * Get the size of the bytes ready to be sent in the next packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 248 * @returns size of buffer in bytes
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 249 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 250 uint8_t GetTxBufferSize();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 251
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 252 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 253 * Get the buffer of bytes ready to be sent in the next packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 254 * @return pointer to buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 255 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 256 const uint8_t* GetTxBuffer();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 257
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 258 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 259 * Get the max duty cycle currently set for device
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 260 * Aggregated duty cycle = 1 / 2 ^ MaxDutyCycle
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 261 * Value of 255 should silence device
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 262 * @return duty cycle 0-15 or 255
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 263 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 264 uint8_t GetMaxDutyCycle();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 265
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 266 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 267 * Get the Rx delay value currently used by the Link
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 268 * @return rxDelay in seconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 269 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 270 uint8_t GetRxDelay();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 271
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 272 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 273 * Get the MCU sleep time between tx done and the Rx1 window opening
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 274 * @return Time MCU sleeps between tx done and rx1 open in milliseconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 275 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 276 uint32_t GetRx1SleepTime();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 277
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 278 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 279 * Get the MCU sleep time between Rx1 window opening and the Rx2 window opening
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 280 * @return Time MCU sleeps between rx1 open and rx2 open in milliseconds
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 281 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 282 uint32_t GetRx2SleepTime();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 283
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 284 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 285 * Get pong received indicator
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 286 * @return true if pong was received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 287 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 288 bool GetPongReceived();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 289
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 290 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 291 * Get the RSSI of the last received pong
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 292 * The RSSI will be the strength of the signal received at the gateway
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 293 * @return rssi in dB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 294 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 295 int16_t GetPongRssi();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 296
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 297 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 298 * Get the SNR of the last received pong
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 299 * The SNR will be the strength of the signal received at the gateway
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 300 * @return snr in dB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 301 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 302 int16_t GetPongSnr();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 303
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 304 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 305 * Get the current statistics for the device
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 306 * @return Statistics
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 307 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 308 Statistics& GetStats();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 309
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 310 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 311 * Reset the current statistics for the device
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 312 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 313 void ResetStats();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 314
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 315 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 316 * Set the current channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 317 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 318 void SetChannelPlan(ChannelPlan* plan);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 319
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 320 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 321 * Set the delay for Rx1 window
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 322 * @param sec time to delay after end of tx, minimum 1 second
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 323 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 324 uint8_t SetRxDelay(uint8_t sec);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 325
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 326 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 327 * Set the MCU sleep time between tx done and the Rx1 window opening
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 328 * @param ms time MCU sleeps between tx done and rx1 open
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 329 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 330 void SetRx1SleepTime(uint32_t ms);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 331
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 332 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 333 * Set the MCU sleep time between Rx1 window opening and the Rx2 window opening
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 334 * @param ms time MCU sleeps between rx1 open and rx2 open
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 335 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 336 void SetRx2SleepTime(uint32_t ms);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 337
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 338 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 339 * Set the network mode
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 340 * @param mode PRIVATE, PUBLIC or PEER_TO_PEER
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 341 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 342 uint8_t SetNetworkMode(uint8_t mode);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 343
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 344 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 345 * Get the current state of the MAC layer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 346 * @return MAC_IDLE, MAC_TX, MAC_RX
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 347 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 348 MacState GetState();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 349
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 350 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 351 * Get the time off air for the current datarate
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 352 * @return time off air before next TX in ms
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 353 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 354 uint32_t GetTimeOffAir();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 355
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 356 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 357 * Open an RX Window
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 358 * @param timeout time in ms to hold window open, 0 for continuous
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 359 * @param freq frequency to listen on
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 360 * @param datarate to listen for
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 361 * @return LORA_OK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 362 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 363 uint8_t OpenRxWindow(uint32_t timeout, uint32_t freq, uint8_t datarate);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 364 uint8_t OpenRxWindow(uint32_t timeout, bool continuous);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 365
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 366 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 367 * Close the open window
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 368 * @return LORA_OK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 369 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 370 uint8_t CloseRxWindow();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 371
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 372 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 373 * Cancel pending rx windows
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 374 * @return LORA_OK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 375 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 376 uint8_t CancelRxWindows();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 377
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 378 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 379 * Get datarate properties of given index for current channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 380 * @param index of datarate
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 381 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 382 Datarate GetDatarate(uint8_t index);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 383
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 384 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 385 * Get the max payload size available of current datarate for channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 386 * @return bytes that can be sent
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 387 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 388 uint8_t GetMaxPayloadSize();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 389
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 390 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 391 * Call to wakeup mac layer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 392 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 393 void Wakeup();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 394
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 395 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 396 * Set the event object to report to
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 397 * @param events object inheriting from MacEvents
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 398 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 399 void SetEventHandler(MacEvents* events);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 400
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 401 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 402 * Get the channels in use by current channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 403 * @return channel frequencies
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 404 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 405 std::vector<uint32_t> GetChannels();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 406
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 407 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 408 * Get the downlink channels in use by current channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 409 * @return channel frequencies
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 410 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 411 std::vector<uint32_t> GetDownlinkChannels();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 412
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 413 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 414 * Get the channel datarate ranges in use by current channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 415 * @return channel datarate ranges
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 416 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 417 std::vector<uint8_t> GetChannelRanges();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 418
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 419 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 420 * Enable the default channels of the channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 421 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 422 void EnableDefaultChannels();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 423
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 424 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 425 * Get the number of duty bands in the current channel plan
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 426 * @return number of bands
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 427 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 428 uint8_t GetNumDutyBands();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 429
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 430 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 431 * Get the time off air for the given duty band
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 432 * @param band index
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 433 * @return time off air in ms
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 434 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 435 uint32_t GetDutyBandTimeOff(uint8_t band);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 436
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 437 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 438 * Set the time off air for the given duty band
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 439 * @param band index
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 440 * @param time off air in ms
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 441 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 442 void SetDutyBandTimeOff(uint8_t band, uint32_t timeoff);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 443
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 444 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 445 * Reset internal mac state if timeout or unforeseen error occurs
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 446 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 447 void ResetState();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 448
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 449 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 450 * Enable TX CW
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 451 * return LORA_OK
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 452 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 453 uint8_t SendContinuous(bool enable);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 454
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 455 private:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 456 /**
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 457 * Helper for clearing MAC commands which can be cleared upon successful uplink
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 458 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 459 void PostTxMacPrune();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 460
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 461 Link _link; //!< Link used to manage radio
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 462 ChannelPlan* _plan; //!< Injected ChannelPlan used by Link to define parameters for tx/rx of packets
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 463 SxRadio& _radio; //!< Injected SxRadio object
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 464 MacEvents* _events; //!< Injected MaxEvents object for event notification to client
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 465 Settings& _settings; //!< Settings used to configure the Mac
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 466
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 467 bool _isMulticastPacket; //!< Indicator of multicast packet recieved
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 468 uint8_t _multicastIndex; //!< Index of multicast session associated with last received packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 469
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 470 uint8_t _rxBuffer[MAX_PHY_PACKET_SIZE]; //!< Buffer of last packet received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 471 uint8_t _rxBufferSize; //!< Size of the last packet received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 472 uint8_t _txBuffer[MAX_PHY_PACKET_SIZE]; //!< Buffer of packet to send
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 473 uint8_t _txBufferSize; //!< Size of buffer to send
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 474 bool _txBufferFull; //!< Indicates that buffer was filled with mac commands
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 475
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 476 uint16_t _joinNonce; //!< Random nonce value used for Join Request and to derive session keys
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 477
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 478 int16_t _rssi; //!< RSSI value of last received packet in dB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 479 int16_t _snr; //!< SNR value of last received packet in cB
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 480
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 481 bool _pongReceived; //!< Indicator of pong received
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 482 int16_t _pongRssi; //!< RSSI value of last received pong
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 483 int16_t _pongSnr; //!< SNR value of last received pong
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 484
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 485 MacState _state; //!< Current mac state
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 486
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 487 uint32_t _downlinkCounter; //!< Temporary downlink counter
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 488 bool _duplicateReceived; //!< Indication of duplicate packet received due to missed ack
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 489
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 490 DownlinkControl _downlinkCtrl; //!< Downlink ctrl status of last rx packet
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 491 };
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 492
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 493 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 494
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 495 #endif // __LORA_MAC_H__