Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: mDotEvent.h
- Revision:
- 16:b630e18103e5
- Child:
- 17:306ffaa5d79b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mDotEvent.h Thu Aug 04 15:11:24 2016 -0500
@@ -0,0 +1,297 @@
+#ifndef MDOT_EVENT_H
+#define MDOT_EVENT_H
+
+#include "mDot.h"
+#include "MacEvents.h"
+#include "MTSLog.h"
+#include "MTSText.h"
+
+typedef union {
+ uint8_t Value;
+ struct {
+ uint8_t :1;
+ uint8_t Tx :1;
+ uint8_t Rx :1;
+ uint8_t RxData :1;
+ uint8_t RxSlot :2;
+ uint8_t LinkCheck :1;
+ uint8_t JoinAccept :1;
+ } Bits;
+} LoRaMacEventFlags;
+
+typedef enum {
+ LORAMAC_EVENT_INFO_STATUS_OK = 0,
+ LORAMAC_EVENT_INFO_STATUS_ERROR,
+ LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT,
+ LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT,
+ LORAMAC_EVENT_INFO_STATUS_RX_ERROR,
+ LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL,
+ LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL,
+ LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL,
+ LORAMAC_EVENT_INFO_STATUS_MIC_FAIL,
+} LoRaMacEventInfoStatus;
+
+/*!
+ * LoRaMAC event information
+ */
+typedef struct {
+ LoRaMacEventInfoStatus Status;
+ lora::DownlinkControl Ctrl;
+ bool TxAckReceived;
+ uint8_t TxNbRetries;
+ uint8_t TxDatarate;
+ uint8_t RxPort;
+ uint8_t *RxBuffer;
+ uint8_t RxBufferSize;
+ int16_t RxRssi;
+ uint8_t RxSnr;
+ uint16_t Energy;
+ uint8_t DemodMargin;
+ uint8_t NbGateways;
+} LoRaMacEventInfo;
+
+class mDotEvent: public lora::MacEvents {
+ public:
+
+ mDotEvent()
+ :
+ LinkCheckAnsReceived(false),
+ DemodMargin(0),
+ NbGateways(0),
+ PacketReceived(false),
+ RxPort(0),
+ RxPayloadSize(0),
+ PongReceived(false),
+ PongRssi(0),
+ PongSnr(0),
+ AckReceived(false),
+ TxNbRetries(0)
+ {
+ memset(&_flags, 0, sizeof(LoRaMacEventFlags));
+ memset(&_info, 0, sizeof(LoRaMacEventInfo));
+ }
+
+ virtual ~mDotEvent() {
+ }
+
+ virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
+ if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
+ std::string msg = "OK";
+ switch (info->Status) {
+ case LORAMAC_EVENT_INFO_STATUS_ERROR:
+ msg = "ERROR";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT:
+ msg = "TX_TIMEOUT";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT:
+ msg = "RX_TIMEOUT";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_RX_ERROR:
+ msg = "RX_ERROR";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL:
+ msg = "JOIN_FAIL";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_DOWNLINK_FAIL:
+ msg = "DOWNLINK_FAIL";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL:
+ msg = "ADDRESS_FAIL";
+ break;
+ case LORAMAC_EVENT_INFO_STATUS_MIC_FAIL:
+ msg = "MIC_FAIL";
+ break;
+ default:
+ break;
+ }
+ logTrace("Event: %s", msg.c_str());
+
+ logTrace("Flags Tx: %d Rx: %d RxData: %d RxSlot: %d LinkCheck: %d JoinAccept: %d",
+ flags->Bits.Tx, flags->Bits.Rx, flags->Bits.RxData, flags->Bits.RxSlot, flags->Bits.LinkCheck, flags->Bits.JoinAccept);
+ logTrace("Info: Status: %d ACK: %d Retries: %d TxDR: %d RxPort: %d RxSize: %d RSSI: %d SNR: %d Energy: %d Margin: %d Gateways: %d",
+ info->Status, info->TxAckReceived, info->TxNbRetries, info->TxDatarate, info->RxPort, info->RxBufferSize,
+ info->RxRssi, info->RxSnr, info->Energy, info->DemodMargin, info->NbGateways);
+ }
+ }
+
+ virtual void TxDone(uint8_t dr) {
+ RxPayloadSize = 0;
+ LinkCheckAnsReceived = false;
+ PacketReceived = false;
+ AckReceived = false;
+ PongReceived = false;
+
+ logDebug("mDotEvent - TxDone");
+ memset(&_flags, 0, sizeof(LoRaMacEventFlags));
+ memset(&_info, 0, sizeof(LoRaMacEventInfo));
+
+ _flags.Bits.Tx = 1;
+ _info.TxDatarate = dr;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
+ Notify();
+ }
+
+ void Notify() {
+ MacEvent(&_flags, &_info);
+ }
+
+ virtual void TxTimeout(void) {
+ logDebug("mDotEvent - TxTimeout");
+
+ _flags.Bits.Tx = 1;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_TX_TIMEOUT;
+ Notify();
+ }
+
+ virtual void JoinAccept(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
+ logDebug("mDotEvent - JoinAccept");
+
+ _flags.Bits.Tx = 0;
+ _flags.Bits.JoinAccept = 1;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
+ Notify();
+ }
+
+ virtual void JoinFailed(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) {
+ logDebug("mDotEvent - JoinFailed");
+
+ _flags.Bits.Tx = 0;
+ _flags.Bits.JoinAccept = 1;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_JOIN_FAIL;
+ Notify();
+ }
+
+ virtual void PacketRx(uint8_t port, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot, uint8_t retries = 0) {
+ logDebug("mDotEvent - PacketRx");
+ RxPort = port;
+ PacketReceived = true;
+
+ memcpy(RxPayload, payload, size);
+ RxPayloadSize = size;
+
+ if (ctrl.Bits.Ack) {
+ AckReceived = true;
+ }
+
+ if (mts::MTSLog::getLogLevel() == mts::MTSLog::TRACE_LEVEL) {
+ std::string packet = mts::Text::bin2hexString(RxPayload, size);
+ logTrace("Payload: %s", packet.c_str());
+ }
+
+ _flags.Bits.Tx = 0;
+ _flags.Bits.Rx = 1;
+ _flags.Bits.RxData = size > 0;
+ _flags.Bits.RxSlot = slot;
+ _info.RxBuffer = payload;
+ _info.RxBufferSize = size;
+ _info.RxPort = port;
+ _info.RxRssi = rssi;
+ _info.RxSnr = snr;
+ _info.TxAckReceived = AckReceived;
+ _info.TxAckReceived = retries;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
+ Notify();
+ }
+
+ virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot) {
+ logDebug("mDotEvent - RxDone");
+ }
+
+ virtual void Pong(int16_t m_rssi, int8_t m_snr, int16_t s_rssi, int8_t s_snr) {
+ logDebug("mDotEvent - Pong");
+ PongReceived = true;
+ PongRssi = s_rssi;
+ PongSnr = s_snr;
+ }
+
+ virtual void NetworkLinkCheck(int16_t m_rssi, int8_t m_snr, int8_t s_snr, uint8_t s_gateways) {
+ logDebug("mDotEvent - NetworkLinkCheck");
+ LinkCheckAnsReceived = true;
+ DemodMargin = s_snr;
+ NbGateways = s_gateways;
+
+ _flags.Bits.Tx = 0;
+ _flags.Bits.LinkCheck = 1;
+ _info.RxRssi = m_rssi;
+ _info.RxSnr = m_snr;
+ _info.DemodMargin = s_snr;
+ _info.NbGateways = s_gateways;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_OK;
+ Notify();
+ }
+
+ virtual void RxTimeout(uint8_t slot) {
+ // logDebug("mDotEvent - RxTimeout");
+
+ _flags.Bits.Tx = 0;
+ _flags.Bits.RxSlot = slot;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_TIMEOUT;
+ Notify();
+ }
+
+ virtual void RxError(uint8_t slot) {
+ logDebug("mDotEvent - RxError");
+
+ memset(&_flags, 0, sizeof(LoRaMacEventFlags));
+ memset(&_info, 0, sizeof(LoRaMacEventInfo));
+
+ _flags.Bits.RxSlot = slot;
+ _info.Status = LORAMAC_EVENT_INFO_STATUS_RX_ERROR;
+ Notify();
+ }
+
+ virtual uint8_t MeasureBattery(void) {
+ return 255;
+ }
+
+ bool LinkCheckAnsReceived;
+ uint8_t DemodMargin;
+ uint8_t NbGateways;
+
+ bool PacketReceived;
+ uint8_t RxPort;
+ uint8_t RxPayload[255];
+ uint8_t RxPayloadSize;
+
+ bool PongReceived;
+ int16_t PongRssi;
+ int16_t PongSnr;
+
+ bool AckReceived;
+ uint8_t TxNbRetries;
+
+ LoRaMacEventFlags& Flags() {
+ return _flags;
+ }
+ LoRaMacEventInfo& Info() {
+ return _info;
+ }
+
+ private:
+
+ LoRaMacEventFlags _flags;
+ LoRaMacEventInfo _info;
+
+//
+// /*!
+// * MAC layer event callback prototype.
+// *
+// * \param [IN] flags Bit field indicating the MAC events occurred
+// * \param [IN] info Details about MAC events occurred
+// */
+// virtual void MacEvent(LoRaMacEventFlags *flags, LoRaMacEventInfo *info) {
+// logDebug("mDotEvent");
+//
+// if (flags->Bits.Rx) {
+// logDebug("Rx");
+//
+// // Event Object must delete RxBuffer
+// delete[] info->RxBuffer;
+// }
+// }
+//
+
+};
+
+#endif // __MDOT_EVENT_H__