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);
// 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,10 +211,11 @@ 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);
}
if (m_rfState == RS_RF_AUDIO) {
// Regenerate Sync
CSync::addP25Sync(data + 2U);
@@ -234,27 +254,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
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;
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);
} else if (duid == P25_DUID_LDU2) {
if (m_rfState == RS_RF_LISTENING)
return false;
return true;
}
} else if (duid == P25_DUID_LDU2) {
if (m_rfState == RS_RF_AUDIO) {
writeNetwork(m_rfLDU, m_lastDUID, false);
// Regenerate Sync
@@ -296,10 +301,13 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
m_display->writeP25RSSI(m_rssi);
} else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) {
if (m_rfState == RS_RF_LISTENING)
return false;
return true;
}
} else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) {
if (m_rfState == RS_RF_REJECTED) {
m_rfState = RS_RF_LISTENING;
} else if (m_rfState == RS_RF_AUDIO) {
writeNetwork(m_rfLDU, m_lastDUID, true);
::memset(data + 2U, 0x00U, P25_TERM_FRAME_LENGTH_BYTES);
@@ -336,11 +344,10 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
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)