Stable version of the xDot library for mbed 5. This version of the library is suitable for deployment scenarios.

Dependents:   Dot-Examples XDOT-Devicewise Dot-Examples-delujoc Dot-Examples_receive ... more

Fork of libxDot-dev-mbed5-deprecated by MultiTech

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

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.

FOTA

Full FOTA support is only available with mDot, xDot does not have the required external flash. xDot can use the FOTA example to dynamically join a multicast session only. After joining the multicast session the received Fragmentation packets could be handed to a host MCU for processing and at completion the firmware can be loaded into the xDot using the bootloader and y-modem. See xDot Developer Guide.

  • Add the following code to allow Fota to use the Dot instance

examples/src/fota_example.cpp

    // Initialize FOTA singleton
    Fota::getInstance(dot);
  • Add fragmentation handling the the PacketRx event

examples/inc/RadioEvent.h

    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) {
        mDotEvent::PacketRx(port, payload, size, rssi, snr, ctrl, slot, retries, address, dupRx);

#if ACTIVE_EXAMPLE == FOTA_EXAMPLE
        if(port == 200 || port == 201 || port == 202) {
            Fota::getInstance()->processCmd(payload, port, size);
        }
#endif
    }

The FOTA implementation has a few differences from the LoRaWAN Protocol

  • Fragmentation Indexing starts at 0
  • McKEKey is 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
  • Start Time is a count-down in seconds to start of session
