diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 81ede4a..78708e0 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -153,7 +153,6 @@ void CDMRSlot::writeModem(unsigned char *data) return; } - did = lc->getDstId(); // true sets allow greater than 4k. Need to add boolean in conf for this later. if (!DstIdWhitelist(did, m_slotNo, true)) { LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG not in whitelist)", m_slotNo, did); @@ -162,6 +161,7 @@ void CDMRSlot::writeModem(unsigned char *data) } m_queue.clear(); + m_modem->writeDMRAbort(m_slotNo); m_rfLC = lc; @@ -518,7 +518,6 @@ void CDMRSlot::writeModem(unsigned char *data) return; } - did = lc->getDstId(); // true sets allow greater than 4k. Need to add boolean in conf for this later. if (!DstIdWhitelist(did, m_slotNo, true)) { LogMessage("DMR Slot %u, invalid access attempt to TG%u (TG not in whitelist)", m_slotNo, did); @@ -527,6 +526,7 @@ void CDMRSlot::writeModem(unsigned char *data) } m_queue.clear(); + m_modem->writeDMRAbort(m_slotNo); m_rfLC = lc; @@ -807,6 +807,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) } m_queue.clear(); + m_modem->writeDMRAbort(m_slotNo); // Store the LC for the embedded LC m_netEmbeddedLC.setData(*m_netLC); @@ -1033,8 +1034,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) LogMessage("DMR Slot %u, invalid traffic to TG%u (TG not in whitelist) dataType: %s", m_slotNo, did, dataType); return; } - + m_queue.clear(); + m_modem->writeDMRAbort(m_slotNo); m_netTimeoutTimer.start(); diff --git a/Modem.cpp b/Modem.cpp index b635436..84b73c6 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -57,6 +57,7 @@ const unsigned char MMDVM_DMR_DATA2 = 0x1AU; const unsigned char MMDVM_DMR_LOST2 = 0x1BU; const unsigned char MMDVM_DMR_SHORTLC = 0x1CU; const unsigned char MMDVM_DMR_START = 0x1DU; +const unsigned char MMDVM_DMR_ABORT = 0x1EU; const unsigned char MMDVM_YSF_DATA = 0x20U; const unsigned char MMDVM_YSF_LOST = 0x21U; @@ -1035,6 +1036,25 @@ bool CModem::writeDMRStart(bool tx) return m_serial.write(buffer, 4U) == 4; } +bool CModem::writeDMRAbort(unsigned int slotNo) +{ + if (slotNo == 1U) + m_txDMRData1.clear(); + else + m_txDMRData2.clear(); + + unsigned char buffer[4U]; + + buffer[0U] = MMDVM_FRAME_START; + buffer[1U] = 4U; + buffer[2U] = MMDVM_DMR_ABORT; + buffer[3U] = slotNo; + + // CUtils::dump(1U, "Written", buffer, 4U); + + return m_serial.write(buffer, 4U) == 4; +} + bool CModem::writeDMRShortLC(const unsigned char* lc) { assert(lc != NULL); diff --git a/Modem.h b/Modem.h index 4655d54..6dce045 100644 --- a/Modem.h +++ b/Modem.h @@ -64,6 +64,7 @@ public: bool writeDMRStart(bool tx); bool writeDMRShortLC(const unsigned char* lc); + bool writeDMRAbort(unsigned int slotNo); bool setMode(unsigned char mode);