Library for LoRa communication using MultiTech MDOT.
Dependents: mDot_test_rx adc_sensor_lora mDotEVBM2X mDot_AT_firmware ... more
Function documentation is in mDot.h
Warning
Using libmDot 2.0.3 and above with an existing application may require a change in the MacEvent handler!
Compile applications with mbed v121 and mbed-rtos v116 libraries.
In AT Command Firmware remove line 803.
CommandTerminal/CommandTerminal.cpp
delete[] info->RxBuffer;
Likewise, if your application is handling events from the library asynchronously.
Diff: mDotEvent.h
- Revision:
- 17:0da384ba484b
- Parent:
- 15:b50f92f1c6ff
--- a/mDotEvent.h Fri Nov 18 10:29:43 2016 -0600 +++ b/mDotEvent.h Fri Nov 18 11:10:04 2016 -0600 @@ -1,298 +1,29 @@ -#ifndef MDOT_EVENT_H -#define MDOT_EVENT_H - -#include "mDot.h" -#include "MacEvents.h" +#include "LoRaMacEvent.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 { +class mDotEvent : public LoRaMacEvent { 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 ~mDotEvent() {} - 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()); - } + /*! + * 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"); - _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; - } + if (flags->Bits.Rx) { + logDebug("Rx"); - 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(); + // Event Object must delete RxBuffer + delete[] info->RxBuffer; + } } 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__ -