khang_91

Committer:
nguyenhoang9x5555
Date:
Tue Jun 23 07:26:42 2020 +0000
Revision:
183:16414698889c
Parent:
172:7ec44396a51b
Child:
176:e8835022d431
phienbanthunghiem

Who changed what in which revision?

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