Log P25 rejections better.

This commit is contained in:
Jonathan Naylor
2017-08-15 15:43:58 +01:00
parent cf0c70087d
commit f79527174c

View File

@@ -103,14 +103,9 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
{ {
assert(data != NULL); assert(data != NULL);
// CUtils::dump(1U, "P25 Data", data, len);
bool sync = data[1U] == 0x01U; bool sync = data[1U] == 0x01U;
if (data[0U] == TAG_LOST && m_rfState == RS_RF_LISTENING) if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) {
return false;
if (data[0U] == TAG_LOST) {
if (m_rssi != 0U) 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); 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 else
@@ -130,6 +125,11 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return false; return false;
} }
if (data[0U] == TAG_LOST) {
m_rfState = RS_RF_LISTENING;
return false;
}
if (!sync && m_rfState == RS_RF_LISTENING) if (!sync && m_rfState == RS_RF_LISTENING)
return false; return false;
@@ -185,6 +185,25 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return false; 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_minRSSI = m_rssi;
m_maxRSSI = m_rssi; m_maxRSSI = m_rssi;
m_aveRSSI = m_rssi; m_aveRSSI = m_rssi;
@@ -192,155 +211,143 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
createRFHeader(); createRFHeader();
writeNetwork(data + 2U, P25_DUID_HEADER, false); writeNetwork(data + 2U, P25_DUID_HEADER, false);
} else { } else if (m_rfState == RS_RF_AUDIO) {
writeNetwork(m_rfLDU, m_lastDUID, false); writeNetwork(m_rfLDU, m_lastDUID, false);
} }
// Regenerate Sync if (m_rfState == RS_RF_AUDIO) {
CSync::addP25Sync(data + 2U); // Regenerate Sync
CSync::addP25Sync(data + 2U);
// Regenerate NID // Regenerate NID
m_nid.encode(data + 2U, P25_DUID_LDU1); m_nid.encode(data + 2U, P25_DUID_LDU1);
// Regenerate LDU1 Data // Regenerate LDU1 Data
m_rfData.encodeLDU1(data + 2U); m_rfData.encodeLDU1(data + 2U);
// Regenerate the Low Speed Data // Regenerate the Low Speed Data
m_rfLSD.process(data + 2U); m_rfLSD.process(data + 2U);
// Regenerate Audio // Regenerate Audio
unsigned int errors = m_audio.process(data + 2U); unsigned int errors = m_audio.process(data + 2U);
LogDebug("P25, LDU1 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F); 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_rfBits += 1233U;
m_rfErrs += errors; m_rfErrs += errors;
m_rfFrames++; m_rfFrames++;
m_lastDUID = duid; m_lastDUID = duid;
// Add busy bits // Add busy bits
addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true); addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
#if defined(DUMP_P25) #if defined(DUMP_P25)
writeFile(data + 2U, len - 2U); writeFile(data + 2U, len - 2U);
#endif #endif
::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES); ::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES);
if (m_duplex) { if (m_duplex) {
data[0U] = TAG_DATA; data[0U] = TAG_DATA;
data[1U] = 0x00U; data[1U] = 0x00U;
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U); 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;
} }
bool grp = m_rfData.getLCF() == P25_LCF_GROUP; m_display->writeP25RSSI(m_rssi);
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); return true;
}
} else if (duid == P25_DUID_LDU2) { } else if (duid == P25_DUID_LDU2) {
if (m_rfState == RS_RF_LISTENING) if (m_rfState == RS_RF_AUDIO) {
return false; writeNetwork(m_rfLDU, m_lastDUID, false);
writeNetwork(m_rfLDU, m_lastDUID, false); // Regenerate Sync
CSync::addP25Sync(data + 2U);
// Regenerate Sync // Regenerate NID
CSync::addP25Sync(data + 2U); m_nid.encode(data + 2U, P25_DUID_LDU2);
// Regenerate NID // Add the dummy LDU2 data
m_nid.encode(data + 2U, P25_DUID_LDU2); m_rfData.encodeLDU2(data + 2U);
// Add the dummy LDU2 data // Regenerate the Low Speed Data
m_rfData.encodeLDU2(data + 2U); m_rfLSD.process(data + 2U);
// Regenerate the Low Speed Data // Regenerate Audio
m_rfLSD.process(data + 2U); unsigned int errors = m_audio.process(data + 2U);
LogDebug("P25, LDU2 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
// Regenerate Audio m_display->writeP25BER(float(errors) / 12.33F);
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_rfBits += 1233U;
m_rfErrs += errors;
m_rfFrames++;
m_lastDUID = duid;
m_rfBits += 1233U; // Add busy bits
m_rfErrs += errors; addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
m_rfFrames++;
m_lastDUID = duid;
// Add busy bits
addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true);
#if defined(DUMP_P25) #if defined(DUMP_P25)
writeFile(data + 2U, len - 2U); writeFile(data + 2U, len - 2U);
#endif #endif
::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES); ::memcpy(m_rfLDU, data + 2U, P25_LDU_FRAME_LENGTH_BYTES);
if (m_duplex) { if (m_duplex) {
data[0U] = TAG_DATA; data[0U] = TAG_DATA;
data[1U] = 0x00U; data[1U] = 0x00U;
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U); 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) { } else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) {
if (m_rfState == RS_RF_LISTENING) if (m_rfState == RS_RF_REJECTED) {
return false; 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 // Regenerate NID
CSync::addP25Sync(data + 2U); m_nid.encode(data + 2U, P25_DUID_TERM);
// Regenerate NID // Add busy bits
m_nid.encode(data + 2U, P25_DUID_TERM); addBusyBits(data + 2U, P25_TERM_FRAME_LENGTH_BITS, false, true);
// Add busy bits m_rfState = RS_RF_LISTENING;
addBusyBits(data + 2U, P25_TERM_FRAME_LENGTH_BITS, false, true); m_rfTimeout.stop();
m_rfData.reset();
m_lastDUID = duid;
m_rfState = RS_RF_LISTENING; if (m_rssi != 0U)
m_rfTimeout.stop(); 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);
m_rfData.reset(); else
m_lastDUID = duid; 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) m_display->clearP25();
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();
#if defined(DUMP_P25) #if defined(DUMP_P25)
closeFile(); closeFile();
#endif #endif
writeNetwork(data + 2U, P25_DUID_TERM, true); writeNetwork(data + 2U, P25_DUID_TERM, true);
if (m_duplex) { if (m_duplex) {
data[0U] = TAG_EOT; data[0U] = TAG_EOT;
data[1U] = 0x00U; data[1U] = 0x00U;
writeQueueRF(data, P25_TERM_FRAME_LENGTH_BYTES + 2U); writeQueueRF(data, P25_TERM_FRAME_LENGTH_BYTES + 2U);
}
} }
} else {
return false;
} }
return true; return false;
} }
unsigned int CP25Control::readModem(unsigned char* data) unsigned int CP25Control::readModem(unsigned char* data)