From 3214cf850456ac4c81cce25b43467b94f6ca6e00 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 9 Aug 2016 20:05:35 +0100 Subject: [PATCH] Add RSSI logging to D-Star and YSF. --- DStarControl.cpp | 13 ++++++++++++- DStarControl.h | 4 +++- MMDVMHost.cpp | 25 ++++++++++++++++++++++--- YSFControl.cpp | 13 ++++++++++++- YSFControl.h | 4 +++- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/DStarControl.cpp b/DStarControl.cpp index 75dcf93..24ffba1 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -36,7 +36,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my) // #define DUMP_DSTAR -CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex) : +CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, int rssiMultiplier, int rssiOffset) : m_callsign(NULL), m_gateway(NULL), m_selfOnly(selfOnly), @@ -70,6 +70,8 @@ m_rfErrs(0U), m_netErrs(0U), m_lastFrame(NULL), m_lastFrameValid(false), +m_rssiMultiplier(rssiMultiplier), +m_rssiOffset(rssiOffset), m_fp(NULL) { assert(display != NULL); @@ -121,6 +123,15 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) return false; } + // Have we got RSSI bytes on the end? + if (len == (DSTAR_FRAME_LENGTH_BYTES + 3U) && m_rssiMultiplier != 0) { + uint16_t rssi = 0U; + rssi |= (data[13U] << 8) & 0xFF00U; + rssi |= (data[14U] << 0) & 0x00FFU; + signed char m_rssi = (rssi - m_rssiOffset) / m_rssiMultiplier; + LogDebug("D-Star, raw RSSI: %u, reported RSSI: %d dBm", rssi, m_rssi); + } + if (type == TAG_HEADER) { CDStarHeader header(data + 1U); diff --git a/DStarControl.h b/DStarControl.h index 0654ce9..8437c2b 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -36,7 +36,7 @@ class CDStarControl { public: - CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex); + CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, int rssiMultiplier, int rssiOffset); ~CDStarControl(); bool writeModem(unsigned char* data, unsigned int len); @@ -79,6 +79,8 @@ private: unsigned int m_netErrs; unsigned char* m_lastFrame; bool m_lastFrameValid; + int m_rssiMultiplier; + int m_rssiOffset; FILE* m_fp; void writeNetwork(); diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 5aa3b4d..5809338 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -273,14 +273,22 @@ int CMMDVMHost::run() std::string module = m_conf.getDStarModule(); bool selfOnly = m_conf.getDStarSelfOnly(); std::vector blackList = m_conf.getDStarBlackList(); + int rssiMultiplier = m_conf.getModemRSSIMultiplier(); + int rssiOffset = m_conf.getModemRSSIOffset(); LogInfo("D-Star Parameters"); LogInfo(" Module: %s", module.c_str()); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); + if (blackList.size() > 0U) LogInfo(" Black List: %u", blackList.size()); - dstar = new CDStarControl(m_callsign, module, selfOnly, blackList, m_dstarNetwork, m_display, m_timeout, m_duplex); + if (rssiMultiplier != 0) { + LogInfo(" RSSI Multiplier: %d", rssiMultiplier); + LogInfo(" RSSI Offset: %d", rssiOffset); + } + + dstar = new CDStarControl(m_callsign, module, selfOnly, blackList, m_dstarNetwork, m_display, m_timeout, m_duplex, rssiMultiplier, rssiOffset); } CDMRControl* dmr = NULL; @@ -352,8 +360,19 @@ int CMMDVMHost::run() } CYSFControl* ysf = NULL; - if (m_ysfEnabled) - ysf = new CYSFControl(m_callsign, m_ysfNetwork, m_display, m_timeout, m_duplex); + if (m_ysfEnabled) { + int rssiMultiplier = m_conf.getModemRSSIMultiplier(); + int rssiOffset = m_conf.getModemRSSIOffset(); + + LogInfo("YSF Parameters"); + + if (rssiMultiplier != 0) { + LogInfo(" RSSI Multiplier: %d", rssiMultiplier); + LogInfo(" RSSI Offset: %d", rssiOffset); + } + + ysf = new CYSFControl(m_callsign, m_ysfNetwork, m_display, m_timeout, m_duplex, rssiMultiplier, rssiOffset); + } setMode(MODE_IDLE); diff --git a/YSFControl.cpp b/YSFControl.cpp index e963eed..4295ebd 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -24,7 +24,7 @@ // #define DUMP_YSF -CYSFControl::CYSFControl(const std::string& callsign, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex) : +CYSFControl::CYSFControl(const std::string& callsign, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, int rssiMultiplier, int rssiOffset) : m_network(network), m_display(display), m_duplex(duplex), @@ -53,6 +53,8 @@ m_lastMode(YSF_DT_VOICE_FR_MODE), m_netN(0U), m_rfPayload(), m_netPayload(), +m_rssiMultiplier(rssiMultiplier), +m_rssiOffset(rssiOffset), m_fp(NULL) { assert(display != NULL); @@ -90,6 +92,15 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len) if (type == TAG_LOST) return false; + // Have we got RSSI bytes on the end? + if (len == (YSF_FRAME_LENGTH_BYTES + 4U) && m_rssiMultiplier != 0) { + uint16_t rssi = 0U; + rssi |= (data[122U] << 8) & 0xFF00U; + rssi |= (data[123U] << 0) & 0x00FFU; + signed char m_rssi = (rssi - m_rssiOffset) / m_rssiMultiplier; + LogDebug("YSF, raw RSSI: %u, reported RSSI: %d dBm", rssi, m_rssi); + } + CYSFFICH fich; bool valid = fich.decode(data + 2U); diff --git a/YSFControl.h b/YSFControl.h index 3e76a7c..09caa62 100644 --- a/YSFControl.h +++ b/YSFControl.h @@ -33,7 +33,7 @@ class CYSFControl { public: - CYSFControl(const std::string& callsign, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex); + CYSFControl(const std::string& callsign, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, int rssiMultiplier, int rssiOffset); ~CYSFControl(); bool writeModem(unsigned char* data, unsigned int len); @@ -71,6 +71,8 @@ private: unsigned char m_netN; CYSFPayload m_rfPayload; CYSFPayload m_netPayload; + int m_rssiMultiplier; + int m_rssiOffset; FILE* m_fp; void writeQueueRF(const unsigned char* data);