From b6adf6931d971bde39c1fc3fbdf4f7d1a15b952b Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 28 Feb 2016 17:40:15 +0000 Subject: [PATCH] Regularise the sending of headers and timeouts. --- DMRIPSC.cpp | 11 +++++++++-- DMRSlot.cpp | 25 ++++++++++++++----------- DMRSlot.h | 1 + DStarControl.cpp | 25 ++++++++++--------------- 4 files changed, 34 insertions(+), 28 deletions(-) diff --git a/DMRIPSC.cpp b/DMRIPSC.cpp index b48fd6b..8b305ed 100644 --- a/DMRIPSC.cpp +++ b/DMRIPSC.cpp @@ -237,14 +237,18 @@ bool CDMRIPSC::write(const CDMRData& data) unsigned int slotIndex = slotNo - 1U; + unsigned int count = 1U; + unsigned char dataType = data.getDataType(); if (dataType == DT_VOICE_SYNC) { buffer[15U] |= 0x10U; } else if (dataType == DT_VOICE) { buffer[15U] |= data.getN(); } else { - if ((dataType == DT_VOICE_LC_HEADER || dataType == DT_DATA_HEADER) && data.getSeqNo() == 0U) + if ((dataType == DT_VOICE_LC_HEADER || dataType == DT_DATA_HEADER) && data.getSeqNo() == 0U) { m_streamId[slotIndex] = ::rand() + 1U; + count = 3U; + } buffer[15U] |= (0x20U | dataType); } @@ -258,7 +262,10 @@ bool CDMRIPSC::write(const CDMRData& data) if (m_debug) CUtils::dump(1U, "IPSC Transmitted", buffer, HOMEBREW_DATA_PACKET_LENGTH); - return write(buffer, HOMEBREW_DATA_PACKET_LENGTH); + for (unsigned int i = 0U; i < count; i++) + write(buffer, HOMEBREW_DATA_PACKET_LENGTH); + + return true; } void CDMRIPSC::close() diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 547fdbf..bb1c593 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -51,6 +51,7 @@ m_netState(RS_NET_IDLE), m_rfEmbeddedLC(), m_rfLC(NULL), m_netLC(NULL), +m_rfSeqNo(0U), m_netSeqNo(0U), m_rfN(0U), m_netN(0U), @@ -134,6 +135,7 @@ void CDMRSlot::writeModem(unsigned char *data) m_rfTimeoutTimer.start(); m_rfFrames = 0U; + m_rfSeqNo = 0U; m_rfBits = 1U; m_rfErrs = 0U; @@ -142,8 +144,7 @@ void CDMRSlot::writeModem(unsigned char *data) writeQueueRF(data); } - for (unsigned i = 0U; i < 3U; i++) - writeNetworkRF(data, DT_VOICE_LC_HEADER); + writeNetworkRF(data, DT_VOICE_LC_HEADER); m_rfState = RS_RF_AUDIO; @@ -222,6 +223,7 @@ void CDMRSlot::writeModem(unsigned char *data) unsigned int dstId = dataHeader.getDstId(); m_rfFrames = dataHeader.getBlocks(); + m_rfSeqNo = 0U; m_rfLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId); @@ -242,8 +244,7 @@ void CDMRSlot::writeModem(unsigned char *data) writeQueueRF(data); } - for (unsigned i = 0U; i < 3U; i++) - writeNetworkRF(data, DT_DATA_HEADER); + writeNetworkRF(data, DT_DATA_HEADER); m_rfState = RS_RF_DATA; @@ -279,6 +280,8 @@ void CDMRSlot::writeModem(unsigned char *data) // Convert the Data Sync to be from the BS CSync::addDMRDataSync(data + 2U); + m_rfSeqNo = 0U; + data[0U] = TAG_DATA; data[1U] = 0x00U; @@ -447,16 +450,16 @@ void CDMRSlot::writeModem(unsigned char *data) m_rfTimeoutTimer.start(); m_rfFrames = 0U; - m_rfBits = 1U; - m_rfErrs = 0U; + m_rfSeqNo = 0U; + m_rfBits = 1U; + m_rfErrs = 0U; if (m_duplex) { for (unsigned int i = 0U; i < 3U; i++) writeQueueRF(start); } - for (unsigned int i = 0U; i < 3U; i++) - writeNetworkRF(start, DT_VOICE_LC_HEADER); + writeNetworkRF(start, DT_VOICE_LC_HEADER); // Regenerate the EMB emb.getData(data + 2U); @@ -1052,10 +1055,10 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, dmrData.setSrcId(srcId); dmrData.setDstId(dstId); dmrData.setFLCO(flco); - dmrData.setN(m_netN); - dmrData.setSeqNo(m_netSeqNo); + dmrData.setN(m_rfN); + dmrData.setSeqNo(m_rfSeqNo); - m_netSeqNo++; + m_rfSeqNo++; dmrData.setData(data + 2U); diff --git a/DMRSlot.h b/DMRSlot.h index a6d0ffc..7e10a0d 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -56,6 +56,7 @@ private: CDMREmbeddedLC m_rfEmbeddedLC; CDMRLC* m_rfLC; CDMRLC* m_netLC; + unsigned char m_rfSeqNo; unsigned char m_netSeqNo; unsigned char m_netN; unsigned char m_rfN; diff --git a/DStarControl.cpp b/DStarControl.cpp index e3f210b..d763251 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -136,17 +136,17 @@ bool CDStarControl::writeModem(unsigned char *data) m_net = ::memcmp(gateway, m_gateway, DSTAR_LONG_CALLSIGN_LENGTH) == 0; // Only start the timeout if not already running - if (!m_rfTimeoutTimer.isRunning()) { + if (!m_rfTimeoutTimer.isRunning()) m_rfTimeoutTimer.start(); - m_rfBits = 1U; - m_rfErrs = 0U; - } m_rfHeader = header; m_holdoffTimer.stop(); m_ackTimer.stop(); + m_rfBits = 1U; + m_rfErrs = 0U; + m_rfFrames = 1U; m_rfN = 0U; @@ -167,8 +167,7 @@ bool CDStarControl::writeModem(unsigned char *data) header.setRPTCall2(m_gateway); header.get(data + 1U); - for (unsigned i = 0U; i < 3U; i++) - writeNetworkHeaderRF(data); + writeNetworkHeaderRF(data); } m_rfState = RS_RF_AUDIO; @@ -269,17 +268,17 @@ bool CDStarControl::writeModem(unsigned char *data) m_net = ::memcmp(gateway, m_gateway, DSTAR_LONG_CALLSIGN_LENGTH) == 0; // Only reset the timeout if the timeout is not running - if (!m_rfTimeoutTimer.isRunning()) { + if (!m_rfTimeoutTimer.isRunning()) m_rfTimeoutTimer.start(); - m_rfBits = 1U; - m_rfErrs = 0U; - } // Create a dummy start frame to replace the received frame m_ackTimer.stop(); m_rfHeader = *header; + m_rfBits = 1U; + m_rfErrs = 0U; + m_rfN = 0U; m_rfFrames = 1U; @@ -306,8 +305,7 @@ bool CDStarControl::writeModem(unsigned char *data) header->setRPTCall2(m_gateway); header->get(start + 1U); - for (unsigned int i = 0U; i < 3U; i++) - writeNetworkHeaderRF(start); + writeNetworkHeaderRF(start); } delete header; @@ -454,8 +452,6 @@ void CDStarControl::writeNetwork() if (m_netState != RS_NET_AUDIO) return; - m_netTimeoutTimer.stop(); - writeQueueEOTNet(); data[1U] = TAG_EOT; @@ -531,7 +527,6 @@ void CDStarControl::clock(unsigned int ms) m_netFrames += 1U; if (m_netBits == 0U) m_netBits = 1U; LogMessage("D-Star, network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); - m_netTimeoutTimer.stop(); writeEndNet(); #if defined(DUMP_DSTAR) closeFile();