Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mDot_LoRa_Sensornode
Fork of libmDot by
Revision 11:9938ba31d428, committed 2016-03-29
- Comitter:
- Mike Fiore
- Date:
- Tue Mar 29 10:18:28 2016 -0500
- Parent:
- 10:0b4eb17d07ae
- Child:
- 12:5fddfa2b85aa
- Commit message:
- update to version 1.0.7 of mDot library
Changed in this revision
--- a/MTS-Utils/MTSCircularBuffer.h Thu Sep 10 13:19:35 2015 -0500 +++ b/MTS-Utils/MTSCircularBuffer.h Tue Mar 29 10:18:28 2016 -0500 @@ -1,10 +1,3 @@ -/************************************************ - * MultiTech MTDOT Library - * Copyright (c) 2015 MultiTech Systems - * - * See LICENSE file for license information - ***********************************************/ - #ifndef MTSCIRCULARBUFFER_H #define MTSCIRCULARBUFFER_H
--- a/MTS-Utils/MTSLog.h Thu Sep 10 13:19:35 2015 -0500
+++ b/MTS-Utils/MTSLog.h Tue Mar 29 10:18:28 2016 -0500
@@ -1,26 +1,35 @@
-/************************************************
- * MultiTech MTDOT Library
- * Copyright (c) 2015 MultiTech Systems
- *
- * See LICENSE file for license information
- ***********************************************/
-
#ifndef MTSLOG_H
#define MTSLOG_H
+#include <string>
+
+inline const char* className(const std::string& prettyFunction)
+{
+ size_t colons = prettyFunction.find_last_of("::");
+ if (colons == std::string::npos)
+ return "";
+ size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
+ size_t end = colons - begin;
+
+ return prettyFunction.substr(begin,end).c_str();
+}
+
+#define __CLASSNAME__ className(__PRETTY_FUNCTION__)
+
+
#ifdef MTS_DEBUG
#define logFatal(format, ...) \
- mts::MTSLog::printMessage(mts::MTSLog::FATAL_LEVEL, "%s:%s:%s| [%s] " format "\r\n", __FILE__, __func__, __LINE__, mts::MTSLog::FATAL_LABEL, ##__VA_ARGS__)
+ mts::MTSLog::printMessage(mts::MTSLog::FATAL_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::FATAL_LABEL, ##__VA_ARGS__)
#define logError(format, ...) \
- mts::MTSLog::printMessage(mts::MTSLog::ERROR_LEVEL, "%s:%s:%s| [%s] " format "\r\n", __FILE__, __func__, __LINE__, mts::MTSLog::ERROR_LABEL, ##__VA_ARGS__)
+ mts::MTSLog::printMessage(mts::MTSLog::ERROR_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::ERROR_LABEL, ##__VA_ARGS__)
#define logWarning(format, ...) \
- mts::MTSLog::printMessage(mts::MTSLog::WARNING_LEVEL, "%s:%s:%s| [%s] " format "\r\n", __FILE__, __func__, __LINE__, mts::MTSLog::WARNING_LABEL, ##__VA_ARGS__)
+ mts::MTSLog::printMessage(mts::MTSLog::WARNING_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::WARNING_LABEL, ##__VA_ARGS__)
#define logInfo(format, ...) \
- mts::MTSLog::printMessage(mts::MTSLog::INFO_LEVEL, "%s:%s:%s| [%s] " format "\r\n", __FILE__, __func__, __LINE__, mts::MTSLog::INFO_LABEL, ##__VA_ARGS__)
+ mts::MTSLog::printMessage(mts::MTSLog::INFO_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::INFO_LABEL, ##__VA_ARGS__)
#define logDebug(format, ...) \
- mts::MTSLog::printMessage(mts::MTSLog::DEBUG_LEVEL, "%s:%s:%s| [%s] " format "\r\n", __FILE__, __func__, __LINE__, mts::MTSLog::DEBUG_LABEL, ##__VA_ARGS__)
+ mts::MTSLog::printMessage(mts::MTSLog::DEBUG_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::DEBUG_LABEL, ##__VA_ARGS__)
#define logTrace(format, ...) \
- mts::MTSLog::printMessage(mts::MTSLog::TRACE_LEVEL, "%s:%s:%s| [%s] " format "\r\n", __FILE__, __func__, __LINE__, mts::MTSLog::TRACE_LABEL, ##__VA_ARGS__)
+ mts::MTSLog::printMessage(mts::MTSLog::TRACE_LEVEL, "%s:%s:%d| [%s] " format "\r\n", __CLASSNAME__, __func__, __LINE__, mts::MTSLog::TRACE_LABEL, ##__VA_ARGS__)
#else
#define logFatal(format, ...) \
mts::MTSLog::printMessage(mts::MTSLog::FATAL_LEVEL, "[%s] " format "\r\n", mts::MTSLog::FATAL_LABEL, ##__VA_ARGS__)
--- a/MTS-Utils/MTSText.h Thu Sep 10 13:19:35 2015 -0500
+++ b/MTS-Utils/MTSText.h Tue Mar 29 10:18:28 2016 -0500
@@ -1,90 +1,83 @@
-/************************************************
- * MultiTech MTDOT Library
- * Copyright (c) 2015 MultiTech Systems
- *
- * See LICENSE file for license information
- ***********************************************/
-
-#ifndef MTSTEXT_H
-#define MTSTEXT_H
-
-#include <string>
-#include <vector>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-namespace mts
-{
+#ifndef MTSTEXT_H
+#define MTSTEXT_H
+
+#include <string>
+#include <vector>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+namespace mts
+{
+
+/** This class contains a number of static methods for manipulating strings and other
+* text data.
+*/
+class Text
+{
+public:
+ /** This static method can be used to pull out a string at the next line break. A
+ * break can either be a newline '\n', carriage return '\r' or both.
+ *
+ * @param source the source string to look for the line break on.
+ * @param start the start postion within the string to begin looking for the line
+ * break.
+ * @param cursor this value will be updated with the index for the next available character
+ * after the line break. If a line break is not found returns -1.
+ * @returns the string beginning with the start index up to including the line breaks.
+ */
+ static std::string getLine(const std::string& source, const size_t& start, size_t& cursor);
+
+ /** This is a static method for splitting strings using a delimeter value.
+ *
+ * @param str the string to try and split.
+ * @param delimiter the delimeter value to split on as a character.
+ * @param limit the maximum number of splits. If equal to 0 it splits as amny times as possible.
+ * The default is 0.
+ * @returns an ordered vector of strings conatining the splits of the original string.
+ */
+ static std::vector<std::string> split(const std::string& str, char delimiter, int limit = 0);
+
+ /** This is a static method for splitting strings using a delimeter value.
+ *
+ * @param str the string to try and split.
+ * @param delimiter the delimeter value to split on as a string.
+ * @param limit the maximum number of splits. If equal to 0 it splits as amny times as possible.
+ * The default is 0.
+ * @returns an ordered vector of strings conatining the splits of the original string.
+ */
+ static std::vector<std::string> split(const std::string& str, const std::string& delimiter, int limit = 0);
+
+ static std::string readString(char* index, int length);
+
+ static std::string toUpper(const std::string str);
+
+ static std::string float2String(double val, int precision);
+
+ static std::string bin2hexString(const std::vector<uint8_t>& data, const char* delim = "", bool leadingZeros = false, bool bytePadding = true);
-/** This class contains a number of static methods for manipulating strings and other
-* text data.
-*/
-class Text
-{
-public:
- /** This static method can be used to pull out a string at the next line break. A
- * break can either be a newline '\n', carriage return '\r' or both.
- *
- * @param source the source string to look for the line break on.
- * @param start the start postion within the string to begin looking for the line
- * break.
- * @param cursor this value will be updated with the index for the next available character
- * after the line break. If a line break is not found returns -1.
- * @returns the string beginning with the start index up to including the line breaks.
- */
- static std::string getLine(const std::string& source, const size_t& start, size_t& cursor);
-
- /** This is a static method for splitting strings using a delimeter value.
- *
- * @param str the string to try and split.
- * @param delimiter the delimeter value to split on as a character.
- * @param limit the maximum number of splits. If equal to 0 it splits as amny times as possible.
- * The default is 0.
- * @returns an ordered vector of strings conatining the splits of the original string.
- */
- static std::vector<std::string> split(const std::string& str, char delimiter, int limit = 0);
-
- /** This is a static method for splitting strings using a delimeter value.
- *
- * @param str the string to try and split.
- * @param delimiter the delimeter value to split on as a string.
- * @param limit the maximum number of splits. If equal to 0 it splits as amny times as possible.
- * The default is 0.
- * @returns an ordered vector of strings conatining the splits of the original string.
- */
- static std::vector<std::string> split(const std::string& str, const std::string& delimiter, int limit = 0);
-
- static std::string readString(char* index, int length);
-
- static std::string toUpper(const std::string str);
-
- static std::string float2String(double val, int precision);
-
- static std::string bin2hexString(const std::vector<uint8_t>& data, const char* delim = "", bool leadingZeros = false);
-
- static std::string bin2hexString(const uint8_t* data, const uint32_t len, const char* delim = "", bool leadingZeros = false);
-
- static std::string bin2base64(const std::vector<uint8_t>& data);
-
- static std::string bin2base64(const uint8_t* data, size_t size);
-
- static bool base642bin(const std::string in, std::vector<uint8_t>& out);
+ static std::string bin2hexString(const uint8_t* data, const uint32_t len, const char* delim = "", bool leadingZeros = false, bool bytePadding = true);
+
+ static std::string bin2base64(const std::vector<uint8_t>& data);
+
+ static std::string bin2base64(const uint8_t* data, size_t size);
+
+ static bool base642bin(const std::string in, std::vector<uint8_t>& out);
static void ltrim(std::string& str, const char* args);
static void rtrim(std::string& str, const char* args);
static void trim(std::string& str, const char* args);
-
-private:
- // Safety for class with only static methods
- Text();
- Text(const Text& other);
- Text& operator=(const Text& other);
-};
-
-}
-
-#endif
+
+private:
+ // Safety for class with only static methods
+ Text();
+ Text(const Text& other);
+ Text& operator=(const Text& other);
+};
+
+}
+
+#endif
--- a/MTS-Utils/Utils.h Thu Sep 10 13:19:35 2015 -0500
+++ b/MTS-Utils/Utils.h Tue Mar 29 10:18:28 2016 -0500
@@ -1,10 +1,3 @@
-/************************************************
- * MultiTech MTDOT Library
- * Copyright (c) 2015 MultiTech Systems
- *
- * See LICENSE file for license information
- ***********************************************/
-
#ifndef UTILS_H
#define UTILS_H
@@ -27,7 +20,7 @@
* @param relationalOperator a RelationalOperator enumeration.
* @returns the enumeration name as a string.
*/
-static std::string getRelationalOperatorNames(RelationalOperator relationalOperator)
+static inline std::string getRelationalOperatorNames(RelationalOperator relationalOperator)
{
switch(relationalOperator) {
case GREATER:
Binary file libmDot.ar has changed
--- a/mDot.h Thu Sep 10 13:19:35 2015 -0500
+++ b/mDot.h Tue Mar 29 10:18:28 2016 -0500
@@ -9,6 +9,7 @@
#include <map>
#include <string>
+class mDotEvent;
class LoRaMacEvent;
class LoRaConfig;
class LoRaMac;
@@ -55,6 +56,9 @@
void wakeup();
+ void enterStopMode(const uint32_t& interval, const uint8_t& wakeup_mode = RTC_ALARM);
+ void enterStandbyMode(const uint32_t& interval, const uint8_t& wakeup_mode = RTC_ALARM);
+
static mDot* _instance;
LoRaMac* _mac;
@@ -76,7 +80,9 @@
PinName _wakeup_pin;
typedef enum {
- OFF, ON, BLINK,
+ OFF,
+ ON,
+ BLINK,
} state;
public:
@@ -101,39 +107,95 @@
MDOT_NOT_JOINED = -6,
MDOT_ENCRYPTION_DISABLED = -7,
MDOT_NO_FREE_CHAN = -8,
+ MDOT_TEST_MODE = -9,
+ MDOT_NO_ENABLED_CHAN = -10,
+ MDOT_AGGREGATED_DUTY_CYCLE = -11,
MDOT_ERROR = -1024,
} mdot_ret_code;
enum JoinMode {
- MANUAL, OTA, AUTO_OTA
+ MANUAL,
+ OTA,
+ AUTO_OTA,
+ PEER_TO_PEER
};
enum Mode {
- COMMAND_MODE, SERIAL_MODE
+ COMMAND_MODE,
+ SERIAL_MODE
};
enum RX_Output {
- HEXADECIMAL, BINARY
+ HEXADECIMAL,
+ BINARY
};
enum DataRates {
- SF_12, SF_11, SF_10, SF_9, SF_8, SF_7, SF_7H, SF_50
+ DR0,
+ DR1,
+ DR2,
+ DR3,
+ DR4,
+ DR5,
+ DR6,
+ DR7,
+ DR8,
+ DR9,
+ DR10,
+ DR11,
+ DR12,
+ DR13,
+ DR14,
+ DR15,
+ SF_12 = 16,
+ SF_11,
+ SF_10,
+ SF_9,
+ SF_8,
+ SF_7,
+ SF_7H,
+ SF_FSK
};
enum FrequencyBands {
- FB_868, FB_915
+ FB_868, // EU868
+ FB_915 // US915
};
enum FrequencySubBands {
- FSB_ALL, FSB_1, FSB_2, FSB_3, FSB_4, FSB_5, FSB_6, FSB_7, FSB_8
+ FSB_ALL,
+ FSB_1,
+ FSB_2,
+ FSB_3,
+ FSB_4,
+ FSB_5,
+ FSB_6,
+ FSB_7,
+ FSB_8
};
enum JoinByteOrder {
- LSB, MSB
+ LSB,
+ MSB
};
enum wakeup_mode {
- RTC_ALARM, INTERRUPT
+ RTC_ALARM,
+ INTERRUPT,
+ RTC_ALARM_OR_INTERRUPT
+ };
+
+ enum UserBackupRegs {
+ UBR0,
+ UBR1,
+ UBR2,
+ UBR3,
+ UBR4,
+ UBR5,
+ UBR6,
+ UBR7,
+ UBR8,
+ UBR9
};
typedef struct {
@@ -158,10 +220,10 @@
} rssi_stats;
typedef struct {
- int8_t last;
- int8_t min;
- int8_t max;
- int8_t avg;
+ int16_t last;
+ int16_t min;
+ int16_t max;
+ int16_t avg;
} snr_stats;
typedef struct {
@@ -187,11 +249,15 @@
static std::string FrequencyBandStr(uint8_t band);
static std::string FrequencySubBandStr(uint8_t band);
+ uint32_t UserRegisters[10];
+
/** Get a handle to the singleton object
* @returns pointer to mDot object
*/
static mDot* getInstance();
+ void setEvents(mDotEvent* events);
+
/** Get library version information
* @returns string containing library version information
*/
@@ -229,6 +295,11 @@
*/
uint8_t getLogLevel();
+ /** Seed pseudo RNG in LoRaMac layer, uses random value from radio RSSI reading by default
+ * @param seed for RNG
+ */
+ void seedRandom(uint32_t seed);
+
/** Enable or disable the activity LED.
* @param enable true to enable the LED, false to disable
*/
@@ -256,11 +327,36 @@
*/
PinName getActivityLedPin();
+ /** Returns boolean indicative of start-up from standby mode
+ * @returns true if dot woke from standby
+ */
+ bool getStandbyFlag();
+
+ /** Add a channel frequencies currently in use
+ * @returns MDOT_OK
+ */
+ int32_t addChannel(uint8_t index, uint32_t frequency, uint8_t datarateRange);
+
/** Get list of channel frequencies currently in use
* @returns vector of channels currently in use
*/
std::vector<uint32_t> getChannels();
+ /** Get list of channel datarate ranges currently in use
+ * @returns vector of datarate ranges currently in use
+ */
+ std::vector<uint8_t> getChannelRanges();
+
+ /** Get list of channel frequencies in config file to be used as session defaults
+ * @returns vector of channels in config file
+ */
+ std::vector<uint32_t> getConfigChannels();
+
+ /** Get list of channel datarate ranges in config file to be used as session defaults
+ * @returns vector of datarate ranges in config file
+ */
+ std::vector<uint8_t> getConfigChannelRanges();
+
/** Get frequency band
* @returns FB_915 if configured for United States, FB_868 if configured for Europe
*/
@@ -268,7 +364,7 @@
/** Set frequency sub band
* only applicable if frequency band is set for United States (FB_915)
- * sub band 0 will allow the radio to use all 64 channels
+ * sub band 0 will allow the radio to use all 64 channels
* sub band 1 - 8 will allow the radio to use the 8 channels in that sub band
* for use with Conduit gateway and MTAC_LORA, use sub bands 1 - 8, not sub band 0
* @param band the sub band to use (0 - 8)
@@ -281,7 +377,14 @@
*/
uint8_t getFrequencySubBand();
+ /** Get the datarate currently in use within the MAC layer
+ * returns 0-15
+ */
+ uint8_t getSessionDataRate();
+
/** Enable/disable public network mode
+ * JoinDelay will be set to (public: 5s, private: 1s) and
+ * RxDelay will be set to 1s both can be adjusted afterwards
* @param on should be true to enable public network mode
* @returns MDOT_OK if success
*/
@@ -297,6 +400,31 @@
*/
std::vector<uint8_t> getDeviceId();
+ /** Get the device port to be used for lora application data (1-223)
+ * @returns port
+ */
+ uint8_t getAppPort();
+
+ /** Set the device port to be used for lora application data (1-223)
+ * @returns MDOT_OK if success
+ */
+ int32_t setAppPort(uint8_t port);
+
+ /** Set the device class A, B or C
+ * @returns MDOT_OK if success
+ */
+ int32_t setClass(std::string newClass);
+
+ /** Get the device class A, B or C
+ * @returns MDOT_OK if success
+ */
+ std::string getClass();
+
+ /** Get the max packet length with current settings
+ * @returns max packet length
+ */
+ uint8_t getMaxPacketLength();
+
/** Set network address
* for use with MANUAL network join mode, will be assigned in OTA & AUTO_OTA modes
* @param addr a vector of 4 bytes
@@ -396,7 +524,9 @@
uint8_t getJoinByteOrder();
/** Attempt to join network
- * retries according to configuration set by setJoinRetries()
+ * each attempt will be made with a random datarate up to the configured datarate
+ * JoinRequest backoff between tries is enforced to 1% for 1st hour, 0.1% for 1-10 hours and 0.01% after 10 hours
+ * Check getNextTxMs() for time until next join attempt can be made
* @returns MDOT_OK if success
*/
int32_t joinNetwork();
@@ -411,6 +541,16 @@
*/
void resetNetworkSession();
+ /** Restore saved network session from flash
+ * has no effect for MANUAL network join mode
+ */
+ void restoreNetworkSession();
+
+ /** Save current network session to flash
+ * has no effect for MANUAL network join mode
+ */
+ void saveNetworkSession();
+
/** Set number of times joining will retry before giving up
* @param retries must be between 0 - 255
* @returns MDOT_OK if success
@@ -471,11 +611,32 @@
*/
uint8_t getLinkCheckThreshold();
+ /** Get/set number of failed link checks in the current session
+ * @returns count (0 - 255)
+ */
+ uint8_t getLinkFailCount();
+ int32_t setLinkFailCount(uint8_t count);
+
+ /** Set UpLinkCounter number of packets sent to the gateway during this network session (sequence number)
+ * @returns MDOT_OK
+ */
+ int32_t setUpLinkCounter(uint32_t count);
+
/** Get UpLinkCounter
* @returns number of packets sent to the gateway during this network session (sequence number)
*/
uint32_t getUpLinkCounter();
+ /** Set UpLinkCounter number of packets sent by the gateway during this network session (sequence number)
+ * @returns MDOT_OK
+ */
+ int32_t setDownLinkCounter(uint32_t count);
+
+ /** Get DownLinkCounter
+ * @returns number of packets sent by the gateway during this network session (sequence number)
+ */
+ uint32_t getDownLinkCounter();
+
/** Enable/disable AES encryption
* AES encryption must be enabled for use with Conduit gateway and MTAC_LORA card
* @param on true for AES encryption to be enabled
@@ -489,12 +650,12 @@
bool getAesEncryption();
/** Get RSSI stats
- * @returns rssi_stats struct containing last, min, max, and avg RSSI
+ * @returns rssi_stats struct containing last, min, max, and avg RSSI in dB
*/
rssi_stats getRssiStats();
/** Get SNR stats
- * @returns snr_stats struct containing last, min, max, and avg SNR
+ * @returns snr_stats struct containing last, min, max, and avg SNR in cB
*/
snr_stats getSnrStats();
@@ -504,30 +665,102 @@
*/
uint32_t getNextTxMs();
+ /** Get join delay in seconds
+ * Public network defaults to 5 seconds
+ * Private network defaults to 1 second
+ * @returns number of seconds before join accept message is expected
+ */
+ uint8_t getJoinDelay();
+
+ /** Set join delay in seconds
+ * Public network defaults to 5 seconds
+ * Private network defaults to 1 second
+ * @param delay number of seconds before join accept message is expected
+ * @return MDOT_OK if success
+ */
+ uint32_t setJoinDelay(uint8_t delay);
+
+ /** Get rx delay in seconds
+ * Defaults to 1 second
+ * @returns number of seconds before response message is expected
+ */
+ uint8_t getRxDelay();
+
+ /** Set rx delay in seconds
+ * Defaults to 1 second
+ * @param delay number of seconds before response message is expected
+ * @return MDOT_OK if success
+ */
+ uint32_t setRxDelay(uint8_t delay);
+
+ /** Get preserve session to save network session info through reset or power down in AUTO_OTA mode
+ * Defaults to off
+ * @returns true if enabled
+ */
+ bool getPreserveSession();
+
+ /** Set preserve session to save network session info through reset or power down in AUTO_OTA mode
+ * Defaults to off
+ * @param enable
+ * @return MDOT_OK if success
+ */
+ uint32_t setPreserveSession(bool enable);
+
/** Get data pending
* only valid after sending data to the gateway
* @returns true if server has available packet(s)
*/
bool getDataPending();
- /** Get transmitting
+ /** Get transmitting
* @returns true if currently transmitting
*/
bool getIsTransmitting();
/** Set TX data rate
* data rates affect maximum payload size
- * @param dr SF_7 - SF_12 for Europe, SF_7 - SF_10 for United States
+ * @param dr SF_7 - SF_12|DR0-DR7 for Europe, SF_7 - SF_10 | DR0-DR4 for United States
* @returns MDOT_OK if success
*/
int32_t setTxDataRate(const uint8_t& dr);
/** Get TX data rate
- * @returns current TX data rate (SF_7 - SF_12)
+ * @returns current TX data rate (DR0-DR15)
*/
uint8_t getTxDataRate();
- /** Set TX power
+ /** Get a random value from the radio based on RSSI
+ * @returns randome value
+ */
+ uint32_t getRadioRandom();
+
+
+ /** Get data rate spreading factor and bandwidth
+ * EU868 Datarates
+ * ---------------
+ * DR0 - SF12BW125
+ * DR1 - SF11BW125
+ * DR2 - SF10BW125
+ * DR3 - SF9BW125
+ * DR4 - SF8BW125
+ * DR5 - SF7BW125
+ * DR6 - SF7BW250
+ * DR7 - FSK
+ *
+ * US915 Datarates
+ * ---------------
+ * DR0 - SF10BW125
+ * DR1 - SF9BW125
+ * DR2 - SF8BW125
+ * DR3 - SF7BW125
+ * DR4 - SF8BW500
+ *
+ * @returns spreading factor and bandwidth
+ */
+ std::string getDateRateDetails(uint8_t rate);
+
+ /** Set TX power output of radio before antenna gain, default: 14 dBm
+ * actual output power may be limited by local regulations for the chosen frequency
* power affects maximum range
* @param power 2 dBm - 20 dBm
* @returns MDOT_OK if success
@@ -539,6 +772,17 @@
*/
uint32_t getTxPower();
+ /** Get configured gain of installed antenna, default: +3 dBi
+ * @returns gain of antenna in dBi
+ */
+ int8_t getAntennaGain();
+
+ /** Set configured gain of installed antenna, default: +3 dBi
+ * @param gain -127 dBi - 128 dBi
+ * @returns MDOT_OK if success
+ */
+ int32_t setAntennaGain(int8_t gain);
+
/** Enable/disable TX waiting for rx windows
* when enabled, send calls will block until a packet is received or RX timeout
* @param enable set to true if expecting responses to transmitted packets
@@ -566,6 +810,13 @@
*/
uint32_t getMaxFrequency();
+ // get/set adaptive data rate
+ // configure data rates and power levels based on signal to noise of packets received at gateway
+ // true == adaptive data rate is on
+ // set function returns MDOT_OK if success
+ int32_t setAdr(const bool& on);
+ bool getAdr();
+
/** Set forward error correction bytes
* @param bytes 1 - 4 bytes
* @returns MDOT_OK if success
@@ -600,6 +851,17 @@
*/
uint8_t getAck();
+ /** Set number of packet repeats for unconfirmed frames
+ * @param repeat 0 or 1 for no repeats, otherwise 2-15
+ * @returns MDOT_OK if success
+ */
+ int32_t setRepeat(const uint8_t& repeat);
+
+ /** Get number of packet repeats for unconfirmed frames
+ * @returns 0 or 1 if no repeats, otherwise 2-15
+ */
+ uint8_t getRepeat();
+
/** Send data to the gateway
* validates data size (based on spreading factor)
* @param data a vector of up to 242 bytes (may be less based on spreading factor)
@@ -615,7 +877,6 @@
*/
int32_t recv(std::vector<uint8_t>& data);
-
/** Ping
* status will be MDOT_OK if ping succeeded
* @returns ping_response struct containing status, RSSI, and SNR
@@ -633,39 +894,126 @@
std::string getLastError();
/** Go to sleep
- * @param interval the number of seconds to sleep before waking up if wakeup_mode == RTC_ALARM, else ignored
- * @param wakeup_mode RTC_ALARM, INTERRUPT
+ * @param interval the number of seconds to sleep before waking up if wakeup_mode == RTC_ALARM or RTC_ALARM_OR_INTERRUPT, else ignored
+ * @param wakeup_mode RTC_ALARM, INTERRUPT, RTC_ALARM_OR_INTERRUPT
* if RTC_ALARM the real time clock is configured to wake the device up after the specified interval
* if INTERRUPT the device will wake up on the rising edge of the interrupt pin
+ * if RTC_ALARM_OR_INTERRUPT the device will wake on the first event to occur
* @param deepsleep if true go into deep sleep mode (lowest power, all memory and registers are lost, peripherals turned off)
* else go into sleep mode (low power, memory and registers are maintained, peripherals stay on)
*
- * ** CURRENTLY ONLY DEEPSLEEP MODE IS AVAILABLE **
- *
- * in sleep mode, the device can be woken up on any of the XBEE pins or by the RTC alarm
+ * in sleep mode, the device can be woken up on an XBEE_DI (2-8) pin or by the RTC alarm
* in deepsleep mode, the device can only be woken up using the WKUP pin (PA0, XBEE_DIO7) or by the RTC alarm
*/
void sleep(const uint32_t& interval, const uint8_t& wakeup_mode = RTC_ALARM, const bool& deepsleep = true);
/** Set wake pin
- * @param pin the pin to use to wake the device from sleep mode
+ * @param pin the pin to use to wake the device from sleep mode XBEE_DI (2-8)
*/
void setWakePin(const PinName& pin);
/** Get wake pin
- * @returns the pin to use to wake the device from sleep mode
+ * @returns the pin to use to wake the device from sleep mode XBEE_DI (2-8)
*/
PinName getWakePin();
- /******************************************
- * THESE FEATURES ARE NOT FULLY IMPLEMENTED
- *****************************************/
- // get/set adaptive data rate
- // configure data rates and power levels based on signal to noise information from gateway
- // true == adaptive data rate is on
- // set function returns MDOT_OK if success
- int32_t setAdr(const bool& on);
- bool getAdr();
+ /** Write data in a user backup register
+ * @param register one of UBR0 through UBR9
+ * @param data user data to back up
+ * @returns true if success
+ */
+ bool writeUserBackupRegister(uint32_t reg, uint32_t data);
+
+ /** Read data in a user backup register
+ * @param register one of UBR0 through UBR9
+ * @param data gets set to content of register
+ * @returns true if success
+ */
+ bool readUserBackupRegister(uint32_t reg, uint32_t& data);
+
+ // Save user file data to flash
+ // file - name of file max 30 chars
+ // data - data of file
+ // size - size of file
+ bool saveUserFile(const char* file, void* data, uint32_t size);
+
+ // Append user file data to flash
+ // file - name of file max 30 chars
+ // data - data of file
+ // size - size of file
+ bool appendUserFile(const char* file, void* data, uint32_t size);
+
+ // Read user file data from flash
+ // file - name of file max 30 chars
+ // data - data of file
+ // size - size of file
+ bool readUserFile(const char* file, void* data, uint32_t size);
+
+ // Move a user file in flash
+ // file - name of file
+ // new_name - new name of file
+ bool moveUserFile(const char* file, const char* new_name);
+
+ // Delete user file data from flash
+ // file - name of file max 30 chars
+ bool deleteUserFile(const char* file);
+
+ // Open user file in flash, max of 4 files open concurrently
+ // file - name of file max 30 chars
+ // mode - combination of FM_APPEND | FM_TRUNC | FM_CREAT |
+ // FM_RDONLY | FM_WRONLY | FM_RDWR | FM_DIRECT
+ // returns - mdot_file struct, fd field will be a negative value if file could not be opened
+ mDot::mdot_file openUserFile(const char* file, int mode);
+
+ // Seek an open file
+ // file - mdot file struct
+ // offset - offset in bytes
+ // whence - where offset is based SEEK_SET, SEEK_CUR, SEEK_END
+ bool seekUserFile(mDot::mdot_file& file, size_t offset, int whence);
+
+ // Read bytes from open file
+ // file - mdot file struct
+ // data - mem location to store data
+ // length - number of bytes to read
+ // returns - number of bytes written
+ int readUserFile(mDot::mdot_file& file, void* data, size_t length);
+
+ // Write bytes to open file
+ // file - mdot file struct
+ // data - data to write
+ // length - number of bytes to write
+ // returns - number of bytes written
+ int writeUserFile(mDot::mdot_file& file, void* data, size_t length);
+
+ // Close open file
+ // file - mdot file struct
+ bool closeUserFile(mDot::mdot_file& file);
+
+ // List user files stored in flash
+ std::vector<mDot::mdot_file> listUserFiles();
+
+ // Move file into the firmware upgrade path to be flashed on next boot
+ // file - name of file
+ bool moveUserFileToFirmwareUpgrade(const char* file);
+
+ // get current statistics
+ // Join Attempts, Join Fails, Up Packets, Down Packets, Missed Acks
+ mdot_stats getStats();
+
+ // reset statistics
+ // Join Attempts, Join Fails, Up Packets, Down Packets, Missed Acks
+ void resetStats();
+
+ // Convert pin number 2-8 to pin name DIO2-DI8
+ static PinName pinNum2Name(uint8_t num);
+
+ // Convert pin name DIO2-DI8 to pin number 2-8
+ static uint8_t pinName2Num(PinName name);
+
+ // Convert pin name DIO2-DI8 to string
+ static std::string pinName2Str(PinName name);
+
+ uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l);
/*************************************************************************
* The following functions are only used by the AT command application and
@@ -751,90 +1099,17 @@
int32_t setWakeMode(const uint8_t& delay);
uint8_t getWakeMode();
- // Save user file data to flash
- // file - name of file max 30 chars
- // data - data of file
- // size - size of file
- bool saveUserFile(const char* file, void* data, uint32_t size);
-
- // Append user file data to flash
- // file - name of file max 30 chars
- // data - data of file
- // size - size of file
- bool appendUserFile(const char* file, void* data, uint32_t size);
-
- // Read user file data from flash
- // file - name of file max 30 chars
- // data - data of file
- // size - size of file
- bool readUserFile(const char* file, void* data, uint32_t size);
-
- // Move a user file in flash
- // file - name of file
- // new_name - new name of file
- bool moveUserFile(const char* file, const char* new_name);
-
- // Delete user file data from flash
- // file - name of file max 30 chars
- bool deleteUserFile(const char* file);
-
- // Open user file in flash, max of 4 files open concurrently
- // file - name of file max 30 chars
- // mode - combination of FM_APPEND | FM_TRUNC | FM_CREAT |
- // FM_RDONLY | FM_WRONLY | FM_RDWR | FM_DIRECT
- // returns - mdot_file struct, fd field will be a negative value if file could not be opened
- mDot::mdot_file openUserFile(const char* file, int mode);
-
- // Seek an open file
- // file - mdot file struct
- // offset - offset in bytes
- // whence - where offset is based SEEK_SET, SEEK_CUR, SEEK_END
- bool seekUserFile(mDot::mdot_file& file, size_t offset, int whence);
-
- // Read bytes from open file
- // file - mdot file struct
- // data - mem location to store data
- // length - number of bytes to read
- // returns - number of bytes written
- int readUserFile(mDot::mdot_file& file, void* data, size_t length);
-
- // Write bytes to open file
- // file - mdot file struct
- // data - data to write
- // length - number of bytes to write
- // returns - number of bytes written
- int writeUserFile(mDot::mdot_file& file, void* data, size_t length);
-
- // Close open file
- // file - mdot file struct
- bool closeUserFile(mDot::mdot_file& file);
-
- // List user files stored in flash
- std::vector<mDot::mdot_file> listUserFiles();
-
- // Move file into the firmware upgrade path to be flashed on next boot
- // file - name of file
- bool moveUserFileToFirmwareUpgrade(const char* file);
-
- // get current statistics
- // Join Attempts, Join Fails, Up Packets, Down Packets, Missed Acks
- mdot_stats getStats();
-
- // reset statistics
- // Join Attempts, Join Fails, Up Packets, Down Packets, Missed Acks
- void resetStats();
-
- // Convert pin number 2-8 to pin name DIO2-DI8
- static PinName pinNum2Name(uint8_t num);
-
- // Convert pin name DIO2-DI8 to pin number 2-8
- static uint8_t pinName2Num(PinName name);
-
- // Convert pin name DIO2-DI8 to string
- static std::string pinName2Str(PinName name);
+ // get/set serial flow control enabled
+ // set function returns MDOT_OK if success
+ int32_t setFlowControl(const bool& on);
+ bool getFlowControl();
- uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l);
+ // get/set serial clear on error
+ // if enabled the data read from the serial port will be discarded if it cannot be sent or if the send fails
+ // set function returns MDOT_OK if success
+ int32_t setSerialClearOnError(const bool& on);
+ bool getSerialClearOnError();
// MTS_RADIO_DEBUG_COMMANDS
@@ -848,7 +1123,6 @@
std::map<uint8_t, uint8_t> dumpRegisters();
void eraseFlash();
-
// deprecated - use setWakeInterval
int32_t setSerialWakeInterval(const uint32_t& interval);
// deprecated - use getWakeInterval
@@ -864,9 +1138,23 @@
// deprecated - use getWakeTimeout
uint16_t getSerialReceiveTimeout();
+ void setWakeupCallback(void (*function)(void));
+
+ template<typename T>
+ void setWakeupCallback(T *object, void (T::*member)(void)) {
+ _wakeup_callback.attach(object, member);
+ }
+
private:
mdot_stats _stats;
+ FunctionPointer _wakeup_callback;
+
+ bool _standbyFlag;
+ bool _testMode;
+ uint8_t _savedPort;
+ void handleTestModePacket();
+
};
#endif
