mirror of
https://github.com/g4klx/MMDVMHost.git
synced 2026-04-06 06:53:42 +00:00
Merge branch 'master' into mqtt
This commit is contained in:
commit
62c33086ca
102 changed files with 1621 additions and 1489 deletions
321
DStarControl.cpp
321
DStarControl.cpp
|
|
@ -54,8 +54,8 @@ m_duplex(duplex),
|
|||
m_queue(5000U, "D-Star Control"),
|
||||
m_rfHeader(),
|
||||
m_netHeader(),
|
||||
m_rfState(RS_RF_LISTENING),
|
||||
m_netState(RS_NET_IDLE),
|
||||
m_rfState(RPT_RF_STATE::LISTENING),
|
||||
m_netState(RPT_NET_STATE::IDLE),
|
||||
m_net(false),
|
||||
m_rfSlowData(),
|
||||
m_netSlowData(),
|
||||
|
|
@ -76,7 +76,8 @@ m_fec(),
|
|||
m_rfBits(1U),
|
||||
m_netBits(1U),
|
||||
m_rfErrs(0U),
|
||||
m_lastFrame(NULL),
|
||||
m_netErrs(0U),
|
||||
m_lastFrame(nullptr),
|
||||
m_lastFrameValid(false),
|
||||
m_rssiMapper(rssiMapper),
|
||||
m_rssi(0),
|
||||
|
|
@ -124,14 +125,14 @@ CDStarControl::~CDStarControl()
|
|||
|
||||
bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (!m_enabled)
|
||||
return false;
|
||||
|
||||
unsigned char type = data[0U];
|
||||
|
||||
if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) {
|
||||
if (type == TAG_LOST && ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA))) {
|
||||
unsigned char my1[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
unsigned char my2[DSTAR_SHORT_CALLSIGN_LENGTH];
|
||||
unsigned char your[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
|
|
@ -150,14 +151,14 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (type == TAG_LOST && m_rfState == RS_RF_INVALID) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::INVALID)) {
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
if (m_netState == RPT_NET_STATE::IDLE) {
|
||||
if (m_errorReply)
|
||||
m_errTimer.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
|
||||
|
|
@ -165,7 +166,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
if (type == TAG_LOST) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -309,7 +310,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
writeNetworkHeaderRF(data);
|
||||
}
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
if (m_netState == RS_NET_IDLE)
|
||||
writeJSONRSSI();
|
||||
|
|
@ -317,21 +318,21 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
LogMessage("D-Star, received RF header from %8.8s/%4.4s to %8.8s", my1, my2, your);
|
||||
writeJSONRF("start", my1, my2, your);
|
||||
} else if (type == TAG_EOT) {
|
||||
if (m_rfState == RS_RF_REJECTED) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
} else if (m_rfState == RS_RF_INVALID) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED) {
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
} else if (m_rfState == RPT_RF_STATE::INVALID) {
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
if (m_netState == RPT_NET_STATE::IDLE) {
|
||||
if (m_errorReply)
|
||||
m_errTimer.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
|
||||
return false;
|
||||
} else if (m_rfState == RS_RF_AUDIO) {
|
||||
} else if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) {
|
||||
if (m_net)
|
||||
writeNetworkDataRF(DSTAR_END_PATTERN_BYTES, 0U, true);
|
||||
|
||||
|
|
@ -358,37 +359,74 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
return false;
|
||||
} else if (type == TAG_DATA) {
|
||||
if (m_rfState == RS_RF_REJECTED)
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED)
|
||||
return true;
|
||||
|
||||
if (m_rfState == RS_RF_INVALID)
|
||||
if (m_rfState == RPT_RF_STATE::INVALID)
|
||||
return true;
|
||||
|
||||
if (m_rfState == RS_RF_LISTENING) {
|
||||
if (m_rfState == RPT_RF_STATE::LISTENING) {
|
||||
// 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) {
|
||||
m_rfSlowData.start();
|
||||
m_rfState = RS_RF_LATE_ENTRY;
|
||||
m_rfN = 0U;
|
||||
m_rfState = RPT_RF_STATE::LATE_ENTRY;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) {
|
||||
// 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) {
|
||||
m_rfSlowData.start();
|
||||
m_rfN = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
// Regenerate the sync and send the RSSI data to the display
|
||||
if (m_rfN == 0U) {
|
||||
CSync::addDStarSync(data + 1U);
|
||||
writeJSONRSSI();
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
m_rfSlowData.peakSlowData(data + 1U, m_rfN);
|
||||
unsigned char type = m_rfSlowData.getType();
|
||||
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) {
|
||||
LogMessage("D-Star, starting fast data mode");
|
||||
m_rfState = RPT_RF_STATE::DATA;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_rfState == RPT_RF_STATE::DATA) {
|
||||
LogDebug("D-Star, fast data sequence no. %u", m_rfN);
|
||||
|
||||
m_rfBits += 48U;
|
||||
m_rfFrames++;
|
||||
|
||||
if (m_net)
|
||||
writeNetworkDataRF(data, 0U, false);
|
||||
|
||||
if (m_duplex)
|
||||
writeQueueDataRF(data);
|
||||
|
||||
m_rfSlowData.peakSlowData(data + 1U, m_rfN);
|
||||
bool complete = m_rfSlowData.isComplete();
|
||||
|
||||
if (complete) {
|
||||
unsigned char type = m_rfSlowData.getType();
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) {
|
||||
LogMessage("D-Star, leaving fast data mode");
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
}
|
||||
}
|
||||
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
// Send the RSSI data to the display
|
||||
if (m_rfN == 0U)
|
||||
m_display->writeDStarRSSI(m_rssi);
|
||||
|
||||
unsigned int errors = 0U;
|
||||
if (!m_rfHeader.isDataPacket()) {
|
||||
if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) {
|
||||
LogDebug("D-Star, audio sequence no. %u, null audio", m_rfN);
|
||||
} else {
|
||||
errors = m_fec.regenerateDStar(data + 1U);
|
||||
m_bitErrsAccum += errors;
|
||||
m_rfErrs += errors;
|
||||
|
|
@ -399,10 +437,10 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
m_rfBits += 48U;
|
||||
m_rfFrames++;
|
||||
|
||||
const unsigned char* text = m_rfSlowData.addText(data + 1U);
|
||||
if (text != NULL) {
|
||||
LogMessage("D-Star, slow data text = \"%s\"", text);
|
||||
writeJSONText(text);
|
||||
if (m_rfN != 0U) {
|
||||
const unsigned char* text = m_rfSlowData.addText(data + 1U, m_rfN);
|
||||
if (text != nullptr)
|
||||
LogMessage("D-Star, RF slow data text = \"%s\"", text);
|
||||
}
|
||||
|
||||
if (m_net)
|
||||
|
|
@ -414,15 +452,20 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
} else if (m_rfState == RS_RF_LATE_ENTRY) {
|
||||
}
|
||||
|
||||
if (m_rfState == RPT_RF_STATE::LATE_ENTRY) {
|
||||
// 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) {
|
||||
m_rfSlowData.reset();
|
||||
m_rfN = 0U;
|
||||
return false;
|
||||
} else {
|
||||
CDStarHeader* header = m_rfSlowData.addHeader(data + 1U);
|
||||
if (header == NULL)
|
||||
CDStarHeader* header = m_rfSlowData.addHeader(data + 1U, m_rfN);
|
||||
if (header == nullptr) {
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_rfHeader = *header;
|
||||
delete header;
|
||||
|
|
@ -523,7 +566,9 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
unsigned int errors = 0U;
|
||||
if (!m_rfHeader.isDataPacket()) {
|
||||
if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) {
|
||||
LogDebug("D-Star, audio sequence no. %u, null audio", m_rfN);
|
||||
} else {
|
||||
errors = m_fec.regenerateDStar(data + 1U);
|
||||
LogDebug("D-Star, audio sequence no. %u, errs: %u/48 (%.1f%%)", m_rfN, errors, float(errors) / 0.48F);
|
||||
m_bitErrsAccum += errors;
|
||||
|
|
@ -541,7 +586,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
writeQueueDataRF(data);
|
||||
}
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
|
||||
|
|
@ -562,7 +607,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
unsigned int CDStarControl::readModem(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_queue.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -577,21 +622,21 @@ unsigned int CDStarControl::readModem(unsigned char* data)
|
|||
|
||||
void CDStarControl::writeEndRF()
|
||||
{
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
m_ackTimer.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
}
|
||||
|
||||
void CDStarControl::writeEndNet()
|
||||
{
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_lastFrameValid = false;
|
||||
|
||||
|
|
@ -599,13 +644,13 @@ void CDStarControl::writeEndNet()
|
|||
m_networkWatchdog.stop();
|
||||
m_packetTimer.stop();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
|
||||
void CDStarControl::writeNetwork()
|
||||
{
|
||||
assert(m_network != NULL);
|
||||
assert(m_network != nullptr);
|
||||
|
||||
unsigned char data[DSTAR_HEADER_LENGTH_BYTES + 2U];
|
||||
unsigned int length = m_network->read(data, DSTAR_HEADER_LENGTH_BYTES + 2U);
|
||||
|
|
@ -615,7 +660,7 @@ void CDStarControl::writeNetwork()
|
|||
if (!m_enabled)
|
||||
return;
|
||||
|
||||
if (m_rfState == RS_RF_AUDIO && m_netState == RS_NET_IDLE)
|
||||
if (((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) && (m_netState == RPT_NET_STATE::IDLE))
|
||||
return;
|
||||
|
||||
m_networkWatchdog.start();
|
||||
|
|
@ -623,7 +668,7 @@ void CDStarControl::writeNetwork()
|
|||
unsigned char type = data[0U];
|
||||
|
||||
if (type == TAG_HEADER) {
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
CDStarHeader header(data + 1U);
|
||||
|
|
@ -664,7 +709,7 @@ void CDStarControl::writeNetwork()
|
|||
|
||||
m_netState = RS_NET_AUDIO;
|
||||
|
||||
LINK_STATUS status = LS_NONE;
|
||||
LINK_STATUS status = LINK_STATUS::NONE;
|
||||
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
m_network->getStatus(status, reflector);
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||
|
|
@ -675,12 +720,9 @@ void CDStarControl::writeNetwork()
|
|||
writeJSONNet("start", my1, my2, your);
|
||||
}
|
||||
|
||||
// Something just above here introduces a large delay forcing erroneous(?) insertion of silence packets.
|
||||
// Starting the elapsed timer here instead of the commented out position above solves that.
|
||||
m_elapsed.start();
|
||||
|
||||
} else if (type == TAG_EOT) {
|
||||
if (m_netState != RS_NET_AUDIO)
|
||||
if ((m_netState != RPT_NET_STATE::AUDIO) && (m_netState != RPT_NET_STATE::DATA))
|
||||
return;
|
||||
|
||||
writeQueueEOTNet();
|
||||
|
|
@ -701,42 +743,89 @@ void CDStarControl::writeNetwork()
|
|||
|
||||
writeEndNet();
|
||||
} else if (type == TAG_DATA) {
|
||||
if (m_netState != RS_NET_AUDIO)
|
||||
return;
|
||||
if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) {
|
||||
unsigned char n = data[1U];
|
||||
|
||||
unsigned int errors = 0U;
|
||||
unsigned char n = data[1U];
|
||||
// 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) {
|
||||
m_netSlowData.start();
|
||||
} else {
|
||||
m_netSlowData.peakSlowData(data + 1U, n);
|
||||
|
||||
if (!m_netHeader.isDataPacket())
|
||||
errors = m_fec.regenerateDStar(data + 2U);
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
unsigned char type = m_netSlowData.getType();
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) {
|
||||
LogMessage("D-Star, starting fast data mode");
|
||||
m_netState = RPT_NET_STATE::DATA;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
blankDTMF(data + 2U);
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
unsigned char n = data[1U];
|
||||
|
||||
data[1U] = TAG_DATA;
|
||||
unsigned int errors = 0U;
|
||||
if (::memcmp(data + 2U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) != 0) {
|
||||
errors = m_fec.regenerateDStar(data + 2U);
|
||||
blankDTMF(data + 2U);
|
||||
}
|
||||
|
||||
// Insert silence and reject if in the past
|
||||
bool ret = insertSilence(data + 1U, n);
|
||||
if (!ret)
|
||||
return;
|
||||
data[1U] = TAG_DATA;
|
||||
|
||||
// Insert silence and reject if in the past
|
||||
bool ret = insertSilence(data + 1U, n);
|
||||
if (!ret)
|
||||
return;
|
||||
|
||||
m_netBits += 48U;
|
||||
|
||||
m_netN = n;
|
||||
m_netN = n;
|
||||
|
||||
// Regenerate the sync
|
||||
if (n == 0U) {
|
||||
CSync::addDStarSync(data + 2U);
|
||||
m_netSlowData.start();
|
||||
// Regenerate the sync
|
||||
if (m_netN == 0U) {
|
||||
CSync::addDStarSync(data + 2U);
|
||||
m_netSlowData.start();
|
||||
} else {
|
||||
const unsigned char* text = m_netSlowData.addText(data + 2U, m_netN);
|
||||
if (text != nullptr)
|
||||
LogMessage("D-Star, network slow data text = \"%s\"", text);
|
||||
}
|
||||
|
||||
m_packetTimer.start();
|
||||
m_netFrames++;
|
||||
|
||||
#if defined(DUMP_DSTAR)
|
||||
writeFile(data + 1U, length - 1U);
|
||||
#endif
|
||||
writeQueueDataNet(data + 1U);
|
||||
}
|
||||
|
||||
const unsigned char* text = m_netSlowData.addText(data + 2U);
|
||||
if (text != NULL) {
|
||||
LogMessage("D-Star, slow data text = \"%s\"", text);
|
||||
writeJSONText(text);
|
||||
}
|
||||
if (m_netState == RPT_NET_STATE::DATA) {
|
||||
m_netN = data[1U];
|
||||
|
||||
m_packetTimer.start();
|
||||
m_netFrames++;
|
||||
data[1U] = TAG_DATA;
|
||||
|
||||
m_netBits += 48U;
|
||||
|
||||
// Regenerate the sync
|
||||
if (m_netN == 0U) {
|
||||
CSync::addDStarSync(data + 2U);
|
||||
m_netSlowData.start();
|
||||
} else {
|
||||
m_netSlowData.peakSlowData(data + 2U, m_netN);
|
||||
bool complete = m_netSlowData.isComplete();
|
||||
if (complete) {
|
||||
unsigned char type = m_netSlowData.getType();
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) {
|
||||
LogMessage("D-Star, leaving fast data mode");
|
||||
m_netState = RPT_NET_STATE::AUDIO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_packetTimer.start();
|
||||
m_netFrames++;
|
||||
|
||||
writeQueueDataNet(data + 1U);
|
||||
} else {
|
||||
|
|
@ -749,7 +838,7 @@ void CDStarControl::clock()
|
|||
unsigned int ms = m_interval.elapsed();
|
||||
m_interval.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
writeNetwork();
|
||||
|
||||
m_ackTimer.clock(ms);
|
||||
|
|
@ -767,7 +856,7 @@ void CDStarControl::clock()
|
|||
m_rfTimeoutTimer.clock(ms);
|
||||
m_netTimeoutTimer.clock(ms);
|
||||
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
m_networkWatchdog.clock(ms);
|
||||
|
||||
if (m_networkWatchdog.hasExpired()) {
|
||||
|
|
@ -787,7 +876,7 @@ void CDStarControl::clock()
|
|||
}
|
||||
|
||||
// Only insert silence on audio data
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
m_packetTimer.clock(ms);
|
||||
|
||||
if (m_packetTimer.isRunning() && m_packetTimer.hasExpired()) {
|
||||
|
|
@ -809,9 +898,9 @@ void CDStarControl::clock()
|
|||
|
||||
void CDStarControl::writeQueueHeaderRF(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -832,9 +921,9 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data)
|
|||
|
||||
void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -855,7 +944,7 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
|||
|
||||
void CDStarControl::writeQueueEOTRF()
|
||||
{
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -877,7 +966,7 @@ void CDStarControl::writeQueueEOTRF()
|
|||
|
||||
void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
|
@ -897,7 +986,7 @@ void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
|||
|
||||
void CDStarControl::writeQueueDataNet(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
|
@ -936,35 +1025,35 @@ void CDStarControl::writeQueueEOTNet()
|
|||
|
||||
void CDStarControl::writeNetworkHeaderRF(const unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_network == NULL)
|
||||
if (m_network == nullptr)
|
||||
return;
|
||||
|
||||
// Don't send to the network if the timeout has expired
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
||||
m_network->writeHeader(data + 1U, DSTAR_HEADER_LENGTH_BYTES, m_netState != RS_NET_IDLE);
|
||||
m_network->writeHeader(data + 1U, DSTAR_HEADER_LENGTH_BYTES, m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
void CDStarControl::writeNetworkDataRF(const unsigned char* data, unsigned int errors, bool end)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_network == NULL)
|
||||
if (m_network == nullptr)
|
||||
return;
|
||||
|
||||
// Don't send to the network if the timeout has expired
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
||||
m_network->writeData(data + 1U, DSTAR_FRAME_LENGTH_BYTES, errors, end, m_netState != RS_NET_IDLE);
|
||||
m_network->writeData(data + 1U, DSTAR_FRAME_LENGTH_BYTES, errors, end, m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
bool CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
// Check to see if we have any spaces to fill?
|
||||
unsigned int oldSeqNo = (m_netN + 1U) % 21U;
|
||||
|
|
@ -999,19 +1088,19 @@ void CDStarControl::insertSilence(unsigned int count)
|
|||
for (unsigned int i = 0U; i < count; i++) {
|
||||
if (i < 3U && m_lastFrameValid) {
|
||||
if (n == 0U) {
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_NULL_SLOW_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_nullptr_SLOW_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
writeQueueDataNet(m_lastFrame);
|
||||
} else {
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_NULL_SLOW_DATA_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_nullptr_SLOW_DATA_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
writeQueueDataNet(m_lastFrame);
|
||||
}
|
||||
} else {
|
||||
m_lastFrameValid = false;
|
||||
|
||||
if (n == 0U)
|
||||
writeQueueDataNet(DSTAR_NULL_FRAME_SYNC_BYTES);
|
||||
writeQueueDataNet(DSTAR_nullptr_FRAME_SYNC_BYTES);
|
||||
else
|
||||
writeQueueDataNet(DSTAR_NULL_FRAME_DATA_BYTES);
|
||||
writeQueueDataNet(DSTAR_nullptr_FRAME_DATA_BYTES);
|
||||
}
|
||||
|
||||
m_netN = n;
|
||||
|
|
@ -1025,7 +1114,7 @@ void CDStarControl::insertSilence(unsigned int count)
|
|||
|
||||
void CDStarControl::blankDTMF(unsigned char* data) const
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
// DTMF begins with these byte values
|
||||
if ((data[0] & DSTAR_DTMF_MASK[0]) == DSTAR_DTMF_SIG[0] && (data[1] & DSTAR_DTMF_MASK[1]) == DSTAR_DTMF_SIG[1] &&
|
||||
|
|
@ -1033,7 +1122,7 @@ void CDStarControl::blankDTMF(unsigned char* data) const
|
|||
(data[4] & DSTAR_DTMF_MASK[4]) == DSTAR_DTMF_SIG[4] && (data[5] & DSTAR_DTMF_MASK[5]) == DSTAR_DTMF_SIG[5] &&
|
||||
(data[6] & DSTAR_DTMF_MASK[6]) == DSTAR_DTMF_SIG[6] && (data[7] & DSTAR_DTMF_MASK[7]) == DSTAR_DTMF_SIG[7] &&
|
||||
(data[8] & DSTAR_DTMF_MASK[8]) == DSTAR_DTMF_SIG[8])
|
||||
::memcpy(data, DSTAR_NULL_AMBE_DATA_BYTES, DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
::memcpy(data, DSTAR_nullptr_AMBE_DATA_BYTES, DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
|
||||
void CDStarControl::sendAck()
|
||||
|
|
@ -1059,16 +1148,16 @@ void CDStarControl::sendAck()
|
|||
|
||||
writeQueueHeaderRF(data);
|
||||
|
||||
writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES);
|
||||
writeQueueDataRF(DSTAR_nullptr_FRAME_SYNC_BYTES);
|
||||
|
||||
LINK_STATUS status = LS_NONE;
|
||||
LINK_STATUS status = LINK_STATUS::NONE;
|
||||
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->getStatus(status, reflector);
|
||||
|
||||
char text[40U];
|
||||
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||
if ((m_ackMessage == DSTAR_ACK::RSSI) && (m_rssi != 0U)) {
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
|
||||
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
|
||||
::sprintf(text, "%-8.8s %.1f%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal));
|
||||
} else {
|
||||
|
|
@ -1097,12 +1186,12 @@ void CDStarControl::sendAck()
|
|||
else
|
||||
::sprintf(signalText, "S%d", signal);
|
||||
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
else
|
||||
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
} else {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
else
|
||||
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
|
|
@ -1110,7 +1199,7 @@ void CDStarControl::sendAck()
|
|||
|
||||
m_rfSlowData.setText(text);
|
||||
|
||||
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
::memcpy(data, DSTAR_nullptr_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
|
||||
for (unsigned int i = 0U; i < 19U; i++) {
|
||||
m_rfSlowData.getSlowData(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
|
|
@ -1138,16 +1227,16 @@ void CDStarControl::sendError()
|
|||
|
||||
writeQueueHeaderRF(data);
|
||||
|
||||
writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES);
|
||||
writeQueueDataRF(DSTAR_nullptr_FRAME_SYNC_BYTES);
|
||||
|
||||
LINK_STATUS status = LS_NONE;
|
||||
LINK_STATUS status = LINK_STATUS::NONE;
|
||||
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->getStatus(status, reflector);
|
||||
|
||||
char text[40U];
|
||||
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||
if ((m_ackMessage == DSTAR_ACK::RSSI) && (m_rssi != 0U)) {
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
|
||||
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
|
||||
::sprintf(text, "%-8.8s %.1f%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal));
|
||||
} else {
|
||||
|
|
@ -1176,12 +1265,12 @@ void CDStarControl::sendError()
|
|||
else
|
||||
::sprintf(signalText, "S%d", signal);
|
||||
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
else
|
||||
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
} else {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
else
|
||||
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
|
|
@ -1189,7 +1278,7 @@ void CDStarControl::sendError()
|
|||
|
||||
m_rfSlowData.setText(text);
|
||||
|
||||
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
::memcpy(data, DSTAR_nullptr_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
|
||||
for (unsigned int i = 0U; i < 19U; i++) {
|
||||
m_rfSlowData.getSlowData(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
|
|
@ -1201,7 +1290,7 @@ void CDStarControl::sendError()
|
|||
|
||||
bool CDStarControl::isBusy() const
|
||||
{
|
||||
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
|
||||
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
void CDStarControl::enable(bool enabled)
|
||||
|
|
@ -1210,12 +1299,12 @@ void CDStarControl::enable(bool enabled)
|
|||
m_queue.clear();
|
||||
|
||||
// Reset the RF section
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
|
||||
// Reset the networking section
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_lastFrameValid = false;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue