diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 6efb38b..2faa45b 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -428,7 +428,12 @@ int CDMRGateway::run() bool ret = m_repeater->read(data); if (ret) { - extractGPSData(data); + // Check if NMEA Data coming + checkForGPSData(data); + + // Do we have GPS data? + if (isGPSData(data)) + extractGPSData(data); unsigned int slotNo = data.getSlotNo(); unsigned int srcId = data.getSrcId(); @@ -1226,6 +1231,55 @@ void CDMRGateway::createAPRSHelper() m_aprsHelper->setInfo(txFrequency, rxFrequency, latitude, longitude, height); } +void CDMRGateway::checkForGPSData(const CDMRData& data) +{ + unsigned int slotNo = data.getSlotNo(); + unsigned char type = data.getDataType(); + + if (type == DT_DATA_HEADER) { + CBPTC19696 bptc; + unsigned char buffer[DMR_FRAME_LENGTH_BYTES]; + + data.getData(buffer); + + unsigned char payload[12U]; + bptc.decode(buffer, payload); + if ( ((payload[1U] & 0x05U) == 0x05U) && ((payload[8U] & 0x03U) == 0x00U) ) + { + LogDebug("UDT/NMEA Frame, Slot %d, 1 Appended data block outstanding", slotNo); + // Store Source and destination ID's per slot + if (slotNo == 1) + { + m_lastSlot1HadNMEA = true; + LogDebug("Recording that Slot1 has NMEA Data outstanding"); + } + if (slotNo == 2){ + m_lastSlot2HadNMEA = true; + LogDebug("Recording that Slot2 has NMEA Data outstanding"); + + } + } + } +} + +bool CDMRGateway::isGPSData(const CDMRData& data) +{ + unsigned char type = data.getDataType(); + + if (type == DT_RATE_12_DATA) { + if (m_lastSlot1HadNMEA == true){ + m_lastSlot1HadNMEA = false; + return true; + } else if (m_lastSlot2HadNMEA == true) + { + m_lastSlot2HadNMEA = false; + return true; + } + } + return false; +} + + void CDMRGateway::extractGPSData(const CDMRData& data) { unsigned int slotNo = data.getSlotNo(); diff --git a/DMRGateway.h b/DMRGateway.h index 750f62f..f05dc49 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -72,6 +72,8 @@ private: std::vector m_dmr2NetRewrites; std::vector m_dmr2RFRewrites; CDMRLookup* m_lookup; + bool m_lastSlot1HadNMEA; + bool m_lastSlot2HadNMEA; bool createMMDVM(); bool createDMRNetwork1(); @@ -79,7 +81,10 @@ private: bool createXLXNetwork1(); bool createXLXNetwork2(); void writeXLXLink(unsigned int srcId, unsigned int dstId, CDMRNetwork* network); + void checkForGPSData(const CDMRData& data); void extractGPSData(const CDMRData& data); + bool isGPSData(const CDMRData& data); + void createAPRSHelper(); };