mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 23:45:49 +08:00
Final changes for splitting the state machines.
This commit is contained in:
63
DMRSlot.cpp
63
DMRSlot.cpp
@@ -45,14 +45,15 @@ bool CDMRSlot::m_voice2 = true;
|
|||||||
|
|
||||||
CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) :
|
CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) :
|
||||||
m_slotNo(slotNo),
|
m_slotNo(slotNo),
|
||||||
m_queue(1000U, "DMR Slot"),
|
m_rfQueue(1000U, "DMR Slot"),
|
||||||
m_rfState(RS_RF_LISTENING),
|
m_rfState(RS_RF_LISTENING),
|
||||||
m_netState(RS_NET_IDLE),
|
m_netState(RS_NET_IDLE),
|
||||||
m_embeddedLC(),
|
m_rfEmbeddedLC(),
|
||||||
m_rfLC(NULL),
|
m_rfLC(NULL),
|
||||||
m_netLC(NULL),
|
m_netLC(NULL),
|
||||||
m_seqNo(0U),
|
m_netSeqNo(0U),
|
||||||
m_n(0U),
|
m_rfN(0U),
|
||||||
|
m_netN(0U),
|
||||||
m_networkWatchdog(1000U, 0U, 1500U),
|
m_networkWatchdog(1000U, 0U, 1500U),
|
||||||
m_rfTimeoutTimer(1000U, timeout),
|
m_rfTimeoutTimer(1000U, timeout),
|
||||||
m_netTimeoutTimer(1000U, timeout),
|
m_netTimeoutTimer(1000U, timeout),
|
||||||
@@ -425,7 +426,7 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||||||
if (colorCode != m_colorCode)
|
if (colorCode != m_colorCode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_rfLC = m_embeddedLC.addData(data + 2U, emb.getLCSS());
|
m_rfLC = m_rfEmbeddedLC.addData(data + 2U, emb.getLCSS());
|
||||||
if (m_rfLC != NULL) {
|
if (m_rfLC != NULL) {
|
||||||
// Create a dummy start frame to replace the received frame
|
// Create a dummy start frame to replace the received frame
|
||||||
unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U];
|
unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U];
|
||||||
@@ -494,13 +495,13 @@ void CDMRSlot::writeModem(unsigned char *data)
|
|||||||
|
|
||||||
unsigned int CDMRSlot::readModem(unsigned char* data)
|
unsigned int CDMRSlot::readModem(unsigned char* data)
|
||||||
{
|
{
|
||||||
if (m_queue.isEmpty())
|
if (m_rfQueue.isEmpty())
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
unsigned char len = 0U;
|
unsigned char len = 0U;
|
||||||
m_queue.getData(&len, 1U);
|
m_rfQueue.getData(&len, 1U);
|
||||||
|
|
||||||
m_queue.getData(data, len);
|
m_rfQueue.getData(data, len);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
@@ -812,8 +813,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
// Initialise the lost packet data
|
// Initialise the lost packet data
|
||||||
if (m_netFrames == 0U) {
|
if (m_netFrames == 0U) {
|
||||||
::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U);
|
::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U);
|
||||||
m_seqNo = dmrData.getSeqNo();
|
m_netSeqNo = dmrData.getSeqNo();
|
||||||
m_n = dmrData.getN();
|
m_netN = dmrData.getN();
|
||||||
m_elapsed.start();
|
m_elapsed.start();
|
||||||
m_netLost = 0U;
|
m_netLost = 0U;
|
||||||
} else {
|
} else {
|
||||||
@@ -829,8 +830,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
m_netFrames++;
|
m_netFrames++;
|
||||||
|
|
||||||
// Save details in case we need to infill data
|
// Save details in case we need to infill data
|
||||||
m_seqNo = dmrData.getSeqNo();
|
m_netSeqNo = dmrData.getSeqNo();
|
||||||
m_n = dmrData.getN();
|
m_netN = dmrData.getN();
|
||||||
|
|
||||||
#if defined(DUMP_DMR)
|
#if defined(DUMP_DMR)
|
||||||
writeFile(data);
|
writeFile(data);
|
||||||
@@ -860,8 +861,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
// Initialise the lost packet data
|
// Initialise the lost packet data
|
||||||
if (m_netFrames == 0U) {
|
if (m_netFrames == 0U) {
|
||||||
::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U);
|
::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U);
|
||||||
m_seqNo = dmrData.getSeqNo();
|
m_netSeqNo = dmrData.getSeqNo();
|
||||||
m_n = dmrData.getN();
|
m_netN = dmrData.getN();
|
||||||
m_elapsed.start();
|
m_elapsed.start();
|
||||||
m_netLost = 0U;
|
m_netLost = 0U;
|
||||||
} else {
|
} else {
|
||||||
@@ -874,8 +875,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
m_netFrames++;
|
m_netFrames++;
|
||||||
|
|
||||||
// Save details in case we need to infill data
|
// Save details in case we need to infill data
|
||||||
m_seqNo = dmrData.getSeqNo();
|
m_netSeqNo = dmrData.getSeqNo();
|
||||||
m_n = dmrData.getN();
|
m_netN = dmrData.getN();
|
||||||
|
|
||||||
#if defined(DUMP_DMR)
|
#if defined(DUMP_DMR)
|
||||||
writeFile(data);
|
writeFile(data);
|
||||||
@@ -1022,13 +1023,13 @@ void CDMRSlot::writeQueueRF(const unsigned char *data)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
|
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
// If the timeout has expired, replace the audio with idles to keep the slot busy
|
// If the timeout has expired, replace the audio with idles to keep the slot busy
|
||||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||||
m_queue.addData(m_idle, len);
|
m_rfQueue.addData(m_idle, len);
|
||||||
else
|
else
|
||||||
m_queue.addData(data, len);
|
m_rfQueue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId)
|
void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId)
|
||||||
@@ -1051,10 +1052,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_n);
|
dmrData.setN(m_netN);
|
||||||
dmrData.setSeqNo(m_seqNo);
|
dmrData.setSeqNo(m_netSeqNo);
|
||||||
|
|
||||||
m_seqNo++;
|
m_netSeqNo++;
|
||||||
|
|
||||||
dmrData.setData(data + 2U);
|
dmrData.setData(data + 2U);
|
||||||
|
|
||||||
@@ -1072,13 +1073,13 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType)
|
|||||||
void CDMRSlot::writeQueueNet(const unsigned char *data)
|
void CDMRSlot::writeQueueNet(const unsigned char *data)
|
||||||
{
|
{
|
||||||
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
|
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
// If the timeout has expired, replace the audio with idles to keep the slot busy
|
// If the timeout has expired, replace the audio with idles to keep the slot busy
|
||||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||||
m_queue.addData(m_idle, len);
|
m_rfQueue.addData(m_idle, len);
|
||||||
else
|
else
|
||||||
m_queue.addData(data, len);
|
m_rfQueue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMRSlot::init(unsigned int colorCode, CModem* modem, CDMRIPSC* network, IDisplay* display, bool duplex)
|
void CDMRSlot::init(unsigned int colorCode, CModem* modem, CDMRIPSC* network, IDisplay* display, bool duplex)
|
||||||
@@ -1228,14 +1229,14 @@ void CDMRSlot::insertSilence(const unsigned char* data, unsigned char seqNo)
|
|||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
||||||
// Check to see if we have any spaces to fill?
|
// Check to see if we have any spaces to fill?
|
||||||
unsigned char seq = m_seqNo + 1U;
|
unsigned char seq = m_netSeqNo + 1U;
|
||||||
if (seq == seqNo) {
|
if (seq == seqNo) {
|
||||||
// Just copy the data, nothing else to do here
|
// Just copy the data, nothing else to do here
|
||||||
::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U);
|
::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int oldSeqNo = m_seqNo + 1U;
|
unsigned int oldSeqNo = m_netSeqNo + 1U;
|
||||||
unsigned int newSeqNo = seqNo;
|
unsigned int newSeqNo = seqNo;
|
||||||
|
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
@@ -1260,8 +1261,8 @@ void CDMRSlot::insertSilence(unsigned int count)
|
|||||||
::memcpy(data + 9U + 2U, data + 2U, 5U); // Copy the last audio block to the middle (1/2)
|
::memcpy(data + 9U + 2U, data + 2U, 5U); // Copy the last audio block to the middle (1/2)
|
||||||
::memcpy(data + 19U + 2U, data + 4U + 2U, 5U); // Copy the last audio block to the middle (2/2)
|
::memcpy(data + 19U + 2U, data + 4U + 2U, 5U); // Copy the last audio block to the middle (2/2)
|
||||||
|
|
||||||
unsigned char n = (m_n + 1U) % 6U;
|
unsigned char n = (m_netN + 1U) % 6U;
|
||||||
unsigned char seqNo = m_seqNo + 1U;
|
unsigned char seqNo = m_netSeqNo + 1U;
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < count; i++) {
|
for (unsigned int i = 0U; i < count; i++) {
|
||||||
if (i > 0U)
|
if (i > 0U)
|
||||||
@@ -1280,8 +1281,8 @@ void CDMRSlot::insertSilence(unsigned int count)
|
|||||||
|
|
||||||
writeQueueNet(data);
|
writeQueueNet(data);
|
||||||
|
|
||||||
m_seqNo = seqNo;
|
m_netSeqNo = seqNo;
|
||||||
m_n = n;
|
m_netN = n;
|
||||||
|
|
||||||
m_netFrames++;
|
m_netFrames++;
|
||||||
m_netLost++;
|
m_netLost++;
|
||||||
|
|||||||
@@ -50,14 +50,15 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned int m_slotNo;
|
unsigned int m_slotNo;
|
||||||
CRingBuffer<unsigned char> m_queue;
|
CRingBuffer<unsigned char> m_rfQueue;
|
||||||
RPT_RF_STATE m_rfState;
|
RPT_RF_STATE m_rfState;
|
||||||
RPT_NET_STATE m_netState;
|
RPT_NET_STATE m_netState;
|
||||||
CDMREmbeddedLC m_embeddedLC;
|
CDMREmbeddedLC m_rfEmbeddedLC;
|
||||||
CDMRLC* m_rfLC;
|
CDMRLC* m_rfLC;
|
||||||
CDMRLC* m_netLC;
|
CDMRLC* m_netLC;
|
||||||
unsigned char m_seqNo;
|
unsigned char m_netSeqNo;
|
||||||
unsigned char m_n;
|
unsigned char m_netN;
|
||||||
|
unsigned char m_rfN;
|
||||||
CTimer m_networkWatchdog;
|
CTimer m_networkWatchdog;
|
||||||
CTimer m_rfTimeoutTimer;
|
CTimer m_rfTimeoutTimer;
|
||||||
CTimer m_netTimeoutTimer;
|
CTimer m_netTimeoutTimer;
|
||||||
|
|||||||
@@ -29,14 +29,15 @@ m_gateway(NULL),
|
|||||||
m_network(network),
|
m_network(network),
|
||||||
m_display(display),
|
m_display(display),
|
||||||
m_duplex(duplex),
|
m_duplex(duplex),
|
||||||
m_queue(1000U, "D-Star Control"),
|
m_rfQueue(1000U, "D-Star Control"),
|
||||||
m_rfHeader(),
|
m_rfHeader(),
|
||||||
m_netHeader(),
|
m_netHeader(),
|
||||||
m_rfState(RS_RF_LISTENING),
|
m_rfState(RS_RF_LISTENING),
|
||||||
m_netState(RS_NET_IDLE),
|
m_netState(RS_NET_IDLE),
|
||||||
m_net(false),
|
m_net(false),
|
||||||
m_slowData(),
|
m_slowData(),
|
||||||
m_n(0U),
|
m_rfN(0U),
|
||||||
|
m_netN(0U),
|
||||||
m_networkWatchdog(1000U, 0U, 1500U),
|
m_networkWatchdog(1000U, 0U, 1500U),
|
||||||
m_holdoffTimer(1000U, 0U, 500U),
|
m_holdoffTimer(1000U, 0U, 500U),
|
||||||
m_rfTimeoutTimer(1000U, timeout),
|
m_rfTimeoutTimer(1000U, timeout),
|
||||||
@@ -147,6 +148,7 @@ bool CDStarControl::writeModem(unsigned char *data)
|
|||||||
m_ackTimer.stop();
|
m_ackTimer.stop();
|
||||||
|
|
||||||
m_rfFrames = 1U;
|
m_rfFrames = 1U;
|
||||||
|
m_rfN = 0U;
|
||||||
|
|
||||||
if (m_duplex) {
|
if (m_duplex) {
|
||||||
// Modify the header
|
// Modify the header
|
||||||
@@ -201,7 +203,6 @@ bool CDStarControl::writeModem(unsigned char *data)
|
|||||||
return false;
|
return false;
|
||||||
} else if (m_rfState == RS_RF_AUDIO) {
|
} else if (m_rfState == RS_RF_AUDIO) {
|
||||||
unsigned int errors = m_fec.regenerateDStar(data + 1U);
|
unsigned int errors = m_fec.regenerateDStar(data + 1U);
|
||||||
LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_n, errors);
|
|
||||||
|
|
||||||
m_rfErrs += errors;
|
m_rfErrs += errors;
|
||||||
m_rfBits += 48U;
|
m_rfBits += 48U;
|
||||||
@@ -210,13 +211,15 @@ bool CDStarControl::writeModem(unsigned char *data)
|
|||||||
|
|
||||||
// The sync is regenerated by the modem so can do exact match
|
// The sync is regenerated by the modem so can do exact match
|
||||||
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0)
|
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0)
|
||||||
m_n = 0U;
|
m_rfN = 0U;
|
||||||
|
|
||||||
// Regenerate the sync
|
// Regenerate the sync
|
||||||
if (m_n == 0U)
|
if (m_rfN == 0U)
|
||||||
CSync::addDStarSync(data + 1U);
|
CSync::addDStarSync(data + 1U);
|
||||||
|
|
||||||
m_n = (m_n + 1U) % 21U;
|
m_rfN = (m_rfN + 1U) % 21U;
|
||||||
|
|
||||||
|
LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_rfN, errors);
|
||||||
|
|
||||||
if (m_net)
|
if (m_net)
|
||||||
writeNetworkDataRF(data, errors, false);
|
writeNetworkDataRF(data, errors, false);
|
||||||
@@ -277,6 +280,7 @@ bool CDStarControl::writeModem(unsigned char *data)
|
|||||||
|
|
||||||
m_rfHeader = *header;
|
m_rfHeader = *header;
|
||||||
|
|
||||||
|
m_rfN = 0U;
|
||||||
m_rfFrames = 1U;
|
m_rfFrames = 1U;
|
||||||
|
|
||||||
if (m_duplex) {
|
if (m_duplex) {
|
||||||
@@ -309,11 +313,14 @@ bool CDStarControl::writeModem(unsigned char *data)
|
|||||||
delete header;
|
delete header;
|
||||||
|
|
||||||
unsigned int errors = m_fec.regenerateDStar(data + 1U);
|
unsigned int errors = m_fec.regenerateDStar(data + 1U);
|
||||||
LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_n, errors);
|
|
||||||
|
|
||||||
m_rfErrs += errors;
|
m_rfErrs += errors;
|
||||||
m_rfBits += 48U;
|
m_rfBits += 48U;
|
||||||
|
|
||||||
|
m_rfN = (m_rfN + 1U) % 21U;
|
||||||
|
|
||||||
|
LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_rfN, errors);
|
||||||
|
|
||||||
if (m_net)
|
if (m_net)
|
||||||
writeNetworkDataRF(data, errors, false);
|
writeNetworkDataRF(data, errors, false);
|
||||||
|
|
||||||
@@ -338,7 +345,7 @@ bool CDStarControl::writeModem(unsigned char *data)
|
|||||||
|
|
||||||
unsigned int CDStarControl::readModem(unsigned char* data)
|
unsigned int CDStarControl::readModem(unsigned char* data)
|
||||||
{
|
{
|
||||||
if (m_queue.isEmpty())
|
if (m_rfQueue.isEmpty())
|
||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
// Don't relay data until the timer has stopped.
|
// Don't relay data until the timer has stopped.
|
||||||
@@ -346,9 +353,9 @@ unsigned int CDStarControl::readModem(unsigned char* data)
|
|||||||
return 0U;
|
return 0U;
|
||||||
|
|
||||||
unsigned char len = 0U;
|
unsigned char len = 0U;
|
||||||
m_queue.getData(&len, 1U);
|
m_rfQueue.getData(&len, 1U);
|
||||||
|
|
||||||
m_queue.getData(data, len);
|
m_rfQueue.getData(data, len);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
@@ -427,7 +434,7 @@ void CDStarControl::writeNetwork()
|
|||||||
m_netFrames = 0U;
|
m_netFrames = 0U;
|
||||||
m_netLost = 0U;
|
m_netLost = 0U;
|
||||||
|
|
||||||
m_n = 0U;
|
m_netN = 0U;
|
||||||
|
|
||||||
m_netBits = 1U;
|
m_netBits = 1U;
|
||||||
m_netErrs = 0U;
|
m_netErrs = 0U;
|
||||||
@@ -482,7 +489,7 @@ void CDStarControl::writeNetwork()
|
|||||||
if (n == 0U)
|
if (n == 0U)
|
||||||
CSync::addDStarSync(data + 2U);
|
CSync::addDStarSync(data + 2U);
|
||||||
|
|
||||||
m_n = n;
|
m_netN = n;
|
||||||
|
|
||||||
m_packetTimer.start();
|
m_packetTimer.start();
|
||||||
m_netFrames++;
|
m_netFrames++;
|
||||||
@@ -563,9 +570,9 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U;
|
unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
m_queue.addData(data, len);
|
m_rfQueue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
||||||
@@ -579,9 +586,9 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U;
|
unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
m_queue.addData(data, len);
|
m_rfQueue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarControl::writeQueueEOTRF()
|
void CDStarControl::writeQueueEOTRF()
|
||||||
@@ -593,10 +600,10 @@ void CDStarControl::writeQueueEOTRF()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = 1U;
|
unsigned char len = 1U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
unsigned char data = TAG_EOT;
|
unsigned char data = TAG_EOT;
|
||||||
m_queue.addData(&data, len);
|
m_rfQueue.addData(&data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
||||||
@@ -607,9 +614,9 @@ void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U;
|
unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
m_queue.addData(data, len);
|
m_rfQueue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarControl::writeQueueDataNet(const unsigned char *data)
|
void CDStarControl::writeQueueDataNet(const unsigned char *data)
|
||||||
@@ -620,9 +627,9 @@ void CDStarControl::writeQueueDataNet(const unsigned char *data)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U;
|
unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
m_queue.addData(data, len);
|
m_rfQueue.addData(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarControl::writeQueueEOTNet()
|
void CDStarControl::writeQueueEOTNet()
|
||||||
@@ -631,10 +638,10 @@ void CDStarControl::writeQueueEOTNet()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned char len = 1U;
|
unsigned char len = 1U;
|
||||||
m_queue.addData(&len, 1U);
|
m_rfQueue.addData(&len, 1U);
|
||||||
|
|
||||||
unsigned char data = TAG_EOT;
|
unsigned char data = TAG_EOT;
|
||||||
m_queue.addData(&data, len);
|
m_rfQueue.addData(&data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDStarControl::writeNetworkHeaderRF(const unsigned char* data)
|
void CDStarControl::writeNetworkHeaderRF(const unsigned char* data)
|
||||||
@@ -710,14 +717,14 @@ void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo
|
|||||||
assert(data != NULL);
|
assert(data != NULL);
|
||||||
|
|
||||||
// Check to see if we have any spaces to fill?
|
// Check to see if we have any spaces to fill?
|
||||||
unsigned char seq = (m_n + 1U) % 21U;
|
unsigned char seq = (m_netN + 1U) % 21U;
|
||||||
if (seq == seqNo) {
|
if (seq == seqNo) {
|
||||||
// Just copy the data, nothing else to do here
|
// Just copy the data, nothing else to do here
|
||||||
::memcpy(m_lastFrame, data, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
::memcpy(m_lastFrame, data, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int oldSeqNo = (m_n + 1U) % 21U;
|
unsigned int oldSeqNo = (m_netN + 1U) % 21U;
|
||||||
unsigned int newSeqNo = seqNo;
|
unsigned int newSeqNo = seqNo;
|
||||||
|
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
@@ -734,7 +741,7 @@ void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo
|
|||||||
|
|
||||||
void CDStarControl::insertSilence(unsigned int count)
|
void CDStarControl::insertSilence(unsigned int count)
|
||||||
{
|
{
|
||||||
unsigned char n = (m_n + 1U) % 21U;
|
unsigned char n = (m_netN + 1U) % 21U;
|
||||||
|
|
||||||
for (unsigned int i = 0U; i < count; i++) {
|
for (unsigned int i = 0U; i < count; i++) {
|
||||||
if (i < 3U) {
|
if (i < 3U) {
|
||||||
@@ -746,7 +753,7 @@ void CDStarControl::insertSilence(unsigned int count)
|
|||||||
writeQueueDataNet(DSTAR_NULL_FRAME_DATA_BYTES);
|
writeQueueDataNet(DSTAR_NULL_FRAME_DATA_BYTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_n = n;
|
m_netN = n;
|
||||||
|
|
||||||
m_netFrames++;
|
m_netFrames++;
|
||||||
m_netLost++;
|
m_netLost++;
|
||||||
|
|||||||
@@ -50,14 +50,15 @@ private:
|
|||||||
CDStarNetwork* m_network;
|
CDStarNetwork* m_network;
|
||||||
IDisplay* m_display;
|
IDisplay* m_display;
|
||||||
bool m_duplex;
|
bool m_duplex;
|
||||||
CRingBuffer<unsigned char> m_queue;
|
CRingBuffer<unsigned char> m_rfQueue;
|
||||||
CDStarHeader m_rfHeader;
|
CDStarHeader m_rfHeader;
|
||||||
CDStarHeader m_netHeader;
|
CDStarHeader m_netHeader;
|
||||||
RPT_RF_STATE m_rfState;
|
RPT_RF_STATE m_rfState;
|
||||||
RPT_NET_STATE m_netState;
|
RPT_NET_STATE m_netState;
|
||||||
bool m_net;
|
bool m_net;
|
||||||
CDStarSlowData m_slowData;
|
CDStarSlowData m_slowData;
|
||||||
unsigned char m_n;
|
unsigned char m_rfN;
|
||||||
|
unsigned char m_netN;
|
||||||
CTimer m_networkWatchdog;
|
CTimer m_networkWatchdog;
|
||||||
CTimer m_holdoffTimer;
|
CTimer m_holdoffTimer;
|
||||||
CTimer m_rfTimeoutTimer;
|
CTimer m_rfTimeoutTimer;
|
||||||
|
|||||||
Reference in New Issue
Block a user