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_test_rx adc_sensor_lora mDotEVBM2X mDot_AT_firmware ... more
Function documentation is in mDot.h
Warning
Using libmDot 2.0.3 and above with an existing application may require a change in the MacEvent handler!
Compile applications with mbed v121 and mbed-rtos v116 libraries.
In AT Command Firmware remove line 803.
CommandTerminal/CommandTerminal.cpp
delete[] info->RxBuffer;
Likewise, if your application is handling events from the library asynchronously.
Revision 17:0da384ba484b, committed 2016-11-18
- Comitter:
- Leon Lindenfelser
- Date:
- Fri Nov 18 11:10:04 2016 -0600
- Parent:
- 16:e4f80db195b6
- Commit message:
- Previous libmDot version "16:e4f80db195b6" has the wrong header files for mDot.h and mDotEvent.h. Use with mbed version 121 and mbed-rtos version 116.
Changed in this revision
| mDot.h | Show annotated file Show diff for this revision Revisions of this file |
| mDotEvent.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/mDot.h Fri Nov 18 10:29:43 2016 -0600
+++ b/mDot.h Fri Nov 18 11:10:04 2016 -0600
@@ -5,16 +5,17 @@
#include "mbed.h"
#include "rtos.h"
-#include "Mote.h"
#include <vector>
#include <map>
#include <string>
class mDotEvent;
+class LoRaMacEvent;
class LoRaConfig;
+class LoRaMac;
+class MdotRadio;
class mDot {
- friend class mDotEvent;
private:
@@ -26,8 +27,6 @@
__WFI();
}
- void initLora();
-
void setLastError(const std::string& str);
static bool validateBaudRate(const uint32_t& baud);
@@ -62,11 +61,10 @@
static mDot* _instance;
- lora::Mote _mote;
+ LoRaMac* _mac;
+ MdotRadio* _radio;
+ LoRaMacEvent* _events;
LoRaConfig* _config;
- lora::Settings _settings;
- mDotEvent* _events;
-
Thread _idle_thread;
std::string _last_error;
static const uint32_t _baud_rates[];
@@ -116,7 +114,7 @@
} mdot_ret_code;
enum JoinMode {
- MANUAL = 0,
+ MANUAL,
OTA,
AUTO_OTA,
PEER_TO_PEER
@@ -160,11 +158,8 @@
};
enum FrequencyBands {
- FB_868 = 0,
- FB_915 = 1,
- FB_EU868 = 0, // EU868
- FB_US915 = 1, // US915
- FB_AU915 = 2
+ FB_868, // EU868
+ FB_915 // US915
};
enum FrequencySubBands {
@@ -205,7 +200,7 @@
typedef struct {
int16_t fd;
- char name[33];
+ char name[30];
uint32_t size;
} mdot_file;
@@ -215,7 +210,6 @@
uint32_t Joins;
uint32_t JoinFails;
uint32_t MissedAcks;
- uint32_t CRCErrors;
} mdot_stats;
typedef struct {
@@ -338,10 +332,6 @@
*/
bool getStandbyFlag();
- std::vector<uint16_t> getChannelMask();
-
- int32_t setChannelMask(uint8_t offset, uint16_t mask);
-
/** Add a channel frequencies currently in use
* @returns MDOT_OK
*/
@@ -561,14 +551,13 @@
*/
void saveNetworkSession();
- /** Set number of times joining will retry each sub-band before changing
- * to the next subband in US915 and AU915
+ /** Set number of times joining will retry before giving up
* @param retries must be between 0 - 255
* @returns MDOT_OK if success
*/
int32_t setJoinRetries(const uint8_t& retries);
- /** Get number of times joining will retry each sub-band
+ /** Set number of times joining will retry before giving up
* @returns join retries (0 - 255)
*/
uint8_t getJoinRetries();
@@ -691,42 +680,6 @@
*/
uint32_t setJoinDelay(uint8_t delay);
- /** Get join Rx1 datarate offset
- * defaults to 0
- * @returns offset
- */
- uint8_t getJoinRx1DataRateOffset();
-
- /** Set join Rx1 datarate offset
- * @param offset for datarate
- * @return MDOT_OK if success
- */
- uint32_t setJoinRx1DataRateOffset(uint8_t offset);
-
- /** Get join Rx2 datarate
- * defaults to US:DR8, AU:DR8, EU:DR0
- * @returns datarate
- */
- uint8_t getJoinRx2DataRate();
-
- /** Set join Rx2 datarate
- * @param datarate
- * @return MDOT_OK if success
- */
- uint32_t setJoinRx2DataRate(uint8_t datarate);
-
- /** Get join Rx2 frequency
- * defaults US:923.3, AU:923.3, EU:869.525
- * @returns frequency
- */
- uint32_t getJoinRx2Frequency();
-
- /** Set join Rx2 frequency
- * @param frequency
- * @return MDOT_OK if success
- */
- uint32_t setJoinRx2Frequency(uint32_t frequency);
-
/** Get rx delay in seconds
* Defaults to 1 second
* @returns number of seconds before response message is expected
@@ -759,22 +712,11 @@
*/
bool getDataPending();
- /** Get ack requested
- * only valid after sending data to the gateway
- * @returns true if server has requested ack
- */
- bool getAckRequested();
-
- /** Get is transmitting indicator
+ /** Get transmitting
* @returns true if currently transmitting
*/
bool getIsTransmitting();
- /** Get is idle indicator
- * @returns true if not currently transmitting, waiting or receiving
- */
- bool getIsIdle();
-
/** Set TX data rate
* data rates affect maximum payload size
* @param dr SF_7 - SF_12|DR0-DR7 for Europe, SF_7 - SF_10 | DR0-DR4 for United States
@@ -792,6 +734,7 @@
*/
uint32_t getRadioRandom();
+
/** Get data rate spreading factor and bandwidth
* EU868 Datarates
* ---------------
@@ -812,14 +755,6 @@
* DR3 - SF7BW125
* DR4 - SF8BW500
*
- * AU915 Datarates
- * ---------------
- * DR0 - SF10BW125
- * DR1 - SF9BW125
- * DR2 - SF8BW125
- * DR3 - SF7BW125
- * DR4 - SF8BW500
- *
* @returns spreading factor and bandwidth
*/
std::string getDateRateDetails(uint8_t rate);
@@ -860,10 +795,6 @@
*/
bool getTxWait();
- /** Cancel pending rx windows
- */
- void cancelRxWindow();
-
/** Get time on air
* @returns the amount of time (in ms) it would take to send bytes bytes based on current configuration
*/
@@ -938,24 +869,6 @@
*/
int32_t send(const std::vector<uint8_t>& data, const bool& blocking = true, const bool& highBw = false);
- /** Inject mac command
- * @param data a vector containing mac commands
- * @returns MDOT_OK
- */
- int32_t injectMacCommand(const std::vector<uint8_t>& data);
-
- /**
- * Clear MAC command buffer to be sent in next uplink
- * @returns MDOT_OK
- */
- int32_t clearMacCommands();
-
- /**
- * Get MAC command buffer to be sent in next uplink
- * @returns command bytes
- */
- std::vector<uint8_t> getMacCommands();
-
/** Fetch data received from the gateway
* this function only checks to see if a packet has been received - it does not open a receive window
* send() must be called before recv()
@@ -1191,6 +1104,7 @@
int32_t setFlowControl(const bool& on);
bool getFlowControl();
+
// 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
@@ -1199,26 +1113,8 @@
// MTS_RADIO_DEBUG_COMMANDS
- /** Disable Duty cycle
- * enables or disables the duty cycle limitations
- * **** ONLY TO BE USED FOR TESTINGS PURPOSES ****
- * **** ALL DEPLOYABLE CODE MUST ADHERE TO LOCAL REGULATIONS ****
- * **** THIS SETTING WILL NOT BE SAVED TO CONFIGURATION *****
- * @param val true to disable duty-cycle (default:false)
- */
- int32_t setDisableDutyCycle(bool val);
-
- /** Disable Duty cycle
- * **** ONLY TO BE USED FOR TESTINGS PURPOSES ****
- * **** ALL DEPLOYABLE CODE MUST ADHERE TO LOCAL REGULATIONS ****
- * **** THIS SETTING WILL NOT BE SAVED TO CONFIGURATION *****
- * @return true if duty-cycle is disabled (default:false)
- */
- uint8_t getDisableDutyCycle();
-
void openRxWindow(uint32_t timeout, uint8_t bandwidth = 0);
- void closeRxWindow();
- void sendContinuous(bool enable=true);
+ void sendContinuous();
int32_t setDeviceId(const std::vector<uint8_t>& id);
int32_t setFrequencyBand(const uint8_t& band);
bool saveProtectedConfig();
@@ -1262,4 +1158,3 @@
};
#endif
-
--- a/mDotEvent.h Fri Nov 18 10:29:43 2016 -0600
+++ b/mDotEvent.h Fri Nov 18 11:10:04 2016 -0600
@@ -1,298 +1,29 @@
-#ifndef MDOT_EVENT_H
-#define MDOT_EVENT_H
-
-#include "mDot.h"
-#include "MacEvents.h"
+#include "LoRaMacEvent.h"
#include "MTSLog.h"
-#include "MTSText.h"
-
-typedef union {
- uint8_t Value;
- struct {
- uint8_t :1;
- uint8_t Tx :1;
- uint8_t Rx :1;
- uint8_t RxData :1;
- uint8_t RxSlot :2;
- uint8_t LinkCheck :1;
- uint8_t JoinAccept :1;
- } Bits;
-} LoRaMacEventFlags;
-typedef enum {
- LORAMAC_EVENT_INFO_STATUS_OK = 0,
- LORAMAC_EVENT_INFO_STATUS_ERROR,
- LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT,
- LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT,
- LORAMAC_EVENT_INFO_STATUS_RX_ERROR,
- LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL,
- LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL,
- LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL,
- LORAMAC_EVENT_INFO_STATUS_MIC_FAIL,
-} LoRaMacEventInfoStatus;
-
-/*!
- * LoRaMAC event information
- */
-typedef struct {
- LoRaMacEventInfoStatus Status;
- lora::DownlinkControl Ctrl;
- bool TxAckReceived;
- uint8_t TxNbRetries;
- uint8_t TxDatarate;
- uint8_t RxPort;
- uint8_t *RxBuffer;
- uint8_t RxBufferSize;
- int16_t RxRssi;
- uint8_t RxSnr;
- uint16_t Energy;
- uint8_t DemodMargin;
- uint8_t NbGateways;
-} LoRaMacEventInfo;
-
-class mDotEvent: public lora::MacEvents {
+class mDotEvent : public LoRaMacEvent {
public:
- mDotEvent()
- :
- LinkCheckAnsReceived(false),
- DemodMargin(0),
- NbGateways(0),
- PacketReceived(false),
- RxPort(0),
- RxPayloadSize(0),
- PongReceived(false),
- PongRssi(0),
- PongSnr(0),
- AckReceived(false),
- TxNbRetries(0)
- {
- memset(&_flags, 0, sizeof(LoRaMacEventFlags));
- memset(&_info, 0, sizeof(LoRaMacEventInfo));
- }
-
- virtual ~mDotEvent() {
- }
-
- virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
- if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
- std::string msg = "OK";
- switch (info->Status) {
- case LORAMAC_EVENT_INFO_STATUS_ERROR:
- msg = "ERROR";
- break;
- case LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT:
- msg = "TX_TIMEOUT";
- break;
- case LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT:
- msg = "RX_TIMEOUT";
- break;
- case LORAMAC_EVENT_INFO_STATUS_RX_ERROR:
- msg = "RX_ERROR";
- break;
- case LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL:
- msg = "JOIN_FAIL";
- break;
- case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL:
- msg = "DOWNLINK_FAIL";
- break;
- case LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL:
- msg = "ADDRESS_FAIL";
- break;
- case LORAMAC_EVENT_INFO_STATUS_MIC_FAIL:
- msg = "MIC_FAIL";
- break;
- default:
- break;
- }
- logTrace("Event: %s", msg.c_str());
-
- logTrace("Flags Tx: %d Rx: %d RxData: %d RxSlot: %d LinkCheck: %d JoinAccept: %d",
- flags->Bits.Tx, flags->Bits.Rx, flags->Bits.RxData, flags->Bits.RxSlot, flags->Bits.LinkCheck, flags->Bits.JoinAccept);
- logTrace("Info: Status: %d ACK: %d Retries: %d TxDR: %d RxPort: %d RxSize: %d RSSI: %d SNR: %d Energy: %d Margin: %d Gateways: %d",
- info->Status, info->TxAckReceived, info->TxNbRetries, info->TxDatarate, info->RxPort, info->RxBufferSize,
- info->RxRssi, info->RxSnr, info->Energy, info->DemodMargin, info->NbGateways);
- }
- }
-
- virtual void TxDone(uint8_t dr) {
- RxPayloadSize = 0;
- LinkCheckAnsReceived = false;
- PacketReceived = false;
- AckReceived = false;
- PongReceived = false;
-
- logDebug("mDotEvent - TxDone");
- memset(&_flags, 0, sizeof(LoRaMacEventFlags));
- memset(&_info, 0, sizeof(LoRaMacEventInfo));
-
- _flags.Bits.Tx = 1;
- _info.TxDatarate = dr;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
- Notify();
- }
-
- void Notify() {
- MacEvent(&_flags, &_info);
- }
-
- virtual void TxTimeout(void) {
- logDebug("mDotEvent - TxTimeout");
-
- _flags.Bits.Tx = 1;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT;
- Notify();
- }
+ virtual ~mDotEvent() {}
- virtual void JoinAccept(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
- logDebug("mDotEvent - JoinAccept");
-
- _flags.Bits.Tx = 0;
- _flags.Bits.JoinAccept = 1;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
- Notify();
- }
-
- virtual void JoinFailed(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
- logDebug("mDotEvent - JoinFailed");
-
- _flags.Bits.Tx = 0;
- _flags.Bits.JoinAccept = 1;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL;
- Notify();
- }
-
- virtual void PacketRx(uint8_t port, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot, uint8_t retries = 0) {
- logDebug("mDotEvent - PacketRx");
- RxPort = port;
- PacketReceived = true;
-
- memcpy(RxPayload, payload, size);
- RxPayloadSize = size;
-
- if (ctrl.Bits.Ack) {
- AckReceived = true;
- }
-
- if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
- std::string packet = mts::Text::bin2hexString(RxPayload, size);
- logTrace("Payload: %s", packet.c_str());
- }
+ /*!
+ * MAC layer event callback prototype.
+ *
+ * \param [IN] flags Bit field indicating the MAC events occurred
+ * \param [IN] info Details about MAC events occurred
+ */
+ virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
+ logDebug("mDotEvent");
- _flags.Bits.Tx = 0;
- _flags.Bits.Rx = 1;
- _flags.Bits.RxData = size > 0;
- _flags.Bits.RxSlot = slot;
- _info.RxBuffer = payload;
- _info.RxBufferSize = size;
- _info.RxPort = port;
- _info.RxRssi = rssi;
- _info.RxSnr = snr;
- _info.TxAckReceived = AckReceived;
- _info.TxAckReceived = retries;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
- Notify();
- }
-
- virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot) {
- logDebug("mDotEvent - RxDone");
- }
-
- virtual void Pong(int16_t m_rssi, int8_t m_snr, int16_t s_rssi, int8_t s_snr) {
- logDebug("mDotEvent - Pong");
- PongReceived = true;
- PongRssi = s_rssi;
- PongSnr = s_snr;
- }
+ if (flags->Bits.Rx) {
+ logDebug("Rx");
- virtual void NetworkLinkCheck(int16_t m_rssi, int8_t m_snr, int8_t s_snr, uint8_t s_gateways) {
- logDebug("mDotEvent - NetworkLinkCheck");
- LinkCheckAnsReceived = true;
- DemodMargin = s_snr;
- NbGateways = s_gateways;
-
- _flags.Bits.Tx = 0;
- _flags.Bits.LinkCheck = 1;
- _info.RxRssi = m_rssi;
- _info.RxSnr = m_snr;
- _info.DemodMargin = s_snr;
- _info.NbGateways = s_gateways;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
- Notify();
- }
-
- virtual void RxTimeout(uint8_t slot) {
- // logDebug("mDotEvent - RxTimeout");
-
- _flags.Bits.Tx = 0;
- _flags.Bits.RxSlot = slot;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT;
- Notify();
- }
-
- virtual void RxError(uint8_t slot) {
- logDebug("mDotEvent - RxError");
-
- memset(&_flags, 0, sizeof(LoRaMacEventFlags));
- memset(&_info, 0, sizeof(LoRaMacEventInfo));
-
- _flags.Bits.RxSlot = slot;
- _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_ERROR;
- Notify();
+ // Event Object must delete RxBuffer
+ delete[] info->RxBuffer;
+ }
}
virtual uint8_t MeasureBattery(void) {
return 255;
}
-
- bool LinkCheckAnsReceived;
- uint8_t DemodMargin;
- uint8_t NbGateways;
-
- bool PacketReceived;
- uint8_t RxPort;
- uint8_t RxPayload[255];
- uint8_t RxPayloadSize;
-
- bool PongReceived;
- int16_t PongRssi;
- int16_t PongSnr;
-
- bool AckReceived;
- uint8_t TxNbRetries;
-
- LoRaMacEventFlags& Flags() {
- return _flags;
- }
- LoRaMacEventInfo& Info() {
- return _info;
- }
-
- private:
-
- LoRaMacEventFlags _flags;
- LoRaMacEventInfo _info;
-
-//
-// /*!
-// * MAC layer event callback prototype.
-// *
-// * \param [IN] flags Bit field indicating the MAC events occurred
-// * \param [IN] info Details about MAC events occurred
-// */
-// virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
-// logDebug("mDotEvent");
-//
-// if (flags->Bits.Rx) {
-// logDebug("Rx");
-//
-// // Event Object must delete RxBuffer
-// delete[] info->RxBuffer;
-// }
-// }
-//
-
};
-
-#endif // __MDOT_EVENT_H__
-