From 6b470c92a7729e019649bccc9c70e2b5ab61e509 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 7 Apr 2020 23:03:27 +0100 Subject: [PATCH] Allow for excluded TGs. --- Conf.cpp | 50 +++++++++++++++-- Conf.h | 1 + DMRGateway.cpp | 133 ++++++++++++++++++++++++++++++++++----------- DMRGateway.h | 11 ++-- DMRGateway.ini | 4 +- DynVoice.cpp | 21 +++---- DynVoice.h | 4 +- RewriteDynTGRF.cpp | 14 +++-- RewriteDynTGRF.h | 4 +- Version.h | 2 +- 10 files changed, 178 insertions(+), 66 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index e714a31..1765a76 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -406,12 +406,16 @@ bool CConf::read() m_dmrNetwork1SrcRewrites.push_back(rewrite); } } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { + std::vector p7; char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); char* p4 = ::strtok(NULL, ", "); char* p5 = ::strtok(NULL, ", "); - char* p6 = ::strtok(NULL, " \r\n"); + char* p6 = ::strtok(NULL, ", \r\n"); + char* p; + while ((p = ::strtok(NULL, ", \r\n")) != NULL) + p7.push_back(p); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) { CTGDynRewriteStruct rewrite; rewrite.m_slot = ::atoi(p1); @@ -420,6 +424,10 @@ bool CConf::read() rewrite.m_statusPC = ::atoi(p4); rewrite.m_toTG = ::atoi(p5); rewrite.m_range = ::atoi(p6); + for (std::vector::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) { + unsigned int tg = ::atoi(*it); + rewrite.m_exclTGs.push_back(tg); + } m_dmrNetwork1TGDynRewrites.push_back(rewrite); } } else if (::strncmp(key, "IdRewrite", 9U) == 0) { @@ -518,12 +526,16 @@ bool CConf::read() m_dmrNetwork2SrcRewrites.push_back(rewrite); } } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { + std::vector p7; char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); char* p4 = ::strtok(NULL, ", "); char* p5 = ::strtok(NULL, ", "); - char* p6 = ::strtok(NULL, " \r\n"); + char* p6 = ::strtok(NULL, ", \r\n"); + char* p; + while ((p = ::strtok(NULL, ", \r\n")) != NULL) + p7.push_back(p); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) { CTGDynRewriteStruct rewrite; rewrite.m_slot = ::atoi(p1); @@ -532,6 +544,10 @@ bool CConf::read() rewrite.m_statusPC = ::atoi(p4); rewrite.m_toTG = ::atoi(p5); rewrite.m_range = ::atoi(p6); + for (std::vector::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) { + unsigned int tg = ::atoi(*it); + rewrite.m_exclTGs.push_back(tg); + } m_dmrNetwork2TGDynRewrites.push_back(rewrite); } } else if (::strncmp(key, "IdRewrite", 9U) == 0) { @@ -630,12 +646,16 @@ bool CConf::read() m_dmrNetwork3SrcRewrites.push_back(rewrite); } } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { + std::vector p7; char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); char* p4 = ::strtok(NULL, ", "); char* p5 = ::strtok(NULL, ", "); - char* p6 = ::strtok(NULL, " \r\n"); + char* p6 = ::strtok(NULL, ", \r\n"); + char* p; + while ((p = ::strtok(NULL, ", \r\n")) != NULL) + p7.push_back(p); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) { CTGDynRewriteStruct rewrite; rewrite.m_slot = ::atoi(p1); @@ -644,6 +664,10 @@ bool CConf::read() rewrite.m_statusPC = ::atoi(p4); rewrite.m_toTG = ::atoi(p5); rewrite.m_range = ::atoi(p6); + for (std::vector::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) { + unsigned int tg = ::atoi(*it); + rewrite.m_exclTGs.push_back(tg); + } m_dmrNetwork3TGDynRewrites.push_back(rewrite); } } else if (::strncmp(key, "IdRewrite", 9U) == 0) { @@ -742,12 +766,16 @@ bool CConf::read() m_dmrNetwork4SrcRewrites.push_back(rewrite); } } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { + std::vector p7; char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); char* p4 = ::strtok(NULL, ", "); char* p5 = ::strtok(NULL, ", "); - char* p6 = ::strtok(NULL, " \r\n"); + char* p6 = ::strtok(NULL, ", \r\n"); + char* p; + while ((p = ::strtok(NULL, ", \r\n")) != NULL) + p7.push_back(p); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) { CTGDynRewriteStruct rewrite; rewrite.m_slot = ::atoi(p1); @@ -756,6 +784,10 @@ bool CConf::read() rewrite.m_statusPC = ::atoi(p4); rewrite.m_toTG = ::atoi(p5); rewrite.m_range = ::atoi(p6); + for (std::vector::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) { + unsigned int tg = ::atoi(*it); + rewrite.m_exclTGs.push_back(tg); + } m_dmrNetwork4TGDynRewrites.push_back(rewrite); } } else if (::strncmp(key, "IdRewrite", 9U) == 0) { @@ -854,12 +886,16 @@ bool CConf::read() m_dmrNetwork5SrcRewrites.push_back(rewrite); } } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { + std::vector p7; char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(NULL, ", "); char* p3 = ::strtok(NULL, ", "); char* p4 = ::strtok(NULL, ", "); char* p5 = ::strtok(NULL, ", "); - char* p6 = ::strtok(NULL, " \r\n"); + char* p6 = ::strtok(NULL, ", \r\n"); + char* p; + while ((p = ::strtok(NULL, ", \r\n")) != NULL) + p7.push_back(p); if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) { CTGDynRewriteStruct rewrite; rewrite.m_slot = ::atoi(p1); @@ -868,6 +904,10 @@ bool CConf::read() rewrite.m_statusPC = ::atoi(p4); rewrite.m_toTG = ::atoi(p5); rewrite.m_range = ::atoi(p6); + for (std::vector::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) { + unsigned int tg = ::atoi(*it); + rewrite.m_exclTGs.push_back(tg); + } m_dmrNetwork5TGDynRewrites.push_back(rewrite); } } else if (::strncmp(key, "IdRewrite", 9U) == 0) { diff --git a/Conf.h b/Conf.h index 59c4100..2df5ede 100644 --- a/Conf.h +++ b/Conf.h @@ -60,6 +60,7 @@ struct CTGDynRewriteStruct { unsigned int m_statusPC; unsigned int m_toTG; unsigned int m_range; + std::vector m_exclTGs; }; struct CIdRewriteStruct { diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 4b9a302..f76a071 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -180,7 +180,8 @@ m_dmr1Passalls(), m_dmr2Passalls(), m_dmr3Passalls(), m_dmr4Passalls(), -m_dmr5Passalls() +m_dmr5Passalls(), +m_dynVoices() { m_status = new DMRGW_STATUS[3U]; m_status[1U] = DMRGWS_NONE; @@ -201,10 +202,10 @@ CDMRGateway::~CDMRGateway() delete *it; for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) - delete *it; + delete *it; for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) - delete *it; + delete *it; for (std::vector::iterator it = m_dmr2SrcRewrites.begin(); it != m_dmr2SrcRewrites.end(); ++it) delete *it; @@ -251,6 +252,9 @@ CDMRGateway::~CDMRGateway() for (std::vector::iterator it = m_dmr5Passalls.begin(); it != m_dmr5Passalls.end(); ++it) delete *it; + for (std::vector::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it) + delete* it; + delete m_rptRewrite; delete m_xlxRewrite; @@ -377,8 +381,6 @@ int CDMRGateway::run() } CXLXVoice* xlxVoice = NULL; - CDynVoice* dynVoice = NULL; - if (m_conf.getVoiceEnabled()) { std::string language = m_conf.getVoiceLanguage(); std::string directory = m_conf.getVoiceDirectory(); @@ -396,41 +398,34 @@ int CDMRGateway::run() xlxVoice = NULL; } } - - dynVoice = new CDynVoice(directory, language, m_repeater->getId()); - bool ret = dynVoice->open(); - if (!ret) { - delete dynVoice; - dynVoice = NULL; - } } if (m_conf.getDMRNetwork1Enabled()) { - ret = createDMRNetwork1(dynVoice); + ret = createDMRNetwork1(); if (!ret) return 1; } if (m_conf.getDMRNetwork2Enabled()) { - ret = createDMRNetwork2(dynVoice); + ret = createDMRNetwork2(); if (!ret) return 1; } if (m_conf.getDMRNetwork3Enabled()) { - ret = createDMRNetwork3(dynVoice); + ret = createDMRNetwork3(); if (!ret) return 1; } if (m_conf.getDMRNetwork4Enabled()) { - ret = createDMRNetwork4(dynVoice); + ret = createDMRNetwork4(); if (!ret) return 1; } if (m_conf.getDMRNetwork5Enabled()) { - ret = createDMRNetwork5(dynVoice); + ret = createDMRNetwork5(); if (!ret) return 1; } @@ -1132,8 +1127,8 @@ int CDMRGateway::run() } } - if (dynVoice != NULL) { - ret = dynVoice->read(data); + for (std::vector::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it) { + ret = (*it)->read(data); if (ret) m_repeater->write(data); } @@ -1169,8 +1164,8 @@ int CDMRGateway::run() if (xlxVoice != NULL) xlxVoice->clock(ms); - if (dynVoice != NULL) - dynVoice->clock(ms); + for (std::vector::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it) + (*it)->clock(ms); for (unsigned int i = 1U; i < 3U; i++) { timer[i]->clock(ms); @@ -1185,7 +1180,6 @@ int CDMRGateway::run() } delete xlxVoice; - delete dynVoice; m_repeater->close(); delete m_repeater; @@ -1254,7 +1248,7 @@ bool CDMRGateway::createMMDVM() return true; } -bool CDMRGateway::createDMRNetwork1(CDynVoice* voice) +bool CDMRGateway::createDMRNetwork1() { std::string address = m_conf.getDMRNetwork1Address(); unsigned int port = m_conf.getDMRNetwork1Port(); @@ -1360,8 +1354,23 @@ bool CDMRGateway::createDMRNetwork1(CDynVoice* voice) for (std::vector::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) { LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC); + CDynVoice* voice = NULL; + if (m_conf.getVoiceEnabled()) { + std::string language = m_conf.getVoiceLanguage(); + std::string directory = m_conf.getVoiceDirectory(); + + voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG); + bool ret = voice->open(); + if (!ret) { + delete voice; + voice = NULL; + } else { + m_dynVoices.push_back(voice); + } + } + CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr1Name, (*it).m_slot, (*it).m_toTG); - CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr1Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice); + CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr1Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice); m_dmr1RFRewrites.push_back(rfRewriteDynTG); m_dmr1NetRewrites.push_back(netRewriteDynTG); @@ -1403,7 +1412,7 @@ bool CDMRGateway::createDMRNetwork1(CDynVoice* voice) return true; } -bool CDMRGateway::createDMRNetwork2(CDynVoice* voice) +bool CDMRGateway::createDMRNetwork2() { std::string address = m_conf.getDMRNetwork2Address(); unsigned int port = m_conf.getDMRNetwork2Port(); @@ -1509,8 +1518,23 @@ bool CDMRGateway::createDMRNetwork2(CDynVoice* voice) for (std::vector::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) { LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC); + CDynVoice* voice = NULL; + if (m_conf.getVoiceEnabled()) { + std::string language = m_conf.getVoiceLanguage(); + std::string directory = m_conf.getVoiceDirectory(); + + voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG); + bool ret = voice->open(); + if (!ret) { + delete voice; + voice = NULL; + } else { + m_dynVoices.push_back(voice); + } + } + CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr2Name, (*it).m_slot, (*it).m_toTG); - CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr2Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice); + CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr2Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice); m_dmr2RFRewrites.push_back(rfRewriteDynTG); m_dmr2NetRewrites.push_back(netRewriteDynTG); @@ -1552,7 +1576,7 @@ bool CDMRGateway::createDMRNetwork2(CDynVoice* voice) return true; } -bool CDMRGateway::createDMRNetwork3(CDynVoice* voice) +bool CDMRGateway::createDMRNetwork3() { std::string address = m_conf.getDMRNetwork3Address(); unsigned int port = m_conf.getDMRNetwork3Port(); @@ -1658,8 +1682,23 @@ bool CDMRGateway::createDMRNetwork3(CDynVoice* voice) for (std::vector::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) { LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC); + CDynVoice* voice = NULL; + if (m_conf.getVoiceEnabled()) { + std::string language = m_conf.getVoiceLanguage(); + std::string directory = m_conf.getVoiceDirectory(); + + voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG); + bool ret = voice->open(); + if (!ret) { + delete voice; + voice = NULL; + } else { + m_dynVoices.push_back(voice); + } + } + CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr3Name, (*it).m_slot, (*it).m_toTG); - CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr3Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice); + CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr3Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice); m_dmr3RFRewrites.push_back(rfRewriteDynTG); m_dmr3NetRewrites.push_back(netRewriteDynTG); @@ -1701,7 +1740,7 @@ bool CDMRGateway::createDMRNetwork3(CDynVoice* voice) return true; } -bool CDMRGateway::createDMRNetwork4(CDynVoice* voice) +bool CDMRGateway::createDMRNetwork4() { std::string address = m_conf.getDMRNetwork4Address(); unsigned int port = m_conf.getDMRNetwork4Port(); @@ -1807,8 +1846,23 @@ bool CDMRGateway::createDMRNetwork4(CDynVoice* voice) for (std::vector::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) { LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC); + CDynVoice* voice = NULL; + if (m_conf.getVoiceEnabled()) { + std::string language = m_conf.getVoiceLanguage(); + std::string directory = m_conf.getVoiceDirectory(); + + voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG); + bool ret = voice->open(); + if (!ret) { + delete voice; + voice = NULL; + } else { + m_dynVoices.push_back(voice); + } + } + CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr4Name, (*it).m_slot, (*it).m_toTG); - CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr4Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice); + CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr4Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice); m_dmr4RFRewrites.push_back(rfRewriteDynTG); m_dmr4NetRewrites.push_back(netRewriteDynTG); @@ -1850,7 +1904,7 @@ bool CDMRGateway::createDMRNetwork4(CDynVoice* voice) return true; } -bool CDMRGateway::createDMRNetwork5(CDynVoice* voice) +bool CDMRGateway::createDMRNetwork5() { std::string address = m_conf.getDMRNetwork5Address(); unsigned int port = m_conf.getDMRNetwork5Port(); @@ -1956,8 +2010,23 @@ bool CDMRGateway::createDMRNetwork5(CDynVoice* voice) for (std::vector::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) { LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC); + CDynVoice* voice = NULL; + if (m_conf.getVoiceEnabled()) { + std::string language = m_conf.getVoiceLanguage(); + std::string directory = m_conf.getVoiceDirectory(); + + voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG); + bool ret = voice->open(); + if (!ret) { + delete voice; + voice = NULL; + } else { + m_dynVoices.push_back(voice); + } + } + CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr5Name, (*it).m_slot, (*it).m_toTG); - CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr5Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice); + CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr5Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice); m_dmr5RFRewrites.push_back(rfRewriteDynTG); m_dmr5NetRewrites.push_back(netRewriteDynTG); diff --git a/DMRGateway.h b/DMRGateway.h index f8debbd..fd5c6b3 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -105,13 +105,14 @@ private: std::vector m_dmr3Passalls; std::vector m_dmr4Passalls; std::vector m_dmr5Passalls; + std::vector m_dynVoices; bool createMMDVM(); - bool createDMRNetwork1(CDynVoice* voice); - bool createDMRNetwork2(CDynVoice* voice); - bool createDMRNetwork3(CDynVoice* voice); - bool createDMRNetwork4(CDynVoice* voice); - bool createDMRNetwork5(CDynVoice* voice); + bool createDMRNetwork1(); + bool createDMRNetwork2(); + bool createDMRNetwork3(); + bool createDMRNetwork4(); + bool createDMRNetwork5(); bool createXLXNetwork(); bool linkXLX(unsigned int number); diff --git a/DMRGateway.ini b/DMRGateway.ini index 6789f4e..bc8a390 100644 --- a/DMRGateway.ini +++ b/DMRGateway.ini @@ -70,8 +70,8 @@ TypeRewrite=1,9990,1,9990 SrcRewrite=1,9990,1,9990,1 # Reflector status returns SrcRewrite=2,4000,2,9,1001 -# Dynamic rewriting of slot 2 TGs 23500-23599 to TG9 to emulate reflector behaviour -TGDynRewrite=2,23500,4000,5000,9,100 +# Dynamic rewriting of slot 2 TGs 90-999999 to TG9 to emulate reflector behaviour +TGDynRewrite=2,90,4000,5000,9,999909,4000,5000,9900 # Pass all of the other private traffic on slot 1 and slot 2 PassAllPC=1 PassAllPC=2 diff --git a/DynVoice.cpp b/DynVoice.cpp index bb32dc0..380a890 100644 --- a/DynVoice.cpp +++ b/DynVoice.cpp @@ -35,11 +35,11 @@ const unsigned char COLOR_CODE = 3U; const unsigned int SILENCE_LENGTH = 9U; const unsigned int AMBE_LENGTH = 9U; -CDynVoice::CDynVoice(const std::string& directory, const std::string& language, unsigned int id) : +CDynVoice::CDynVoice(const std::string& directory, const std::string& language, unsigned int id, unsigned int slot, unsigned int tg) : m_indxFile(), m_ambeFile(), m_id(id), -m_slot(0U), +m_slot(slot), m_lc(), m_embeddedLC(), m_status(DYNVS_NONE), @@ -60,6 +60,12 @@ m_it() m_indxFile = directory + "/" + language + ".indx"; m_ambeFile = directory + "/" + language + ".ambe"; #endif + + m_lc.setFLCO(FLCO_GROUP); + m_lc.setSrcId(id); + m_lc.setDstId(tg); + + m_embeddedLC.setLC(m_lc); } CDynVoice::~CDynVoice() @@ -76,17 +82,6 @@ CDynVoice::~CDynVoice() delete[] m_ambe; } -void CDynVoice::setSlotAndTG(unsigned int slot, unsigned int tg) -{ - m_slot = slot; - - m_lc.setFLCO(FLCO_GROUP); - m_lc.setSrcId(m_id); - m_lc.setDstId(tg); - - m_embeddedLC.setLC(m_lc); -} - bool CDynVoice::open() { FILE* fpindx = ::fopen(m_indxFile.c_str(), "rt"); diff --git a/DynVoice.h b/DynVoice.h index 755145e..53b269f 100644 --- a/DynVoice.h +++ b/DynVoice.h @@ -42,11 +42,9 @@ struct CDynPositions { class CDynVoice { public: - CDynVoice(const std::string& directory, const std::string& language, unsigned int id); + CDynVoice(const std::string& directory, const std::string& language, unsigned int id, unsigned int slot, unsigned int tg); ~CDynVoice(); - void setSlotAndTG(unsigned int slot, unsigned int tg); - bool open(); void linkedTo(unsigned int number); diff --git a/RewriteDynTGRF.cpp b/RewriteDynTGRF.cpp index d748862..3829953 100644 --- a/RewriteDynTGRF.cpp +++ b/RewriteDynTGRF.cpp @@ -23,8 +23,9 @@ #include #include +#include -CRewriteDynTGRF::CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, CRewriteDynTGNet* rewriteNet, CDynVoice* voice) : +CRewriteDynTGRF::CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, const std::vector& exclTGs, CRewriteDynTGNet* rewriteNet, CDynVoice* voice) : CRewrite(), m_name(name), m_slot(slot), @@ -33,15 +34,13 @@ m_fromTGEnd(fromTG + range - 1U), m_toTG(toTG), m_discPC(discPC), m_statusPC(statusPC), +m_exclTGs(exclTGs), m_rewriteNet(rewriteNet), m_voice(voice), m_currentTG(0U) { assert(slot == 1U || slot == 2U); assert(rewriteNet != NULL); - - if (voice != NULL) - voice->setSlotAndTG(slot, toTG); } CRewriteDynTGRF::~CRewriteDynTGRF() @@ -66,6 +65,13 @@ PROCESS_RESULT CRewriteDynTGRF::process(CDMRData& data, bool trace) return RESULT_MATCHED; } + if (flco == FLCO_GROUP && std::find(m_exclTGs.cbegin(), m_exclTGs.cend(), dstId) != m_exclTGs.cend()) { + if (trace) + LogDebug("Rule Trace,\tRewriteDynTGRF from %s Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_slot, dstId); + + return RESULT_UNMATCHED; + } + if (flco == FLCO_USER_USER && slotNo == m_slot && dstId == m_discPC && m_currentTG != 0U) { if (trace) LogDebug("Rule Trace,\tRewriteDynTGRF from %s Slot=%u Dst=%u: matched", m_name.c_str(), m_slot, m_discPC); diff --git a/RewriteDynTGRF.h b/RewriteDynTGRF.h index 17146f6..8e6a8d4 100644 --- a/RewriteDynTGRF.h +++ b/RewriteDynTGRF.h @@ -26,10 +26,11 @@ #include "RewriteDynTGNet.h" #include +#include class CRewriteDynTGRF : public CRewrite { public: - CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, CRewriteDynTGNet* rewriteNet, CDynVoice* voice); + CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, const std::vector& exclTGs, CRewriteDynTGNet* rewriteNet, CDynVoice* voice); virtual ~CRewriteDynTGRF(); virtual PROCESS_RESULT process(CDMRData& data, bool trace); @@ -42,6 +43,7 @@ private: unsigned int m_toTG; unsigned int m_discPC; unsigned int m_statusPC; + std::vector m_exclTGs; CRewriteDynTGNet* m_rewriteNet; CDynVoice* m_voice; unsigned int m_currentTG; diff --git a/Version.h b/Version.h index 093d5d4..cfa3710 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200406"; +const char* VERSION = "20200407"; #endif