Clean up the RSSI code to work with negative values correctly.

This commit is contained in:
Jonathan Naylor
2023-08-05 16:51:55 +01:00
parent fdc917518b
commit 376ff71fea
13 changed files with 228 additions and 249 deletions

View File

@@ -52,8 +52,8 @@ const unsigned char SCRAMBLER[] = {
0x5DU, 0x0CU, 0xC8U, 0x52U, 0x43U, 0x91U, 0x1DU, 0xF8U, 0x6EU, 0x68U, 0x2FU, 0x35U, 0xDAU, 0x14U, 0xEAU, 0xCDU, 0x76U,
0x19U, 0x8DU, 0xD5U, 0x80U, 0xD1U, 0x33U, 0x87U, 0x13U, 0x57U, 0x18U, 0x2DU, 0x29U, 0x78U, 0xC3U};
const unsigned int RSSI_COUNT = 28U; // 28 * 40ms = 1120ms
const unsigned int BER_COUNT = 28U * 272U; // 28 * 40ms = 1120ms
const unsigned int RSSI_COUNT = 25U; // 25 * 40ms = 1000ms
const unsigned int BER_COUNT = 25U * 272U; // 25 * 40ms = 1000ms
const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
@@ -93,12 +93,12 @@ m_netTextBits(0x00U),
m_rfText(NULL),
m_netText(NULL),
m_rssiMapper(rssiMapper),
m_rssi(0U),
m_maxRSSI(0U),
m_minRSSI(0U),
m_aveRSSI(0U),
m_rssi(0),
m_maxRSSI(0),
m_minRSSI(0),
m_aveRSSI(0),
m_rssiCountTotal(0U),
m_rssiAccum(0U),
m_rssiAccum(0),
m_rssiCount(0U),
m_bitsCount(0U),
m_bitErrsAccum(0U),
@@ -127,8 +127,8 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
if (type == TAG_LOST && (m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO)) {
if (m_rssi != 0U) {
LogMessage("M17, transmission lost from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal);
writeJSONRF("lost", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal);
LogMessage("M17, transmission lost from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal));
writeJSONRF("lost", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal));
} else {
LogMessage("M17, transmission lost from %s to %s, %.1f seconds, BER: %.1f%%", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
writeJSONRF("lost", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
@@ -159,16 +159,13 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
raw |= (data[51U] << 0) & 0x00FFU;
// Convert the raw RSSI to dBm
int rssi = m_rssiMapper->interpolate(raw);
if (rssi != 0)
LogDebug("M17, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi);
int m_rssi = m_rssiMapper->interpolate(raw);
if (m_rssi != 0)
LogDebug("M17, raw RSSI: %u, reported RSSI: %d dBm", raw, m_rssi);
// RSSI is always reported as positive
m_rssi = (rssi >= 0) ? rssi : -rssi;
if (m_rssi > m_minRSSI)
if (m_rssi < m_minRSSI)
m_minRSSI = m_rssi;
if (m_rssi < m_maxRSSI)
if (m_rssi > m_maxRSSI)
m_maxRSSI = m_rssi;
m_aveRSSI += m_rssi;
@@ -483,12 +480,12 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
m_network->write(netData);
}
if (m_rssi != 0U) {
LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal);
writeJSONRF("end", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
if (m_rssi != 0) {
LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal));
writeJSONRF("end", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal));
} else {
LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
writeJSONRF("end", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal);
writeJSONRF("end", float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits));
}
writeEndRF();
@@ -972,7 +969,7 @@ void CM17Control::enable(bool enabled)
void CM17Control::writeJSONRSSI()
{
if (m_rssi == 0U)
if (m_rssi == 0)
return;
if (m_rssiCountTotal >= RSSI_COUNT) {
@@ -981,11 +978,11 @@ void CM17Control::writeJSONRSSI()
json["timestamp"] = CUtils::createTimestamp();
json["mode"] = "M17";
json["value"] = -int(m_rssiAccum / m_rssiCountTotal);
json["value"] = m_rssiAccum / int(m_rssiCountTotal);
WriteJSON("RSSI", json);
m_rssiAccum = 0U;
m_rssiAccum = 0;
m_rssiCountTotal = 0U;
}
}
@@ -1043,7 +1040,7 @@ void CM17Control::writeJSONRF(const char* action, float duration, float ber)
WriteJSON("M17", json);
}
void CM17Control::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI)
void CM17Control::writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI)
{
assert(action != NULL);
@@ -1052,9 +1049,9 @@ void CM17Control::writeJSONRF(const char* action, float duration, float ber, uns
writeJSONRF(json, action, duration, ber);
nlohmann::json rssi;
rssi["min"] = -int(minRSSI);
rssi["max"] = -int(maxRSSI);
rssi["ave"] = -int(aveRSSI);
rssi["min"] = minRSSI;
rssi["max"] = maxRSSI;
rssi["ave"] = aveRSSI;
json["rssi"] = rssi;