Regularise the sending of headers and timeouts.
This commit is contained in:
parent
14a30286c7
commit
b6adf6931d
11
DMRIPSC.cpp
11
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()
|
||||
|
|
25
DMRSlot.cpp
25
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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue