mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 15:09:23 +08:00
Regularise the sending of headers and timeouts.
This commit is contained in:
11
DMRIPSC.cpp
11
DMRIPSC.cpp
@@ -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()
|
||||||
|
|||||||
15
DMRSlot.cpp
15
DMRSlot.cpp
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user