From 98e0869257e08c9d11102035b7b65a1cc5b12249 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 5 Nov 2019 08:42:21 +0000 Subject: [PATCH] Re-introduce optional network DMR beacons. --- Conf.cpp | 11 +++++---- Conf.h | 2 +- Defines.h | 6 +++++ MMDVMHost.cpp | 68 ++++++++++++++++++++++++++++++++++++++------------- 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index a5e3e91..a4f357f 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -130,7 +130,7 @@ m_dstarErrorReply(true), m_dstarRemoteGateway(false), m_dstarModeHang(10U), m_dmrEnabled(false), -m_dmrBeacons(false), +m_dmrBeacons(DMR_BEACONS_OFF), m_dmrBeaconInterval(60U), m_dmrBeaconDuration(3U), m_dmrId(0U), @@ -530,10 +530,11 @@ bool CConf::read() if (::strcmp(key, "Enable") == 0) m_dmrEnabled = ::atoi(value) == 1; else if (::strcmp(key, "Beacons") == 0) - m_dmrBeacons = ::atoi(value) == 1; - else if (::strcmp(key, "BeaconInterval") == 0) + m_dmrBeacons = ::atoi(value) == 1 ? DMR_BEACONS_NETWORK : DMR_BEACONS_OFF; + else if (::strcmp(key, "BeaconInterval") == 0) { + m_dmrBeacons = m_dmrBeacons != DMR_BEACONS_OFF ? DMR_BEACONS_TIMED : DMR_BEACONS_OFF; m_dmrBeaconInterval = (unsigned int)::atoi(value); - else if (::strcmp(key, "BeaconDuration") == 0) + } else if (::strcmp(key, "BeaconDuration") == 0) m_dmrBeaconDuration = (unsigned int)::atoi(value); else if (::strcmp(key, "Id") == 0) m_dmrId = (unsigned int)::atoi(value); @@ -1174,7 +1175,7 @@ bool CConf::getDMREnabled() const return m_dmrEnabled; } -bool CConf::getDMRBeacons() const +DMR_BEACONS CConf::getDMRBeacons() const { return m_dmrBeacons; } diff --git a/Conf.h b/Conf.h index f5b871b..fa8142d 100644 --- a/Conf.h +++ b/Conf.h @@ -119,7 +119,7 @@ public: // The DMR section bool getDMREnabled() const; - bool getDMRBeacons() const; + DMR_BEACONS getDMRBeacons() const; unsigned int getDMRBeaconInterval() const; unsigned int getDMRBeaconDuration() const; unsigned int getDMRId() const; diff --git a/Defines.h b/Defines.h index a6da8fe..2f0baa8 100644 --- a/Defines.h +++ b/Defines.h @@ -64,4 +64,10 @@ enum RPT_NET_STATE { RS_NET_DATA }; +enum DMR_BEACONS { + DMR_BEACONS_OFF, + DMR_BEACONS_NETWORK, + DMR_BEACONS_TIMED +}; + #endif diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 9525ee4..a7d76ce 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -443,7 +443,7 @@ int CMMDVMHost::run() unsigned int txHang = m_conf.getDMRTXHang(); unsigned int jitter = m_conf.getDMRNetworkJitter(); m_dmrRFModeHang = m_conf.getDMRModeHang(); - bool dmrBeacons = m_conf.getDMRBeacons(); + DMR_BEACONS dmrBeacons = m_conf.getDMRBeacons(); bool ovcm = m_conf.getDMROVCM(); if (txHang > m_dmrRFModeHang) @@ -479,17 +479,33 @@ int CMMDVMHost::run() LogInfo(" Mode Hang: %us", m_dmrRFModeHang); LogInfo(" OVCM: %s", ovcm ? "on" : "off"); - if (dmrBeacons) { - unsigned int dmrBeaconInterval = m_conf.getDMRBeaconInterval(); - unsigned int dmrBeaconDuration = m_conf.getDMRBeaconDuration(); + switch (dmrBeacons) { + case DMR_BEACONS_NETWORK: { + unsigned int dmrBeaconDuration = m_conf.getDMRBeaconDuration(); - LogInfo(" DMR Roaming Beacon Interval: %us", dmrBeaconInterval); - LogInfo(" DMR Roaming Beacon Duration: %us", dmrBeaconDuration); + LogInfo(" DMR Roaming Beacons Type: network"); + LogInfo(" DMR Roaming Beacons Duration: %us", dmrBeaconDuration); - dmrBeaconDurationTimer.setTimeout(dmrBeaconDuration); + dmrBeaconDurationTimer.setTimeout(dmrBeaconDuration); + } + break; + case DMR_BEACONS_TIMED: { + unsigned int dmrBeaconInterval = m_conf.getDMRBeaconInterval(); + unsigned int dmrBeaconDuration = m_conf.getDMRBeaconDuration(); - dmrBeaconIntervalTimer.setTimeout(dmrBeaconInterval); - dmrBeaconIntervalTimer.start(); + LogInfo(" DMR Roaming Beacons Type: timed"); + LogInfo(" DMR Roaming Beacons Interval: %us", dmrBeaconInterval); + LogInfo(" DMR Roaming Beacons Duration: %us", dmrBeaconDuration); + + dmrBeaconDurationTimer.setTimeout(dmrBeaconDuration); + + dmrBeaconIntervalTimer.setTimeout(dmrBeaconInterval); + dmrBeaconIntervalTimer.start(); + } + break; + default: + LogInfo(" DMR Roaming Beacons Type: off"); + break; } 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); @@ -977,14 +993,32 @@ int CMMDVMHost::run() } } - dmrBeaconIntervalTimer.clock(ms); - if (dmrBeaconIntervalTimer.isRunning() && dmrBeaconIntervalTimer.hasExpired()) { - if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) { - if (!m_fixedMode && m_mode == MODE_IDLE) - setMode(MODE_DMR); - dmrBeaconIntervalTimer.start(); - dmrBeaconDurationTimer.start(); - } + switch (dmrBeacons) { + case DMR_BEACONS_TIMED: + dmrBeaconIntervalTimer.clock(ms); + if (dmrBeaconIntervalTimer.isRunning() && dmrBeaconIntervalTimer.hasExpired()) { + if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) { + if (!m_fixedMode && m_mode == MODE_IDLE) + setMode(MODE_DMR); + dmrBeaconIntervalTimer.start(); + dmrBeaconDurationTimer.start(); + } + } + break; + case DMR_BEACONS_NETWORK: + if (m_dmrNetwork != NULL) { + bool beacon = m_dmrNetwork->wantsBeacon(); + if (beacon) { + if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) { + if (!m_fixedMode && m_mode == MODE_IDLE) + setMode(MODE_DMR); + dmrBeaconDurationTimer.start(); + } + } + } + break; + default: + break; } dmrBeaconDurationTimer.clock(ms);