From 9a1334e36dab8ee9cee16efea4062e0c753def5f Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sat, 6 May 2017 09:57:17 +0100 Subject: [PATCH] Allow seperate Ids and bug fixing. --- Conf.cpp | 28 +++++++++++++++++++-- Conf.h | 6 +++++ DMRGateway.cpp | 67 ++++++++++++++++++++++++++++++-------------------- Rewrite.cpp | 7 +++--- Version.h | 2 +- 5 files changed, 78 insertions(+), 32 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 4a21b9e..3544670 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -53,6 +53,7 @@ m_voiceEnabled(true), m_voiceLanguage("en_GB"), m_voiceDirectory(), m_dmrNetwork1Enabled(false), +m_dmrNetwork1Id(0U), m_dmrNetwork1Address(), m_dmrNetwork1Port(0U), m_dmrNetwork1Local(0U), @@ -62,6 +63,7 @@ m_dmrNetwork1Rewrites(), m_dmrNetwork1PrivateSlot1(false), m_dmrNetwork1PrivateSlot2(false), m_dmrNetwork2Enabled(false), +m_dmrNetwork2Id(0U), m_dmrNetwork2Address(), m_dmrNetwork2Port(0U), m_dmrNetwork2Local(0U), @@ -71,6 +73,7 @@ m_dmrNetwork2Rewrites(), m_dmrNetwork2PrivateSlot1(false), m_dmrNetwork2PrivateSlot2(false), m_xlxNetworkEnabled(false), +m_xlxNetworkId(0U), m_xlxNetworkAddress(), m_xlxNetworkPort(0U), m_xlxNetworkLocal(0U), @@ -162,6 +165,8 @@ bool CConf::read() } else if (section == SECTION_XLX_NETWORK) { if (::strcmp(key, "Enabled") == 0) m_xlxNetworkEnabled = ::atoi(value) == 1; + else if (::strcmp(key, "Id") == 0) + m_xlxNetworkId = (unsigned int)::atoi(value); else if (::strcmp(key, "Address") == 0) m_xlxNetworkAddress = value; else if (::strcmp(key, "Port") == 0) @@ -181,6 +186,8 @@ bool CConf::read() } else if (section == SECTION_DMR_NETWORK_1) { if (::strcmp(key, "Enabled") == 0) m_dmrNetwork1Enabled = ::atoi(value) == 1; + else if (::strcmp(key, "Id") == 0) + m_dmrNetwork1Id = (unsigned int)::atoi(value); else if (::strcmp(key, "Address") == 0) m_dmrNetwork1Address = value; else if (::strcmp(key, "Port") == 0) @@ -191,7 +198,7 @@ bool CConf::read() m_dmrNetwork1Password = value; else if (::strcmp(key, "Debug") == 0) m_dmrNetwork1Debug = ::atoi(value) == 1; - else if (::strcmp(key, "Rewrites") == 0) { + else if (::strcmp(key, "Rewrite") == 0) { char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); @@ -211,6 +218,8 @@ bool CConf::read() } else if (section == SECTION_DMR_NETWORK_2) { if (::strcmp(key, "Enabled") == 0) m_dmrNetwork2Enabled = ::atoi(value) == 1; + else if (::strcmp(key, "Id") == 0) + m_dmrNetwork2Id = (unsigned int)::atoi(value); else if (::strcmp(key, "Address") == 0) m_dmrNetwork2Address = value; else if (::strcmp(key, "Port") == 0) @@ -221,7 +230,7 @@ bool CConf::read() m_dmrNetwork2Password = value; else if (::strcmp(key, "Debug") == 0) m_dmrNetwork2Debug = ::atoi(value) == 1; - else if (::strcmp(key, "Rewrites") == 0) { + else if (::strcmp(key, "Rewrite") == 0) { char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); @@ -321,6 +330,11 @@ bool CConf::getXLXNetworkEnabled() const return m_xlxNetworkEnabled; } +unsigned int CConf::getXLXNetworkId() const +{ + return m_xlxNetworkId; +} + std::string CConf::getXLXNetworkAddress() const { return m_xlxNetworkAddress; @@ -366,6 +380,11 @@ bool CConf::getDMRNetwork1Enabled() const return m_dmrNetwork1Enabled; } +unsigned int CConf::getDMRNetwork1Id() const +{ + return m_dmrNetwork1Id; +} + std::string CConf::getDMRNetwork1Address() const { return m_dmrNetwork1Address; @@ -411,6 +430,11 @@ bool CConf::getDMRNetwork2Enabled() const return m_dmrNetwork2Enabled; } +unsigned int CConf::getDMRNetwork2Id() const +{ + return m_dmrNetwork2Id; +} + std::string CConf::getDMRNetwork2Address() const { return m_dmrNetwork2Address; diff --git a/Conf.h b/Conf.h index ad21ecd..a4f26ca 100644 --- a/Conf.h +++ b/Conf.h @@ -59,6 +59,7 @@ public: // The DMR Network 1 section bool getDMRNetwork1Enabled() const; + unsigned int getDMRNetwork1Id() const; std::string getDMRNetwork1Address() const; unsigned int getDMRNetwork1Port() const; unsigned int getDMRNetwork1Local() const; @@ -70,6 +71,7 @@ public: // The DMR Network 2 section bool getDMRNetwork2Enabled() const; + unsigned int getDMRNetwork2Id() const; std::string getDMRNetwork2Address() const; unsigned int getDMRNetwork2Port() const; unsigned int getDMRNetwork2Local() const; @@ -81,6 +83,7 @@ public: // The XLX Network section bool getXLXNetworkEnabled() const; + unsigned int getXLXNetworkId() const; std::string getXLXNetworkAddress() const; unsigned int getXLXNetworkPort() const; unsigned int getXLXNetworkLocal() const; @@ -110,6 +113,7 @@ private: std::string m_logFileRoot; bool m_dmrNetwork1Enabled; + unsigned int m_dmrNetwork1Id; std::string m_dmrNetwork1Address; unsigned int m_dmrNetwork1Port; unsigned int m_dmrNetwork1Local; @@ -117,6 +121,7 @@ private: bool m_dmrNetwork1Debug; bool m_dmrNetwork2Enabled; + unsigned int m_dmrNetwork2Id; std::string m_dmrNetwork2Address; unsigned int m_dmrNetwork2Port; unsigned int m_dmrNetwork2Local; @@ -127,6 +132,7 @@ private: bool m_dmrNetwork1PrivateSlot2; bool m_xlxNetworkEnabled; + unsigned int m_xlxNetworkId; std::string m_xlxNetworkAddress; unsigned int m_xlxNetworkPort; unsigned int m_xlxNetworkLocal; diff --git a/DMRGateway.cpp b/DMRGateway.cpp index c9f1462..252fcd4 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -248,13 +248,6 @@ int CDMRGateway::run() LogMessage("MMDVM has connected"); - unsigned int timeout = m_conf.getTimeout(); - - LogInfo("Id: %u", m_repeater->getId()); - - CRewrite rptRewrite(XLX_SLOT, XLX_TG, m_xlxSlot, m_xlxTG); - CRewrite xlxRewrite(m_xlxSlot, m_xlxTG, XLX_SLOT, XLX_TG); - if (m_conf.getDMRNetwork1Enabled()) { ret = createDMRNetwork1(); if (!ret) @@ -273,6 +266,11 @@ int CDMRGateway::run() return 1; } + unsigned int timeout = m_conf.getTimeout(); + + CRewrite rptRewrite(XLX_SLOT, XLX_TG, m_xlxSlot, m_xlxTG); + CRewrite xlxRewrite(m_xlxSlot, m_xlxTG, XLX_SLOT, XLX_TG); + CVoice* voice = NULL; if (m_conf.getVoiceEnabled() && m_xlxNetwork != NULL) { std::string language = m_conf.getVoiceLanguage(); @@ -368,9 +366,10 @@ int CDMRGateway::run() timer[slotNo]->start(); } } else { + bool rewritten = false; + if (m_dmrNetwork1 != NULL) { // Rewrite the slot and/or TG or neither - bool rewritten = false; for (std::vector::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) { bool ret = (*it)->process(data); if (ret) { @@ -389,23 +388,24 @@ int CDMRGateway::run() } } - if (m_dmrNetwork2 != NULL) { - // Rewrite the slot and/or TG or neither - bool rewritten = false; - for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) { - bool ret = (*it)->process(data); - if (ret) { - rewritten = true; - break; + if (!rewritten) { + if (m_dmrNetwork2 != NULL) { + // Rewrite the slot and/or TG or neither + for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) { + bool ret = (*it)->process(data); + if (ret) { + rewritten = true; + break; + } } - } - if (rewritten) { - unsigned int slotNo = data.getSlotNo(); - if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_NETWORK2) { - m_dmrNetwork2->write(data); - status[slotNo] = DMRGWS_NETWORK2; - timer[slotNo]->start(); + if (rewritten) { + unsigned int slotNo = data.getSlotNo(); + if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_NETWORK2) { + m_dmrNetwork2->write(data); + status[slotNo] = DMRGWS_NETWORK2; + timer[slotNo]->start(); + } } } } @@ -575,6 +575,9 @@ int CDMRGateway::run() delete m_xlxNetwork; } + delete timer[1U]; + delete timer[2U]; + return 0; } @@ -609,11 +612,15 @@ bool CDMRGateway::createDMRNetwork1() std::string address = m_conf.getDMRNetwork1Address(); unsigned int port = m_conf.getDMRNetwork1Port(); unsigned int local = m_conf.getDMRNetwork1Local(); - unsigned int id = m_repeater->getId(); + unsigned int id = m_conf.getDMRNetwork1Id(); std::string password = m_conf.getDMRNetwork1Password(); bool debug = m_conf.getDMRNetwork1Debug(); + if (id == 0U) + id = m_repeater->getId(); + LogInfo("DMR Network 1 Parameters"); + LogInfo(" Id: %u", id); LogInfo(" Address: %s", address.c_str()); LogInfo(" Port: %u", port); if (local > 0U) @@ -666,11 +673,15 @@ bool CDMRGateway::createDMRNetwork2() std::string address = m_conf.getDMRNetwork2Address(); unsigned int port = m_conf.getDMRNetwork2Port(); unsigned int local = m_conf.getDMRNetwork2Local(); - unsigned int id = m_repeater->getId(); + unsigned int id = m_conf.getDMRNetwork2Id(); std::string password = m_conf.getDMRNetwork2Password(); bool debug = m_conf.getDMRNetwork2Debug(); + if (id == 0U) + id = m_repeater->getId(); + LogInfo("DMR Network 2 Parameters"); + LogInfo(" Id: %u", id); LogInfo(" Address: %s", address.c_str()); LogInfo(" Port: %u", port); if (local > 0U) @@ -723,12 +734,16 @@ bool CDMRGateway::createXLXNetwork() std::string address = m_conf.getXLXNetworkAddress(); unsigned int port = m_conf.getXLXNetworkPort(); unsigned int local = m_conf.getXLXNetworkLocal(); - unsigned int id = m_repeater->getId(); + unsigned int id = m_conf.getXLXNetworkId(); std::string password = m_conf.getXLXNetworkPassword(); std::string options = m_conf.getXLXNetworkOptions(); bool debug = m_conf.getXLXNetworkDebug(); + if (id == 0U) + id = m_repeater->getId(); + LogInfo("XLX Network Parameters"); + LogInfo(" Id: %u", id); LogInfo(" Address: %s", address.c_str()); LogInfo(" Port: %u", port); if (local > 0U) diff --git a/Rewrite.cpp b/Rewrite.cpp index 349004e..835d456 100644 --- a/Rewrite.cpp +++ b/Rewrite.cpp @@ -85,12 +85,13 @@ void CRewrite::processHeader(CDMRData& data, unsigned char dataType) data.getData(buffer); delete m_lc; - m_lc = NULL; CDMRFullLC fullLC; m_lc = fullLC.decode(buffer, dataType); - if (m_lc == NULL) - return; + if (m_lc == NULL) { + m_lc = new CDMRLC(FLCO_GROUP, data.getSrcId(), m_toTG); + m_embeddedLC.setLC(*m_lc); + } m_lc->setDstId(m_toTG); diff --git a/Version.h b/Version.h index cb3e3b7..e5b708e 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20170503"; +const char* VERSION = "20170506"; #endif