Committer:
jreiss
Date:
Wed Mar 25 17:08:50 2020 +0000
Revision:
27:fd99405121d8
Parent:
20:bc12c888e7dc
Remove old ARMCC archive, only ARMC6 is available

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 1 /**********************************************************************
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 2 * COPYRIGHT 2015 MULTI-TECH SYSTEMS, INC.
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 3 *
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 4 * Redistribution and use in source and binary forms, with or without modification,
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 5 * are permitted provided that the following conditions are met:
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 6 * 1. Redistributions of source code must retain the above copyright notice,
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 7 * this list of conditions and the following disclaimer.
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 8 * 2. Redistributions in binary form must reproduce the above copyright notice,
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 9 * this list of conditions and the following disclaimer in the documentation
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 10 * and/or other materials provided with the distribution.
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 11 * 3. Neither the name of MULTI-TECH SYSTEMS, INC. nor the names of its contributors
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 12 * may be used to endorse or promote products derived from this software
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 13 * without specific prior written permission.
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 14 *
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 25 *
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 26 ******************************************************************************
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 27 */
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 28
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 29 #ifndef MDOT_EVENT_H
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 30 #define MDOT_EVENT_H
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 31
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 32 #include "mbed.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 33 #include "mDot.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 34 #include "MacEvents.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 35 #include "MTSLog.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 36 #include "MTSText.h"
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 37
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 38 typedef union {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 39 uint8_t Value;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 40 struct {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 41 uint8_t :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 42 uint8_t Tx :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 43 uint8_t Rx :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 44 uint8_t RxData :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 45 uint8_t RxSlot :2;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 46 uint8_t LinkCheck :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 47 uint8_t JoinAccept :1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 48 } Bits;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 49 } LoRaMacEventFlags;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 50
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 51 typedef enum {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 52 LORAMAC_EVENT_INFO_STATUS_OK = 0,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 53 LORAMAC_EVENT_INFO_STATUS_ERROR,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 54 LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 55 LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 56 LORAMAC_EVENT_INFO_STATUS_RX_ERROR,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 57 LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 58 LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 59 LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 60 LORAMAC_EVENT_INFO_STATUS_MIC_FAIL,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 61 } LoRaMacEventInfoStatus;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 62
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 63 /*!
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 64 * LoRaMAC event information
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 65 */
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 66 typedef struct {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 67 LoRaMacEventInfoStatus Status;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 68 lora::DownlinkControl Ctrl;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 69 bool TxAckReceived;
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 70 bool DuplicateRx;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 71 uint8_t TxNbRetries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 72 uint8_t TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 73 uint8_t RxPort;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 74 uint8_t *RxBuffer;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 75 uint8_t RxBufferSize;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 76 int16_t RxRssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 77 uint8_t RxSnr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 78 uint16_t Energy;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 79 uint8_t DemodMargin;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 80 uint8_t NbGateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 81 } LoRaMacEventInfo;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 82
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 83 class mDotEvent: public lora::MacEvents {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 84 public:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 85
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 86 mDotEvent()
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 87 :
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 88 LinkCheckAnsReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 89 DemodMargin(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 90 NbGateways(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 91 PacketReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 92 RxPort(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 93 RxPayloadSize(0),
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 94 BeaconLocked(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 95 PongReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 96 PongRssi(0),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 97 PongSnr(0),
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 98 ServerTimeReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 99 ServerTimeSeconds(0U),
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 100 AckReceived(false),
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 101 DuplicateRx(false),
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 102 TxNbRetries(0)
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 103 {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 104 memset(&_flags, 0, sizeof(LoRaMacEventFlags));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 105 memset(&_info, 0, sizeof(LoRaMacEventInfo));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 106 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 107
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 108 virtual ~mDotEvent() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 109 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 110
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 111 virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 112 if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 113 std::string msg = "OK";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 114 switch (info->Status) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 115 case LORAMAC_EVENT_INFO_STATUS_ERROR:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 116 msg = "ERROR";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 117 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 118 case LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 119 msg = "TX_TIMEOUT";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 120 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 121 case LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 122 msg = "RX_TIMEOUT";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 123 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 124 case LORAMAC_EVENT_INFO_STATUS_RX_ERROR:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 125 msg = "RX_ERROR";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 126 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 127 case LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 128 msg = "JOIN_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 129 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 130 case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 131 msg = "DOWNLINK_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 132 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 133 case LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 134 msg = "ADDRESS_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 135 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 136 case LORAMAC_EVENT_INFO_STATUS_MIC_FAIL:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 137 msg = "MIC_FAIL";
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 138 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 139 default:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 140 break;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 141 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 142 logTrace("Event: %s", msg.c_str());
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 143
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 144 logTrace("Flags Tx: %d Rx: %d RxData: %d RxSlot: %d LinkCheck: %d JoinAccept: %d",
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 145 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 146 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 147 info->Status, info->TxAckReceived, info->TxNbRetries, info->TxDatarate, info->RxPort, info->RxBufferSize,
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 148 info->RxRssi, info->RxSnr, info->Energy, info->DemodMargin, info->NbGateways);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 149 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 150 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 151
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 152 virtual void TxStart() {
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 153 logDebug("mDotEvent - TxStart");
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 154
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 155 }
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 156
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 157 virtual void TxDone(uint8_t dr) {
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 158 _timeSinceTx.reset();
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 159 _timeSinceTx.start();
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 160
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 161 RxPayloadSize = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 162 LinkCheckAnsReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 163 PacketReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 164 AckReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 165 DuplicateRx = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 166 PongReceived = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 167 TxNbRetries = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 168
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 169 logDebug("mDotEvent - TxDone");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 170 memset(&_flags, 0, sizeof(LoRaMacEventFlags));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 171 memset(&_info, 0, sizeof(LoRaMacEventInfo));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 172
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 173 _flags.Bits.Tx = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 174 _info.TxDatarate = dr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 175 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 176 Notify();
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 177
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 178 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 179
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 180 void Notify() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 181 MacEvent(&_flags, &_info);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 182 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 183
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 184 virtual void TxTimeout(void) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 185 logDebug("mDotEvent - TxTimeout");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 186
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 187 _flags.Bits.Tx = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 188 _info.Status = LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 189 Notify();
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 190 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 191
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 192 virtual void JoinAccept(uint8_t *payload, uint16_t size, int16_t rssi, int16_t snr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 193 logDebug("mDotEvent - JoinAccept");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 194
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 195 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 196 _flags.Bits.JoinAccept = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 197 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 198 Notify();
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 199
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 200 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 201
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 202 virtual void JoinFailed(uint8_t *payload, uint16_t size, int16_t rssi, int16_t snr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 203 logDebug("mDotEvent - JoinFailed");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 204
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 205 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 206 _flags.Bits.JoinAccept = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 207 _info.Status = LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 208 Notify();
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 209
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 210 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 211
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 212 virtual void MissedAck(uint8_t retries) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 213 logDebug("mDotEvent - MissedAck : retries %u", retries);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 214 TxNbRetries = retries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 215 _info.TxNbRetries = retries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 216 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 217
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 218 virtual void PacketRx(uint8_t port, uint8_t *payload, uint16_t size, int16_t rssi, int16_t snr, lora::DownlinkControl ctrl, uint8_t slot, uint8_t retries, uint32_t address, bool dupRx) {
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 219 logDebug("mDotEvent - PacketRx ADDR: %08x", address);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 220 RxPort = port;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 221 PacketReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 222
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 223 memcpy(RxPayload, payload, size);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 224 RxPayloadSize = size;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 225
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 226 if (ctrl.Bits.Ack) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 227 AckReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 228 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 229
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 230 DuplicateRx = dupRx;
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 231
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 232 if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 233 std::string packet = mts::Text::bin2hexString(RxPayload, size);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 234 logTrace("Payload: %s", packet.c_str());
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 235 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 236
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 237 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 238 _flags.Bits.Rx = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 239 _flags.Bits.RxData = size > 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 240 _flags.Bits.RxSlot = slot;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 241 _info.RxBuffer = payload;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 242 _info.RxBufferSize = size;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 243 _info.RxPort = port;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 244 _info.RxRssi = rssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 245 _info.RxSnr = snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 246 _info.TxAckReceived = AckReceived;
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 247 _info.DuplicateRx = DuplicateRx;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 248 _info.TxNbRetries = retries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 249 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 250 Notify();
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 251 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 252
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 253 virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int16_t snr, lora::DownlinkControl ctrl, uint8_t slot) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 254 logDebug("mDotEvent - RxDone");
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 255
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 256 }
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 257
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 258 virtual void BeaconRx(const lora::BeaconData_t& beacon_data, int16_t rssi, int16_t snr) {
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 259 logDebug("mDotEvent - BeaconRx");
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 260 BeaconLocked = true;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 261 BeaconData = beacon_data;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 262 }
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 263
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 264 virtual void BeaconLost() {
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 265 logDebug("mDotEvent - BeaconLost");
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 266 BeaconLocked = false;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 267 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 268
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 269 virtual void Pong(int16_t m_rssi, int16_t m_snr, int16_t s_rssi, int16_t s_snr) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 270 logDebug("mDotEvent - Pong");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 271 PongReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 272 PongRssi = s_rssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 273 PongSnr = s_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 274 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 275
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 276 virtual void ServerTime(uint32_t seconds, uint8_t sub_seconds) {
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 277 logDebug("mDotEvent - ServerTime");
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 278 ServerTimeReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 279
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 280 uint64_t current_server_time_ms = static_cast<uint64_t>(seconds) * 1000 +
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 281 static_cast<uint16_t>(sub_seconds) * 4 + _timeSinceTx.read_ms();
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 282
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 283 ServerTimeSeconds = static_cast<uint32_t>(current_server_time_ms / 1000);
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 284 ServerTimeMillis = static_cast<uint16_t>(current_server_time_ms % 1000);
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 285 }
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 286
Jenkins@KEILDM1.dc.multitech.prv 20:bc12c888e7dc 287 virtual void NetworkLinkCheck(int16_t m_rssi, int16_t m_snr, int16_t s_snr, uint8_t s_gateways) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 288 logDebug("mDotEvent - NetworkLinkCheck");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 289 LinkCheckAnsReceived = true;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 290 DemodMargin = s_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 291 NbGateways = s_gateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 292
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 293 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 294 _flags.Bits.LinkCheck = 1;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 295 _info.RxRssi = m_rssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 296 _info.RxSnr = m_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 297 _info.DemodMargin = s_snr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 298 _info.NbGateways = s_gateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 299 _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 300 Notify();
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 301 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 302
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 303 virtual void RxTimeout(uint8_t slot) {
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 304 logDebug("mDotEvent - RxTimeout on Slot %d", slot);
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 305
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 306 _flags.Bits.Tx = 0;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 307 _flags.Bits.RxSlot = slot;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 308 _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 309 Notify();
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 310
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 311 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 312
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 313 virtual void RxError(uint8_t slot) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 314 logDebug("mDotEvent - RxError");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 315
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 316 memset(&_flags, 0, sizeof(LoRaMacEventFlags));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 317 memset(&_info, 0, sizeof(LoRaMacEventInfo));
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 318
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 319 _flags.Bits.RxSlot = slot;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 320 _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_ERROR;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 321 Notify();
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 322
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 323 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 324
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 325 virtual uint8_t MeasureBattery(void) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 326 return 255;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 327 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 328
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 329 bool LinkCheckAnsReceived;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 330 uint8_t DemodMargin;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 331 uint8_t NbGateways;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 332
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 333 bool PacketReceived;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 334 uint8_t RxPort;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 335 uint8_t RxPayload[255];
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 336 uint8_t RxPayloadSize;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 337
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 338 bool BeaconLocked;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 339 lora::BeaconData_t BeaconData;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 340
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 341 bool PongReceived;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 342 int16_t PongRssi;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 343 int16_t PongSnr;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 344
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 345 bool ServerTimeReceived;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 346 uint32_t ServerTimeSeconds;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 347 uint16_t ServerTimeMillis;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 348
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 349 bool AckReceived;
Jenkins@KEILDM1.dc.multitech.prv 14:f0c24ce93427 350 bool DuplicateRx;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 351 uint8_t TxNbRetries;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 352
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 353 LoRaMacEventFlags& Flags() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 354 return _flags;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 355 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 356 LoRaMacEventInfo& Info() {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 357 return _info;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 358 }
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 359
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 360 private:
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 361
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 362 LoRaMacEventFlags _flags;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 363 LoRaMacEventInfo _info;
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 364
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 365 Timer _timeSinceTx;
Jenkins@KEILDM1.dc.multitech.prv 16:4a382fe8f51b 366
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 367 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 368 // /*!
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 369 // * MAC layer event callback prototype.
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 370 // *
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 371 // * \param [IN] flags Bit field indicating the MAC events occurred
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 372 // * \param [IN] info Details about MAC events occurred
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 373 // */
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 374 // virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 375 // logDebug("mDotEvent");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 376 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 377 // if (flags->Bits.Rx) {
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 378 // logDebug("Rx");
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 379 //
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 380 // // Event Object must delete RxBuffer
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 381 // delete[] info->RxBuffer;
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
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 386 };
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 387
Jenkins@KEILDM1.dc.multitech.prv 2:4569491293d7 388 #endif // __MDOT_EVENT_H__