Regularise the sending of headers and timeouts.

This commit is contained in:
Jonathan Naylor
2016-02-28 17:40:15 +00:00
parent 14a30286c7
commit b6adf6931d
4 changed files with 34 additions and 28 deletions

View File

@@ -237,14 +237,18 @@ bool CDMRIPSC::write(const CDMRData& data)
unsigned int slotIndex = slotNo - 1U; unsigned int slotIndex = slotNo - 1U;
unsigned int count = 1U;
unsigned char dataType = data.getDataType(); unsigned char dataType = data.getDataType();
if (dataType == DT_VOICE_SYNC) { if (dataType == DT_VOICE_SYNC) {
buffer[15U] |= 0x10U; buffer[15U] |= 0x10U;
} else if (dataType == DT_VOICE) { } else if (dataType == DT_VOICE) {
buffer[15U] |= data.getN(); buffer[15U] |= data.getN();
} else { } 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; m_streamId[slotIndex] = ::rand() + 1U;
count = 3U;
}
buffer[15U] |= (0x20U | dataType); buffer[15U] |= (0x20U | dataType);
} }
@@ -258,7 +262,10 @@ bool CDMRIPSC::write(const CDMRData& data)
if (m_debug) if (m_debug)
CUtils::dump(1U, "IPSC Transmitted", buffer, HOMEBREW_DATA_PACKET_LENGTH); 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() void CDMRIPSC::close()

View File

