diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 714df51..5c74292 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -70,8 +70,8 @@ const unsigned int NO_HEADERS_SIMPLEX = 8U; const unsigned int NO_HEADERS_DUPLEX = 3U; const unsigned int NO_PREAMBLE_CSBK = 15U; -const unsigned int RSSI_COUNT = 4U; // 4 * 360ms = 1440ms -const unsigned int BER_COUNT = 24U * 141U; // 24 * 60ms = 1440ms +const unsigned int RSSI_COUNT = 3U; // 3 * 360ms = 1080ms +const unsigned int BER_COUNT = 18U * 141U; // 18 * 60ms = 1080ms CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) : m_slotNo(slotNo), @@ -114,12 +114,12 @@ m_rfTimeout(false), m_netTimeout(false), m_lastFrame(NULL), m_lastFrameValid(false), -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_bitErrsAccum(0U), m_bitsCount(0U), @@ -154,9 +154,9 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) std::string dst = m_lookup->find(dstId); FLCO flco = m_rfLC->getFLCO(); - if (m_rssi != 0U) { - LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("lost", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + writeJSONRF("lost", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("lost", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -196,16 +196,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) raw |= (data[36U] << 0) & 0x00FFU; // Convert the raw RSSI to dBm - int rssi = m_rssiMapper->interpolate(raw); - if (rssi != 0) - LogDebug("DMR Slot %u, raw RSSI: %u, reported RSSI: %d dBm", m_slotNo, raw, rssi); + m_rssi = m_rssiMapper->interpolate(raw); + if (m_rssi != 0) + LogDebug("DMR Slot %u, raw RSSI: %u, reported RSSI: %d dBm", m_slotNo, 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; @@ -383,9 +380,9 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) std::string dst = m_lookup->find(dstId); FLCO flco = m_rfLC->getFLCO(); - if (m_rssi != 0U) { - LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("end", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -1940,7 +1937,7 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, dmrData.setN(m_rfN); dmrData.setSeqNo(m_rfSeqNo); dmrData.setBER(errors); - dmrData.setRSSI(m_rssi); + dmrData.setRSSI(-m_rssi); // Always report as positive m_rfSeqNo++; @@ -2244,11 +2241,11 @@ void CDMRSlot::writeJSONRSSI() json["mode"] = "DMR"; json["slot"] = int(m_slotNo); - json["value"] = -int(m_rssiAccum / m_rssiCount); + json["value"] = m_rssiAccum / int(m_rssiCount); WriteJSON("RSSI", json); - m_rssiAccum = 0U; + m_rssiAccum = 0; m_rssiCount = 0U; } } @@ -2349,7 +2346,7 @@ void CDMRSlot::writeJSONRF(const char* action, float duration, float ber) WriteJSON("DMR", json); } -void CDMRSlot::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI) +void CDMRSlot::writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI) { assert(action != NULL); @@ -2361,9 +2358,9 @@ void CDMRSlot::writeJSONRF(const char* action, float duration, float ber, unsign json["ber"] = 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; diff --git a/DMRSlot.h b/DMRSlot.h index a2f426b..bee254a 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -108,12 +108,12 @@ private: bool m_netTimeout; unsigned char* m_lastFrame; bool m_lastFrameValid; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; + int m_rssi; + int m_maxRSSI; + int m_minRSSI; + int m_aveRSSI; unsigned int m_rssiCountTotal; - unsigned int m_rssiAccum; + int m_rssiAccum; unsigned int m_rssiCount; unsigned int m_bitErrsAccum; unsigned int m_bitsCount; @@ -169,7 +169,7 @@ private: void writeJSONRF(const char* action, unsigned int srcId, const std::string& srcInfo, bool grp, unsigned int dstId, unsigned int frames); void writeJSONRF(const char* action, const char* desc, unsigned int srcId, const std::string& srcInfo, bool grp, unsigned int dstId); void writeJSONRF(const char* action, float duration, float ber); - void writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI); + void writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI); void writeJSONNet(const char* action); void writeJSONNet(const char* action, unsigned int srcId, const std::string& srcInfo, bool grp, unsigned int dstId); diff --git a/DStarControl.cpp b/DStarControl.cpp index e550a2d..f2e1a0e 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -28,7 +28,7 @@ const unsigned int MAX_SYNC_BIT_ERRORS = 2U; const unsigned int FAST_DATA_BEEP_GRACE_FRAMES = 6U; const unsigned int RSSI_COUNT = 3U * 21U; // 3 * 420ms = 1260ms -const unsigned int BER_COUNT = 63U * 48U; // 63 * 20ms = 1260ms +const unsigned int BER_COUNT = 50U * 48U; // 50 * 20ms = 1000ms bool CallsignCompare(const std::string& arg, const unsigned char* my) { @@ -80,12 +80,12 @@ m_rfErrs(0U), m_lastFrame(NULL), m_lastFrameValid(false), 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_bitErrsAccum(0U), m_bitsCount(0U), @@ -229,9 +229,9 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfHeader.getMyCall2(my2); m_rfHeader.getYourCall(your); - if (m_rssi != 0U) { - LogMessage("D-Star, transmission lost from %8.8s/%4.4s to %8.8s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", my1, my2, your, float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("lost", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("D-Star, transmission lost from %8.8s/%4.4s to %8.8s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", my1, my2, your, float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("lost", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("D-Star, transmission lost from %8.8s/%4.4s to %8.8s, %.1f seconds, BER: %.1f%%", my1, my2, your, float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("lost", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -266,16 +266,13 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) raw |= (data[43U] << 0) & 0x00FFU; // Convert the raw RSSI to dBm - int rssi = m_rssiMapper->interpolate(raw); - if (rssi != 0) - LogDebug("D-Star, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi); + int m_rssi = m_rssiMapper->interpolate(raw); + if (m_rssi != 0) + LogDebug("D-Star, 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; @@ -292,16 +289,13 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) raw |= (data[14U] << 0) & 0x00FFU; // Convert the raw RSSI to dBm - int rssi = m_rssiMapper->interpolate(raw); - if (rssi != 0) - LogDebug("D-Star, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi); + int m_rssi = m_rssiMapper->interpolate(raw); + if (m_rssi != 0) + LogDebug("D-Star, 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; @@ -444,9 +438,9 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfHeader.getMyCall2(my2); m_rfHeader.getYourCall(your); - if (m_rssi != 0U) { - LogMessage("D-Star, received RF end of transmission from %8.8s/%4.4s to %8.8s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", my1, my2, your, float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("D-Star, received RF end of transmission from %8.8s/%4.4s to %8.8s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", my1, my2, your, float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("D-Star, received RF end of transmission from %8.8s/%4.4s to %8.8s, %.1f seconds, BER: %.1f%%", my1, my2, your, float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("end", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -1174,32 +1168,32 @@ void CDStarControl::sendAck() if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) { if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) { CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm - ::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCountTotal); + ::sprintf(text, "%-8.8s %.1f%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal)); } else { - ::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCountTotal); + ::sprintf(text, "BER:%.1f%% %ddBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal)); } } else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) { - const unsigned int RSSI_S1 = 141U; - const unsigned int RSSI_S9 = 93U; + const int RSSI_S1 = -141; + const int RSSI_S9 = -93; - unsigned int signal = 0U; - unsigned int plus = 0U; - unsigned int rssi = m_aveRSSI / m_rssiCountTotal; + int signal = 0; + int plus = 0; + int rssi = m_aveRSSI / int(m_rssiCountTotal); - if (rssi > RSSI_S1) { - plus = rssi - RSSI_S1; - } else if (rssi > RSSI_S9 && rssi <= RSSI_S1) { - signal = ((RSSI_S1 - rssi) / 6U) + 1U; - plus = (RSSI_S1 - rssi) % 6U; + if (rssi < RSSI_S1) { + plus = RSSI_S1 - rssi; + } else if (rssi < RSSI_S9 && rssi >= RSSI_S1) { + signal = ((rssi - RSSI_S1) / 6) + 1; + plus = (rssi - RSSI_S1) % 6; } else { - plus = RSSI_S9 - rssi; + plus = rssi - RSSI_S9; } char signalText[15U]; - if (plus != 0U) - ::sprintf(signalText, "S%u+%02u", signal, plus); + if (plus != 0) + ::sprintf(signalText, "S%d+%02d", signal, plus); else - ::sprintf(signalText, "S%u", signal); + ::sprintf(signalText, "S%d", signal); if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) ::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText); @@ -1253,32 +1247,32 @@ void CDStarControl::sendError() if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) { if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) { CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm - ::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCountTotal); + ::sprintf(text, "%-8.8s %.1f%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal)); } else { - ::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCountTotal); + ::sprintf(text, "BER:%.1f%% %ddBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal)); } } else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) { - const unsigned int RSSI_S1 = 141U; - const unsigned int RSSI_S9 = 93U; + const int RSSI_S1 = -141; + const int RSSI_S9 = -93; - unsigned int signal = 0U; - unsigned int plus = 0U; - unsigned int rssi = m_aveRSSI / m_rssiCountTotal; + int signal = 0; + int plus = 0; + int rssi = m_aveRSSI / int(m_rssiCountTotal); - if (rssi > RSSI_S1) { - plus = rssi - RSSI_S1; - } else if (rssi > RSSI_S9 && rssi <= RSSI_S1) { - signal = ((RSSI_S1 - rssi) / 6U) + 1U; - plus = (RSSI_S1 - rssi) % 6U; + if (rssi < RSSI_S1) { + plus = RSSI_S1 - rssi; + } else if (rssi < RSSI_S9 && rssi >= RSSI_S1) { + signal = ((rssi - RSSI_S1) / 6) + 1; + plus = (rssi - RSSI_S1) % 6; } else { - plus = RSSI_S9 - rssi; + plus = rssi - RSSI_S9; } char signalText[15U]; if (plus != 0U) - ::sprintf(signalText, "S%u+%02u", signal, plus); + ::sprintf(signalText, "S%d+%02d", signal, plus); else - ::sprintf(signalText, "S%u", signal); + ::sprintf(signalText, "S%d", signal); if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) ::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText); @@ -1333,7 +1327,7 @@ void CDStarControl::enable(bool enabled) void CDStarControl::writeJSONRSSI() { - if (m_rssi == 0U) + if (m_rssi == 0) return; if (m_rssiCountTotal >= RSSI_COUNT) { @@ -1342,11 +1336,11 @@ void CDStarControl::writeJSONRSSI() json["timestamp"] = CUtils::createTimestamp(); json["mode"] = "D-Star"; - 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; } } @@ -1414,7 +1408,7 @@ void CDStarControl::writeJSONRF(const char* action, float duration, float ber) WriteJSON("D-Star", json); } -void CDStarControl::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI) +void CDStarControl::writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI) { assert(action != NULL); @@ -1423,9 +1417,9 @@ void CDStarControl::writeJSONRF(const char* action, float duration, float ber, u 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; diff --git a/DStarControl.h b/DStarControl.h index dd22749..b1ddfed 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -93,12 +93,12 @@ private: unsigned char* m_lastFrame; bool m_lastFrameValid; CRSSIInterpolator* m_rssiMapper; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; + int m_rssi; + int m_maxRSSI; + int m_minRSSI; + int m_aveRSSI; unsigned int m_rssiCountTotal; - unsigned int m_rssiAccum; + int m_rssiAccum; unsigned int m_rssiCount; unsigned int m_bitErrsAccum; unsigned int m_bitsCount; @@ -145,7 +145,7 @@ private: void writeJSONRF(const char* action, const unsigned char* my1, const unsigned char* my2, const unsigned char* your); void writeJSONRF(const char* action, float duration, float ber); - void writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI); + void writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI); void writeJSONNet(const char* action, const unsigned char* my1, const unsigned char* my2, const unsigned char* your, const unsigned char* reflector = NULL); void writeJSONNet(const char* action, float duration, float loss); diff --git a/M17Control.cpp b/M17Control.cpp index 2dbab37..ed369f6 100644 --- a/M17Control.cpp +++ b/M17Control.cpp @@ -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; diff --git a/M17Control.h b/M17Control.h index 18cac63..d161d9f 100644 --- a/M17Control.h +++ b/M17Control.h @@ -83,12 +83,12 @@ private: char* m_rfText; char* m_netText; CRSSIInterpolator* m_rssiMapper; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; + int m_rssi; + int m_maxRSSI; + int m_minRSSI; + int m_aveRSSI; unsigned int m_rssiCountTotal; - unsigned int m_rssiAccum; + int m_rssiAccum; unsigned int m_rssiCount; unsigned int m_bitsCount; unsigned int m_bitErrsAccum; @@ -118,7 +118,7 @@ private: void writeJSONRF(const char* action, RPT_RF_STATE state, const std::string& source, const std::string& dest); void writeJSONRF(const char* action, float duration, float ber); - void writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI); + void writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI); void writeJSONNet(const char* action, RPT_NET_STATE state, const std::string& source, const std::string& dest); void writeJSONNet(const char* action, float duration); diff --git a/NXDNControl.cpp b/NXDNControl.cpp index cf2b9b5..340ac80 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -34,8 +34,8 @@ const unsigned char SCRAMBLER[] = { 0x28U, 0x28U, 0x00U, 0x0AU, 0x02U, 0x82U, 0x20U, 0x28U, 0x82U, 0x2AU, 0xAAU, 0x20U, 0x22U, 0x80U, 0xA8U, 0x8AU, 0x08U, 0xA0U, 0xAAU, 0x02U }; -const unsigned int RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int BER_COUNT = 28U; // 28 * 40ms = 1120ms +const unsigned int RSSI_COUNT = 25U; // 25 * 40ms = 1000ms +const unsigned int BER_COUNT = 25U; // 25 * 40ms = 1000ms const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; @@ -68,12 +68,12 @@ m_netLayer3(), m_rfMask(0x00U), m_netMask(0x00U), 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), @@ -102,9 +102,9 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len) unsigned short srcId = m_rfLayer3.getSourceUnitId(); std::string source = m_lookup->find(srcId); - if (m_rssi != 0U) { - LogMessage("NXDN, transmission lost from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("lost", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("NXDN, transmission lost from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%ddBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("lost", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("NXDN, transmission lost from %s to %s%u, %.1f seconds, BER: %.1f%%", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("lost", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -132,16 +132,13 @@ bool CNXDNControl::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("NXDN, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi); + m_rssi = m_rssiMapper->interpolate(raw); + if (m_rssi != 0) + LogDebug("NXDN, 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; @@ -277,9 +274,9 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne std::string source = m_lookup->find(srcId); m_rfFrames++; - if (m_rssi != 0U) { - LogMessage("NXDN, received RF end of transmission from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("NXDN, received RF end of transmission from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("NXDN, received RF end of transmission from %s to %s%u, %.1f seconds, BER: %.1f%%", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("end", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -1110,7 +1107,7 @@ void CNXDNControl::enable(bool enabled) void CNXDNControl::writeJSONRSSI() { - if (m_rssi == 0U) + if (m_rssi == 0) return; if (m_rssiCount >= RSSI_COUNT) { @@ -1119,11 +1116,11 @@ void CNXDNControl::writeJSONRSSI() json["timestamp"] = CUtils::createTimestamp(); json["mode"] = "NXDN"; - json["value"] = -int(m_rssiAccum / m_rssiCount); + json["value"] = m_rssiAccum / int(m_rssiCount); WriteJSON("RSSI", json); - m_rssiAccum = 0U; + m_rssiAccum = 0; m_rssiCount = 0U; } } @@ -1173,7 +1170,7 @@ void CNXDNControl::writeJSONRF(const char* action, float duration, float ber) WriteJSON("NXDN", json); } -void CNXDNControl::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI) +void CNXDNControl::writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI) { assert(action != NULL); @@ -1185,9 +1182,9 @@ void CNXDNControl::writeJSONRF(const char* action, float duration, float ber, un json["ber"] = 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; diff --git a/NXDNControl.h b/NXDNControl.h index 68683ca..7fe604d 100644 --- a/NXDNControl.h +++ b/NXDNControl.h @@ -78,12 +78,12 @@ private: unsigned char m_rfMask; unsigned char m_netMask; CRSSIInterpolator* m_rssiMapper; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; + int m_rssi; + int m_maxRSSI; + int m_minRSSI; + int m_aveRSSI; unsigned int m_rssiCountTotal; - unsigned int m_rssiAccum; + int m_rssiAccum; unsigned int m_rssiCount; unsigned int m_bitsCount; unsigned int m_bitErrsAccum; @@ -107,7 +107,7 @@ private: void writeJSONRF(const char* action, unsigned short srcId, const std::string& srcInfo, bool grp, unsigned short dstId); void writeJSONRF(const char* action, float duration, float ber); - void writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI); + void writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI); void writeJSONNet(const char* action, unsigned short srcId, const std::string& srcInfo, bool grp, unsigned short dstId); void writeJSONNet(const char* action, unsigned short srcId, const std::string& srcInfo, bool grp, unsigned short dstId, unsigned char frames); diff --git a/P25Control.cpp b/P25Control.cpp index 7fb9351..00d8cbf 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -33,8 +33,8 @@ #include #include -const unsigned int RSSI_COUNT = 7U; // 7 * 180ms = 1260ms -const unsigned int BER_COUNT = 7U * 1233U; // 7 * 180ms = 1260ms +const unsigned int RSSI_COUNT = 6U; // 6 * 180ms = 1080ms +const unsigned int BER_COUNT = 6U * 1233U; // 6 * 180ms = 1080ms const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; @@ -77,12 +77,12 @@ m_rfPDU(NULL), m_rfPDUCount(0U), m_rfPDUBits(0U), 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), @@ -131,9 +131,9 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) unsigned int srcId = m_rfData.getSrcId(); std::string source = m_lookup->find(srcId); - if (m_rssi != 0U) { - LogMessage("P25, transmission lost from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("lost", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("P25, transmission lost from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("lost", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("P25, transmission lost from %s to %s%u, %.1f seconds, BER: %.1f%%", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("lost", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -198,16 +198,13 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) raw |= (data[219U] << 0) & 0x00FFU; // Convert the raw RSSI to dBm - int rssi = m_rssiMapper->interpolate(raw); - if (rssi != 0) - LogDebug("P25, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi); + m_rssi = m_rssiMapper->interpolate(raw); + if (m_rssi != 0) + LogDebug("P25, 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; @@ -466,9 +463,9 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) m_rfData.reset(); m_lastDUID = duid; - if (m_rssi != 0U) { - LogMessage("P25, received RF end of voice transmission from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("P25, received RF end of voice transmission from %s to %s%u, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("P25, received RF end of voice transmission from %s to %s%u, %.1f seconds, BER: %.1f%%", source.c_str(), grp ? "TG " : "", dstId, float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("end", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -1156,7 +1153,7 @@ void CP25Control::enable(bool enabled) void CP25Control::writeJSONRSSI() { - if (m_rssi == 0U) + if (m_rssi == 0) return; if (m_rssiCount >= RSSI_COUNT) { @@ -1165,11 +1162,11 @@ void CP25Control::writeJSONRSSI() json["timestamp"] = CUtils::createTimestamp(); json["mode"] = "P25"; - json["value"] = -int(m_rssiAccum / m_rssiCount); + json["value"] = m_rssiAccum / int(m_rssiCount); WriteJSON("RSSI", json); - m_rssiAccum = 0U; + m_rssiAccum = 0; m_rssiCount = 0U; } } @@ -1216,7 +1213,7 @@ void CP25Control::writeJSONRF(const char* action, float duration, float ber) WriteJSON("P25", json); } -void CP25Control::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI) +void CP25Control::writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI) { assert(action != NULL); @@ -1228,9 +1225,9 @@ void CP25Control::writeJSONRF(const char* action, float duration, float ber, uns json["ber"] = 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; diff --git a/P25Control.h b/P25Control.h index 72b101b..be27582 100644 --- a/P25Control.h +++ b/P25Control.h @@ -89,12 +89,12 @@ private: unsigned int m_rfPDUCount; unsigned int m_rfPDUBits; CRSSIInterpolator* m_rssiMapper; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; + int m_rssi; + int m_maxRSSI; + int m_minRSSI; + int m_aveRSSI; unsigned int m_rssiCountTotal; - unsigned int m_rssiAccum; + int m_rssiAccum; unsigned int m_rssiCount; unsigned int m_bitsCount; unsigned int m_bitErrsAccum; @@ -125,7 +125,7 @@ private: void writeJSONRF(const char* action, unsigned int srcId, const std::string& srcInfo, bool grp, unsigned int dstId); void writeJSONRF(const char* action, float duration, float ber); - void writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI); + void writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI); void writeJSONNet(const char* action, unsigned int srcId, const std::string& srcInfo, bool grp, unsigned int dstId); void writeJSONNet(const char* action, float duration, float loss); diff --git a/YSFControl.cpp b/YSFControl.cpp index 242107b..7333713 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -23,8 +23,8 @@ #include #include -const unsigned int RSSI_COUNT = 13U; // 13 * 100ms = 1300ms -const unsigned int BER_COUNT = 13U; // 13 * 100ms = 1300ms +const unsigned int RSSI_COUNT = 10U; // 10 * 100ms = 1000ms +const unsigned int BER_COUNT = 10U; // 10 * 100ms = 1000ms CYSFControl::CYSFControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper) : m_callsign(NULL), @@ -57,12 +57,12 @@ m_netN(0U), m_rfPayload(), m_netPayload(), 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), @@ -111,9 +111,9 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len) unsigned char type = data[0U]; if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) { - if (m_rssi != 0U) { - LogMessage("YSF, transmission lost from %10.10s to %10.10s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_rfSource, m_rfDest, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("lost", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("YSF, transmission lost from %10.10s to %10.10s, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_rfSource, m_rfDest, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("lost", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("YSF, transmission lost from %10.10s to %10.10s, %.1f seconds, BER: %.1f%%", m_rfSource, m_rfDest, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("lost", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -143,16 +143,13 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len) raw |= (data[123U] << 0) & 0x00FFU; // Convert the raw RSSI to dBm - int rssi = m_rssiMapper->interpolate(raw); - if (rssi != 0) - LogDebug("YSF, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi); + m_rssi = m_rssiMapper->interpolate(raw); + if (m_rssi != 0) + LogDebug("YSF, 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; @@ -326,9 +323,9 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data) m_rfFrames++; - if (m_rssi != 0U) { - LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_rfSource, dgid, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_rfSource, dgid, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, BER: %.1f%%", m_rfSource, dgid, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -494,9 +491,9 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data) m_rfFrames++; - if (m_rssi != 0U) { - LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_rfSource, dgid, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, BER: %.1f%%, RSSI: %d/%d/%d dBm", m_rfSource, dgid, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, BER: %.1f%%", m_rfSource, dgid, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); @@ -792,9 +789,9 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data) m_rfFrames++; - if (m_rssi != 0U) { - LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, RSSI: -%u/-%u/-%u dBm", m_rfSource, dgid, float(m_rfFrames) / 10.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); - writeJSONRF("end", float(m_rfFrames) / 10.0F, 0.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCountTotal); + if (m_rssi != 0) { + LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds, RSSI: %d/%d/%d dBm", m_rfSource, dgid, float(m_rfFrames) / 10.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); + writeJSONRF("end", float(m_rfFrames) / 10.0F, 0.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / int(m_rssiCountTotal)); } else { LogMessage("YSF, received RF end of transmission from %10.10s to DG-ID %u, %.1f seconds", m_rfSource, dgid, float(m_rfFrames) / 10.0F); writeJSONRF("end", float(m_rfFrames) / 10.0F, 0.0F); @@ -1187,7 +1184,7 @@ void CYSFControl::enable(bool enabled) void CYSFControl::writeJSONRSSI() { - if (m_rssi == 0U) + if (m_rssi == 0) return; if (m_rssiCount >= RSSI_COUNT) { @@ -1196,11 +1193,11 @@ void CYSFControl::writeJSONRSSI() json["timestamp"] = CUtils::createTimestamp(); json["mode"] = "YSF"; - json["value"] = -int(m_rssiAccum / m_rssiCount); + json["value"] = m_rssiAccum / int(m_rssiCount); WriteJSON("RSSI", json); - m_rssiAccum = 0U; + m_rssiAccum = 0; m_rssiCount = 0U; } } @@ -1254,7 +1251,7 @@ void CYSFControl::writeJSONRF(const char* action, float duration, float ber) WriteJSON("YSF", json); } -void CYSFControl::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI) +void CYSFControl::writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI) { assert(action != NULL); @@ -1266,9 +1263,9 @@ void CYSFControl::writeJSONRF(const char* action, float duration, float ber, uns json["ber"] = 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; diff --git a/YSFControl.h b/YSFControl.h index 101e0e1..d8ea890 100644 --- a/YSFControl.h +++ b/YSFControl.h @@ -82,12 +82,12 @@ private: CYSFPayload m_rfPayload; CYSFPayload m_netPayload; CRSSIInterpolator* m_rssiMapper; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; + int m_rssi; + int m_maxRSSI; + int m_minRSSI; + int m_aveRSSI; unsigned int m_rssiCountTotal; - unsigned int m_rssiAccum; + int m_rssiAccum; unsigned int m_rssiCount; unsigned int m_bitsCount; unsigned int m_bitErrsAccum; @@ -110,7 +110,7 @@ private: void writeJSONRF(const char* action, const char* mode, const unsigned char* source, unsigned char dgid); void writeJSONRF(const char* action, float duration, float ber); - void writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI); + void writeJSONRF(const char* action, float duration, float ber, int minRSSI, int maxRSSI, int aveRSSI); void writeJSONNet(const char* action, const unsigned char* source, unsigned char dgid, const unsigned char* reflector); void writeJSONNet(const char* action, float duration, unsigned int loss); diff --git a/schema.json b/schema.json index c9257f4..a1d2719 100644 --- a/schema.json +++ b/schema.json @@ -27,7 +27,7 @@ "duration": {"type": "number", "minimum": 0.0}, "loss": {"type": "number", "minimum": 0.0}, "ber": {"type": "number", "minimum": 0.0}, - "rssi": {"type": "number", "minimum": -200.0, "maximum": -10.0}, + "rssi": {"type": "integer", "minimum": -200, "maximum": -10}, "timestamp": {"type": "string"} },