diff --git a/Utils.cpp b/Utils.cpp index be3831f1..1df11700 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -177,7 +177,7 @@ void Utils::symbols(const std::string& title, const uint8_t* data, uint32_t leng microslotHeader += temp; } - ::Log(2U, "SYMBOLS", "MCR: % s", microslotHeader.c_str()); + ::Log(2U, "SYMBOLS", "MCR: %s", microslotHeader.c_str()); uint32_t bufLen = length; while (bufLen > 0U) { diff --git a/dmr/DataPacket.cpp b/dmr/DataPacket.cpp index 4543a4d5..b8a62104 100644 --- a/dmr/DataPacket.cpp +++ b/dmr/DataPacket.cpp @@ -26,7 +26,6 @@ #include "Defines.h" #include "dmr/DataPacket.h" #include "dmr/acl/AccessControl.h" -#include "dmr/data/DataHeader.h" #include "dmr/data/EMB.h" #include "dmr/edac/Trellis.h" #include "dmr/lc/ShortLC.h" @@ -56,13 +55,6 @@ using namespace dmr; return false; \ } -#define CHECK_TRAFFIC_COLLISION_DELLC(_DST_ID) \ - if (m_slot->m_netState != RS_NET_IDLE && _DST_ID == m_slot->m_netLastDstId) { \ - LogWarning(LOG_RF, "DMR Slot %u, Traffic collision detect, preempting new RF traffic to existing network traffic!", m_slot->m_slotNo); \ - delete lc; \ - return false; \ - } - #define CHECK_TG_HANG(_DST_ID) \ if (m_slot->m_rfLastDstId != 0U) { \ if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \ @@ -70,14 +62,6 @@ using namespace dmr; } \ } -#define CHECK_TG_HANG_DELLC(_DST_ID) \ - if (m_slot->m_rfLastDstId != 0U) { \ - if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \ - delete lc; \ - return; \ - } \ - } - // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- @@ -154,14 +138,16 @@ bool DataPacket::process(uint8_t* data, uint32_t len) if (m_slot->m_rfState == RS_RF_DATA) return true; - data::DataHeader dataHeader; - bool valid = dataHeader.decode(data + 2U); + data::DataHeader* dataHeader = new data::DataHeader(); + bool valid = dataHeader->decode(data + 2U); if (!valid) return false; - bool gi = dataHeader.getGI(); - uint32_t srcId = dataHeader.getSrcId(); - uint32_t dstId = dataHeader.getDstId(); + m_slot->m_rfDataHeader = dataHeader; + + bool gi = dataHeader->getGI(); + uint32_t srcId = dataHeader->getSrcId(); + uint32_t dstId = dataHeader->getDstId(); CHECK_TRAFFIC_COLLISION(dstId); @@ -179,12 +165,12 @@ bool DataPacket::process(uint8_t* data, uint32_t len) } } - m_slot->m_rfFrames = dataHeader.getBlocks(); + m_slot->m_rfFrames = dataHeader->getBlocks(); m_slot->m_rfSeqNo = 0U; m_slot->m_rfLC = new lc::LC(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId); // Regenerate the data header - dataHeader.encode(data + 2U); + dataHeader->encode(data + 2U); // Regenerate the Slot Type slotType.encode(data + 2U); @@ -209,7 +195,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) if (m_verbose) { LogMessage(LOG_RF, DMR_DT_DATA_HEADER ", slot = %u, dpf = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, seqNo = %u, dstId = %u, srcId = %u, group = %u", - m_slot->m_slotNo, dataHeader.getDPF(), dataHeader.getSAP(), dataHeader.getFullMesage(), dataHeader.getBlocks(), dataHeader.getPadCount(), dataHeader.getFSN(), + m_slot->m_slotNo, dataHeader->getDPF(), dataHeader->getSAP(), dataHeader->getFullMesage(), dataHeader->getBlocks(), dataHeader->getPadCount(), dataHeader->getFSN(), dstId, srcId, gi); } @@ -365,23 +351,26 @@ void DataPacket::processNetwork(const data::Data& dmrData) if (m_slot->m_netState == RS_NET_DATA) return; - data::DataHeader dataHeader; - bool valid = dataHeader.decode(data + 2U); + data::DataHeader* dataHeader = new data::DataHeader(); + bool valid = dataHeader->decode(data + 2U); if (!valid) { LogError(LOG_NET, "DMR Slot %u, DT_DATA_HEADER, unable to decode the network data header", m_slot->m_slotNo); return; } - bool gi = dataHeader.getGI(); - uint32_t srcId = dataHeader.getSrcId(); - uint32_t dstId = dataHeader.getDstId(); + m_slot->m_netDataHeader = dataHeader; + + bool gi = dataHeader->getGI(); + uint32_t srcId = dataHeader->getSrcId(); + uint32_t dstId = dataHeader->getDstId(); CHECK_TG_HANG(dstId); - m_slot->m_netFrames = dataHeader.getBlocks(); + m_slot->m_netFrames = dataHeader->getBlocks(); + m_slot->m_netLC = new lc::LC(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId); // Regenerate the data header - dataHeader.encode(data + 2U); + dataHeader->encode(data + 2U); // Regenerate the Slot Type SlotType slotType; @@ -407,8 +396,9 @@ void DataPacket::processNetwork(const data::Data& dmrData) m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_PRIVATE, false); if (m_verbose) { - LogMessage(LOG_RF, DMR_DT_DATA_HEADER ", slot = %u, dstId = %u, srcId = %u, group = %u, blocks = %u", m_slot->m_slotNo, m_slot->m_rfLC->getDstId(), m_slot->m_rfLC->getSrcId(), - m_slot->m_rfLC->getFLCO() == FLCO_GROUP, dataHeader.getBlocks()); + LogMessage(LOG_NET, DMR_DT_DATA_HEADER ", slot = %u, dpf = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, seqNo = %u, dstId = %u, srcId = %u, group = %u", + m_slot->m_slotNo, dataHeader->getDPF(), dataHeader->getSAP(), dataHeader->getFullMesage(), dataHeader->getBlocks(), dataHeader->getPadCount(), dataHeader->getFSN(), + dstId, srcId, gi); } ::ActivityLog("DMR", false, "Slot %u network data header from %u to %s%u, %u blocks", diff --git a/dmr/DataPacket.h b/dmr/DataPacket.h index 436f08d3..09101a0b 100644 --- a/dmr/DataPacket.h +++ b/dmr/DataPacket.h @@ -33,6 +33,7 @@ #include "Defines.h" #include "dmr/data/Data.h" +#include "dmr/data/DataHeader.h" #include "dmr/data/EmbeddedData.h" #include "dmr/lc/LC.h" #include "dmr/Slot.h" diff --git a/dmr/Slot.cpp b/dmr/Slot.cpp index 84ae80b0..ba6b4ded 100644 --- a/dmr/Slot.cpp +++ b/dmr/Slot.cpp @@ -114,9 +114,11 @@ Slot::Slot(uint32_t slotNo, uint32_t timeout, uint32_t tgHang, uint32_t queueSiz m_netLastDstId(0U), m_rfLC(NULL), m_rfPrivacyLC(NULL), + m_rfDataHeader(NULL), m_rfSeqNo(0U), m_netLC(NULL), m_netPrivacyLC(NULL), + m_netDataHeader(NULL), m_networkWatchdog(1000U, 0U, 1500U), m_rfTimeoutTimer(1000U, timeout), m_rfTGHang(1000U, tgHang), @@ -678,7 +680,14 @@ void Slot::writeEndRF(bool writeEnd) m_rfBits = 1U; delete m_rfLC; + if (m_rfPrivacyLC != NULL) + delete m_rfPrivacyLC; + if (m_rfDataHeader != NULL) + delete m_rfDataHeader; + m_rfLC = NULL; + m_rfPrivacyLC = NULL; + m_rfDataHeader = NULL; } /// @@ -737,7 +746,14 @@ void Slot::writeEndNet(bool writeEnd) m_netBits = 1U; delete m_netLC; + if (m_netPrivacyLC != NULL) + delete m_netPrivacyLC; + if (m_netDataHeader != NULL) + delete m_netDataHeader; + m_netLC = NULL; + m_netPrivacyLC = NULL; + m_netDataHeader = NULL; } /// diff --git a/dmr/Slot.h b/dmr/Slot.h index f400fb89..eb2637df 100644 --- a/dmr/Slot.h +++ b/dmr/Slot.h @@ -114,11 +114,13 @@ namespace dmr lc::LC* m_rfLC; lc::PrivacyLC* m_rfPrivacyLC; + data::DataHeader* m_rfDataHeader; uint8_t m_rfSeqNo; lc::LC* m_netLC; lc::PrivacyLC* m_netPrivacyLC; + data::DataHeader* m_netDataHeader; Timer m_networkWatchdog; Timer m_rfTimeoutTimer; diff --git a/dmr/VoicePacket.cpp b/dmr/VoicePacket.cpp index 733bf82e..7e9bf0ff 100644 --- a/dmr/VoicePacket.cpp +++ b/dmr/VoicePacket.cpp @@ -92,7 +92,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) return true; lc::FullLC fullLC; - lc::LC * lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); + lc::LC* lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); if (lc == NULL) return false; diff --git a/modem/port/UARTPort.cpp b/modem/port/UARTPort.cpp index 9a20b98e..6e39bfcf 100644 --- a/modem/port/UARTPort.cpp +++ b/modem/port/UARTPort.cpp @@ -209,9 +209,13 @@ int UARTPort::read(uint8_t* buffer, uint32_t length) /// Actual length of data written to the serial port. int UARTPort::write(const uint8_t* buffer, uint32_t length) { - assert(m_handle != INVALID_HANDLE_VALUE); assert(buffer != NULL); + if (m_isOpen && m_handle == INVALID_HANDLE_VALUE) + return 0; + + assert(m_handle != INVALID_HANDLE_VALUE); + if (length == 0U) return 0; @@ -236,13 +240,14 @@ int UARTPort::write(const uint8_t* buffer, uint32_t length) /// void UARTPort::close() { - if (!m_isOpen) + if (!m_isOpen && m_handle == INVALID_HANDLE_VALUE) return; assert(m_handle != INVALID_HANDLE_VALUE); ::CloseHandle(m_handle); m_handle = INVALID_HANDLE_VALUE; + m_isOpen = false; } #else @@ -460,6 +465,10 @@ int UARTPort::read(uint8_t* buffer, uint32_t length) int UARTPort::write(const uint8_t* buffer, uint32_t length) { assert(buffer != NULL); + + if (m_isOpen && m_fd == -1) + return 0; + assert(m_fd != -1); if (length == 0U) @@ -496,6 +505,7 @@ void UARTPort::close() ::close(m_fd); m_fd = -1; + m_isOpen = false; } #if defined(__APPLE__) diff --git a/p25/VoicePacket.h b/p25/VoicePacket.h index 267f485d..99478270 100644 --- a/p25/VoicePacket.h +++ b/p25/VoicePacket.h @@ -84,18 +84,24 @@ namespace p25 uint32_t m_netLost; Audio m_audio; + lc::LC m_rfLC; lc::LC m_rfLastHDU; lc::LC m_rfLastLDU1; lc::LC m_rfLastLDU2; + lc::LC m_netLC; lc::LC m_netLastLDU1; + data::LowSpeedData m_rfLSD; data::LowSpeedData m_netLSD; + uint8_t* m_netLDU1; uint8_t* m_netLDU2; + uint8_t m_lastDUID; uint8_t* m_lastIMBE; + bool m_hadVoice; uint32_t m_lastRejectId;