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

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?

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