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.

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__
-