Add RSSI logging to D-Star and YSF.

This commit is contained in:
Jonathan Naylor
2016-08-09 20:05:35 +01:00
parent cd628a6005
commit 3214cf8504
5 changed files with 52 additions and 7 deletions

View File

@@ -36,7 +36,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my)
// #define DUMP_DSTAR // #define DUMP_DSTAR
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector<std::string>& 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<std::string>& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, int rssiMultiplier, int rssiOffset) :
m_callsign(NULL), m_callsign(NULL),
m_gateway(NULL), m_gateway(NULL),
m_selfOnly(selfOnly), m_selfOnly(selfOnly),
@@ -70,6 +70,8 @@ m_rfErrs(0U),
m_netErrs(0U), m_netErrs(0U),
m_lastFrame(NULL), m_lastFrame(NULL),
m_lastFrameValid(false), m_lastFrameValid(false),
m_rssiMultiplier(rssiMultiplier),
m_rssiOffset(rssiOffset),
m_fp(NULL) m_fp(NULL)
{ {
assert(display != NULL); assert(display != NULL);
@@ -121,6 +123,15 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
return false; 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) { if (type == TAG_HEADER) {
CDStarHeader header(data + 1U); CDStarHeader header(data + 1U);

View File

@@ -36,7 +36,7 @@
class CDStarControl { class CDStarControl {
public: public:
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector<std::string>& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex); CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, const std::vector<std::string>& blackList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, int rssiMultiplier, int rssiOffset);
~CDStarControl(); ~CDStarControl();
bool writeModem(unsigned char* data, unsigned int len); bool writeModem(unsigned char* data, unsigned int len);
@@ -79,6 +79,8 @@ private:
unsigned int m_netErrs; unsigned int m_netErrs;
unsigned char* m_lastFrame; unsigned char* m_lastFrame;
bool m_lastFrameValid; bool m_lastFrameValid;
int m_rssiMultiplier;
int m_rssiOffset;
FILE* m_fp; FILE* m_fp;
void writeNetwork(); void writeNetwork();

View File

@@ -273,14 +273,22 @@ int CMMDVMHost::run()
std::string module = m_conf.getDStarModule(); std::string module = m_conf.getDStarModule();
bool selfOnly = m_conf.getDStarSelfOnly(); bool selfOnly = m_conf.getDStarSelfOnly();
std::vector<std::string> blackList = m_conf.getDStarBlackList(); std::vector<std::string> blackList = m_conf.getDStarBlackList();
int rssiMultiplier = m_conf.getModemRSSIMultiplier();
int rssiOffset = m_conf.getModemRSSIOffset();
LogInfo("D-Star Parameters"); LogInfo("D-Star Parameters");
LogInfo(" Module: %s", module.c_str()); LogInfo(" Module: %s", module.c_str());
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
if (blackList.size() > 0U) if (blackList.size() > 0U)
LogInfo(" Black List: %u", blackList.size()); 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; CDMRControl* dmr = NULL;
@@ -352,8 +360,19 @@ int CMMDVMHost::run()
} }
CYSFControl* ysf = NULL; CYSFControl* ysf = NULL;
if (m_ysfEnabled) if (m_ysfEnabled) {
ysf = new CYSFControl(m_callsign, m_ysfNetwork, m_display, m_timeout, m_duplex); 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); setMode(MODE_IDLE);

View File

@@ -24,7 +24,7 @@
// #define DUMP_YSF // #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_network(network),
m_display(display), m_display(display),
m_duplex(duplex), m_duplex(duplex),
@@ -53,6 +53,8 @@ m_lastMode(YSF_DT_VOICE_FR_MODE),
m_netN(0U), m_netN(0U),
m_rfPayload(), m_rfPayload(),
m_netPayload(), m_netPayload(),
m_rssiMultiplier(rssiMultiplier),
m_rssiOffset(rssiOffset),
m_fp(NULL) m_fp(NULL)
{ {
assert(display != NULL); assert(display != NULL);
@@ -90,6 +92,15 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
if (type == TAG_LOST) if (type == TAG_LOST)
return false; 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; CYSFFICH fich;
bool valid = fich.decode(data + 2U); bool valid = fich.decode(data + 2U);

View File

@@ -33,7 +33,7 @@
class CYSFControl { class CYSFControl {
public: 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(); ~CYSFControl();
bool writeModem(unsigned char* data, unsigned int len); bool writeModem(unsigned char* data, unsigned int len);
@@ -71,6 +71,8 @@ private:
unsigned char m_netN; unsigned char m_netN;
CYSFPayload m_rfPayload; CYSFPayload m_rfPayload;
CYSFPayload m_netPayload; CYSFPayload m_netPayload;
int m_rssiMultiplier;
int m_rssiOffset;
FILE* m_fp; FILE* m_fp;
void writeQueueRF(const unsigned char* data); void writeQueueRF(const unsigned char* data);