Merge remote-tracking branch 'g4klx/nxdn' into nxdn
This commit is contained in:
commit
80c50e627e
6 changed files with 46 additions and 106 deletions
132
NXDNControl.cpp
132
NXDNControl.cpp
|
@ -91,9 +91,9 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) {
|
||||
if (m_rssi != 0U)
|
||||
LogMessage("NXDN, transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
LogMessage("NXDN, transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
else
|
||||
LogMessage("NXDN, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
LogMessage("NXDN, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
writeEndRF();
|
||||
return false;
|
||||
}
|
||||
|
@ -241,9 +241,9 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
|||
if (data[0U] == TAG_EOT) {
|
||||
m_rfFrames++;
|
||||
if (m_rssi != 0U)
|
||||
LogMessage("NXDN, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
LogMessage("NXDN, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
else
|
||||
LogMessage("NXDN, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
LogMessage("NXDN, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
writeEndRF();
|
||||
} else {
|
||||
m_rfFrames = 0U;
|
||||
|
@ -432,28 +432,17 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
|||
}
|
||||
|
||||
// Regenerate the audio and interpret the FACCH1 data
|
||||
unsigned char voiceMode = m_rfLayer3.getVoiceMode();
|
||||
|
||||
if (option == NXDN_LICH_STEAL_NONE) {
|
||||
CAMBEFEC ambe;
|
||||
unsigned int errors = 0U;
|
||||
if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) {
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 288U;
|
||||
m_display->writeNXDNBER(float(errors) / 2.88F);
|
||||
LogDebug("NXDN, EFR, AMBE FEC %u/288 (%.1f%%)", errors, float(errors) / 2.88F);
|
||||
} else {
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 188U;
|
||||
m_display->writeNXDNBER(float(errors) / 1.88F);
|
||||
LogDebug("NXDN, EHR, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F);
|
||||
}
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 188U;
|
||||
m_display->writeNXDNBER(float(errors) / 1.88F);
|
||||
LogDebug("NXDN, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F);
|
||||
} else if (option == NXDN_LICH_STEAL_FACCH1_1) {
|
||||
CNXDNFACCH1 facch1;
|
||||
bool valid = facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
|
||||
|
@ -462,37 +451,21 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
|||
|
||||
CAMBEFEC ambe;
|
||||
unsigned int errors = 0U;
|
||||
if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) {
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 144U;
|
||||
m_display->writeNXDNBER(float(errors) / 1.44F);
|
||||
LogDebug("NXDN, EFR, AMBE FEC %u/144 (%.1f%%)", errors, float(errors) / 1.44F);
|
||||
} else {
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 94U;
|
||||
m_display->writeNXDNBER(float(errors) / 0.94F);
|
||||
LogDebug("NXDN, EHR, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
|
||||
}
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 94U;
|
||||
m_display->writeNXDNBER(float(errors) / 0.94F);
|
||||
LogDebug("NXDN, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
|
||||
} else if (option == NXDN_LICH_STEAL_FACCH1_2) {
|
||||
CAMBEFEC ambe;
|
||||
unsigned int errors = 0U;
|
||||
if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) {
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 144U;
|
||||
m_display->writeNXDNBER(float(errors) / 1.44F);
|
||||
LogDebug("NXDN, EFR, AMBE FEC %u/144 (%.1f%%)", errors, float(errors) / 1.44F);
|
||||
} else {
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 94U;
|
||||
m_display->writeNXDNBER(float(errors) / 0.94F);
|
||||
LogDebug("NXDN, EHR, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
|
||||
}
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
m_rfErrs += errors;
|
||||
m_rfBits += 94U;
|
||||
m_display->writeNXDNBER(float(errors) / 0.94F);
|
||||
LogDebug("NXDN, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
|
||||
|
||||
CNXDNFACCH1 facch1;
|
||||
bool valid = facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
|
||||
|
@ -686,10 +659,9 @@ void CNXDNControl::writeNetwork()
|
|||
unsigned char count = 0U;
|
||||
bool grp = false;
|
||||
bool dat = false;
|
||||
bool efr = false;
|
||||
bool end = false;
|
||||
unsigned char data[200U];
|
||||
unsigned int length = m_network->read(data + 2U, srcId, grp, dstId, dat, efr, count, end);
|
||||
unsigned int length = m_network->read(data + 2U, srcId, grp, dstId, dat, count, end);
|
||||
if (length == 0U)
|
||||
return;
|
||||
|
||||
|
@ -794,19 +766,12 @@ void CNXDNControl::writeNetwork()
|
|||
if (option == NXDN_LICH_STEAL_NONE) {
|
||||
CAMBEFEC ambe;
|
||||
unsigned int errors = 0U;
|
||||
if (efr) {
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 288U;
|
||||
} else {
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 188U;
|
||||
}
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 188U;
|
||||
} else if (option == NXDN_LICH_STEAL_FACCH1_1) {
|
||||
CNXDNFACCH1 facch1;
|
||||
bool valid = facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
|
||||
|
@ -815,29 +780,17 @@ void CNXDNControl::writeNetwork()
|
|||
|
||||
CAMBEFEC ambe;
|
||||
unsigned int errors = 0U;
|
||||
if (efr) {
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 144U;
|
||||
} else {
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 94U;
|
||||
}
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 94U;
|
||||
} else if (option == NXDN_LICH_STEAL_FACCH1_2) {
|
||||
CAMBEFEC ambe;
|
||||
unsigned int errors = 0U;
|
||||
if (efr) {
|
||||
errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 144U;
|
||||
} else {
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 94U;
|
||||
}
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
|
||||
errors += ambe.regenerateYSFDN(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
|
||||
m_netErrs += errors;
|
||||
m_netBits += 94U;
|
||||
|
||||
CNXDNFACCH1 facch1;
|
||||
bool valid = facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
|
||||
|
@ -860,7 +813,7 @@ void CNXDNControl::writeNetwork()
|
|||
writeQueueNet(data);
|
||||
|
||||
if (end) {
|
||||
LogMessage("NXDN, received network end of transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 25.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
|
||||
LogMessage("NXDN, received network end of transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 12.5F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
|
||||
writeEndNet();
|
||||
}
|
||||
}
|
||||
|
@ -878,7 +831,7 @@ void CNXDNControl::clock(unsigned int ms)
|
|||
m_networkWatchdog.clock(ms);
|
||||
|
||||
if (m_networkWatchdog.hasExpired()) {
|
||||
LogMessage("NXDN, network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 10.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
|
||||
LogMessage("NXDN, network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 12.5F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
|
||||
writeEndNet();
|
||||
}
|
||||
}
|
||||
|
@ -940,11 +893,10 @@ void CNXDNControl::writeNetwork(const unsigned char *data, bool dat)
|
|||
unsigned short srcId = m_rfLayer3.getSourceUnitId();
|
||||
unsigned short dstId = m_rfLayer3.getDestinationGroupId();
|
||||
bool grp = m_rfLayer3.getIsGroup();
|
||||
bool efr = m_rfLayer3.getVoiceMode() == NXDN_VOICE_CALL_OPTION_9600_EFR;
|
||||
|
||||
bool end = data[0U] == TAG_EOT;
|
||||
|
||||
m_network->write(data + 2U, srcId, grp, dstId, dat, efr, m_rfFrames, end);
|
||||
m_network->write(data + 2U, srcId, grp, dstId, dat, m_rfFrames, end);
|
||||
}
|
||||
|
||||
void CNXDNControl::scrambler(unsigned char* data) const
|
||||
|
|
|
@ -91,10 +91,6 @@ const unsigned char NXDN_MESSAGE_TYPE_PROP_FORM = 0x3FU;
|
|||
const unsigned char NXDN_VOICE_CALL_OPTION_HALF_DUPLEX = 0x00U;
|
||||
const unsigned char NXDN_VOICE_CALL_OPTION_DUPLEX = 0x10U;
|
||||
|
||||
const unsigned char NXDN_VOICE_CALL_OPTION_4800_EHR = 0x00U;
|
||||
const unsigned char NXDN_VOICE_CALL_OPTION_9600_EHR = 0x02U;
|
||||
const unsigned char NXDN_VOICE_CALL_OPTION_9600_EFR = 0x03U;
|
||||
|
||||
const unsigned char NXDN_DATA_CALL_OPTION_HALF_DUPLEX = 0x00U;
|
||||
const unsigned char NXDN_DATA_CALL_OPTION_DUPLEX = 0x10U;
|
||||
|
||||
|
|
|
@ -87,11 +87,6 @@ bool CNXDNLayer3::getIsGroup() const
|
|||
return (m_data[2U] & 0x80U) != 0x80U;
|
||||
}
|
||||
|
||||
unsigned char CNXDNLayer3::getVoiceMode() const
|
||||
{
|
||||
return m_data[2U] & 0x07U;
|
||||
}
|
||||
|
||||
unsigned char CNXDNLayer3::getDataBlocks() const
|
||||
{
|
||||
return m_data[8U] & 0x0FU;
|
||||
|
|
|
@ -33,7 +33,6 @@ public:
|
|||
unsigned short getSourceUnitId() const;
|
||||
unsigned short getDestinationGroupId() const;
|
||||
bool getIsGroup() const;
|
||||
unsigned char getVoiceMode() const;
|
||||
unsigned char getDataBlocks() const;
|
||||
|
||||
void getData(unsigned char* data) const;
|
||||
|
|
|
@ -59,7 +59,7 @@ bool CNXDNNetwork::open()
|
|||
return m_socket.open();
|
||||
}
|
||||
|
||||
bool CNXDNNetwork::write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, bool dat, bool efr, unsigned char cnt, bool end)
|
||||
bool CNXDNNetwork::write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, bool dat, unsigned char cnt, bool end)
|
||||
{
|
||||
assert(data != NULL);
|
||||
|
||||
|
@ -77,7 +77,6 @@ bool CNXDNNetwork::write(const unsigned char* data, unsigned short src, bool grp
|
|||
buffer[7U] = grp ? 0x01U : 0x00U;
|
||||
buffer[7U] |= dat ? 0x02U : 0x00U;
|
||||
buffer[7U] |= end ? 0x04U : 0x00U;
|
||||
buffer[7U] |= efr ? 0x08U : 0x00U;
|
||||
|
||||
buffer[8U] = (dst >> 8) & 0xFFU;
|
||||
buffer[9U] = (dst >> 8) & 0xFFU;
|
||||
|
@ -150,7 +149,7 @@ void CNXDNNetwork::clock(unsigned int ms)
|
|||
m_buffer.addData(buffer, 59U);
|
||||
}
|
||||
|
||||
unsigned int CNXDNNetwork::read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, bool& dat, bool& efr, unsigned char& cnt, bool& end)
|
||||
unsigned int CNXDNNetwork::read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, bool& dat, unsigned char& cnt, bool& end)
|
||||
{
|
||||
assert(data != NULL);
|
||||
|
||||
|
@ -164,7 +163,6 @@ unsigned int CNXDNNetwork::read(unsigned char* data, unsigned short& src, bool&
|
|||
grp = (buffer[7U] & 0x01U) == 0x01U;
|
||||
dat = (buffer[7U] & 0x02U) == 0x02U;
|
||||
end = (buffer[7U] & 0x04U) == 0x04U;
|
||||
efr = (buffer[7U] & 0x08U) == 0x08U;
|
||||
dst = (buffer[8U] << 8) + buffer[9U];
|
||||
|
||||
cnt = buffer[10U];
|
||||
|
|
|
@ -36,9 +36,9 @@ public:
|
|||
|
||||
void enable(bool enabled);
|
||||
|
||||
bool write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, bool dat, bool efr, unsigned char cnt, bool end);
|
||||
bool write(const unsigned char* data, unsigned short src, bool grp, unsigned short dst, bool dat, unsigned char cnt, bool end);
|
||||
|
||||
unsigned int read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, bool& dat, bool& efr, unsigned char& cnt, bool& end);
|
||||
unsigned int read(unsigned char* data, unsigned short& src, bool& grp, unsigned short& dst, bool& dat, unsigned char& cnt, bool& end);
|
||||
|
||||
void reset();
|
||||
|
||||
|
|
Loading…
Reference in a new issue