Bleeding edge development version of the xDot library for mbed 5. This version of the library is not guaranteed to be stable or well tested and should not be used in production or deployment scenarios.

Dependents:   Dot-Examples Dot-AT-Firmware Dot-Examples TEST_FF1705 ... more

The Dot library provides a LoRaWan certified stack for LoRa communication using MultiTech mDot and xDot devices. The stack is compatible with mbed 5.

Dot Library Version 3 Updates

Dot Library versions 3.x.x require a channel plan to be injected into the stack. Channel plans are included with the 3.x.x Dot Library releases. The following code snippet demonstrates how to create a channel plan and inject it into the stack.

#include "mDot.h"
#include "channel_plans.h"

int main() {
    ChannelPlan* plan = new lora::ChannelPlan_US915();
    assert(plan);
    mDot* dot = mDot::getInstance(plan);
    assert(dot);

    // ...
}

Dot devices must not be deployed with software using a different channel plan than the Dot's default plan! This functionality is for development and testing only!

Multicast Sessions

Multicast sessions and packet rx events in library. When in Class C mode Multicast downlinks can be received. Recieved packets should be filtered on address, counter value will be maintained in the session or can be set explicitly depending on Application support to share Multicast Address, Keys and Counters.

mDot.h

        /**
         * Add a multicast session address and keys
         * Downlink counter is set to 0
         * Up to 3 MULTICAST_SESSIONS can be set
         */
        int32_t setMulticastSession(uint8_t index, uint32_t addr, const uint8_t* nsk, const uint8_t* dsk);
 
        /**
         * Set a multicast session counter
         * Up to 3 MULTICAST_SESSIONS can be set
         */
        int32_t setMulticastDownlinkCounter(uint8_t index, uint32_t count);

mDotEvent.h

The address field was added to PacketRx event.

        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, uint32_t address);

The name of the repository can be used to determine which device the stack was compiled for and if it's a development or production-ready build:

A changelog for the Dot library can be found here.

The Dot library version and the version of mbed-os it was compiled against can both be found in the commit message for that revision of the Dot library. Building your application with the same version of mbed-os as what was used to build the Dot library is highly recommended!

The Dot-Examples repository demonstrates how to use the Dot library in a custom application.

The mDot and xDot platform pages have lots of platform specific information and document potential issues, gotchas, etc, and provide instructions for getting started with development. Please take a look at the platform page before starting development as they should answer many questions you will have.