@@ -51,6 +51,7 @@ m_netState(RS_NET_IDLE),
m_rfEmbeddedLC(), m_rfEmbeddedLC(),
m_rfLC(NULL), m_rfLC(NULL),
m_netLC(NULL), m_netLC(NULL),
m_rfSeqNo(0U),
m_netSeqNo(0U), m_netSeqNo(0U),
m_rfN(0U), m_rfN(0U),
m_netN(0U), m_netN(0U),
@@ -134,6 +135,7 @@ void CDMRSlot::writeModem(unsigned char *data)
m_rfTimeoutTimer.start(); m_rfTimeoutTimer.start();
m_rfFrames = 0U; m_rfFrames = 0U;
m_rfSeqNo = 0U;
m_rfBits = 1U; m_rfBits = 1U;
m_rfErrs = 0U; m_rfErrs = 0U;
@@ -142,7 +144,6 @@ void CDMRSlot::writeModem(unsigned char *data)
writeQueueRF(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; m_rfState = RS_RF_AUDIO;
@@ -222,6 +223,7 @@ void CDMRSlot::writeModem(unsigned char *data)
unsigned int dstId = dataHeader.getDstId(); unsigned int dstId = dataHeader.getDstId();
m_rfFrames = dataHeader.getBlocks(); m_rfFrames = dataHeader.getBlocks();
m_rfSeqNo = 0U;
m_rfLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId); m_rfLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId);
@@ -242,7 +244,6 @@ void CDMRSlot::writeModem(unsigned char *data)
writeQueueRF(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; m_rfState = RS_RF_DATA;
@@ -279,6 +280,8 @@ void CDMRSlot::writeModem(unsigned char *data)
// Convert the Data Sync to be from the BS // Convert the Data Sync to be from the BS
CSync::addDMRDataSync(data + 2U); CSync::addDMRDataSync(data + 2U);
m_rfSeqNo = 0U;
data[0U] = TAG_DATA; data[0U] = TAG_DATA;
data[1U] = 0x00U; data[1U] = 0x00U;
@@ -447,6 +450,7 @@ void CDMRSlot::writeModem(unsigned char *data)
m_rfTimeoutTimer.start(); m_rfTimeoutTimer.start();
m_rfFrames = 0U; m_rfFrames = 0U;
m_rfSeqNo = 0U;
m_rfBits = 1U; m_rfBits = 1U;
m_rfErrs = 0U; m_rfErrs = 0U;
@@ -455,7 +459,6 @@ void CDMRSlot::writeModem(unsigned char *data)
writeQueueRF(start); 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 // Regenerate the EMB
@@ -1052,10 +1055,10 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType,
dmrData.setSrcId(srcId); dmrData.setSrcId(srcId);
dmrData.setDstId(dstId); dmrData.setDstId(dstId);
dmrData.setFLCO(flco); dmrData.setFLCO(flco);
dmrData.setN(m_netN); dmrData.setN(m_rfN);
dmrData.setSeqNo(m_netSeqNo); dmrData.setSeqNo(m_rfSeqNo);
m_netSeqNo++; m_rfSeqNo++;
dmrData.setData(data + 2U); dmrData.setData(data + 2U);

View File

@@ -56,6 +56,7 @@ private:
CDMREmbeddedLC m_rfEmbeddedLC; CDMREmbeddedLC m_rfEmbeddedLC;
CDMRLC* m_rfLC; CDMRLC* m_rfLC;
CDMRLC* m_netLC; CDMRLC* m_netLC;
unsigned char m_rfSeqNo;
unsigned char m_netSeqNo; unsigned char m_netSeqNo;
unsigned char m_netN; unsigned char m_netN;
unsigned char m_rfN; unsigned char m_rfN;

View File

@@ -136,17 +136,17 @@ bool CDStarControl::writeModem(unsigned char *data)
m_net = ::memcmp(gateway, m_gateway, DSTAR_LONG_CALLSIGN_LENGTH) == 0; m_net = ::memcmp(gateway, m_gateway, DSTAR_LONG_CALLSIGN_LENGTH) == 0;
// Only start the timeout if not already running // Only start the timeout if not already running
if (!m_rfTimeoutTimer.isRunning()) { if (!m_rfTimeoutTimer.isRunning())
m_rfTimeoutTimer.start(); m_rfTimeoutTimer.start();
m_rfBits = 1U;
m_rfErrs = 0U;
}
m_rfHeader = header; m_rfHeader = header;
m_holdoffTimer.stop(); m_holdoffTimer.stop();
m_ackTimer.stop(); m_ackTimer.stop();
m_rfBits = 1U;
m_rfErrs = 0U;
m_rfFrames = 1U; m_rfFrames = 1U;
m_rfN = 0U; m_rfN = 0U;
@@ -167,7 +167,6 @@ bool CDStarControl::writeModem(unsigned char *data)
header.setRPTCall2(m_gateway); header.setRPTCall2(m_gateway);
header.get(data + 1U); header.get(data + 1U);
for (unsigned i = 0U; i < 3U; i++)
writeNetworkHeaderRF(data); writeNetworkHeaderRF(data);
} }
@@ -269,17 +268,17 @@ bool CDStarControl::writeModem(unsigned char *data)
m_net = ::memcmp(gateway, m_gateway, DSTAR_LONG_CALLSIGN_LENGTH) == 0; m_net = ::memcmp(gateway, m_gateway, DSTAR_LONG_CALLSIGN_LENGTH) == 0;
// Only reset the timeout if the timeout is not running // Only reset the timeout if the timeout is not running
if (!m_rfTimeoutTimer.isRunning()) { if (!m_rfTimeoutTimer.isRunning())
m_rfTimeoutTimer.start(); m_rfTimeoutTimer.start();
m_rfBits = 1U;
m_rfErrs = 0U;
}
// Create a dummy start frame to replace the received frame // Create a dummy start frame to replace the received frame
m_ackTimer.stop(); m_ackTimer.stop();
m_rfHeader = *header; m_rfHeader = *header;
m_rfBits = 1U;
m_rfErrs = 0U;
m_rfN = 0U; m_rfN = 0U;
m_rfFrames = 1U; m_rfFrames = 1U;
@@ -306,7 +305,6 @@ bool CDStarControl::writeModem(unsigned char *data)
header->setRPTCall2(m_gateway); header->setRPTCall2(m_gateway);
header->get(start + 1U); header->get(start + 1U);
for (unsigned int i = 0U; i < 3U; i++)
writeNetworkHeaderRF(start); writeNetworkHeaderRF(start);
} }
@@ -454,8 +452,6 @@ void CDStarControl::writeNetwork()
if (m_netState != RS_NET_AUDIO) if (m_netState != RS_NET_AUDIO)
return; return;
m_netTimeoutTimer.stop();
writeQueueEOTNet(); writeQueueEOTNet();
data[1U] = TAG_EOT; data[1U] = TAG_EOT;
@@ -531,7 +527,6 @@ void CDStarControl::clock(unsigned int ms)
m_netFrames += 1U; m_netFrames += 1U;
if (m_netBits == 0U) m_netBits = 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)); 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(); writeEndNet();
#if defined(DUMP_DSTAR) #if defined(DUMP_DSTAR)
closeFile(); closeFile();