A mbed library for the RN2483. Heavily based on the Sodaq_RN2483 library for Arduino (https://github.com/SodaqMoja/Sodaq_RN2483). This is currently under-going initial testing, but seems to work! Tested on a NRF51 and FRDM K64F.
Dependents: rn2483-TestProgram
RN2483.h@8:c4069091afa1, 2016-12-19 (annotated)
- Committer:
- azazeal88
- Date:
- Mon Dec 19 08:25:35 2016 +0000
- Revision:
- 8:c4069091afa1
- Parent:
- 7:100ab85cc6d7
Have removed save functioanlity for now, due to a bug introduced. The potentially long delay between requesting to save and saving means the device is thrown out of sync with the returned 'ok' strings -- causing issues with the library.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
azazeal88 | 0:a8609e6f88f3 | 1 | /* |
azazeal88 | 0:a8609e6f88f3 | 2 | * Copyright (c) 2016 Dan Knox. All rights reserved. |
azazeal88 | 0:a8609e6f88f3 | 3 | * |
azazeal88 | 0:a8609e6f88f3 | 4 | * This file is part of RN2483. |
azazeal88 | 0:a8609e6f88f3 | 5 | * |
azazeal88 | 0:a8609e6f88f3 | 6 | * RN2483 is free software: you can redistribute it and/or modify |
azazeal88 | 0:a8609e6f88f3 | 7 | * it under the terms of the GNU Lesser General Public License as |
azazeal88 | 0:a8609e6f88f3 | 8 | * published by the Free Software Foundation, either version 3 of |
azazeal88 | 0:a8609e6f88f3 | 9 | * the License, or(at your option) any later version. |
azazeal88 | 0:a8609e6f88f3 | 10 | * |
azazeal88 | 0:a8609e6f88f3 | 11 | * RN2483 is distributed in the hope that it will be useful, |
azazeal88 | 0:a8609e6f88f3 | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
azazeal88 | 0:a8609e6f88f3 | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
azazeal88 | 0:a8609e6f88f3 | 14 | * GNU Lesser General Public License for more details. |
azazeal88 | 0:a8609e6f88f3 | 15 | * |
azazeal88 | 0:a8609e6f88f3 | 16 | * You should have received a copy of the GNU Lesser General Public |
azazeal88 | 0:a8609e6f88f3 | 17 | * License along with RN2483. If not, see |
azazeal88 | 0:a8609e6f88f3 | 18 | * <http://www.gnu.org/licenses/>. |
azazeal88 | 0:a8609e6f88f3 | 19 | */ |
azazeal88 | 0:a8609e6f88f3 | 20 | |
azazeal88 | 0:a8609e6f88f3 | 21 | #ifndef _RN2483_h |
azazeal88 | 0:a8609e6f88f3 | 22 | #define _RN2483_h |
azazeal88 | 0:a8609e6f88f3 | 23 | |
azazeal88 | 0:a8609e6f88f3 | 24 | #include "mbed.h" |
azazeal88 | 0:a8609e6f88f3 | 25 | #include <stdint.h> |
azazeal88 | 0:a8609e6f88f3 | 26 | |
azazeal88 | 1:cf9b0c21907a | 27 | //#define USE_DYNAMIC_BUFFER |
azazeal88 | 0:a8609e6f88f3 | 28 | |
azazeal88 | 0:a8609e6f88f3 | 29 | #define DEFAULT_INPUT_BUFFER_SIZE 64 |
azazeal88 | 0:a8609e6f88f3 | 30 | #define DEFAULT_RECEIVED_PAYLOAD_BUFFER_SIZE 32 |
azazeal88 | 0:a8609e6f88f3 | 31 | #define DEFAULT_TIMEOUT 120 |
azazeal88 | 0:a8609e6f88f3 | 32 | #define RECEIVE_TIMEOUT 60000 |
azazeal88 | 0:a8609e6f88f3 | 33 | #define DEFAULT_FSB 2 |
azazeal88 | 0:a8609e6f88f3 | 34 | #define DEFAULT_PWR_IDX_868 1 |
azazeal88 | 0:a8609e6f88f3 | 35 | #define DEFAULT_PWR_IDX_915 5 |
azazeal88 | 0:a8609e6f88f3 | 36 | #define DEFAULT_SF_868 7 |
azazeal88 | 0:a8609e6f88f3 | 37 | #define DEFAULT_SF_915 7 |
azazeal88 | 0:a8609e6f88f3 | 38 | |
azazeal88 | 0:a8609e6f88f3 | 39 | #define ENABLE_SLEEP |
azazeal88 | 0:a8609e6f88f3 | 40 | |
azazeal88 | 0:a8609e6f88f3 | 41 | // Available error codes. |
azazeal88 | 1:cf9b0c21907a | 42 | enum MacTransmitErrorCodes { |
azazeal88 | 0:a8609e6f88f3 | 43 | NoError = 0, |
azazeal88 | 0:a8609e6f88f3 | 44 | NoResponse = 1, |
azazeal88 | 0:a8609e6f88f3 | 45 | Timedout = 2, |
azazeal88 | 0:a8609e6f88f3 | 46 | PayloadSizeError = 3, |
azazeal88 | 0:a8609e6f88f3 | 47 | InternalError = 4, |
azazeal88 | 0:a8609e6f88f3 | 48 | Busy = 5, |
azazeal88 | 0:a8609e6f88f3 | 49 | NetworkFatalError = 6, |
azazeal88 | 0:a8609e6f88f3 | 50 | NotConnected = 7, |
azazeal88 | 0:a8609e6f88f3 | 51 | NoAcknowledgment = 8, |
azazeal88 | 2:336a025b82b5 | 52 | Silent = 9, |
azazeal88 | 0:a8609e6f88f3 | 53 | }; |
azazeal88 | 0:a8609e6f88f3 | 54 | |
azazeal88 | 0:a8609e6f88f3 | 55 | // Provides a simple, abstracted interface to Microchip's RN2483 LoRaWAN module. |
azazeal88 | 0:a8609e6f88f3 | 56 | |
azazeal88 | 0:a8609e6f88f3 | 57 | class RN2483 |
azazeal88 | 0:a8609e6f88f3 | 58 | { |
azazeal88 | 0:a8609e6f88f3 | 59 | public: |
azazeal88 | 1:cf9b0c21907a | 60 | |
azazeal88 | 1:cf9b0c21907a | 61 | /** |
azazeal88 | 1:cf9b0c21907a | 62 | * @brief Create a new instance of the RN2483. |
azazeal88 | 1:cf9b0c21907a | 63 | * @param Serial TX pin name. |
azazeal88 | 1:cf9b0c21907a | 64 | * @param Serial RX pin name. |
azazeal88 | 1:cf9b0c21907a | 65 | */ |
azazeal88 | 0:a8609e6f88f3 | 66 | RN2483(PinName tx, PinName rx); |
azazeal88 | 1:cf9b0c21907a | 67 | |
azazeal88 | 1:cf9b0c21907a | 68 | /** |
azazeal88 | 1:cf9b0c21907a | 69 | * @return Returns the default device baud rate. |
azazeal88 | 1:cf9b0c21907a | 70 | */ |
azazeal88 | 1:cf9b0c21907a | 71 | uint32_t getDefaultBaudRate() { |
azazeal88 | 1:cf9b0c21907a | 72 | return 57600; |
azazeal88 | 1:cf9b0c21907a | 73 | }; |
azazeal88 | 1:cf9b0c21907a | 74 | |
azazeal88 | 1:cf9b0c21907a | 75 | /** |
azazeal88 | 2:336a025b82b5 | 76 | * @brief Initialise settings and connect to network using Over The Air activation. |
azazeal88 | 1:cf9b0c21907a | 77 | * @param devEUI provided by LoRaWAN Network server registration. |
azazeal88 | 1:cf9b0c21907a | 78 | * @param appEUI provided by LoRaWAN Network server registration. |
azazeal88 | 1:cf9b0c21907a | 79 | * @param appKey provided by LoRaWAN Network server registration. |
azazeal88 | 2:336a025b82b5 | 80 | * @return Returns true if network confirmation and able to save settings. |
azazeal88 | 1:cf9b0c21907a | 81 | */ |
azazeal88 | 0:a8609e6f88f3 | 82 | bool initOTA(const uint8_t devEUI[8], const uint8_t appEUI[8], const uint8_t appKey[16], bool adr = true); |
azazeal88 | 0:a8609e6f88f3 | 83 | |
azazeal88 | 1:cf9b0c21907a | 84 | /** |
azazeal88 | 1:cf9b0c21907a | 85 | * @brief Initializes the device and connects to the network using Activation By Personalization. |
azazeal88 | 1:cf9b0c21907a | 86 | * @param devADDR provided by LoRaWAN Network server registration. |
azazeal88 | 1:cf9b0c21907a | 87 | * @param appSKey provided by LoRaWAN Network server registration. |
azazeal88 | 1:cf9b0c21907a | 88 | * @param nwkSKey provided by LoRaWAN Network server registration. |
azazeal88 | 2:336a025b82b5 | 89 | * @return Returns true if the parameters were valid and able to save settings. |
azazeal88 | 1:cf9b0c21907a | 90 | */ |
azazeal88 | 0:a8609e6f88f3 | 91 | bool initABP(const uint8_t devAddr[4], const uint8_t appSKey[16], const uint8_t nwkSKey[16], bool adr = true); |
azazeal88 | 0:a8609e6f88f3 | 92 | |
azazeal88 | 1:cf9b0c21907a | 93 | /** |
azazeal88 | 2:336a025b82b5 | 94 | * @brief Attempts to connect to the network using Over The Air Activation. |
azazeal88 | 2:336a025b82b5 | 95 | * @return Returns true if able to join network. |
azazeal88 | 2:336a025b82b5 | 96 | */ |
azazeal88 | 2:336a025b82b5 | 97 | bool joinOTTA(); |
azazeal88 | 2:336a025b82b5 | 98 | |
azazeal88 | 2:336a025b82b5 | 99 | /** |
azazeal88 | 2:336a025b82b5 | 100 | * @brief Attempts to connect to the network using Activation By Personalization. |
azazeal88 | 2:336a025b82b5 | 101 | * @return Returns true if able to join network. |
azazeal88 | 2:336a025b82b5 | 102 | */ |
azazeal88 | 2:336a025b82b5 | 103 | bool joinABP(); |
azazeal88 | 2:336a025b82b5 | 104 | |
azazeal88 | 2:336a025b82b5 | 105 | /** |
azazeal88 | 1:cf9b0c21907a | 106 | * @brief Sends the given payload without acknowledgement. |
azazeal88 | 1:cf9b0c21907a | 107 | * @param Port to use for transmission. |
azazeal88 | 1:cf9b0c21907a | 108 | * @param Payload buffer |
azazeal88 | 1:cf9b0c21907a | 109 | * @param Payload buffer size |
azazeal88 | 1:cf9b0c21907a | 110 | * @return Returns 0 (NoError) when data was sucessfully fowarded to radio, otherwise returns MacTransmitErrorCode. |
azazeal88 | 1:cf9b0c21907a | 111 | */ |
azazeal88 | 0:a8609e6f88f3 | 112 | uint8_t send(uint8_t port, const uint8_t* payload, uint8_t size); |
azazeal88 | 0:a8609e6f88f3 | 113 | |
azazeal88 | 1:cf9b0c21907a | 114 | /** |
azazeal88 | 1:cf9b0c21907a | 115 | * @brief Sends the given payload with acknowledgement. |
azazeal88 | 1:cf9b0c21907a | 116 | * @param Port to use for transmission. |
azazeal88 | 1:cf9b0c21907a | 117 | * @param Payload buffer |
azazeal88 | 1:cf9b0c21907a | 118 | * @param Payload buffer size |
azazeal88 | 1:cf9b0c21907a | 119 | * @param Number of transmission retries in event of network transmission failure. |
azazeal88 | 1:cf9b0c21907a | 120 | * @return Returns 0 (NoError) when network acks transmission, otherwise returns MacTransmitErrorCode. |
azazeal88 | 1:cf9b0c21907a | 121 | */ |
azazeal88 | 0:a8609e6f88f3 | 122 | uint8_t sendReqAck(uint8_t port, const uint8_t* payload, uint8_t size, uint8_t maxRetries); |
azazeal88 | 0:a8609e6f88f3 | 123 | |
azazeal88 | 1:cf9b0c21907a | 124 | /** |
azazeal88 | 1:cf9b0c21907a | 125 | * @brief Copies the latest received packet (optionally starting from the "payloadStartPosition" of the payload). |
azazeal88 | 1:cf9b0c21907a | 126 | * @param Buffer to read into. |
azazeal88 | 1:cf9b0c21907a | 127 | * @param Buffer size. |
azazeal88 | 1:cf9b0c21907a | 128 | * @return Returns the number of bytes written or 0 if no packet is received since last transmission. |
azazeal88 | 1:cf9b0c21907a | 129 | */ |
azazeal88 | 0:a8609e6f88f3 | 130 | uint16_t receive(uint8_t* buffer, uint16_t size, uint16_t payloadStartPosition = 0); |
azazeal88 | 0:a8609e6f88f3 | 131 | |
azazeal88 | 1:cf9b0c21907a | 132 | /** |
azazeal88 | 3:ee222a99783c | 133 | * @brief Gets the preprogrammed EUI node address from the module in HEX. |
azazeal88 | 1:cf9b0c21907a | 134 | * @param Buffer to read into. |
azazeal88 | 1:cf9b0c21907a | 135 | * @param Buffer size. |
azazeal88 | 1:cf9b0c21907a | 136 | * @return Returns the number of bytes written or 0 in case of error.. |
azazeal88 | 1:cf9b0c21907a | 137 | */ |
azazeal88 | 0:a8609e6f88f3 | 138 | uint8_t getHWEUI(uint8_t* buffer, uint8_t size); |
azazeal88 | 2:336a025b82b5 | 139 | |
azazeal88 | 5:eb983e9336a7 | 140 | /** |
azazeal88 | 2:336a025b82b5 | 141 | * @brief Informs the RN2483 to do an ADC conversion on the VDD. |
azazeal88 | 5:eb983e9336a7 | 142 | * @param Pass pointer to long for conversion to read into. |
azazeal88 | 5:eb983e9336a7 | 143 | * @return Returns if a value was sucessfully read into the long. |
azazeal88 | 2:336a025b82b5 | 144 | */ |
azazeal88 | 4:0c066401ae12 | 145 | bool getVDD(long *vdd); |
azazeal88 | 0:a8609e6f88f3 | 146 | |
azazeal88 | 1:cf9b0c21907a | 147 | /** |
azazeal88 | 1:cf9b0c21907a | 148 | * @brief Enables all the channels that belong to the given Frequency Sub-Band (FSB) |
azazeal88 | 1:cf9b0c21907a | 149 | * disables the rest. |
azazeal88 | 1:cf9b0c21907a | 150 | * @param FSB is [1, 8] or 0 to enable all channels. |
azazeal88 | 1:cf9b0c21907a | 151 | * @return Returns true if all channels were set successfully. |
azazeal88 | 1:cf9b0c21907a | 152 | */ |
azazeal88 | 0:a8609e6f88f3 | 153 | bool setFsbChannels(uint8_t fsb); |
azazeal88 | 0:a8609e6f88f3 | 154 | |
azazeal88 | 1:cf9b0c21907a | 155 | /** |
azazeal88 | 1:cf9b0c21907a | 156 | * @brief Sets the spreading factor. |
azazeal88 | 1:cf9b0c21907a | 157 | * @param Spreading factor parameter. |
azazeal88 | 1:cf9b0c21907a | 158 | * @return Returns true if was set successfully. |
azazeal88 | 1:cf9b0c21907a | 159 | */ |
azazeal88 | 0:a8609e6f88f3 | 160 | bool setSpreadingFactor(uint8_t spreadingFactor); |
azazeal88 | 0:a8609e6f88f3 | 161 | |
azazeal88 | 1:cf9b0c21907a | 162 | /** |
azazeal88 | 1:cf9b0c21907a | 163 | * @brief Sets the power index |
azazeal88 | 1:cf9b0c21907a | 164 | * @param 868MHz: 1 to 5 / 915MHz: 5, 7, 8, 9 or 10. |
azazeal88 | 1:cf9b0c21907a | 165 | * @return Returns true if succesful. |
azazeal88 | 1:cf9b0c21907a | 166 | */ |
azazeal88 | 0:a8609e6f88f3 | 167 | bool setPowerIndex(uint8_t powerIndex); |
azazeal88 | 0:a8609e6f88f3 | 168 | |
azazeal88 | 1:cf9b0c21907a | 169 | /** |
azazeal88 | 1:cf9b0c21907a | 170 | * @brief Sets the time interval for the link check process. When the time expires, the next application |
azazeal88 | 1:cf9b0c21907a | 171 | * packet will include a link check command to the server. |
azazeal88 | 1:cf9b0c21907a | 172 | * @param Decimal number that sets the time interval in seconds, from 0 to 65535. 0 disables link check process. |
azazeal88 | 1:cf9b0c21907a | 173 | * @return Returns true if parameter is valid or false if time interval is not valid. |
azazeal88 | 1:cf9b0c21907a | 174 | */ |
azazeal88 | 1:cf9b0c21907a | 175 | bool setLinkCheckInterval(uint8_t linkCheckInterval); |
azazeal88 | 1:cf9b0c21907a | 176 | |
azazeal88 | 1:cf9b0c21907a | 177 | /** |
azazeal88 | 1:cf9b0c21907a | 178 | * @brief Sets the battery level required for the Device Status Answer frame in LoRaWAN Class A Protocol. |
azazeal88 | 1:cf9b0c21907a | 179 | * @param temperature Decimal number between 0-255 representing battery level. 0 means external power, 1 means |
azazeal88 | 1:cf9b0c21907a | 180 | * low level, 254 means high level, 255 means the device was unable to measure battery level. |
azazeal88 | 1:cf9b0c21907a | 181 | * @return Returns true if battery level is valid or false if value not valid. |
azazeal88 | 1:cf9b0c21907a | 182 | */ |
azazeal88 | 1:cf9b0c21907a | 183 | bool setBattery(uint8_t batLvl); |
azazeal88 | 1:cf9b0c21907a | 184 | |
azazeal88 | 1:cf9b0c21907a | 185 | /** |
azazeal88 | 1:cf9b0c21907a | 186 | * @brief Sets the module operation frequency on a given channel ID. |
azazeal88 | 1:cf9b0c21907a | 187 | * @param Channel ID from 3 - 15. |
azazeal88 | 1:cf9b0c21907a | 188 | * @param Decimal number representing the frequency. |
azazeal88 | 1:cf9b0c21907a | 189 | * 863000000 to 870000000 or 433050000 to 434790000 in Hz |
azazeal88 | 1:cf9b0c21907a | 190 | * @return Returns true if parameters are valid or false if not. |
azazeal88 | 1:cf9b0c21907a | 191 | */ |
azazeal88 | 1:cf9b0c21907a | 192 | bool setChannelFreq(uint8_t channelID, uint32_t frequency); |
azazeal88 | 1:cf9b0c21907a | 193 | |
azazeal88 | 1:cf9b0c21907a | 194 | /** |
azazeal88 | 1:cf9b0c21907a | 195 | * @brief Sets the duty cycle allowed on the given channel ID. |
azazeal88 | 1:cf9b0c21907a | 196 | * @param Channel ID to set duty cycle (0-15), |
azazeal88 | 1:cf9b0c21907a | 197 | * @param Duty cycle is 0 - 100% as a float. |
azazeal88 | 1:cf9b0c21907a | 198 | * @return Returns true if parameters are valid or false if not. |
azazeal88 | 1:cf9b0c21907a | 199 | */ |
azazeal88 | 1:cf9b0c21907a | 200 | bool setDutyCycle(uint8_t channelID, float dutyCycle); |
azazeal88 | 1:cf9b0c21907a | 201 | |
azazeal88 | 1:cf9b0c21907a | 202 | /** |
azazeal88 | 1:cf9b0c21907a | 203 | * @brief Sets the data rate for a given channel ID. |
azazeal88 | 1:cf9b0c21907a | 204 | * Please refer to the LoRaWAN spec for the actual values. |
azazeal88 | 1:cf9b0c21907a | 205 | * @param Channel ID from 0 - 15. |
azazeal88 | 1:cf9b0c21907a | 206 | * @param Number representing the minimum data rate range from 0 to 7. |
azazeal88 | 1:cf9b0c21907a | 207 | * @param Number representing the maximum data rate range from 0 to 7 |
azazeal88 | 1:cf9b0c21907a | 208 | * @return Returns true if parameters are valid or false if not. |
azazeal88 | 1:cf9b0c21907a | 209 | */ |
azazeal88 | 1:cf9b0c21907a | 210 | bool setDrRange(uint8_t channelID, uint8_t minRange, uint8_t maxRange); |
azazeal88 | 1:cf9b0c21907a | 211 | |
azazeal88 | 1:cf9b0c21907a | 212 | /** |
azazeal88 | 1:cf9b0c21907a | 213 | * @brief Sets a given channel ID to be enabled or disabled. |
azazeal88 | 1:cf9b0c21907a | 214 | * @param Channel ID from 0 - 15. |
azazeal88 | 1:cf9b0c21907a | 215 | * @param Flag representing if channel is enabled or disabled. |
azazeal88 | 1:cf9b0c21907a | 216 | * Warning: duty cycle, frequency and data range must be set for a channel |
azazeal88 | 1:cf9b0c21907a | 217 | * before enabling! |
azazeal88 | 1:cf9b0c21907a | 218 | * @return Returns true if parameters are valid or false if not. |
azazeal88 | 1:cf9b0c21907a | 219 | */ |
azazeal88 | 1:cf9b0c21907a | 220 | bool setStatus(uint8_t channelID, bool status); |
azazeal88 | 1:cf9b0c21907a | 221 | |
azazeal88 | 1:cf9b0c21907a | 222 | /** |
azazeal88 | 1:cf9b0c21907a | 223 | * @brief The network can issue a command to silence the RN2483. This restores the module. |
azazeal88 | 1:cf9b0c21907a | 224 | * @return Returns true if parameters are valid or false if not. |
azazeal88 | 1:cf9b0c21907a | 225 | */ |
azazeal88 | 1:cf9b0c21907a | 226 | bool forceEnable(); |
azazeal88 | 1:cf9b0c21907a | 227 | |
azazeal88 | 1:cf9b0c21907a | 228 | /** |
azazeal88 | 1:cf9b0c21907a | 229 | * @brief Saves configurable parameters to eeprom. |
azazeal88 | 1:cf9b0c21907a | 230 | * @return Returns true if parameters are valid or false if not. |
azazeal88 | 1:cf9b0c21907a | 231 | */ |
azazeal88 | 1:cf9b0c21907a | 232 | bool saveConfiguration(); |
azazeal88 | 1:cf9b0c21907a | 233 | |
azazeal88 | 1:cf9b0c21907a | 234 | /** |
azazeal88 | 1:cf9b0c21907a | 235 | * @brief Sends the command together with the given, paramValue (optional) |
azazeal88 | 1:cf9b0c21907a | 236 | * @param Command should include a trailing space if paramValue is set. Refer to RN2483 command ref |
azazeal88 | 1:cf9b0c21907a | 237 | * @param Command Parameter to send |
azazeal88 | 1:cf9b0c21907a | 238 | * @param Size of param buffer |
azazeal88 | 1:cf9b0c21907a | 239 | * @return Returns true on success or false if invalid. |
azazeal88 | 1:cf9b0c21907a | 240 | */ |
azazeal88 | 0:a8609e6f88f3 | 241 | bool sendCommand(const char* command, const uint8_t* paramValue, uint16_t size); |
azazeal88 | 0:a8609e6f88f3 | 242 | bool sendCommand(const char* command, uint8_t paramValue); |
azazeal88 | 0:a8609e6f88f3 | 243 | bool sendCommand(const char* command, const char* paramValue = NULL); |
azazeal88 | 0:a8609e6f88f3 | 244 | |
azazeal88 | 1:cf9b0c21907a | 245 | /** |
azazeal88 | 1:cf9b0c21907a | 246 | * @brief Sends the command together with the given paramValue (optional) |
azazeal88 | 1:cf9b0c21907a | 247 | * @param MAC param should include a trailing space if paramValue is set. Refer to RN2483 command ref. |
azazeal88 | 1:cf9b0c21907a | 248 | * @param Param value to send |
azazeal88 | 1:cf9b0c21907a | 249 | * @param Size of Param buffer |
azazeal88 | 1:cf9b0c21907a | 250 | * @return Returns true on success or false if invalid. |
azazeal88 | 1:cf9b0c21907a | 251 | */ |
azazeal88 | 0:a8609e6f88f3 | 252 | bool setMacParam(const char* paramName, const uint8_t* paramValue, uint16_t size); |
azazeal88 | 0:a8609e6f88f3 | 253 | bool setMacParam(const char* paramName, uint8_t paramValue); |
azazeal88 | 0:a8609e6f88f3 | 254 | bool setMacParam(const char* paramName, const char* paramValue); |
azazeal88 | 0:a8609e6f88f3 | 255 | |
azazeal88 | 0:a8609e6f88f3 | 256 | #ifdef ENABLE_SLEEP |
azazeal88 | 1:cf9b0c21907a | 257 | /** |
azazeal88 | 1:cf9b0c21907a | 258 | * @brief Sends a serial line break to wake up the RN2483 |
azazeal88 | 1:cf9b0c21907a | 259 | */ |
azazeal88 | 0:a8609e6f88f3 | 260 | void wakeUp(); |
azazeal88 | 0:a8609e6f88f3 | 261 | |
azazeal88 | 1:cf9b0c21907a | 262 | /** |
azazeal88 | 1:cf9b0c21907a | 263 | * @brief Sends the RN2483 to sleep for a finite length of time. |
azazeal88 | 1:cf9b0c21907a | 264 | * @param Milliseconds to sleep for, range is 100 to 4294967295 |
azazeal88 | 1:cf9b0c21907a | 265 | */ |
azazeal88 | 1:cf9b0c21907a | 266 | void sleep(uint32_t); |
azazeal88 | 1:cf9b0c21907a | 267 | |
azazeal88 | 1:cf9b0c21907a | 268 | /** |
azazeal88 | 1:cf9b0c21907a | 269 | * @brief Sends the RN2483 to sleep for a finite length of time. |
azazeal88 | 1:cf9b0c21907a | 270 | * Roughly three days. |
azazeal88 | 1:cf9b0c21907a | 271 | */ |
azazeal88 | 0:a8609e6f88f3 | 272 | void sleep(); |
azazeal88 | 1:cf9b0c21907a | 273 | |
azazeal88 | 0:a8609e6f88f3 | 274 | #endif |
azazeal88 | 0:a8609e6f88f3 | 275 | |
azazeal88 | 0:a8609e6f88f3 | 276 | #ifdef USE_DYNAMIC_BUFFER |
azazeal88 | 0:a8609e6f88f3 | 277 | // Sets the size of the input buffer. |
azazeal88 | 0:a8609e6f88f3 | 278 | // Needs to be called before initOTA()/initABP(). |
azazeal88 | 1:cf9b0c21907a | 279 | void setInputBufferSize(uint16_t value) { |
azazeal88 | 1:cf9b0c21907a | 280 | this->inputBufferSize = value; |
azazeal88 | 1:cf9b0c21907a | 281 | }; |
azazeal88 | 0:a8609e6f88f3 | 282 | |
azazeal88 | 0:a8609e6f88f3 | 283 | // Sets the size of the "Received Payload" buffer. |
azazeal88 | 0:a8609e6f88f3 | 284 | // Needs to be called before initOTA()/initABP(). |
azazeal88 | 1:cf9b0c21907a | 285 | void setReceivedPayloadBufferSize(uint16_t value) { |
azazeal88 | 1:cf9b0c21907a | 286 | this->receivedPayloadBufferSize = value; |
azazeal88 | 1:cf9b0c21907a | 287 | }; |
azazeal88 | 0:a8609e6f88f3 | 288 | #endif |
azazeal88 | 0:a8609e6f88f3 | 289 | |
azazeal88 | 0:a8609e6f88f3 | 290 | private: |
azazeal88 | 0:a8609e6f88f3 | 291 | |
azazeal88 | 0:a8609e6f88f3 | 292 | Serial _RN2483; |
azazeal88 | 1:cf9b0c21907a | 293 | |
azazeal88 | 0:a8609e6f88f3 | 294 | // The size of the input buffer. Equals DEFAULT_INPUT_BUFFER_SIZE |
azazeal88 | 0:a8609e6f88f3 | 295 | // by default or (optionally) a user-defined value when using USE_DYNAMIC_BUFFER. |
azazeal88 | 0:a8609e6f88f3 | 296 | uint16_t inputBufferSize; |
azazeal88 | 0:a8609e6f88f3 | 297 | |
azazeal88 | 0:a8609e6f88f3 | 298 | // The size of the received payload buffer. Equals DEFAULT_RECEIVED_PAYLOAD_BUFFER_SIZE |
azazeal88 | 0:a8609e6f88f3 | 299 | // by default or (optionally) a user-defined value when using USE_DYNAMIC_BUFFER. |
azazeal88 | 0:a8609e6f88f3 | 300 | uint16_t receivedPayloadBufferSize; |
azazeal88 | 0:a8609e6f88f3 | 301 | |
azazeal88 | 0:a8609e6f88f3 | 302 | // Flag used to make sure the received payload buffer is |
azazeal88 | 0:a8609e6f88f3 | 303 | // current with the latest transmission. |
azazeal88 | 0:a8609e6f88f3 | 304 | bool packetReceived; |
azazeal88 | 0:a8609e6f88f3 | 305 | |
azazeal88 | 1:cf9b0c21907a | 306 | // Used to distinguise between RN2483 and RN2903. |
azazeal88 | 0:a8609e6f88f3 | 307 | // Currently only being set during reset(). |
azazeal88 | 0:a8609e6f88f3 | 308 | bool isRN2903; |
azazeal88 | 0:a8609e6f88f3 | 309 | |
azazeal88 | 0:a8609e6f88f3 | 310 | #ifdef USE_DYNAMIC_BUFFER |
azazeal88 | 0:a8609e6f88f3 | 311 | // Flag to make sure the buffers are not allocated more than once. |
azazeal88 | 0:a8609e6f88f3 | 312 | bool isBufferInitialized; |
azazeal88 | 0:a8609e6f88f3 | 313 | |
azazeal88 | 0:a8609e6f88f3 | 314 | char* inputBuffer; |
azazeal88 | 0:a8609e6f88f3 | 315 | char* receivedPayloadBuffer; |
azazeal88 | 0:a8609e6f88f3 | 316 | #else |
azazeal88 | 0:a8609e6f88f3 | 317 | char inputBuffer[DEFAULT_INPUT_BUFFER_SIZE]; |
azazeal88 | 0:a8609e6f88f3 | 318 | char receivedPayloadBuffer[DEFAULT_RECEIVED_PAYLOAD_BUFFER_SIZE]; |
azazeal88 | 0:a8609e6f88f3 | 319 | #endif |
azazeal88 | 0:a8609e6f88f3 | 320 | |
azazeal88 | 1:cf9b0c21907a | 321 | /** |
azazeal88 | 1:cf9b0c21907a | 322 | * @brief Takes care of the init tasks common to both initOTA() and initABP. |
azazeal88 | 1:cf9b0c21907a | 323 | */ |
azazeal88 | 0:a8609e6f88f3 | 324 | inline void init(); |
azazeal88 | 0:a8609e6f88f3 | 325 | |
azazeal88 | 1:cf9b0c21907a | 326 | /** |
azazeal88 | 1:cf9b0c21907a | 327 | * @brief Reads a line from the device serial stream. |
azazeal88 | 1:cf9b0c21907a | 328 | * @param Buffer to read into. |
azazeal88 | 1:cf9b0c21907a | 329 | * @param Size of buffer. |
azazeal88 | 1:cf9b0c21907a | 330 | * @param Position to start from. |
azazeal88 | 1:cf9b0c21907a | 331 | * @return Number of bytes read. |
azazeal88 | 1:cf9b0c21907a | 332 | */ |
azazeal88 | 0:a8609e6f88f3 | 333 | uint16_t readLn(char* buffer, uint16_t size, uint16_t start = 0); |
azazeal88 | 0:a8609e6f88f3 | 334 | |
azazeal88 | 1:cf9b0c21907a | 335 | /** |
azazeal88 | 1:cf9b0c21907a | 336 | * @brief Reads a line from the input buffer |
azazeal88 | 1:cf9b0c21907a | 337 | * @return Number of bytes read. |
azazeal88 | 1:cf9b0c21907a | 338 | */ |
azazeal88 | 1:cf9b0c21907a | 339 | uint16_t readLn() { |
azazeal88 | 1:cf9b0c21907a | 340 | return readLn(this->inputBuffer, this->inputBufferSize); |
azazeal88 | 1:cf9b0c21907a | 341 | }; |
azazeal88 | 0:a8609e6f88f3 | 342 | |
azazeal88 | 1:cf9b0c21907a | 343 | /** |
azazeal88 | 1:cf9b0c21907a | 344 | * @brief Waits for the given string. |
azazeal88 | 1:cf9b0c21907a | 345 | * @param String to look for. |
azazeal88 | 1:cf9b0c21907a | 346 | * @param Timeout Period |
azazeal88 | 1:cf9b0c21907a | 347 | * @param Position to start from. |
azazeal88 | 1:cf9b0c21907a | 348 | * @return Returns true if the string is received before a timeout. |
azazeal88 | 1:cf9b0c21907a | 349 | * Returns false if a timeout occurs or if another string is received. |
azazeal88 | 1:cf9b0c21907a | 350 | */ |
azazeal88 | 0:a8609e6f88f3 | 351 | bool expectString(const char* str, uint16_t timeout = DEFAULT_TIMEOUT); |
azazeal88 | 1:cf9b0c21907a | 352 | |
azazeal88 | 1:cf9b0c21907a | 353 | /** |
azazeal88 | 1:cf9b0c21907a | 354 | * @brief Looks for an 'OK' response from the RN2483 |
azazeal88 | 7:100ab85cc6d7 | 355 | * @param Timeout Period |
azazeal88 | 1:cf9b0c21907a | 356 | * @return Returns true if the string is received before a timeout. |
azazeal88 | 1:cf9b0c21907a | 357 | * Returns false if a timeout occurs or if another string is received. |
azazeal88 | 1:cf9b0c21907a | 358 | */ |
azazeal88 | 7:100ab85cc6d7 | 359 | bool expectOK(uint16_t timeout = DEFAULT_TIMEOUT); |
azazeal88 | 0:a8609e6f88f3 | 360 | |
azazeal88 | 1:cf9b0c21907a | 361 | /** |
azazeal88 | 1:cf9b0c21907a | 362 | * @brief Sends a reset command to the module |
azazeal88 | 1:cf9b0c21907a | 363 | * Also sets-up some initial parameters like power index, SF and FSB channels. |
azazeal88 | 1:cf9b0c21907a | 364 | * @return Waits for sucess reponse or timeout. |
azazeal88 | 1:cf9b0c21907a | 365 | */ |
azazeal88 | 0:a8609e6f88f3 | 366 | bool resetDevice(); |
azazeal88 | 0:a8609e6f88f3 | 367 | |
azazeal88 | 1:cf9b0c21907a | 368 | /** |
azazeal88 | 1:cf9b0c21907a | 369 | * @brief Sends a join command to the network |
azazeal88 | 1:cf9b0c21907a | 370 | * @param Type of join, OTAA or ABP |
azazeal88 | 1:cf9b0c21907a | 371 | * @return Returns true on success or false if fail. |
azazeal88 | 1:cf9b0c21907a | 372 | */ |
azazeal88 | 0:a8609e6f88f3 | 373 | bool joinNetwork(const char* type); |
azazeal88 | 0:a8609e6f88f3 | 374 | |
azazeal88 | 1:cf9b0c21907a | 375 | /** |
azazeal88 | 1:cf9b0c21907a | 376 | * @brief Returns the enum that is mapped to the given "error" message |
azazeal88 | 1:cf9b0c21907a | 377 | * @param Error to lookup. |
azazeal88 | 1:cf9b0c21907a | 378 | * @return Returns the enum |
azazeal88 | 1:cf9b0c21907a | 379 | */ |
azazeal88 | 0:a8609e6f88f3 | 380 | uint8_t lookupMacTransmitError(const char* error); |
azazeal88 | 0:a8609e6f88f3 | 381 | |
azazeal88 | 1:cf9b0c21907a | 382 | /** |
azazeal88 | 1:cf9b0c21907a | 383 | * @brief Sends a a payload and blocks until there is a response back, |
azazeal88 | 1:cf9b0c21907a | 384 | * or the receive windows have closed or the hard timeout has passed. |
azazeal88 | 1:cf9b0c21907a | 385 | * @param Transmit type |
azazeal88 | 1:cf9b0c21907a | 386 | * @param Port to use for transmit |
azazeal88 | 1:cf9b0c21907a | 387 | * @param Payload buffer |
azazeal88 | 1:cf9b0c21907a | 388 | * @param Size of payload buffer |
azazeal88 | 1:cf9b0c21907a | 389 | * @return Returns if sucessfull or if a MAC transmit error. |
azazeal88 | 1:cf9b0c21907a | 390 | */ |
azazeal88 | 0:a8609e6f88f3 | 391 | uint8_t macTransmit(const char* type, uint8_t port, const uint8_t* payload, uint8_t size); |
azazeal88 | 0:a8609e6f88f3 | 392 | |
azazeal88 | 1:cf9b0c21907a | 393 | /** |
azazeal88 | 1:cf9b0c21907a | 394 | * @brief Parses the input buffer and copies the received payload into |
azazeal88 | 1:cf9b0c21907a | 395 | * the "received payload" buffer when a "mac rx" message has been received. |
azazeal88 | 1:cf9b0c21907a | 396 | * @return Returns 0 (NoError) or otherwise one of the MacTransmitErrorCodes. |
azazeal88 | 1:cf9b0c21907a | 397 | */ |
azazeal88 | 0:a8609e6f88f3 | 398 | uint8_t onMacRX(); |
azazeal88 | 1:cf9b0c21907a | 399 | |
azazeal88 | 1:cf9b0c21907a | 400 | /** |
azazeal88 | 1:cf9b0c21907a | 401 | * @brief Private method to read serial port with timeout |
azazeal88 | 1:cf9b0c21907a | 402 | * @param The time to wait for in milliseconds. |
azazeal88 | 1:cf9b0c21907a | 403 | * @return Returns character or -1 on timeout |
azazeal88 | 1:cf9b0c21907a | 404 | */ |
azazeal88 | 1:cf9b0c21907a | 405 | int timedRead(int _timeout); |
azazeal88 | 1:cf9b0c21907a | 406 | |
azazeal88 | 1:cf9b0c21907a | 407 | /** |
azazeal88 | 1:cf9b0c21907a | 408 | * @brief Read characters into buffer. |
azazeal88 | 1:cf9b0c21907a | 409 | * Terminates if length characters have been read, timeout, or |
azazeal88 | 1:cf9b0c21907a | 410 | * if the terminator character has been detected |
azazeal88 | 1:cf9b0c21907a | 411 | * @param The terminator character to look for |
azazeal88 | 1:cf9b0c21907a | 412 | * @param The buffer to read into. |
azazeal88 | 1:cf9b0c21907a | 413 | * @param The size of the buffer. |
azazeal88 | 1:cf9b0c21907a | 414 | * @return The number of bytes read. 0 means no valid data found. |
azazeal88 | 1:cf9b0c21907a | 415 | */ |
azazeal88 | 0:a8609e6f88f3 | 416 | size_t readBytesUntil(char terminator, char *buffer, size_t length); |
azazeal88 | 0:a8609e6f88f3 | 417 | }; |
azazeal88 | 0:a8609e6f88f3 | 418 | |
azazeal88 | 0:a8609e6f88f3 | 419 | #endif // RN2483 |