Committer:
Jenkins@KEILDM1.dc.multitech.prv
Date:
Thu Aug 30 09:06:17 2018 -0500
Revision:
121:b7c80d8c4eb2
Parent:
84:7ded4b9b3f37
Child:
124:85e19115e4a1
xdot-library revision 3.1.0-class-b-alpha-1-15-g0c33f0a and mbed-os revision mbed-os-5.7.7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 1 #ifndef MDOT_EVENT_H
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 2 #define MDOT_EVENT_H
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 3
Jenkins@KEILDM1.dc.multitech.prv 41:4174881d578f 4 #include "mbed.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 5 #include "mDot.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 6 #include "MacEvents.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 7 #include "MTSLog.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 8 #include "MTSText.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 9
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 10 typedef union {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 11 uint8_t Value;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 12 struct {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 13 uint8_t :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 14 uint8_t Tx :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 15 uint8_t Rx :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 16 uint8_t RxData :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 17 uint8_t RxSlot :2;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 18 uint8_t LinkCheck :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 19 uint8_t JoinAccept :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 20 } Bits;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 21 } LoRaMacEventFlags;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 22
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 23 typedef enum {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 24 LORAMAC_EVENT_INFO_STATUS_OK = 0,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 25 LORAMAC_EVENT_INFO_STATUS_ERROR,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 26 LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 27 LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 28 LORAMAC_EVENT_INFO_STATUS_RX_ERROR,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 29 LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 30 LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 31 LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 32 LORAMAC_EVENT_INFO_STATUS_MIC_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 33 } LoRaMacEventInfoStatus;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 34
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 35 /*!
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 36 * LoRaMAC event information
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 37 */
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 38 typedef struct {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 39 LoRaMacEventInfoStatus Status;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 40 lora::DownlinkControl Ctrl;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 41 bool TxAckReceived;
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 42 bool DuplicateRx;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 43 uint8_t TxNbRetries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 44 uint8_t TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 45 uint8_t RxPort;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 46 uint8_t *RxBuffer;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 47 uint8_t RxBufferSize;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 48 int16_t RxRssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 49 uint8_t RxSnr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 50 uint16_t Energy;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 51 uint8_t DemodMargin;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 52 uint8_t NbGateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 53 } LoRaMacEventInfo;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 54
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 55 class mDotEvent: public lora::MacEvents {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 56 public:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 57
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 58 mDotEvent()
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 59 :
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 60 LinkCheckAnsReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 61 DemodMargin(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 62 NbGateways(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 63 PacketReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 64 RxPort(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 65 RxPayloadSize(0),
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 66 BeaconLocked(false),
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 67 BeaconPayloadSize(0U),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 68 PongReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 69 PongRssi(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 70 PongSnr(0),
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 71 ServerTimeReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 72 ServerTimeSeconds(0U),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 73 AckReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 74 DuplicateRx(false),
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 75 TxNbRetries(0),
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 76 _sleep_cb(NULL)
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 77 {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 78 memset(&_flags, 0, sizeof(LoRaMacEventFlags));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 79 memset(&_info, 0, sizeof(LoRaMacEventInfo));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 80 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 81
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 82 virtual ~mDotEvent() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 83 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 84
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 85 virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 86 if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 87 std::string msg = "OK";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 88 switch (info->Status) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 89 case LORAMAC_EVENT_INFO_STATUS_ERROR:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 90 msg = "ERROR";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 91 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 92 case LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 93 msg = "TX_TIMEOUT";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 94 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 95 case LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 96 msg = "RX_TIMEOUT";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 97 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 98 case LORAMAC_EVENT_INFO_STATUS_RX_ERROR:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 99 msg = "RX_ERROR";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 100 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 101 case LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 102 msg = "JOIN_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 103 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 104 case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 105 msg = "DOWNLINK_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 106 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 107 case LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 108 msg = "ADDRESS_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 109 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 110 case LORAMAC_EVENT_INFO_STATUS_MIC_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 111 msg = "MIC_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 112 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 113 default:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 114 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 115 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 116 logTrace("Event: %s", msg.c_str());
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 117
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 118 logTrace("Flags Tx: %d Rx: %d RxData: %d RxSlot: %d LinkCheck: %d JoinAccept: %d",
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 119 flags->Bits.Tx, flags->Bits.Rx, flags->Bits.RxData, flags->Bits.RxSlot, flags->Bits.LinkCheck, flags->Bits.JoinAccept);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 120 logTrace("Info: Status: %d ACK: %d Retries: %d TxDR: %d RxPort: %d RxSize: %d RSSI: %d SNR: %d Energy: %d Margin: %d Gateways: %d",
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 121 info->Status, info->TxAckReceived, info->TxNbRetries, info->TxDatarate, info->RxPort, info->RxBufferSize,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 122 info->RxRssi, info->RxSnr, info->Energy, info->DemodMargin, info->NbGateways);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 123 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 124 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 125
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 126 virtual void TxStart() {
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 127 logDebug("mDotEvent - TxStart");
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 128
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 129 // Fire auto sleep cfg event if enabled
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 130 if (_sleep_cb)
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 131 _sleep_cb(mDot::AUTO_SLEEP_EVT_CFG);
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 132 }
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 133
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 134 virtual void TxDone(uint8_t dr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 135 RxPayloadSize = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 136 LinkCheckAnsReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 137 PacketReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 138 AckReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 139 DuplicateRx = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 140 PongReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 141 TxNbRetries = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 142
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 143 logDebug("mDotEvent - TxDone");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 144 memset(&_flags, 0, sizeof(LoRaMacEventFlags));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 145 memset(&_info, 0, sizeof(LoRaMacEventInfo));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 146
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 147 _flags.Bits.Tx = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 148 _info.TxDatarate = dr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 149 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 150 Notify();
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 151
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 152 // If configured, we can sleep until the rx window opens
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 153 if (_sleep_cb)
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 154 _sleep_cb(mDot::AUTO_SLEEP_EVT_TXDONE);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 155 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 156
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 157 void Notify() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 158 MacEvent(&_flags, &_info);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 159 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 160
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 161 virtual void TxTimeout(void) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 162 logDebug("mDotEvent - TxTimeout");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 163
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 164 _flags.Bits.Tx = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 165 _info.Status = LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 166 Notify();
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 167 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 168
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 169 virtual void JoinAccept(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 170 logDebug("mDotEvent - JoinAccept");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 171
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 172 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 173 _flags.Bits.JoinAccept = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 174 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 175 Notify();
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 176
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 177 if (_sleep_cb)
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 178 _sleep_cb(mDot::AUTO_SLEEP_EVT_CLEANUP);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 179 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 180
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 181 virtual void JoinFailed(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 182 logDebug("mDotEvent - JoinFailed");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 183
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 184 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 185 _flags.Bits.JoinAccept = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 186 _info.Status = LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 187 Notify();
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 188
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 189 if (_sleep_cb)
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 190 _sleep_cb(mDot::AUTO_SLEEP_EVT_CLEANUP);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 191 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 192
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 193 virtual void MissedAck(uint8_t retries) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 194 logDebug("mDotEvent - MissedAck : retries %u", retries);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 195 TxNbRetries = retries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 196 _info.TxNbRetries = retries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 197 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 198
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 199 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, uint32_t address, bool dupRx) {
Jenkins@KEILDM1.dc.multitech.prv 41:4174881d578f 200 logDebug("mDotEvent - PacketRx ADDR: %08x", address);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 201 RxPort = port;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 202 PacketReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 203
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 204 memcpy(RxPayload, payload, size);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 205 RxPayloadSize = size;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 206
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 207 if (ctrl.Bits.Ack) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 208 AckReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 209 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 210
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 211 DuplicateRx = dupRx;
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 212
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 213 if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 214 std::string packet = mts::Text::bin2hexString(RxPayload, size);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 215 logTrace("Payload: %s", packet.c_str());
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 216 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 217
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 218 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 219 _flags.Bits.Rx = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 220 _flags.Bits.RxData = size > 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 221 _flags.Bits.RxSlot = slot;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 222 _info.RxBuffer = payload;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 223 _info.RxBufferSize = size;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 224 _info.RxPort = port;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 225 _info.RxRssi = rssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 226 _info.RxSnr = snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 227 _info.TxAckReceived = AckReceived;
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 228 _info.DuplicateRx = DuplicateRx;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 229 _info.TxNbRetries = retries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 230 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 231 Notify();
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 232 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 233
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 234 virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 235 logDebug("mDotEvent - RxDone");
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 236
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 237 if (_sleep_cb)
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 238 _sleep_cb(mDot::AUTO_SLEEP_EVT_CLEANUP);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 239 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 240
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 241 virtual void BeaconRx(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 242 logDebug("mDotEvent - BeaconRx");
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 243 BeaconLocked = true;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 244
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 245 memcpy(BeaconPayload, payload, size);
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 246 BeaconPayloadSize = size;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 247 }
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 248
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 249 virtual void BeaconLost() {
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 250 logDebug("mDotEvent - BeaconLost");
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 251 BeaconLocked = false;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 252 }
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 253
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 254 virtual void Pong(int16_t m_rssi, int8_t m_snr, int16_t s_rssi, int8_t s_snr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 255 logDebug("mDotEvent - Pong");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 256 PongReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 257 PongRssi = s_rssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 258 PongSnr = s_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 259 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 260
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 261 virtual void ServerTime(uint32_t seconds, uint8_t sub_seconds) {
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 262 logDebug("mDotEvent - ServerTime");
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 263 ServerTimeReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 264 ServerTimeSeconds = seconds;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 265 }
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 266
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 267 virtual void NetworkLinkCheck(int16_t m_rssi, int8_t m_snr, int8_t s_snr, uint8_t s_gateways) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 268 logDebug("mDotEvent - NetworkLinkCheck");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 269 LinkCheckAnsReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 270 DemodMargin = s_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 271 NbGateways = s_gateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 272
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 273 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 274 _flags.Bits.LinkCheck = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 275 _info.RxRssi = m_rssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 276 _info.RxSnr = m_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 277 _info.DemodMargin = s_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 278 _info.NbGateways = s_gateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 279 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 280 Notify();
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 281 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 282
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 283 virtual void RxTimeout(uint8_t slot) {
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 284 logDebug("mDotEvent - RxTimeout on Slot %d", slot);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 285
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 286 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 287 _flags.Bits.RxSlot = slot;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 288 _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 289 Notify();
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 290
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 291 if (_sleep_cb) {
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 292 // If this is the first rx window we can sleep until the next one
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 293 if (slot == 1)
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 294 _sleep_cb(mDot::AUTO_SLEEP_EVT_RX1_TIMEOUT);
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 295 else
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 296 _sleep_cb(mDot::AUTO_SLEEP_EVT_CLEANUP);
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 297 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 298 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 299
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 300 virtual void RxError(uint8_t slot) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 301 logDebug("mDotEvent - RxError");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 302
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 303 memset(&_flags, 0, sizeof(LoRaMacEventFlags));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 304 memset(&_info, 0, sizeof(LoRaMacEventInfo));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 305
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 306 _flags.Bits.RxSlot = slot;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 307 _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_ERROR;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 308 Notify();
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 309
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 310 if (_sleep_cb)
Jenkins@KEILDM1.dc.multitech.prv 83:bc2e615d8595 311 _sleep_cb(mDot::AUTO_SLEEP_EVT_CLEANUP);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 312 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 313
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 314 virtual uint8_t MeasureBattery(void) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 315 return 255;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 316 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 317
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 318 void AttachSleepCallback(Callback<void(mDot::AutoSleepEvent_t)> cb) {
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 319 _sleep_cb = cb;
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 320 }
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 321
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 322 void DetachSleepCallback() {
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 323 _sleep_cb = NULL;
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 324 }
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 325
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 326 bool LinkCheckAnsReceived;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 327 uint8_t DemodMargin;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 328 uint8_t NbGateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 329
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 330 bool PacketReceived;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 331 uint8_t RxPort;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 332 uint8_t RxPayload[255];
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 333 uint8_t RxPayloadSize;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 334
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 335 bool BeaconLocked;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 336 uint8_t BeaconPayload[25];
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 337 uint8_t BeaconPayloadSize;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 338
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 339 bool PongReceived;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 340 int16_t PongRssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 341 int16_t PongSnr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 342
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 343 bool ServerTimeReceived;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 344 uint32_t ServerTimeSeconds;
Jenkins@KEILDM1.dc.multitech.prv 121:b7c80d8c4eb2 345
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 346 bool AckReceived;
Jenkins@KEILDM1.dc.multitech.prv 84:7ded4b9b3f37 347 bool DuplicateRx;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 348 uint8_t TxNbRetries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 349
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 350 LoRaMacEventFlags& Flags() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 351 return _flags;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 352 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 353 LoRaMacEventInfo& Info() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 354 return _info;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 355 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 356
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 357 private:
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 358 /* Hook to inject a sleep method in between receive windows */
Jenkins@KEILDM1.dc.multitech.prv 61:e8eb2d72ecd6 359 Callback<void(mDot::AutoSleepEvent_t)> _sleep_cb;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 360
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 361 LoRaMacEventFlags _flags;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 362 LoRaMacEventInfo _info;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 363
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 364 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 365 // /*!
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 366 // * MAC layer event callback prototype.
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 367 // *
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 368 // * \param [IN] flags Bit field indicating the MAC events occurred
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 369 // * \param [IN] info Details about MAC events occurred
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 370 // */
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 371 // virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 372 // logDebug("mDotEvent");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 373 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 374 // if (flags->Bits.Rx) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 375 // logDebug("Rx");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 376 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 377 // // Event Object must delete RxBuffer
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 378 // delete[] info->RxBuffer;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 379 // }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 380 // }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 381 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 382
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 383 };
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 384
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 385 #endif // __MDOT_EVENT_H__