Library for LoRa communication using MultiTech MDOT.
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.
Diff: mDotEvent.h
- Revision:
- 17:0da384ba484b
- Parent:
- 15:b50f92f1c6ff
diff -r e4f80db195b6 -r 0da384ba484b mDotEvent.h
--- 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__
-