Log P25 rejections better.
This commit is contained in:
parent
cf0c70087d
commit
f79527174c
219
P25Control.cpp
219
P25Control.cpp
|
@ -103,14 +103,9 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
|
|||
{
|
||||
assert(data != NULL);
|
||||
|
||||
// CUtils::dump(1U, "P25 Data", data, len);
|
||||
|
||||
bool sync = data[1U] == 0x01U;
|
||||
|
||||
if (data[0U] == TAG_LOST && m_rfState == RS_RF_LISTENING)
|
||||
return false;
|
||||
|
||||
if (data[0U] == TAG_LOST) {
|
||||
if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) {
|
||||
if (m_rssi != 0U)
|
||||
LogMessage("P25, transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
else
|
||||
|
@ -130,6 +125,11 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (data[0U] == TAG_LOST) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!sync && m_rfState == RS_RF_LISTENING)
|
||||
return false;
|
||||
|
||||
|
@ -185,6 +185,25 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
|
|||
return false;
|
||||
}
|
||||
|
||||
unsigned int srcId = m_rfData.getSrcId();
|
||||
|
||||
if (m_selfOnly) {
|
||||
if (srcId != m_id) {
|
||||
LogMessage("P25, invalid access attempt from %u", srcId);
|
||||
m_rfState = RS_RF_REJECTED;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool grp = m_rfData.getLCF() == P25_LCF_GROUP;
|
||||
unsigned int dstId = m_rfData.getDstId();
|
||||
std::string source = m_lookup->find(srcId);
|
||||
|
||||
LogMessage("P25, received RF transmission from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId);
|
||||
m_display->writeP25(source.c_str(), grp, dstId, "R");
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
m_aveRSSI = m_rssi;
|
||||
|
@ -192,155 +211,143 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
|
|||
|
||||
createRFHeader();
|
||||
writeNetwork(data + 2U, P25_DUID_HEADER, false);
|
||||
} else {
|
||||
} else if (m_rfState == RS_RF_AUDIO) {
|
||||
writeNetwork(m_rfLDU, m_lastDUID, false);
|
||||
}
|
||||
|
||||
// Regenerate Sync
|
||||
CSync::addP25Sync(data + 2U);
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
// Regenerate Sync
|
||||
CSync::addP25Sync(data + 2U);
|
||||
|
||||
// Regenerate NID
|
||||
m_nid.encode(data + 2U, P25_DUID_LDU1);
|
||||
// Regenerate NID
|
||||
m_nid.encode(data + 2U, P25_DUID_LDU1);
|
||||
|
||||
// Regenerate LDU1 Data
|
||||
m_rfData.encodeLDU1(data + 2U);
|
||||
// Regenerate LDU1 Data
|
||||
m_rfData.encodeLDU1(data + 2U);
|
||||
|
||||
// Regenerate the Low Speed Data
|
||||
m_rfLSD.process(data + 2U);
|
||||
// Regenerate the Low Speed Data
|
||||
m_rfLSD.process(data + 2U);
|
||||
|
||||
// Regenerate Audio
|
||||
unsigned int errors = m_audio.process(data + 2U);
|
||||
LogDebug("P25, LDU1 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
|
||||
// Regenerate Audio
|
||||
unsigned int errors = m_audio.process(data + 2U);
|
||||
LogDebug("P25, LDU1 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
|
||||
|
||||
m_display->writeP25BER(float(errors) / 12.33F);
|
||||
m_display->writeP25BER(float(errors) / 12.33F);
|
||||
|
||||
m_rfBits += 1233U;
|
||||
m_rfErrs += errors;
|
||||
m_rfFrames++;
|
||||
m_lastDUID = duid;
|
||||
m_rfBits += 1233U;
|
||||
m_rfErrs += errors;
|
||||
m_rfFrames++;
|
||||
m_lastDUID = duid;
|
||||
|
||||
// Add busy bits
|
||||
addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
|
||||
// Add busy bits
|
||||
addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
|
||||
|
||||
#if defined(DUMP_P25)
|
||||
writeFile(data + 2U, len - 2U);
|
||||
writeFile(data + 2U, len - 2U);
|
||||
#endif
|
||||
|
||||
::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES);
|
||||
::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES);
|
||||
|
||||
if (m_duplex) {
|
||||
data[0U] = TAG_DATA;
|
||||
data[1U] = 0x00U;
|
||||
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U);
|
||||
}
|
||||
|
||||
if (m_rfState == RS_RF_LISTENING) {
|
||||
unsigned int srcId = m_rfData.getSrcId();
|
||||
|
||||
if (m_selfOnly) {
|
||||
if (srcId != m_id)
|
||||
return false;
|
||||
if (m_duplex) {
|
||||
data[0U] = TAG_DATA;
|
||||
data[1U] = 0x00U;
|
||||
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U);
|
||||
}
|
||||
|
||||
bool grp = m_rfData.getLCF() == P25_LCF_GROUP;
|
||||
unsigned int dstId = m_rfData.getDstId();
|
||||
std::string source = m_lookup->find(srcId);
|
||||
LogMessage("P25, received RF transmission from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId);
|
||||
m_display->writeP25(source.c_str(), grp, dstId, "R");
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
}
|
||||
m_display->writeP25RSSI(m_rssi);
|
||||
|
||||
m_display->writeP25RSSI(m_rssi);
|
||||
return true;
|
||||
}
|
||||
} else if (duid == P25_DUID_LDU2) {
|
||||
if (m_rfState == RS_RF_LISTENING)
|
||||
return false;
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
writeNetwork(m_rfLDU, m_lastDUID, false);
|
||||
|
||||
writeNetwork(m_rfLDU, m_lastDUID, false);
|
||||
// Regenerate Sync
|
||||
CSync::addP25Sync(data + 2U);
|
||||
|
||||
// Regenerate Sync
|
||||
CSync::addP25Sync(data + 2U);
|
||||
// Regenerate NID
|
||||
m_nid.encode(data + 2U, P25_DUID_LDU2);
|
||||
|
||||
// Regenerate NID
|
||||
m_nid.encode(data + 2U, P25_DUID_LDU2);
|
||||
// Add the dummy LDU2 data
|
||||
m_rfData.encodeLDU2(data + 2U);
|
||||
|
||||
// Add the dummy LDU2 data
|
||||
m_rfData.encodeLDU2(data + 2U);
|
||||
// Regenerate the Low Speed Data
|
||||
m_rfLSD.process(data + 2U);
|
||||
|
||||
// Regenerate the Low Speed Data
|
||||
m_rfLSD.process(data + 2U);
|
||||
// Regenerate Audio
|
||||
unsigned int errors = m_audio.process(data + 2U);
|
||||
LogDebug("P25, LDU2 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
|
||||
|
||||
// Regenerate Audio
|
||||
unsigned int errors = m_audio.process(data + 2U);
|
||||
LogDebug("P25, LDU2 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
|
||||
m_display->writeP25BER(float(errors) / 12.33F);
|
||||
|
||||
m_display->writeP25BER(float(errors) / 12.33F);
|
||||
m_rfBits += 1233U;
|
||||
m_rfErrs += errors;
|
||||
m_rfFrames++;
|
||||
m_lastDUID = duid;
|
||||
|
||||
m_rfBits += 1233U;
|
||||
m_rfErrs += errors;
|
||||
m_rfFrames++;
|
||||
m_lastDUID = duid;
|
||||
|
||||
// Add busy bits
|
||||
addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
|
||||
// Add busy bits
|
||||
addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
|
||||
|
||||
#if defined(DUMP_P25)
|
||||
writeFile(data + 2U, len - 2U);
|
||||
writeFile(data + 2U, len - 2U);
|
||||
#endif
|
||||
|
||||
::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES);
|
||||
::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES);
|
||||
|
||||
if (m_duplex) {
|
||||
data[0U] = TAG_DATA;
|
||||
data[1U] = 0x00U;
|
||||
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U);
|
||||
if (m_duplex) {
|
||||
data[0U] = TAG_DATA;
|
||||
data[1U] = 0x00U;
|
||||
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U);
|
||||
}
|
||||
|
||||
m_display->writeP25RSSI(m_rssi);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
m_display->writeP25RSSI(m_rssi);
|
||||
} else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) {
|
||||
if (m_rfState == RS_RF_LISTENING)
|
||||
return false;
|
||||
if (m_rfState == RS_RF_REJECTED) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
} else if (m_rfState == RS_RF_AUDIO) {
|
||||
writeNetwork(m_rfLDU, m_lastDUID, true);
|
||||
|
||||
writeNetwork(m_rfLDU, m_lastDUID, true);
|
||||
::memset(data + 2U, 0x00U, P25_TERM_FRAME_LENGTH_BYTES);
|
||||
|
||||
::memset(data + 2U, 0x00U, P25_TERM_FRAME_LENGTH_BYTES);
|
||||
// Regenerate Sync
|
||||
CSync::addP25Sync(data + 2U);
|
||||
|
||||
// Regenerate Sync
|
||||
CSync::addP25Sync(data + 2U);
|
||||
// Regenerate NID
|
||||
m_nid.encode(data + 2U, P25_DUID_TERM);
|
||||
|
||||
// Regenerate NID
|
||||
m_nid.encode(data + 2U, P25_DUID_TERM);
|
||||
// Add busy bits
|
||||
addBusyBits(data + 2U, P25_TERM_FRAME_LENGTH_BITS, false, true);
|
||||
|
||||
// Add busy bits
|
||||
addBusyBits(data + 2U, P25_TERM_FRAME_LENGTH_BITS, false, true);
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfTimeout.stop();
|
||||
m_rfData.reset();
|
||||
m_lastDUID = duid;
|
||||
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfTimeout.stop();
|
||||
m_rfData.reset();
|
||||
m_lastDUID = duid;
|
||||
if (m_rssi != 0U)
|
||||
LogMessage("P25, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
else
|
||||
LogMessage("P25, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
|
||||
if (m_rssi != 0U)
|
||||
LogMessage("P25, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
else
|
||||
LogMessage("P25, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
|
||||
m_display->clearP25();
|
||||
m_display->clearP25();
|
||||
|
||||
#if defined(DUMP_P25)
|
||||
closeFile();
|
||||
closeFile();
|
||||
#endif
|
||||
|
||||
writeNetwork(data + 2U, P25_DUID_TERM, true);
|
||||
writeNetwork(data + 2U, P25_DUID_TERM, true);
|
||||
|
||||
if (m_duplex) {
|
||||
data[0U] = TAG_EOT;
|
||||
data[1U] = 0x00U;
|
||||
writeQueueRF(data, P25_TERM_FRAME_LENGTH_BYTES + 2U);
|
||||
if (m_duplex) {
|
||||
data[0U] = TAG_EOT;
|
||||
data[1U] = 0x00U;
|
||||
writeQueueRF(data, P25_TERM_FRAME_LENGTH_BYTES + 2U);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int CP25Control::readModem(unsigned char* data)
|
||||
|
|
Loading…
Reference in a new issue