mirror of
https://github.com/g4klx/MMDVMHost.git
synced 2026-02-14 19:44:15 +01:00
Add JSON RSSI and BER messages to YSF.
This commit is contained in:
parent
74376d3b8c
commit
fb5e5b5fa1
|
|
@ -1386,7 +1386,7 @@ void CDStarControl::writeJSONBER()
|
|||
nlohmann::json json;
|
||||
|
||||
json["timestamp"] = CUtils::createTimestamp();
|
||||
json["mode"] = "D-STar";
|
||||
json["mode"] = "D-Star";
|
||||
|
||||
json["value"] = float(m_bitErrsAccum * 100U) / float(m_bitsCount);
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,9 @@
|
|||
#include <cstring>
|
||||
#include <ctime>
|
||||
|
||||
const unsigned int RSSI_COUNT = 13U; // 13 * 100ms = 1300ms
|
||||
const unsigned int BER_COUNT = 13U; // 13 * 100ms = 1300ms
|
||||
|
||||
// #define DUMP_YSF
|
||||
|
||||
CYSFControl::CYSFControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
|
||||
|
|
@ -59,7 +62,11 @@ m_rssi(0U),
|
|||
m_maxRSSI(0U),
|
||||
m_minRSSI(0U),
|
||||
m_aveRSSI(0U),
|
||||
m_rssiCountTotal(0U),
|
||||
m_rssiAccum(0U),
|
||||
m_rssiCount(0U),
|
||||
m_bitsCount(0U),
|
||||
m_bitErrsAccum(0U),
|
||||
m_enabled(true),
|
||||
m_fp(NULL)
|
||||
{
|
||||
|
|
@ -108,8 +115,8 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
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_rssiCount);
|
||||
writeJSONRF("lost", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
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);
|
||||
} 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));
|
||||
|
|
@ -152,7 +159,9 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
|
|||
m_maxRSSI = m_rssi;
|
||||
|
||||
m_aveRSSI += m_rssi;
|
||||
m_rssiCount++;
|
||||
m_rssiCountTotal++;
|
||||
|
||||
writeJSONRSSI();
|
||||
}
|
||||
|
||||
CYSFFICH fich;
|
||||
|
|
@ -255,7 +264,14 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
|
|||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
m_aveRSSI = m_rssi;
|
||||
m_rssiCountTotal = 1U;
|
||||
|
||||
m_rssiAccum = m_rssi;
|
||||
m_rssiCount = 1U;
|
||||
|
||||
m_bitErrsAccum = 0U;
|
||||
m_bitsCount = 0U;
|
||||
|
||||
#if defined(DUMP_YSF)
|
||||
openFile();
|
||||
#endif
|
||||
|
|
@ -322,8 +338,8 @@ 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_rssiCount);
|
||||
writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
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);
|
||||
} 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));
|
||||
|
|
@ -361,6 +377,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
|
|||
m_rfBits += 720U;
|
||||
m_display->writeFusionBER(float(errors) / 7.2F);
|
||||
LogDebug("YSF, V Mode 3, seq %u, AMBE FEC %u/720 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 7.2F);
|
||||
writeJSONBER(720U, errors);
|
||||
}
|
||||
|
||||
fich.encode(data + 2U);
|
||||
|
|
@ -429,7 +446,14 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
m_aveRSSI = m_rssi;
|
||||
m_rssiCountTotal = 1U;
|
||||
|
||||
m_rssiAccum = m_rssi;
|
||||
m_rssiCount = 1U;
|
||||
|
||||
m_bitErrsAccum = 0U;
|
||||
m_bitsCount = 0U;
|
||||
|
||||
#if defined(DUMP_YSF)
|
||||
openFile();
|
||||
#endif
|
||||
|
|
@ -496,8 +520,8 @@ 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_rssiCount);
|
||||
writeJSONRF("end", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
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);
|
||||
} 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));
|
||||
|
|
@ -531,6 +555,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
m_rfBits += 235U;
|
||||
m_display->writeFusionBER(float(errors) / 2.35F);
|
||||
LogDebug("YSF, V/D Mode 1, seq %u, AMBE FEC %u/235 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 2.35F);
|
||||
writeJSONBER(235U, errors);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -541,6 +566,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
m_rfBits += 405U;
|
||||
m_display->writeFusionBER(float(errors) / 4.05F);
|
||||
LogDebug("YSF, V/D Mode 2, seq %u, Repetition FEC %u/405 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 4.05F);
|
||||
writeJSONBER(405U, errors);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -624,7 +650,14 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
m_aveRSSI = m_rssi;
|
||||
m_rssiCountTotal = 1U;
|
||||
|
||||
m_rssiAccum = m_rssi;
|
||||
m_rssiCount = 1U;
|
||||
|
||||
m_bitErrsAccum = 0U;
|
||||
m_bitsCount = 0U;
|
||||
|
||||
#if defined(DUMP_YSF)
|
||||
openFile();
|
||||
#endif
|
||||
|
|
@ -735,7 +768,14 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
|
|||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
m_aveRSSI = m_rssi;
|
||||
m_rssiCountTotal = 1U;
|
||||
|
||||
m_rssiAccum = m_rssi;
|
||||
m_rssiCount = 1U;
|
||||
|
||||
m_bitErrsAccum = 0U;
|
||||
m_bitsCount = 0U;
|
||||
|
||||
#if defined(DUMP_YSF)
|
||||
openFile();
|
||||
#endif
|
||||
|
|
@ -801,8 +841,8 @@ 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_rssiCount);
|
||||
writeJSONRF("end", float(m_rfFrames) / 10.0F, 0.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
|
||||
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);
|
||||
} 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);
|
||||
|
|
@ -1275,6 +1315,46 @@ void CYSFControl::writeJSONRF(const char* action, float duration, float ber)
|
|||
WriteJSON("YSF", json);
|
||||
}
|
||||
|
||||
void CYSFControl::writeJSONRSSI()
|
||||
{
|
||||
m_rssiAccum += m_rssi;
|
||||
m_rssiCount++;
|
||||
|
||||
if (m_rssiCount >= RSSI_COUNT) {
|
||||
nlohmann::json json;
|
||||
|
||||
json["timestamp"] = CUtils::createTimestamp();
|
||||
json["mode"] = "YSF";
|
||||
|
||||
json["value"] = -int(m_rssiAccum / m_rssiCount);
|
||||
|
||||
WriteJSON("RSSI", json);
|
||||
|
||||
m_rssiAccum = 0U;
|
||||
m_rssiCount = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
void CYSFControl::writeJSONBER(unsigned int bits, unsigned int errs)
|
||||
{
|
||||
m_bitsCount += bits;
|
||||
m_bitErrsAccum += errs;
|
||||
|
||||
if (m_bitsCount >= (BER_COUNT * bits)) {
|
||||
nlohmann::json json;
|
||||
|
||||
json["timestamp"] = CUtils::createTimestamp();
|
||||
json["mode"] = "YSF";
|
||||
|
||||
json["value"] = float(m_bitErrsAccum * 100U) / float(m_bitsCount);
|
||||
|
||||
WriteJSON("BER", json);
|
||||
|
||||
m_bitErrsAccum = 0U;
|
||||
m_bitsCount = 1U;
|
||||
}
|
||||
}
|
||||
|
||||
void CYSFControl::writeJSONRF(const char* action, float duration, float ber, unsigned char minRSSI, unsigned char maxRSSI, unsigned int aveRSSI)
|
||||
{
|
||||
assert(action != NULL);
|
||||
|
|
|
|||
|
|
@ -86,7 +86,11 @@ private:
|
|||
unsigned char m_maxRSSI;
|
||||
unsigned char m_minRSSI;
|
||||
unsigned int m_aveRSSI;
|
||||
unsigned int m_rssiCountTotal;
|
||||
unsigned int m_rssiAccum;
|
||||
unsigned int m_rssiCount;
|
||||
unsigned int m_bitsCount;
|
||||
unsigned int m_bitErrsAccum;
|
||||
bool m_enabled;
|
||||
FILE* m_fp;
|
||||
|
||||
|
|
@ -102,6 +106,9 @@ private:
|
|||
void writeEndRF();
|
||||
void writeEndNet();
|
||||
|
||||
void writeJSONRSSI();
|
||||
void writeJSONBER(unsigned int bits, unsigned int errs);
|
||||
|
||||
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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue