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 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()

View file

@ -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);

View file

@ -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;

View file

@ -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();