From cf0c70087d0431c3f15f62b432a1b3e5d139c4cd Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 15 Aug 2017 10:30:05 +0100 Subject: [PATCH] Add SelfOnly to P25 based on the DMR Id. --- Conf.cpp | 8 ++++++++ Conf.h | 2 ++ MMDVM.ini | 1 + MMDVMHost.cpp | 6 +++++- P25Control.cpp | 10 +++++++++- P25Control.h | 4 +++- 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 25e30f6..e19621f 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -126,6 +126,7 @@ m_fusionSQLEnabled(false), m_fusionSQL(0U), m_p25Enabled(false), m_p25NAC(0x293U), +m_p25SelfOnly(false), m_dstarNetworkEnabled(false), m_dstarGatewayAddress(), m_dstarGatewayPort(0U), @@ -466,6 +467,8 @@ bool CConf::read() m_p25NAC = (unsigned int)::strtoul(value, NULL, 16); else if (::strcmp(key, "OverrideUIDCheck") == 0) m_p25OverrideUID = ::atoi(value) == 1; + else if (::strcmp(key, "SelfOnly") == 0) + m_p25SelfOnly = ::atoi(value) == 1; } else if (section == SECTION_DSTAR_NETWORK) { if (::strcmp(key, "Enable") == 0) m_dstarNetworkEnabled = ::atoi(value) == 1; @@ -1090,6 +1093,11 @@ bool CConf::getP25OverrideUID() const return m_p25OverrideUID; } +bool CConf::getP25SelfOnly() const +{ + return m_p25SelfOnly; +} + std::string CConf::getTFTSerialPort() const { return m_tftSerialPort; diff --git a/Conf.h b/Conf.h index b66c12d..19b09b2 100644 --- a/Conf.h +++ b/Conf.h @@ -123,6 +123,7 @@ public: // The P25 section bool getP25Enabled() const; unsigned int getP25NAC() const; + bool getP25SelfOnly() const; // The D-Star Network section bool getDStarNetworkEnabled() const; @@ -280,6 +281,7 @@ private: bool m_p25Enabled; unsigned int m_p25NAC; + bool m_p25SelfOnly; bool m_dstarNetworkEnabled; std::string m_dstarGatewayAddress; diff --git a/MMDVM.ini b/MMDVM.ini index 1ab671e..0bb248b 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -92,6 +92,7 @@ RemoteGateway=0 [P25] Enable=1 NAC=293 +SelfOnly=0 OverrideUIDCheck=0 [D-Star Network] diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 3dae46e..ec184fd 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -425,13 +425,17 @@ int CMMDVMHost::run() CP25Control* p25 = NULL; if (m_p25Enabled) { unsigned int nac = m_conf.getP25NAC(); + unsigned int id = m_conf.getDMRId(); bool uidOverride = m_conf.getP25OverrideUID(); + bool selfOnly = m_conf.getP25SelfOnly(); LogInfo("P25 Parameters"); LogInfo(" NAC: $%03X", nac); + LogInfo(" Id: %u", id); LogInfo(" UID Override: %s", uidOverride ? "yes" : "no"); + LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); - p25 = new CP25Control(nac, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, rssi); + p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_lookup, rssi); } setMode(MODE_IDLE); diff --git a/P25Control.cpp b/P25Control.cpp index 35e6124..f6368dd 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -35,8 +35,10 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U #define WRITE_BIT(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) #define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) -CP25Control::CP25Control(unsigned int nac, bool uidOverride, CP25Network* network, CDisplay* display, unsigned int timeout, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper) : +CP25Control::CP25Control(unsigned int nac, unsigned int id, bool selfOnly, bool uidOverride, CP25Network* network, CDisplay* display, unsigned int timeout, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper) : m_nac(nac), +m_id(id), +m_selfOnly(selfOnly), m_uidOverride(uidOverride), m_network(network), m_display(display), @@ -234,6 +236,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) if (m_rfState == RS_RF_LISTENING) { unsigned int srcId = m_rfData.getSrcId(); + + if (m_selfOnly) { + if (srcId != m_id) + return false; + } + bool grp = m_rfData.getLCF() == P25_LCF_GROUP; unsigned int dstId = m_rfData.getDstId(); std::string source = m_lookup->find(srcId); diff --git a/P25Control.h b/P25Control.h index 5748ace..59dc2d3 100644 --- a/P25Control.h +++ b/P25Control.h @@ -36,7 +36,7 @@ class CP25Control { public: - CP25Control(unsigned int nac, bool uidOverride, CP25Network* network, CDisplay* display, unsigned int timeout, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper); + CP25Control(unsigned int nac, unsigned int id, bool selfOly, bool uidOverride, CP25Network* network, CDisplay* display, unsigned int timeout, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper); ~CP25Control(); bool writeModem(unsigned char* data, unsigned int len); @@ -47,6 +47,8 @@ public: private: unsigned int m_nac; + unsigned int m_id; + bool m_selfOnly; bool m_uidOverride; CP25Network* m_network; CDisplay* m_display;