diff --git a/Conf.cpp b/Conf.cpp index 73d0433..a5e3e91 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -146,6 +146,7 @@ m_dmrSlot2TGWhiteList(), m_dmrCallHang(10U), m_dmrTXHang(4U), m_dmrModeHang(10U), +m_dmrOVCM(true), m_fusionEnabled(false), m_fusionLowDeviation(false), m_fusionRemoteGateway(false), @@ -237,6 +238,7 @@ m_oledBrightness(0U), m_oledInvert(false), m_oledScroll(false), m_oledRotate(false), +m_oledLogoScreensaver(true), m_lcdprocAddress(), m_lcdprocPort(0U), m_lcdprocLocalPort(0U), @@ -589,6 +591,8 @@ bool CConf::read() m_dmrCallHang = (unsigned int)::atoi(value); else if (::strcmp(key, "ModeHang") == 0) m_dmrModeHang = (unsigned int)::atoi(value); + else if (::strcmp(key, "OVCM") == 0) + m_dmrOVCM = ::atoi(value) == 1; } else if (section == SECTION_FUSION) { if (::strcmp(key, "Enable") == 0) m_fusionEnabled = ::atoi(value) == 1; @@ -790,6 +794,8 @@ bool CConf::read() m_oledScroll = ::atoi(value) == 1; else if (::strcmp(key, "Rotate") == 0) m_oledRotate = ::atoi(value) == 1; + else if (::strcmp(key, "LogoScreensaver") == 0) + m_oledLogoScreensaver = ::atoi(value) == 1; } else if (section == SECTION_LCDPROC) { if (::strcmp(key, "Address") == 0) m_lcdprocAddress = value; @@ -1248,6 +1254,11 @@ unsigned int CConf::getDMRModeHang() const return m_dmrModeHang; } +bool CConf::getDMROVCM() const +{ + return m_dmrOVCM; +} + bool CConf::getFusionEnabled() const { return m_fusionEnabled; @@ -1698,6 +1709,11 @@ bool CConf::getOLEDRotate() const return m_oledRotate; } +bool CConf::getOLEDLogoScreensaver() const +{ + return m_oledLogoScreensaver; +} + std::string CConf::getLCDprocAddress() const { diff --git a/Conf.h b/Conf.h index dd2c292..f5b871b 100644 --- a/Conf.h +++ b/Conf.h @@ -135,6 +135,7 @@ public: unsigned int getDMRCallHang() const; unsigned int getDMRTXHang() const; unsigned int getDMRModeHang() const; + bool getDMROVCM() const; // The System Fusion section bool getFusionEnabled() const; @@ -254,6 +255,7 @@ public: bool getOLEDInvert() const; bool getOLEDScroll() const; bool getOLEDRotate() const; + bool getOLEDLogoScreensaver() const; // The LCDproc section std::string getLCDprocAddress() const; @@ -372,6 +374,7 @@ private: unsigned int m_dmrCallHang; unsigned int m_dmrTXHang; unsigned int m_dmrModeHang; + bool m_dmrOVCM; bool m_fusionEnabled; bool m_fusionLowDeviation; @@ -477,6 +480,7 @@ private: bool m_oledInvert; bool m_oledScroll; bool m_oledRotate; + bool m_oledLogoScreensaver; std::string m_lcdprocAddress; unsigned int m_lcdprocPort; diff --git a/DMRControl.cpp b/DMRControl.cpp index 54fcb10..4b7d8bb 100644 --- a/DMRControl.cpp +++ b/DMRControl.cpp @@ -21,7 +21,7 @@ #include #include -CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter) : +CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, bool ovcm) : m_colorCode(colorCode), m_modem(modem), m_network(network), @@ -38,7 +38,7 @@ m_lookup(lookup) // Load black and white lists to DMRAccessControl CDMRAccessControl::init(blacklist, whitelist, slot1TGWhitelist, slot2TGWhitelist, selfOnly, prefixes, id); - CDMRSlot::init(colorCode, embeddedLCOnly, dumpTAData, callHang, modem, network, display, duplex, m_lookup, rssi, jitter); + CDMRSlot::init(colorCode, embeddedLCOnly, dumpTAData, callHang, modem, network, display, duplex, m_lookup, rssi, jitter, ovcm); } CDMRControl::~CDMRControl() diff --git a/DMRControl.h b/DMRControl.h index 7bafbbc..8f88d83 100644 --- a/DMRControl.h +++ b/DMRControl.h @@ -31,7 +31,7 @@ class CDMRControl { public: - CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter); + CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, bool ovcm); ~CDMRControl(); bool processWakeup(const unsigned char* data); diff --git a/DMRLC.cpp b/DMRLC.cpp index 8dd897b..632cfa7 100644 --- a/DMRLC.cpp +++ b/DMRLC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -184,6 +184,19 @@ void CDMRLC::setFID(unsigned char fid) m_FID = fid; } +bool CDMRLC::getOVCM() const +{ + return (m_options & 0x04U) == 0x04U; +} + +void CDMRLC::setOVCM(bool ovcm) +{ + if (ovcm) + m_options |= 0x04U; + else + m_options &= 0xFBU; +} + unsigned int CDMRLC::getSrcId() const { return m_srcId; diff --git a/DMRLC.h b/DMRLC.h index 9f3a464..3a39450 100644 --- a/DMRLC.h +++ b/DMRLC.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,6 +39,9 @@ public: FLCO getFLCO() const; void setFLCO(FLCO flco); + bool getOVCM() const; + void setOVCM(bool ovcm); + unsigned char getFID() const; void setFID(unsigned char fid); diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index 80ac444..e8aef3d 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -602,6 +602,9 @@ bool CDMRNetwork::writeConfig() case HWT_NANO_DV: software = "MMDVM_Nano_DV"; break; + case HWT_D2RG_MMDVM_HS: + software = "MMDVM_D2RG_MMDVM_HS"; + break; case HWT_MMDVM_HS: software = "MMDVM_MMDVM_HS"; break; diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 58125ad..34597ce 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -43,6 +43,7 @@ CDisplay* CDMRSlot::m_display = NULL; bool CDMRSlot::m_duplex = true; CDMRLookup* CDMRSlot::m_lookup = NULL; unsigned int CDMRSlot::m_hangCount = 3U * 17U; +bool CDMRSlot::m_ovcm = true; CRSSIInterpolator* CDMRSlot::m_rssiMapper = NULL; @@ -141,10 +142,14 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) { + std::string src = m_lookup->find(m_rfLC->getSrcId()); + std::string dst = m_lookup->find(m_rfLC->getDstId()); + FLCO flco = m_rfLC->getFLCO(); + if (m_rssi != 0U) - LogMessage("DMR Slot %u, RF voice transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("DMR Slot %u, RF voice transmission lost, %.1f seconds, BER: %.1f%%", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); if (m_rfTimeout) { writeEndRF(); return false; @@ -155,7 +160,11 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) } if (data[0U] == TAG_LOST && m_rfState == RS_RF_DATA) { - LogMessage("DMR Slot %u, RF data transmission lost", m_slotNo); + std::string src = m_lookup->find(m_rfLC->getSrcId()); + std::string dst = m_lookup->find(m_rfLC->getDstId()); + FLCO flco = m_rfLC->getFLCO(); + + LogMessage("DMR Slot %u, RF data transmission lost from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str()); writeEndRF(); return false; } @@ -224,6 +233,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; } + lc->setOVCM(m_ovcm); m_rfLC = lc; // The standby LC data @@ -336,10 +346,14 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) } } + std::string src = m_lookup->find(m_rfLC->getSrcId()); + std::string dst = m_lookup->find(m_rfLC->getDstId()); + FLCO flco = m_rfLC->getFLCO(); + if (m_rssi != 0U) - LogMessage("DMR Slot %u, received RF end of voice transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("DMR Slot %u, received RF end of voice transmission, %.1f seconds, BER: %.1f%%", m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); m_display->writeDMRTA(m_slotNo, NULL, " "); @@ -408,7 +422,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) LogMessage("DMR Slot %u, received RF data header from %s to %s%s, %u blocks", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str(), m_rfFrames); if (m_rfFrames == 0U) { - LogMessage("DMR Slot %u, ended RF data transmission", m_slotNo); + LogMessage("DMR Slot %u, ended RF data transmission from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str()); writeEndRF(); } @@ -775,6 +789,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; } + lc->setOVCM(m_ovcm); m_rfLC = lc; // The standby LC data @@ -1030,6 +1045,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(), srcId, flco == FLCO_GROUP ? "TG" : "", dstId); + lc->setOVCM(m_ovcm); m_netLC = lc; // The standby LC data @@ -1103,6 +1119,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); + lc->setOVCM(m_ovcm); m_netLC = lc; m_lastFrameValid = false; @@ -1219,9 +1236,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) writeFile(data); closeFile(); #endif + std::string src = m_lookup->find(m_netLC->getSrcId()); + std::string dst = m_lookup->find(m_netLC->getDstId()); + FLCO flco = m_netLC->getFLCO(); + // We've received the voice header and terminator haven't we? m_netFrames += 2U; - LogMessage("DMR Slot %u, received network end of voice transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); + LogMessage("DMR Slot %u, received network end of voice transmission from %s to %s%s, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); m_display->writeDMRTA(m_slotNo, NULL, " "); writeEndNet(); } else if (dataType == DT_DATA_HEADER) { @@ -1274,7 +1295,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) LogMessage("DMR Slot %u, received network data header from %s to %s%s, %u blocks", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str(), m_netFrames); if (m_netFrames == 0U) { - LogMessage("DMR Slot %u, ended network data transmission", m_slotNo); + LogMessage("DMR Slot %u, ended network data transmission from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str()); writeEndNet(); } } else if (dataType == DT_VOICE_SYNC) { @@ -1284,6 +1305,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); + lc->setOVCM(m_ovcm); m_netLC = lc; // The standby LC data @@ -1859,7 +1881,7 @@ void CDMRSlot::writeQueueNet(const unsigned char *data) m_queue.addData(data, len); } -void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter) +void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, bool ovcm) { assert(modem != NULL); assert(display != NULL); @@ -1875,6 +1897,7 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData m_duplex = duplex; m_lookup = lookup; m_hangCount = callHang * 17U; + m_ovcm = ovcm; m_rssiMapper = rssiMapper; diff --git a/DMRSlot.h b/DMRSlot.h index 7f0add3..a0232cb 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -62,7 +62,7 @@ public: void enable(bool enabled); - static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter); + static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, bool ovcm); private: unsigned int m_slotNo; @@ -123,6 +123,7 @@ private: static bool m_duplex; static CDMRLookup* m_lookup; static unsigned int m_hangCount; + static bool m_ovcm; static CRSSIInterpolator* m_rssiMapper; diff --git a/DStarControl.cpp b/DStarControl.cpp index 6b68906..9e08914 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -127,10 +127,17 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) unsigned char type = data[0U]; if (type == TAG_LOST && (m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA)) { + unsigned char my1[DSTAR_LONG_CALLSIGN_LENGTH]; + unsigned char my2[DSTAR_SHORT_CALLSIGN_LENGTH]; + unsigned char your[DSTAR_LONG_CALLSIGN_LENGTH]; + m_rfHeader.getMyCall1(my1); + m_rfHeader.getMyCall2(my2); + m_rfHeader.getYourCall(your); + if (m_rssi != 0U) - LogMessage("D-Star, transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("D-Star, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); writeEndRF(); return false; } @@ -315,10 +322,17 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) if (m_duplex) writeQueueEOTRF(); + unsigned char my1[DSTAR_LONG_CALLSIGN_LENGTH]; + unsigned char my2[DSTAR_SHORT_CALLSIGN_LENGTH]; + unsigned char your[DSTAR_LONG_CALLSIGN_LENGTH]; + m_rfHeader.getMyCall1(my1); + m_rfHeader.getMyCall2(my2); + m_rfHeader.getYourCall(your); + if (m_rssi != 0U) - LogMessage("D-Star, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("D-Star, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 50.0F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); writeEndRF(); } @@ -701,9 +715,16 @@ void CDStarControl::writeNetwork() writeFile(data + 1U, length - 1U); closeFile(); #endif + unsigned char my1[DSTAR_LONG_CALLSIGN_LENGTH]; + unsigned char my2[DSTAR_SHORT_CALLSIGN_LENGTH]; + unsigned char your[DSTAR_LONG_CALLSIGN_LENGTH]; + m_netHeader.getMyCall1(my1); + m_netHeader.getMyCall2(my2); + m_netHeader.getYourCall(your); + // We've received the header and EOT haven't we? m_netFrames += 2U; - LogMessage("D-Star, received network end of transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); + LogMessage("D-Star, received network end of transmission from %8.8s/%4.4s to %8.8s, %.1f seconds, %u%% packet loss, BER: %.1f%%", my1, my2, your, float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); writeEndNet(); } diff --git a/Defines.h b/Defines.h index d4b9ff5..a6da8fe 100644 --- a/Defines.h +++ b/Defines.h @@ -44,6 +44,7 @@ enum HW_TYPE { HWT_MMDVM_HS_DUAL_HAT, HWT_NANO_HOTSPOT, HWT_NANO_DV, + HWT_D2RG_MMDVM_HS, HWT_MMDVM_HS, HWT_UNKNOWN }; diff --git a/Display.cpp b/Display.cpp index a66d3cc..6d9224d 100644 --- a/Display.cpp +++ b/Display.cpp @@ -569,8 +569,9 @@ CDisplay* CDisplay::createDisplay(const CConf& conf, CUMP* ump, CModem* modem) bool invert = conf.getOLEDInvert(); bool scroll = conf.getOLEDScroll(); bool rotate = conf.getOLEDRotate(); + bool logosaver = conf.getOLEDLogoScreensaver(); - display = new COLED(type, brightness, invert, scroll, rotate, conf.getDMRNetworkSlot1(), conf.getDMRNetworkSlot2()); + display = new COLED(type, brightness, invert, scroll, rotate, logosaver, conf.getDMRNetworkSlot1(), conf.getDMRNetworkSlot2()); #endif } else if (type == "CAST") { display = new CCASTInfo(modem); diff --git a/MMDVM.ini b/MMDVM.ini index 519cee7..5c1f4c1 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -107,6 +107,7 @@ DumpTAData=1 CallHang=3 TXHang=4 # ModeHang=10 +OVCM=1 [System Fusion] Enable=1 @@ -234,6 +235,7 @@ Invert=0 Scroll=1 Rotate=0 Cast=0 +LogoScreensaver=1 [LCDproc] Address=localhost diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index bb00f23..9525ee4 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -444,6 +444,7 @@ int CMMDVMHost::run() unsigned int jitter = m_conf.getDMRNetworkJitter(); m_dmrRFModeHang = m_conf.getDMRModeHang(); bool dmrBeacons = m_conf.getDMRBeacons(); + bool ovcm = m_conf.getDMROVCM(); if (txHang > m_dmrRFModeHang) txHang = m_dmrRFModeHang; @@ -476,6 +477,7 @@ int CMMDVMHost::run() LogInfo(" Call Hang: %us", callHang); LogInfo(" TX Hang: %us", txHang); LogInfo(" Mode Hang: %us", m_dmrRFModeHang); + LogInfo(" OVCM: %s", ovcm ? "on" : "off"); if (dmrBeacons) { unsigned int dmrBeaconInterval = m_conf.getDMRBeaconInterval(); @@ -490,7 +492,7 @@ int CMMDVMHost::run() dmrBeaconIntervalTimer.start(); } - m_dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_dmrLookup, rssi, jitter); + m_dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_dmrLookup, rssi, jitter, ovcm); m_dmrTXTimer.setTimeout(txHang); } @@ -622,7 +624,7 @@ int CMMDVMHost::run() m_ump->setCD(cd); } - unsigned char data[200U]; + unsigned char data[220U]; unsigned int len; bool ret; diff --git a/Modem.cpp b/Modem.cpp index 7fe5ae1..ec422ae 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -1394,6 +1394,8 @@ bool CModem::readVersion() m_hwType = HWT_NANO_HOTSPOT; else if (::memcmp(m_buffer + 4U, "Nano_DV", 7U) == 0) m_hwType = HWT_NANO_DV; + else if (::memcmp(m_buffer + 4U, "D2RG_MMDVM_HS", 13U) == 0) + m_hwType = HWT_D2RG_MMDVM_HS; else if (::memcmp(m_buffer + 4U, "MMDVM_HS-", 9U) == 0) m_hwType = HWT_MMDVM_HS; diff --git a/NXDNControl.cpp b/NXDNControl.cpp index 495724f..f36d7d0 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -93,10 +93,14 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len) unsigned char type = data[0U]; if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) { + unsigned short dstId = m_rfLayer3.getDestinationGroupId(); + bool grp = m_rfLayer3.getIsGroup(); + std::string source = m_lookup->find(m_rfLayer3.getSourceUnitId()); + if (m_rssi != 0U) - LogMessage("NXDN, transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("NXDN, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); writeEndRF(); return false; } @@ -259,11 +263,15 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne writeQueueRF(data); if (data[0U] == TAG_EOT) { + unsigned short dstId = m_rfLayer3.getDestinationGroupId(); + bool grp = m_rfLayer3.getIsGroup(); + std::string source = m_lookup->find(m_rfLayer3.getSourceUnitId()); + m_rfFrames++; if (m_rssi != 0U) - LogMessage("NXDN, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("NXDN, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 12.5F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); writeEndRF(); } else { m_rfFrames = 0U; @@ -663,7 +671,11 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data) #endif if (data[0U] == TAG_EOT) { - LogMessage("NXDN, ended RF data transmission"); + unsigned short dstId = m_rfLayer3.getDestinationGroupId(); + bool grp = m_rfLayer3.getIsGroup(); + std::string source = m_lookup->find(m_rfLayer3.getSourceUnitId()); + + LogMessage("NXDN, ended RF data transmission from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); writeEndRF(); } @@ -786,7 +798,11 @@ void CNXDNControl::writeNetwork() writeQueueNet(data); if (type == NXDN_MESSAGE_TYPE_TX_REL) { - LogMessage("NXDN, ended network data transmission"); + unsigned short dstId = m_netLayer3.getDestinationGroupId(); + bool grp = m_netLayer3.getIsGroup(); + std::string source = m_lookup->find(m_netLayer3.getSourceUnitId()); + + LogMessage("NXDN, ended network data transmission from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); writeEndNet(); } } @@ -817,16 +833,15 @@ void CNXDNControl::writeNetwork() writeQueueNet(data); + unsigned short dstId = m_netLayer3.getDestinationGroupId(); + bool grp = m_netLayer3.getIsGroup(); + std::string source = m_lookup->find(m_netLayer3.getSourceUnitId()); + if (type == NXDN_MESSAGE_TYPE_TX_REL) { m_netFrames++; - LogMessage("NXDN, received network end of transmission, %.1f seconds", float(m_netFrames) / 12.5F); + LogMessage("NXDN, received network end of transmission from %s to %s%u, %.1f seconds", source.c_str(), grp ? "TG " : "", dstId, float(m_netFrames) / 12.5F); writeEndNet(); } else if (type == NXDN_MESSAGE_TYPE_VCALL) { - unsigned short srcId = m_netLayer3.getSourceUnitId(); - unsigned short dstId = m_netLayer3.getDestinationGroupId(); - bool grp = m_netLayer3.getIsGroup(); - - std::string source = m_lookup->find(srcId); LogMessage("NXDN, received network transmission from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); m_display->writeNXDN(source.c_str(), grp, dstId, "N"); diff --git a/OLED.cpp b/OLED.cpp index 36d73fc..8dbfbe5 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -169,12 +169,13 @@ const unsigned char logo_POCSAG_bmp [] = 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -COLED::COLED(unsigned char displayType, unsigned char displayBrightness, bool displayInvert, bool displayScroll, bool displayRotate, bool slot1Enabled, bool slot2Enabled) : +COLED::COLED(unsigned char displayType, unsigned char displayBrightness, bool displayInvert, bool displayScroll, bool displayRotate, bool displayLogoScreensaver, bool slot1Enabled, bool slot2Enabled) : m_displayType(displayType), m_displayBrightness(displayBrightness), m_displayInvert(displayInvert), m_displayScroll(displayScroll), m_displayRotate(displayRotate), +m_displayLogoScreensaver(displayLogoScreensaver), m_slot1Enabled(slot1Enabled), m_slot2Enabled(slot2Enabled), m_ipaddress(), @@ -600,7 +601,7 @@ void COLED::OLED_statusbar() m_display.drawBitmap(0, 0, logo_NXDN_bmp, 128, 16, WHITE); else if (m_mode == MODE_POCSAG) m_display.drawBitmap(0, 0, logo_POCSAG_bmp, 128, 16, WHITE); - else + else if (m_displayLogoScreensaver) m_display.drawBitmap(0, 0, logo_glcd_bmp, 128, 16, WHITE); if (m_displayScroll) diff --git a/OLED.h b/OLED.h index df5111b..6f40371 100644 --- a/OLED.h +++ b/OLED.h @@ -40,7 +40,7 @@ class COLED : public CDisplay { public: - COLED(unsigned char displayType, unsigned char displayBrighness, bool displayInvert, bool displayScroll, bool displayRotate, bool slot1Enabled, bool slot2Enabled, CModem* modem); + COLED(unsigned char displayType, unsigned char displayBrighness, bool displayInvert, bool displayScroll, bool displayRotate, bool displayLogoScreensaver, bool slot1Enabled, bool slot2Enabled); virtual ~COLED(); virtual bool open(); @@ -83,6 +83,7 @@ private: bool m_displayInvert; bool m_displayScroll; bool m_displayRotate; + bool m_displayLogoScreensaver; bool m_slot1Enabled; bool m_slot2Enabled; std::string m_ipaddress; diff --git a/P25Control.cpp b/P25Control.cpp index a21602e..b9825f0 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -122,10 +122,14 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) bool sync = data[1U] == 0x01U; if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) { + bool grp = m_rfData.getLCF() == P25_LCF_GROUP; + unsigned int dstId = m_rfData.getDstId(); + std::string source = m_lookup->find(m_rfData.getSrcId()); + if (m_rssi != 0U) - LogMessage("P25, transmission lost, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("P25, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); if (m_netState == RS_NET_IDLE) m_display->clearP25(); @@ -368,14 +372,15 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) return false; } - unsigned int srcId = m_rfData.getSrcId(); + bool grp = m_rfData.getLCF() == P25_LCF_GROUP; unsigned int dstId = m_rfData.getDstId(); - + std::string source = m_lookup->find(m_rfData.getSrcId()); + unsigned char data[P25_TSDU_FRAME_LENGTH_BYTES + 2U]; switch (m_rfData.getLCF()) { case P25_LCF_TSBK_CALL_ALERT: - LogMessage("P25, received RF TSDU transmission, CALL ALERT from %u to %u", srcId, dstId); + LogMessage("P25, received RF TSDU transmission, CALL ALERT from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); ::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES); // Regenerate Sync @@ -401,7 +406,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) } break; case P25_LCF_TSBK_ACK_RSP_FNE: - LogMessage("P25, received RF TSDU transmission, ACK RESPONSE FNE from %u to %u", srcId, dstId); + LogMessage("P25, received RF TSDU transmission, ACK RESPONSE FNE from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId); ::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES); // Regenerate Sync @@ -448,15 +453,19 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) // Add busy bits addBusyBits(data + 2U, P25_TERM_FRAME_LENGTH_BITS, false, true); + bool grp = m_rfData.getLCF() == P25_LCF_GROUP; + unsigned int dstId = m_rfData.getDstId(); + std::string source = m_lookup->find(m_rfData.getSrcId()); + m_rfState = RS_RF_LISTENING; m_rfTimeout.stop(); m_rfData.reset(); m_lastDUID = duid; if (m_rssi != 0U) - LogMessage("P25, received RF end of voice transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + 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_rssiCount); else - LogMessage("P25, received RF end of voice transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); m_display->clearP25(); @@ -1112,7 +1121,9 @@ void CP25Control::createNetTerminator() writeQueueNet(buffer, P25_TERM_FRAME_LENGTH_BYTES + 2U); - LogMessage("P25, network end of transmission, %.1f seconds, %u%% packet loss", float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames); + std::string source = m_lookup->find(m_netData.getSrcId()); + + LogMessage("P25, network end of transmission from %s to %s%u, %.1f seconds, %u%% packet loss", source.c_str(), m_netData.getLCF() == P25_LCF_GROUP ? "TG " : "", m_netData.getDstId(), float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames); m_display->clearP25(); m_netTimeout.stop(); diff --git a/P25LowSpeedData.cpp b/P25LowSpeedData.cpp index 45989e2..8b05368 100644 --- a/P25LowSpeedData.cpp +++ b/P25LowSpeedData.cpp @@ -28,17 +28,17 @@ const unsigned char CCS_PARITY[] = { 0x8FU, 0xB6U, 0xFDU, 0xC4U, 0x6BU, 0x52U, 0x19U, 0x20U, 0x7EU, 0x47U, 0x0CU, 0x35U, 0x9AU, 0xA3U, 0xE8U, 0xD1U, 0x54U, 0x6DU, 0x26U, 0x1FU, 0xB0U, 0x89U, 0xC2U, 0xFBU, 0xA5U, 0x9CU, 0xD7U, 0xEEU, 0x41U, 0x78U, 0x33U, 0x0AU, 0x27U, 0x1EU, 0x55U, 0x6CU, 0xC3U, 0xFAU, 0xB1U, 0x88U, 0xD6U, 0xEFU, 0xA4U, 0x9DU, 0x32U, 0x0BU, 0x40U, 0x79U, - 0xFCU, 0xC5U, 0x8EU, 0xB7U, 0x18U, 0x21U, 0x6AU, 0x53U, 0x0DU, 0x34U, 0x7FU, 0xE9U, 0xD0U, 0x9BU, 0xA2U, 0xA8U, - 0x91U, 0xDAU, 0xE3U, 0x4CU, 0x75U, 0x3EU, 0x07U, 0x59U, 0x60U, 0x2BU, 0x12U, 0xBDU, 0x84U, 0xCFU, 0xF6U, 0x73U, - 0x4AU, 0x01U, 0x38U, 0x97U, 0xAEU, 0xE5U, 0xDCU, 0x82U, 0xBBU, 0xF0U, 0xC9U, 0x66U, 0x5FU, 0x14U, 0x2DU, 0x4EU, - 0x77U, 0x3CU, 0x05U, 0xAAU, 0x93U, 0xD8U, 0xE1U, 0xBFU, 0x86U, 0xCDU, 0xF4U, 0x5BU, 0x62U, 0x29U, 0x10U, 0x95U, - 0xACU, 0xE7U, 0xDEU, 0x71U, 0x48U, 0x03U, 0x3AU, 0x64U, 0x5DU, 0x16U, 0x2FU, 0x80U, 0xB9U, 0xF2U, 0xCBU, 0xC1U, - 0xF8U, 0xB3U, 0x8AU, 0x25U, 0x1CU, 0x57U, 0x6EU, 0x30U, 0x09U, 0x42U, 0x7BU, 0xD4U, 0xEDU, 0xA6U, 0x9FU, 0x1AU, - 0x23U, 0x68U, 0x51U, 0xFEU, 0xC7U, 0x8CU, 0xB5U, 0xEBU, 0xD2U, 0x99U, 0xA0U, 0x0FU, 0x36U, 0x7DU, 0x44U, 0x69U, - 0x50U, 0x1BU, 0x22U, 0x8DU, 0xB4U, 0xFFU, 0xC6U, 0x98U, 0xA1U, 0xEAU, 0xD3U, 0x7CU, 0x45U, 0x0EU, 0x37U, 0xB2U, - 0x8BU, 0xC0U, 0xF9U, 0x56U, 0x6FU, 0x24U, 0x1DU, 0x43U, 0x7AU, 0x31U, 0x08U, 0xA7U, 0x9EU, 0xD5U, 0xECU, 0xE6U, - 0xDFU, 0x94U, 0xADU, 0x02U, 0x3BU, 0x70U, 0x49U, 0x17U, 0x2EU, 0x65U, 0x5CU, 0xF3U, 0xCAU, 0x81U, 0xB8U, 0x3DU, - 0x04U, 0x4FU, 0x76U, 0xD9U, 0xE0U, 0xABU, 0x92U, 0xCCU, 0xF5U, 0xBEU, 0x87U, 0x28U, 0x11U, 0x5AU, 0x63U}; + 0xFCU, 0xC5U, 0x8EU, 0xB7U, 0x18U, 0x21U, 0x6AU, 0x53U, 0x0DU, 0x34U, 0x7FU, 0x46U, 0xE9U, 0xD0U, 0x9BU, 0xA2U, + 0xA8U, 0x91U, 0xDAU, 0xE3U, 0x4CU, 0x75U, 0x3EU, 0x07U, 0x59U, 0x60U, 0x2BU, 0x12U, 0xBDU, 0x84U, 0xCFU, 0xF6U, + 0x73U, 0x4AU, 0x01U, 0x38U, 0x97U, 0xAEU, 0xE5U, 0xDCU, 0x82U, 0xBBU, 0xF0U, 0xC9U, 0x66U, 0x5FU, 0x14U, 0x2DU, + 0x4EU, 0x77U, 0x3CU, 0x05U, 0xAAU, 0x93U, 0xD8U, 0xE1U, 0xBFU, 0x86U, 0xCDU, 0xF4U, 0x5BU, 0x62U, 0x29U, 0x10U, + 0x95U, 0xACU, 0xE7U, 0xDEU, 0x71U, 0x48U, 0x03U, 0x3AU, 0x64U, 0x5DU, 0x16U, 0x2FU, 0x80U, 0xB9U, 0xF2U, 0xCBU, + 0xC1U, 0xF8U, 0xB3U, 0x8AU, 0x25U, 0x1CU, 0x57U, 0x6EU, 0x30U, 0x09U, 0x42U, 0x7BU, 0xD4U, 0xEDU, 0xA6U, 0x9FU, + 0x1AU, 0x23U, 0x68U, 0x51U, 0xFEU, 0xC7U, 0x8CU, 0xB5U, 0xEBU, 0xD2U, 0x99U, 0xA0U, 0x0FU, 0x36U, 0x7DU, 0x44U, + 0x69U, 0x50U, 0x1BU, 0x22U, 0x8DU, 0xB4U, 0xFFU, 0xC6U, 0x98U, 0xA1U, 0xEAU, 0xD3U, 0x7CU, 0x45U, 0x0EU, 0x37U, + 0xB2U, 0x8BU, 0xC0U, 0xF9U, 0x56U, 0x6FU, 0x24U, 0x1DU, 0x43U, 0x7AU, 0x31U, 0x08U, 0xA7U, 0x9EU, 0xD5U, 0xECU, + 0xE6U, 0xDFU, 0x94U, 0xADU, 0x02U, 0x3BU, 0x70U, 0x49U, 0x17U, 0x2EU, 0x65U, 0x5CU, 0xF3U, 0xCAU, 0x81U, 0xB8U, + 0x3DU, 0x04U, 0x4FU, 0x76U, 0xD9U, 0xE0U, 0xABU, 0x92U, 0xCCU, 0xF5U, 0xBEU, 0x87U, 0x28U, 0x11U, 0x5AU, 0x63U}; const unsigned int MAX_CCS_ERRS = 4U; diff --git a/YSFControl.cpp b/YSFControl.cpp index d1d0880..73c8e8f 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -117,9 +117,9 @@ 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, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", 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_rssiCount); else - LogMessage("YSF, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); + 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)); writeEndRF(); return false; } @@ -324,9 +324,9 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data) m_rfFrames++; if (m_rssi != 0U) - LogMessage("YSF, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", 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 %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); else - LogMessage("YSF, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); + LogMessage("YSF, received RF end of transmission 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)); writeEndRF(); } @@ -501,9 +501,9 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data) m_rfFrames++; if (m_rssi != 0U) - LogMessage("YSF, received RF end of transmission, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", 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 %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); else - LogMessage("YSF, received RF end of transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits)); + LogMessage("YSF, received RF end of transmission 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)); writeEndRF(); } @@ -825,9 +825,9 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data) m_rfFrames++; if (m_rssi != 0U) - LogMessage("YSF, received RF end of transmission, %.1f seconds, RSSI: -%u/-%u/-%u dBm", float(m_rfFrames) / 10.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); + LogMessage("YSF, received RF end of transmission from %10.10s to %10.10s, %.1f seconds, RSSI: -%u/-%u/-%u dBm", m_rfSource, m_rfDest, float(m_rfFrames) / 10.0F, m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); else - LogMessage("YSF, received RF end of transmission, %.1f seconds", float(m_rfFrames) / 10.0F); + LogMessage("YSF, received RF end of transmission from %10.10s to %10.10s, %.1f seconds", m_rfSource, m_rfDest, float(m_rfFrames) / 10.0F); writeEndRF(); } @@ -1085,7 +1085,7 @@ void CYSFControl::writeNetwork() m_netN = n; if (end) { - LogMessage("YSF, received network end of transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%", float(m_netFrames) / 10.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); + LogMessage("YSF, received network end of transmission from %10.10s to %10.10s, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_netSource, m_netDest, float(m_netFrames) / 10.0F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits)); writeEndNet(); } }