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:
15:b50f92f1c6ff
Parent:
11:9938ba31d428
Child:
17:0da384ba484b
--- a/mDot.h	Mon Apr 04 09:58:34 2016 -0500
+++ b/mDot.h	Thu Aug 18 16:07:10 2016 +0000
@@ -5,17 +5,16 @@
 
 #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:
 
@@ -27,6 +26,8 @@
                 __WFI();
         }
 
+        void initLora();
+
         void setLastError(const std::string& str);
 
         static bool validateBaudRate(const uint32_t& baud);
@@ -61,10 +62,11 @@
 
         static mDot* _instance;
 
-        LoRaMac* _mac;
-        MdotRadio* _radio;
-        LoRaMacEvent* _events;
+        lora::Mote _mote;
         LoRaConfig* _config;
+        lora::Settings _settings;
+        mDotEvent* _events;
+
         Thread _idle_thread;
         std::string _last_error;
         static const uint32_t _baud_rates[];
@@ -114,7 +116,7 @@
         } mdot_ret_code;
 
         enum JoinMode {
-            MANUAL,
+            MANUAL = 0,
             OTA,
             AUTO_OTA,
             PEER_TO_PEER
@@ -158,8 +160,11 @@
         };
 
         enum FrequencyBands {
-            FB_868, // EU868
-            FB_915  // US915
+            FB_868 = 0,
+            FB_915 = 1,
+            FB_EU868 = 0, // EU868
+            FB_US915 = 1,  // US915
+            FB_AU915 = 2
         };
 
         enum FrequencySubBands {
@@ -200,7 +205,7 @@
 
         typedef struct {
                 int16_t fd;
-                char name[30];
+                char name[33];
                 uint32_t size;
         } mdot_file;
 
@@ -210,6 +215,7 @@
                 uint32_t Joins;
                 uint32_t JoinFails;
                 uint32_t MissedAcks;
+                uint32_t CRCErrors;
         } mdot_stats;
 
         typedef struct {
@@ -332,6 +338,10 @@
          */
         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
          */
@@ -551,13 +561,14 @@
          */
         void saveNetworkSession();
 
-        /** Set number of times joining will retry before giving up
+        /** Set number of times joining will retry each sub-band before changing
+         * to the next subband in US915 and AU915
          * @param retries must be between 0 - 255
          * @returns MDOT_OK if success
          */
         int32_t setJoinRetries(const uint8_t& retries);
 
-        /** Set number of times joining will retry before giving up
+        /** Get number of times joining will retry each sub-band
          * @returns join retries (0 - 255)
          */
         uint8_t getJoinRetries();
@@ -680,6 +691,42 @@
          */
         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
@@ -712,11 +759,22 @@
          */
         bool getDataPending();
 
-        /** Get transmitting
+        /** Get ack requested
+         * only valid after sending data to the gateway
+         * @returns true if server has requested ack
+         */
+        bool getAckRequested();
+
+        /** Get is transmitting indicator
          * @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
@@ -734,7 +792,6 @@
          */
         uint32_t getRadioRandom();
 
-
         /** Get data rate spreading factor and bandwidth
          * EU868 Datarates
          * ---------------
@@ -755,6 +812,14 @@
          * 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);
@@ -795,6 +860,10 @@
          */
         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
          */
@@ -869,6 +938,24 @@
          */
         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()
@@ -1104,7 +1191,6 @@
         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
@@ -1113,8 +1199,26 @@
 
         // 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 sendContinuous();
+        void closeRxWindow();
+        void sendContinuous(bool enable=true);
         int32_t setDeviceId(const std::vector<uint8_t>& id);
         int32_t setFrequencyBand(const uint8_t& band);
         bool saveProtectedConfig();
@@ -1158,3 +1262,4 @@
 };
 
 #endif
+