From 68e68c9c79d2def441651e915d8894d9488042e7 Mon Sep 17 00:00:00 2001 From: Alexander Mokrov UR6LKW Date: Sun, 1 Jun 2025 17:04:44 +0300 Subject: [PATCH 1/5] [unlim-networks] indentation fix --- Conf.cpp | 156 +++++++++++++++++++++++++++---------------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 038b90b..2c92546 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -197,80 +197,80 @@ CConf::~CConf() bool CConf::read() { - FILE* fp = ::fopen(m_file.c_str(), "rt"); - if (fp == nullptr) { - ::fprintf(stderr, "Couldn't open the .ini file - %s\n", m_file.c_str()); - return false; - } - - SECTION section = SECTION::NONE; - - char buffer[BUFFER_SIZE]; - while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) { - if (buffer[0U] == '#') - continue; - - if (buffer[0U] == '[') { - if (::strncmp(buffer, "[General]", 9U) == 0) - section = SECTION::GENERAL; - else if (::strncmp(buffer, "[Log]", 5U) == 0) - section = SECTION::LOG; - else if (::strncmp(buffer, "[Voice]", 7U) == 0) - section = SECTION::VOICE; - else if (::strncmp(buffer, "[Info]", 6U) == 0) - section = SECTION::INFO; - else if (::strncmp(buffer, "[XLX Network]", 13U) == 0) - section = SECTION::XLX_NETWORK; - else if (::strncmp(buffer, "[DMR Network 1]", 15U) == 0) - section = SECTION::DMR_NETWORK_1; - else if (::strncmp(buffer, "[DMR Network 2]", 15U) == 0) - section = SECTION::DMR_NETWORK_2; - else if (::strncmp(buffer, "[DMR Network 3]", 15U) == 0) - section = SECTION::DMR_NETWORK_3; - else if (::strncmp(buffer, "[DMR Network 4]", 15U) == 0) - section = SECTION::DMR_NETWORK_4; - else if (::strncmp(buffer, "[DMR Network 5]", 15U) == 0) - section = SECTION::DMR_NETWORK_5; - else if (::strncmp(buffer, "[GPSD]", 6U) == 0) - section = SECTION::GPSD; - else if (::strncmp(buffer, "[APRS]", 6U) == 0) - section = SECTION::APRS; - else if (::strncmp(buffer, "[Dynamic TG Control]", 20U) == 0) - section = SECTION::DYNAMIC_TG_CONTROL; - else if (::strncmp(buffer, "[Remote Control]", 16U) == 0) - section = SECTION::REMOTE_CONTROL; - else - section = SECTION::NONE; - - continue; + FILE* fp = ::fopen(m_file.c_str(), "rt"); + if (fp == nullptr) { + ::fprintf(stderr, "Couldn't open the .ini file - %s\n", m_file.c_str()); + return false; } - char* key = ::strtok(buffer, " \t=\r\n"); - if (key == nullptr) - continue; + SECTION section = SECTION::NONE; - char* value = ::strtok(nullptr, "\r\n"); - if (value == nullptr) - continue; + char buffer[BUFFER_SIZE]; + while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) { + if (buffer[0U] == '#') + continue; - // Remove quotes from the value - size_t len = ::strlen(value); - if (len > 1U && *value == '"' && value[len - 1U] == '"') { - value[len - 1U] = '\0'; - value++; - } else { - char *p; + if (buffer[0U] == '[') { + if (::strncmp(buffer, "[General]", 9U) == 0) + section = SECTION::GENERAL; + else if (::strncmp(buffer, "[Log]", 5U) == 0) + section = SECTION::LOG; + else if (::strncmp(buffer, "[Voice]", 7U) == 0) + section = SECTION::VOICE; + else if (::strncmp(buffer, "[Info]", 6U) == 0) + section = SECTION::INFO; + else if (::strncmp(buffer, "[XLX Network]", 13U) == 0) + section = SECTION::XLX_NETWORK; + else if (::strncmp(buffer, "[DMR Network 1]", 15U) == 0) + section = SECTION::DMR_NETWORK_1; + else if (::strncmp(buffer, "[DMR Network 2]", 15U) == 0) + section = SECTION::DMR_NETWORK_2; + else if (::strncmp(buffer, "[DMR Network 3]", 15U) == 0) + section = SECTION::DMR_NETWORK_3; + else if (::strncmp(buffer, "[DMR Network 4]", 15U) == 0) + section = SECTION::DMR_NETWORK_4; + else if (::strncmp(buffer, "[DMR Network 5]", 15U) == 0) + section = SECTION::DMR_NETWORK_5; + else if (::strncmp(buffer, "[GPSD]", 6U) == 0) + section = SECTION::GPSD; + else if (::strncmp(buffer, "[APRS]", 6U) == 0) + section = SECTION::APRS; + else if (::strncmp(buffer, "[Dynamic TG Control]", 20U) == 0) + section = SECTION::DYNAMIC_TG_CONTROL; + else if (::strncmp(buffer, "[Remote Control]", 16U) == 0) + section = SECTION::REMOTE_CONTROL; + else + section = SECTION::NONE; - // if value is not quoted, remove after # (to make comment) - if ((p = strchr(value, '#')) != nullptr) - *p = '\0'; + continue; + } - // remove trailing tab/space - for (p = value + strlen(value) - 1U; p >= value && (*p == '\t' || *p == ' '); p--) - *p = '\0'; - } + char* key = ::strtok(buffer, " \t=\r\n"); + if (key == nullptr) + continue; - if (section == SECTION::GENERAL) { + char* value = ::strtok(nullptr, "\r\n"); + if (value == nullptr) + continue; + + // Remove quotes from the value + size_t len = ::strlen(value); + if (len > 1U && *value == '"' && value[len - 1U] == '"') { + value[len - 1U] = '\0'; + value++; + } else { + char *p; + + // if value is not quoted, remove after # (to make comment) + if ((p = strchr(value, '#')) != nullptr) + *p = '\0'; + + // remove trailing tab/space + for (p = value + strlen(value) - 1U; p >= value && (*p == '\t' || *p == ' '); p--) + *p = '\0'; + } + + if (section == SECTION::GENERAL) { if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; else if (::strcmp(key, "Timeout") == 0) @@ -350,7 +350,7 @@ bool CConf::read() // Right align, then pads with zeros, as XLX IDs are 3 characters length snprintf(buffer, sizeof(buffer), "%3s", value); while ((*p != '\0') && (*p == ' ')) - *p++ = '0'; + *p++ = '0'; m_xlxNetworkStartup = std::string(buffer); } @@ -358,10 +358,10 @@ bool CConf::read() m_xlxNetworkRelink = (unsigned int)::atoi(value); else if (::strcmp(key, "Debug") == 0) m_xlxNetworkDebug = ::atoi(value) == 1; - else if (::strcmp(key, "UserControl") == 0) - m_xlxNetworkUserControl = ::atoi(value) ==1; - else if (::strcmp(key, "Module") == 0) - m_xlxNetworkModule = ::toupper(value[0]); + else if (::strcmp(key, "UserControl") == 0) + m_xlxNetworkUserControl = ::atoi(value) ==1; + else if (::strcmp(key, "Module") == 0) + m_xlxNetworkModule = ::toupper(value[0]); } else if (section == SECTION::DMR_NETWORK_1) { if (::strcmp(key, "Enabled") == 0) m_dmrNetwork1Enabled = ::atoi(value) == 1; @@ -990,8 +990,8 @@ bool CConf::read() m_aprsSuffix = value; else if (::strcmp(key, "Description") == 0) m_aprsDescription = value; - else if (::strcmp(key, "Symbol") == 0) - m_aprsSymbol = value; + else if (::strcmp(key, "Symbol") == 0) + m_aprsSymbol = value; } else if (section == SECTION::DYNAMIC_TG_CONTROL) { if (::strcmp(key, "Enabled") == 0) m_dynamicTGControlEnabled = ::atoi(value) == 1; @@ -1144,17 +1144,17 @@ std::string CConf::getXLXNetworkFile() const unsigned int CConf::getXLXNetworkReloadTime() const { - return m_xlxNetworkReloadTime; + return m_xlxNetworkReloadTime; } unsigned short CConf::getXLXNetworkPort() const { - return m_xlxNetworkPort; + return m_xlxNetworkPort; } std::string CConf::getXLXNetworkPassword() const { - return m_xlxNetworkPassword; + return m_xlxNetworkPassword; } unsigned short CConf::getXLXNetworkLocal() const @@ -1707,7 +1707,7 @@ std::string CConf::getAPRSDescription() const std::string CConf::getAPRSSymbol() const { - return m_aprsSymbol; + return m_aprsSymbol; } bool CConf::getDynamicTGControlEnabled() const From fa558552d89c7f9f378c33c36acdd654129243f1 Mon Sep 17 00:00:00 2001 From: Alexander Mokrov UR6LKW Date: Sun, 1 Jun 2025 17:43:06 +0300 Subject: [PATCH 2/5] [unlim-networks] Config --- Conf.cpp | 1129 +++++------------------------------------------------- Conf.h | 236 +++--------- 2 files changed, 140 insertions(+), 1225 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 2c92546..d7e959f 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -23,6 +23,7 @@ #include #include #include +#include const int BUFFER_SIZE = 500; @@ -32,11 +33,7 @@ enum class SECTION { LOG, VOICE, INFO, - DMR_NETWORK_1, - DMR_NETWORK_2, - DMR_NETWORK_3, - DMR_NETWORK_4, - DMR_NETWORK_5, + DMR_NETWORK_N, XLX_NETWORK, GPSD, APRS, @@ -69,96 +66,7 @@ m_infoHeight(0), m_infoLocation(), m_infoDescription(), m_infoURL(), -m_dmrNetwork1Enabled(false), -m_dmrNetwork1Name(), -m_dmrNetwork1Id(0U), -m_dmrNetwork1Address(), -m_dmrNetwork1Port(0U), -m_dmrNetwork1Local(0U), -m_dmrNetwork1Password(), -m_dmrNetwork1Options(), -m_dmrNetwork1Location(true), -m_dmrNetwork1Debug(false), -m_dmrNetwork1TGRewrites(), -m_dmrNetwork1PCRewrites(), -m_dmrNetwork1TypeRewrites(), -m_dmrNetwork1SrcRewrites(), -m_dmrNetwork1TGDynRewrites(), -m_dmrNetwork1IdRewrites(), -m_dmrNetwork1PassAllPC(), -m_dmrNetwork1PassAllTG(), -m_dmrNetwork2Enabled(false), -m_dmrNetwork2Name(), -m_dmrNetwork2Id(0U), -m_dmrNetwork2Address(), -m_dmrNetwork2Port(0U), -m_dmrNetwork2Local(0U), -m_dmrNetwork2Password(), -m_dmrNetwork2Options(), -m_dmrNetwork2Location(true), -m_dmrNetwork2Debug(false), -m_dmrNetwork2TGRewrites(), -m_dmrNetwork2PCRewrites(), -m_dmrNetwork2TypeRewrites(), -m_dmrNetwork2SrcRewrites(), -m_dmrNetwork2TGDynRewrites(), -m_dmrNetwork2IdRewrites(), -m_dmrNetwork2PassAllPC(), -m_dmrNetwork2PassAllTG(), -m_dmrNetwork3Enabled(false), -m_dmrNetwork3Name(), -m_dmrNetwork3Id(0U), -m_dmrNetwork3Address(), -m_dmrNetwork3Port(0U), -m_dmrNetwork3Local(0U), -m_dmrNetwork3Password(), -m_dmrNetwork3Options(), -m_dmrNetwork3Location(true), -m_dmrNetwork3Debug(false), -m_dmrNetwork3TGRewrites(), -m_dmrNetwork3PCRewrites(), -m_dmrNetwork3TypeRewrites(), -m_dmrNetwork3SrcRewrites(), -m_dmrNetwork3TGDynRewrites(), -m_dmrNetwork3IdRewrites(), -m_dmrNetwork3PassAllPC(), -m_dmrNetwork3PassAllTG(), -m_dmrNetwork4Enabled(false), -m_dmrNetwork4Name(), -m_dmrNetwork4Id(0U), -m_dmrNetwork4Address(), -m_dmrNetwork4Port(0U), -m_dmrNetwork4Local(0U), -m_dmrNetwork4Password(), -m_dmrNetwork4Options(), -m_dmrNetwork4Location(true), -m_dmrNetwork4Debug(false), -m_dmrNetwork4TGRewrites(), -m_dmrNetwork4PCRewrites(), -m_dmrNetwork4TypeRewrites(), -m_dmrNetwork4SrcRewrites(), -m_dmrNetwork4TGDynRewrites(), -m_dmrNetwork4IdRewrites(), -m_dmrNetwork4PassAllPC(), -m_dmrNetwork4PassAllTG(), -m_dmrNetwork5Enabled(false), -m_dmrNetwork5Name(), -m_dmrNetwork5Id(0U), -m_dmrNetwork5Address(), -m_dmrNetwork5Port(0U), -m_dmrNetwork5Local(0U), -m_dmrNetwork5Password(), -m_dmrNetwork5Options(), -m_dmrNetwork5Location(true), -m_dmrNetwork5Debug(false), -m_dmrNetwork5TGRewrites(), -m_dmrNetwork5PCRewrites(), -m_dmrNetwork5TypeRewrites(), -m_dmrNetwork5SrcRewrites(), -m_dmrNetwork5TGDynRewrites(), -m_dmrNetwork5IdRewrites(), -m_dmrNetwork5PassAllPC(), -m_dmrNetwork5PassAllTG(), +m_dmrNetworks(), m_xlxNetworkEnabled(false), m_xlxNetworkId(0U), m_xlxNetworkFile(), @@ -204,6 +112,7 @@ bool CConf::read() } SECTION section = SECTION::NONE; + CDMRNetConfStruct *lastDmrNet = nullptr; char buffer[BUFFER_SIZE]; while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) { @@ -211,36 +120,30 @@ bool CConf::read() continue; if (buffer[0U] == '[') { - if (::strncmp(buffer, "[General]", 9U) == 0) + if (::strncmp(buffer, "[General]", 9U) == 0) { section = SECTION::GENERAL; - else if (::strncmp(buffer, "[Log]", 5U) == 0) + } else if (::strncmp(buffer, "[Log]", 5U) == 0) { section = SECTION::LOG; - else if (::strncmp(buffer, "[Voice]", 7U) == 0) + } else if (::strncmp(buffer, "[Voice]", 7U) == 0) { section = SECTION::VOICE; - else if (::strncmp(buffer, "[Info]", 6U) == 0) + } else if (::strncmp(buffer, "[Info]", 6U) == 0) { section = SECTION::INFO; - else if (::strncmp(buffer, "[XLX Network]", 13U) == 0) + } else if (::strncmp(buffer, "[XLX Network]", 13U) == 0) { section = SECTION::XLX_NETWORK; - else if (::strncmp(buffer, "[DMR Network 1]", 15U) == 0) - section = SECTION::DMR_NETWORK_1; - else if (::strncmp(buffer, "[DMR Network 2]", 15U) == 0) - section = SECTION::DMR_NETWORK_2; - else if (::strncmp(buffer, "[DMR Network 3]", 15U) == 0) - section = SECTION::DMR_NETWORK_3; - else if (::strncmp(buffer, "[DMR Network 4]", 15U) == 0) - section = SECTION::DMR_NETWORK_4; - else if (::strncmp(buffer, "[DMR Network 5]", 15U) == 0) - section = SECTION::DMR_NETWORK_5; - else if (::strncmp(buffer, "[GPSD]", 6U) == 0) + } else if (::strncmp(buffer, "[DMR Network", 12U) == 0) { + section = SECTION::DMR_NETWORK_N; + lastDmrNet = addDMRNetwork(); + } else if (::strncmp(buffer, "[GPSD]", 6U) == 0) { section = SECTION::GPSD; - else if (::strncmp(buffer, "[APRS]", 6U) == 0) + } else if (::strncmp(buffer, "[APRS]", 6U) == 0) { section = SECTION::APRS; - else if (::strncmp(buffer, "[Dynamic TG Control]", 20U) == 0) + } else if (::strncmp(buffer, "[Dynamic TG Control]", 20U) == 0) { section = SECTION::DYNAMIC_TG_CONTROL; - else if (::strncmp(buffer, "[Remote Control]", 16U) == 0) + } else if (::strncmp(buffer, "[Remote Control]", 16U) == 0) { section = SECTION::REMOTE_CONTROL; - else + } else { section = SECTION::NONE; + } continue; } @@ -362,27 +265,28 @@ bool CConf::read() m_xlxNetworkUserControl = ::atoi(value) ==1; else if (::strcmp(key, "Module") == 0) m_xlxNetworkModule = ::toupper(value[0]); - } else if (section == SECTION::DMR_NETWORK_1) { + } else if (section == SECTION::DMR_NETWORK_N) { + assert(lastDmrNet != nullptr); if (::strcmp(key, "Enabled") == 0) - m_dmrNetwork1Enabled = ::atoi(value) == 1; + lastDmrNet->m_Enabled = ::atoi(value) == 1; else if (::strcmp(key, "Name") == 0) - m_dmrNetwork1Name = value; + lastDmrNet->m_Name = value; else if (::strcmp(key, "Id") == 0) - m_dmrNetwork1Id = (unsigned int)::atoi(value); + lastDmrNet->m_Id = (unsigned int)::atoi(value); else if (::strcmp(key, "Address") == 0) - m_dmrNetwork1Address = value; + lastDmrNet->m_Address = value; else if (::strcmp(key, "Port") == 0) - m_dmrNetwork1Port = (unsigned short)::atoi(value); + lastDmrNet->m_Port = (unsigned short)::atoi(value); else if (::strcmp(key, "Local") == 0) - m_dmrNetwork1Local = (unsigned short)::atoi(value); + lastDmrNet->m_Local = (unsigned short)::atoi(value); else if (::strcmp(key, "Password") == 0) - m_dmrNetwork1Password = value; + lastDmrNet->m_Password = value; else if (::strcmp(key, "Options") == 0) - m_dmrNetwork1Options = value; + lastDmrNet->m_Options = value; else if (::strcmp(key, "Location") == 0) - m_dmrNetwork1Location = ::atoi(value) == 1; + lastDmrNet->m_Location = ::atoi(value) == 1; else if (::strcmp(key, "Debug") == 0) - m_dmrNetwork1Debug = ::atoi(value) == 1; + lastDmrNet->m_Debug = ::atoi(value) == 1; else if (::strncmp(key, "TGRewrite", 9U) == 0) { char* p1 = ::strtok(value, ", "); char* p2 = ::strtok(nullptr, ", "); @@ -396,7 +300,7 @@ bool CConf::read() rewrite.m_toSlot = ::atoi(p3); rewrite.m_toTG = ::atoi(p4); rewrite.m_range = ::atoi(p5); - m_dmrNetwork1TGRewrites.push_back(rewrite); + lastDmrNet->m_TGRewrites.push_back(rewrite); } } else if (::strncmp(key, "PCRewrite", 9U) == 0) { char* p1 = ::strtok(value, ", "); @@ -411,7 +315,7 @@ bool CConf::read() rewrite.m_toSlot = ::atoi(p3); rewrite.m_toId = ::atoi(p4); rewrite.m_range = ::atoi(p5); - m_dmrNetwork1PCRewrites.push_back(rewrite); + lastDmrNet->m_PCRewrites.push_back(rewrite); } } else if (::strncmp(key, "TypeRewrite", 11U) == 0) { char* p1 = ::strtok(value, ", "); @@ -426,7 +330,7 @@ bool CConf::read() rewrite.m_toId = ::atoi(p4); char* p5 = ::strtok(nullptr, " \r\n"); rewrite.m_range = p5 != nullptr ? ::atoi(p5) : 1; - m_dmrNetwork1TypeRewrites.push_back(rewrite); + lastDmrNet->m_TypeRewrites.push_back(rewrite); } } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { char* p1 = ::strtok(value, ", "); @@ -441,7 +345,7 @@ bool CConf::read() rewrite.m_toSlot = ::atoi(p3); rewrite.m_toTG = ::atoi(p4); rewrite.m_range = ::atoi(p5); - m_dmrNetwork1SrcRewrites.push_back(rewrite); + lastDmrNet->m_SrcRewrites.push_back(rewrite); } } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { std::vector p7; @@ -466,7 +370,7 @@ bool CConf::read() unsigned int tg = ::atoi(*it); rewrite.m_exclTGs.push_back(tg); } - m_dmrNetwork1TGDynRewrites.push_back(rewrite); + lastDmrNet->m_TGDynRewrites.push_back(rewrite); } } else if (::strncmp(key, "IdRewrite", 9U) == 0) { char* rfId = ::strtok(value, ", "); @@ -475,502 +379,14 @@ bool CConf::read() CIdRewriteStruct rewrite; rewrite.m_rfId = ::atoi(rfId); rewrite.m_netId = ::atoi(netId); - m_dmrNetwork1IdRewrites.push_back(rewrite); + lastDmrNet->m_IdRewrites.push_back(rewrite); } } else if (::strncmp(key, "PassAllPC", 9U) == 0) { unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork1PassAllPC.push_back(slotNo); + lastDmrNet->m_PassAllPC.push_back(slotNo); } else if (::strncmp(key, "PassAllTG", 9U) == 0) { unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork1PassAllTG.push_back(slotNo); - } - } else if (section == SECTION::DMR_NETWORK_2) { - if (::strcmp(key, "Enabled") == 0) - m_dmrNetwork2Enabled = ::atoi(value) == 1; - else if (::strcmp(key, "Name") == 0) - m_dmrNetwork2Name = value; - 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) - m_dmrNetwork2Port = (unsigned short)::atoi(value); - else if (::strcmp(key, "Local") == 0) - m_dmrNetwork2Local = (unsigned short)::atoi(value); - else if (::strcmp(key, "Password") == 0) - m_dmrNetwork2Password = value; - else if (::strcmp(key, "Options") == 0) - m_dmrNetwork2Options = value; - else if (::strcmp(key, "Location") == 0) - m_dmrNetwork2Location = ::atoi(value) == 1; - else if (::strcmp(key, "Debug") == 0) - m_dmrNetwork2Debug = ::atoi(value) == 1; - else if (::strncmp(key, "TGRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CTGRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork2TGRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PCRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CPCRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork2PCRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TypeRewrite", 11U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr) { - CTypeRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - char* p5 = ::strtok(nullptr, " \r\n"); - rewrite.m_range = p5 != nullptr ? ::atoi(p5) : 1; - m_dmrNetwork2TypeRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CSrcRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork2SrcRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { - std::vector p7; - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, ", "); - char* p6 = ::strtok(nullptr, ", \r\n"); - char* p; - while ((p = ::strtok(nullptr, ", \r\n")) != nullptr) - p7.push_back(p); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr && p6 != nullptr) { - CTGDynRewriteStruct rewrite; - rewrite.m_slot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_discPC = ::atoi(p3); - 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) { - char* rfId = ::strtok(value, ", "); - char* netId = ::strtok(nullptr, " \r\n"); - if (rfId != nullptr && netId != nullptr) { - CIdRewriteStruct rewrite; - rewrite.m_rfId = ::atoi(rfId); - rewrite.m_netId = ::atoi(netId); - m_dmrNetwork2IdRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PassAllPC", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork2PassAllPC.push_back(slotNo); - } else if (::strncmp(key, "PassAllTG", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork2PassAllTG.push_back(slotNo); - } - } else if (section == SECTION::DMR_NETWORK_3) { - if (::strcmp(key, "Enabled") == 0) - m_dmrNetwork3Enabled = ::atoi(value) == 1; - else if (::strcmp(key, "Name") == 0) - m_dmrNetwork3Name = value; - else if (::strcmp(key, "Id") == 0) - m_dmrNetwork3Id = (unsigned int)::atoi(value); - else if (::strcmp(key, "Address") == 0) - m_dmrNetwork3Address = value; - else if (::strcmp(key, "Port") == 0) - m_dmrNetwork3Port = (unsigned short)::atoi(value); - else if (::strcmp(key, "Local") == 0) - m_dmrNetwork3Local = (unsigned short)::atoi(value); - else if (::strcmp(key, "Password") == 0) - m_dmrNetwork3Password = value; - else if (::strcmp(key, "Options") == 0) - m_dmrNetwork3Options = value; - else if (::strcmp(key, "Location") == 0) - m_dmrNetwork3Location = ::atoi(value) == 1; - else if (::strcmp(key, "Debug") == 0) - m_dmrNetwork3Debug = ::atoi(value) == 1; - else if (::strncmp(key, "TGRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CTGRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork3TGRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PCRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CPCRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork3PCRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TypeRewrite", 11U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr) { - CTypeRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - char* p5 = ::strtok(nullptr, " \r\n"); - rewrite.m_range = p5 != nullptr ? ::atoi(p5) : 1; - m_dmrNetwork3TypeRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CSrcRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork3SrcRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { - std::vector p7; - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, ", "); - char* p6 = ::strtok(nullptr, ", \r\n"); - char* p; - while ((p = ::strtok(nullptr, ", \r\n")) != nullptr) - p7.push_back(p); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr && p6 != nullptr) { - CTGDynRewriteStruct rewrite; - rewrite.m_slot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_discPC = ::atoi(p3); - 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) { - char* rfId = ::strtok(value, ", "); - char* netId = ::strtok(nullptr, " \r\n"); - if (rfId != nullptr && netId != nullptr) { - CIdRewriteStruct rewrite; - rewrite.m_rfId = ::atoi(rfId); - rewrite.m_netId = ::atoi(netId); - m_dmrNetwork3IdRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PassAllPC", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork3PassAllPC.push_back(slotNo); - } else if (::strncmp(key, "PassAllTG", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork3PassAllTG.push_back(slotNo); - } - } else if (section == SECTION::DMR_NETWORK_4) { - if (::strcmp(key, "Enabled") == 0) - m_dmrNetwork4Enabled = ::atoi(value) == 1; - else if (::strcmp(key, "Name") == 0) - m_dmrNetwork4Name = value; - else if (::strcmp(key, "Id") == 0) - m_dmrNetwork4Id = (unsigned int)::atoi(value); - else if (::strcmp(key, "Address") == 0) - m_dmrNetwork4Address = value; - else if (::strcmp(key, "Port") == 0) - m_dmrNetwork4Port = (unsigned short)::atoi(value); - else if (::strcmp(key, "Local") == 0) - m_dmrNetwork4Local = (unsigned short)::atoi(value); - else if (::strcmp(key, "Password") == 0) - m_dmrNetwork4Password = value; - else if (::strcmp(key, "Options") == 0) - m_dmrNetwork4Options = value; - else if (::strcmp(key, "Location") == 0) - m_dmrNetwork4Location = ::atoi(value) == 1; - else if (::strcmp(key, "Debug") == 0) - m_dmrNetwork4Debug = ::atoi(value) == 1; - else if (::strncmp(key, "TGRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CTGRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork4TGRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PCRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CPCRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork4PCRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TypeRewrite", 11U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr) { - CTypeRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - char* p5 = ::strtok(nullptr, " \r\n"); - rewrite.m_range = p5 != nullptr ? ::atoi(p5) : 1; - m_dmrNetwork4TypeRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CSrcRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork4SrcRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { - std::vector p7; - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, ", "); - char* p6 = ::strtok(nullptr, ", \r\n"); - char* p; - while ((p = ::strtok(nullptr, ", \r\n")) != nullptr) - p7.push_back(p); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr && p6 != nullptr) { - CTGDynRewriteStruct rewrite; - rewrite.m_slot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_discPC = ::atoi(p3); - 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) { - char* rfId = ::strtok(value, ", "); - char* netId = ::strtok(nullptr, " \r\n"); - if (rfId != nullptr && netId != nullptr) { - CIdRewriteStruct rewrite; - rewrite.m_rfId = ::atoi(rfId); - rewrite.m_netId = ::atoi(netId); - m_dmrNetwork4IdRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PassAllPC", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork4PassAllPC.push_back(slotNo); - } else if (::strncmp(key, "PassAllTG", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork4PassAllTG.push_back(slotNo); - } - } else if (section == SECTION::DMR_NETWORK_5) { - if (::strcmp(key, "Enabled") == 0) - m_dmrNetwork5Enabled = ::atoi(value) == 1; - else if (::strcmp(key, "Name") == 0) - m_dmrNetwork5Name = value; - else if (::strcmp(key, "Id") == 0) - m_dmrNetwork5Id = (unsigned int)::atoi(value); - else if (::strcmp(key, "Address") == 0) - m_dmrNetwork5Address = value; - else if (::strcmp(key, "Port") == 0) - m_dmrNetwork5Port = (unsigned short)::atoi(value); - else if (::strcmp(key, "Local") == 0) - m_dmrNetwork5Local = (unsigned short)::atoi(value); - else if (::strcmp(key, "Password") == 0) - m_dmrNetwork5Password = value; - else if (::strcmp(key, "Options") == 0) - m_dmrNetwork5Options = value; - else if (::strcmp(key, "Location") == 0) - m_dmrNetwork5Location = ::atoi(value) == 1; - else if (::strcmp(key, "Debug") == 0) - m_dmrNetwork5Debug = ::atoi(value) == 1; - else if (::strncmp(key, "TGRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CTGRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork5TGRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PCRewrite", 9U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CPCRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork5PCRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TypeRewrite", 11U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr) { - CTypeRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toId = ::atoi(p4); - char* p5 = ::strtok(nullptr, " \r\n"); - rewrite.m_range = p5 != nullptr ? ::atoi(p5) : 1; - m_dmrNetwork5TypeRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, " \r\n"); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr) { - CSrcRewriteStruct rewrite; - rewrite.m_fromSlot = ::atoi(p1); - rewrite.m_fromId = ::atoi(p2); - rewrite.m_toSlot = ::atoi(p3); - rewrite.m_toTG = ::atoi(p4); - rewrite.m_range = ::atoi(p5); - m_dmrNetwork5SrcRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "TGDynRewrite", 12U) == 0) { - std::vector p7; - char* p1 = ::strtok(value, ", "); - char* p2 = ::strtok(nullptr, ", "); - char* p3 = ::strtok(nullptr, ", "); - char* p4 = ::strtok(nullptr, ", "); - char* p5 = ::strtok(nullptr, ", "); - char* p6 = ::strtok(nullptr, ", \r\n"); - char* p; - while ((p = ::strtok(nullptr, ", \r\n")) != nullptr) - p7.push_back(p); - if (p1 != nullptr && p2 != nullptr && p3 != nullptr && p4 != nullptr && p5 != nullptr && p6 != nullptr) { - CTGDynRewriteStruct rewrite; - rewrite.m_slot = ::atoi(p1); - rewrite.m_fromTG = ::atoi(p2); - rewrite.m_discPC = ::atoi(p3); - 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) { - char* rfId = ::strtok(value, ", "); - char* netId = ::strtok(nullptr, " \r\n"); - if (rfId != nullptr && netId != nullptr) { - CIdRewriteStruct rewrite; - rewrite.m_rfId = ::atoi(rfId); - rewrite.m_netId = ::atoi(netId); - m_dmrNetwork5IdRewrites.push_back(rewrite); - } - } else if (::strncmp(key, "PassAllPC", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork5PassAllPC.push_back(slotNo); - } else if (::strncmp(key, "PassAllTG", 9U) == 0) { - unsigned int slotNo = (unsigned int)::atoi(value); - m_dmrNetwork5PassAllTG.push_back(slotNo); + lastDmrNet->m_PassAllTG.push_back(slotNo); } } else if (section == SECTION::GPSD) { if (::strcmp(key, "Enable") == 0) @@ -1200,469 +616,118 @@ char CConf::getXLXNetworkModule() const return m_xlxNetworkModule; } -bool CConf::getDMRNetwork1Enabled() const +CDMRNetConfStruct *CConf::addDMRNetwork() { - return m_dmrNetwork1Enabled; + m_dmrNetworks.emplace_back(); + CDMRNetConfStruct& dmrNetwork = m_dmrNetworks.back(); + + // set defaults + dmrNetwork.m_Enabled = false; + dmrNetwork.m_Id = 0U; + dmrNetwork.m_Port = 0U; + dmrNetwork.m_Local = 0U; + dmrNetwork.m_Location = true; + dmrNetwork.m_Debug = false; + + return &dmrNetwork; } -std::string CConf::getDMRNetwork1Name() const +unsigned int CConf::getDMRNetworksCount() const { - if (m_dmrNetwork1Name.empty()) - return "DMR-1"; + return m_dmrNetworks.size(); +} + +bool CConf::getDMRNetworkEnabled(unsigned int index) const +{ + return m_dmrNetworks[index].m_Enabled; +} + +std::string CConf::getDMRNetworkName(unsigned int index) const +{ + if (m_dmrNetworks[index].m_Name.empty()) + return "DMR-" + std::to_string(index + 1); else - return m_dmrNetwork1Name; + return m_dmrNetworks[index].m_Name; } -unsigned int CConf::getDMRNetwork1Id() const +unsigned int CConf::getDMRNetworkId(unsigned int index) const { - return m_dmrNetwork1Id; + return m_dmrNetworks[index].m_Id; } -std::string CConf::getDMRNetwork1Address() const +std::string CConf::getDMRNetworkAddress(unsigned int index) const { - return m_dmrNetwork1Address; + return m_dmrNetworks[index].m_Address; } -unsigned short CConf::getDMRNetwork1Port() const +unsigned short CConf::getDMRNetworkPort(unsigned int index) const { - return m_dmrNetwork1Port; + return m_dmrNetworks[index].m_Port; } -unsigned short CConf::getDMRNetwork1Local() const +unsigned short CConf::getDMRNetworkLocal(unsigned int index) const { - return m_dmrNetwork1Local; + return m_dmrNetworks[index].m_Local; } -std::string CConf::getDMRNetwork1Password() const +std::string CConf::getDMRNetworkPassword(unsigned int index) const { - return m_dmrNetwork1Password; + return m_dmrNetworks[index].m_Password; } -std::string CConf::getDMRNetwork1Options() const +std::string CConf::getDMRNetworkOptions(unsigned int index) const { - return m_dmrNetwork1Options; + return m_dmrNetworks[index].m_Options; } -bool CConf::getDMRNetwork1Location() const +bool CConf::getDMRNetworkLocation(unsigned int index) const { - return m_dmrNetwork1Location; + return m_dmrNetworks[index].m_Location; } -bool CConf::getDMRNetwork1Debug() const +bool CConf::getDMRNetworkDebug(unsigned int index) const { - return m_dmrNetwork1Debug; + return m_dmrNetworks[index].m_Debug; } -std::vector CConf::getDMRNetwork1TGRewrites() const +std::vector CConf::getDMRNetworkTGRewrites(unsigned int index) const { - return m_dmrNetwork1TGRewrites; + return m_dmrNetworks[index].m_TGRewrites; } -std::vector CConf::getDMRNetwork1PCRewrites() const +std::vector CConf::getDMRNetworkPCRewrites(unsigned int index) const { - return m_dmrNetwork1PCRewrites; + return m_dmrNetworks[index].m_PCRewrites; } -std::vector CConf::getDMRNetwork1TypeRewrites() const +std::vector CConf::getDMRNetworkTypeRewrites(unsigned int index) const { - return m_dmrNetwork1TypeRewrites; + return m_dmrNetworks[index].m_TypeRewrites; } -std::vector CConf::getDMRNetwork1SrcRewrites() const +std::vector CConf::getDMRNetworkSrcRewrites(unsigned int index) const { - return m_dmrNetwork1SrcRewrites; + return m_dmrNetworks[index].m_SrcRewrites; } -std::vector CConf::getDMRNetwork1TGDynRewrites() const +std::vector CConf::getDMRNetworkTGDynRewrites(unsigned int index) const { - return m_dmrNetwork1TGDynRewrites; + return m_dmrNetworks[index].m_TGDynRewrites; } -std::vector CConf::getDMRNetwork1IdRewrites() const +std::vector CConf::getDMRNetworkIdRewrites(unsigned int index) const { - return m_dmrNetwork1IdRewrites; + return m_dmrNetworks[index].m_IdRewrites; } -std::vector CConf::getDMRNetwork1PassAllPC() const +std::vector CConf::getDMRNetworkPassAllPC(unsigned int index) const { - return m_dmrNetwork1PassAllPC; + return m_dmrNetworks[index].m_PassAllPC; } -std::vector CConf::getDMRNetwork1PassAllTG() const +std::vector CConf::getDMRNetworkPassAllTG(unsigned int index) const { - return m_dmrNetwork1PassAllTG; -} - -bool CConf::getDMRNetwork2Enabled() const -{ - return m_dmrNetwork2Enabled; -} - -std::string CConf::getDMRNetwork2Name() const -{ - if (m_dmrNetwork2Name.empty()) - return "DMR-2"; - else - return m_dmrNetwork2Name; -} - -unsigned int CConf::getDMRNetwork2Id() const -{ - return m_dmrNetwork2Id; -} - -std::string CConf::getDMRNetwork2Address() const -{ - return m_dmrNetwork2Address; -} - -unsigned short CConf::getDMRNetwork2Port() const -{ - return m_dmrNetwork2Port; -} - -unsigned short CConf::getDMRNetwork2Local() const -{ - return m_dmrNetwork2Local; -} - -std::string CConf::getDMRNetwork2Password() const -{ - return m_dmrNetwork2Password; -} - -std::string CConf::getDMRNetwork2Options() const -{ - return m_dmrNetwork2Options; -} - -bool CConf::getDMRNetwork2Location() const -{ - return m_dmrNetwork2Location; -} - -bool CConf::getDMRNetwork2Debug() const -{ - return m_dmrNetwork2Debug; -} - -std::vector CConf::getDMRNetwork2TGRewrites() const -{ - return m_dmrNetwork2TGRewrites; -} - -std::vector CConf::getDMRNetwork2PCRewrites() const -{ - return m_dmrNetwork2PCRewrites; -} - -std::vector CConf::getDMRNetwork2TypeRewrites() const -{ - return m_dmrNetwork2TypeRewrites; -} - -std::vector CConf::getDMRNetwork2SrcRewrites() const -{ - return m_dmrNetwork2SrcRewrites; -} - -std::vector CConf::getDMRNetwork2TGDynRewrites() const -{ - return m_dmrNetwork2TGDynRewrites; -} - -std::vector CConf::getDMRNetwork2IdRewrites() const -{ - return m_dmrNetwork2IdRewrites; -} - -std::vector CConf::getDMRNetwork2PassAllPC() const -{ - return m_dmrNetwork2PassAllPC; -} - -std::vector CConf::getDMRNetwork2PassAllTG() const -{ - return m_dmrNetwork2PassAllTG; -} - -bool CConf::getDMRNetwork3Enabled() const -{ - return m_dmrNetwork3Enabled; -} - -std::string CConf::getDMRNetwork3Name() const -{ - if (m_dmrNetwork3Name.empty()) - return "DMR-3"; - else - return m_dmrNetwork3Name; -} - -unsigned int CConf::getDMRNetwork3Id() const -{ - return m_dmrNetwork3Id; -} - -std::string CConf::getDMRNetwork3Address() const -{ - return m_dmrNetwork3Address; -} - -unsigned short CConf::getDMRNetwork3Port() const -{ - return m_dmrNetwork3Port; -} - -unsigned short CConf::getDMRNetwork3Local() const -{ - return m_dmrNetwork3Local; -} - -std::string CConf::getDMRNetwork3Password() const -{ - return m_dmrNetwork3Password; -} - -std::string CConf::getDMRNetwork3Options() const -{ - return m_dmrNetwork3Options; -} - -bool CConf::getDMRNetwork3Location() const -{ - return m_dmrNetwork3Location; -} - -bool CConf::getDMRNetwork3Debug() const -{ - return m_dmrNetwork3Debug; -} - -std::vector CConf::getDMRNetwork3TGRewrites() const -{ - return m_dmrNetwork3TGRewrites; -} - -std::vector CConf::getDMRNetwork3PCRewrites() const -{ - return m_dmrNetwork3PCRewrites; -} - -std::vector CConf::getDMRNetwork3TypeRewrites() const -{ - return m_dmrNetwork3TypeRewrites; -} - -std::vector CConf::getDMRNetwork3SrcRewrites() const -{ - return m_dmrNetwork3SrcRewrites; -} - -std::vector CConf::getDMRNetwork3TGDynRewrites() const -{ - return m_dmrNetwork3TGDynRewrites; -} - -std::vector CConf::getDMRNetwork3IdRewrites() const -{ - return m_dmrNetwork3IdRewrites; -} - -std::vector CConf::getDMRNetwork3PassAllPC() const -{ - return m_dmrNetwork3PassAllPC; -} - -std::vector CConf::getDMRNetwork3PassAllTG() const -{ - return m_dmrNetwork3PassAllTG; -} - -bool CConf::getDMRNetwork4Enabled() const -{ - return m_dmrNetwork4Enabled; -} - -std::string CConf::getDMRNetwork4Name() const -{ - if (m_dmrNetwork4Name.empty()) - return "DMR-4"; - else - return m_dmrNetwork4Name; -} - -unsigned int CConf::getDMRNetwork4Id() const -{ - return m_dmrNetwork4Id; -} - -std::string CConf::getDMRNetwork4Address() const -{ - return m_dmrNetwork4Address; -} - -unsigned short CConf::getDMRNetwork4Port() const -{ - return m_dmrNetwork4Port; -} - -unsigned short CConf::getDMRNetwork4Local() const -{ - return m_dmrNetwork4Local; -} - -std::string CConf::getDMRNetwork4Password() const -{ - return m_dmrNetwork4Password; -} - -std::string CConf::getDMRNetwork4Options() const -{ - return m_dmrNetwork4Options; -} - -bool CConf::getDMRNetwork4Location() const -{ - return m_dmrNetwork4Location; -} - -bool CConf::getDMRNetwork4Debug() const -{ - return m_dmrNetwork4Debug; -} - -std::vector CConf::getDMRNetwork4TGRewrites() const -{ - return m_dmrNetwork4TGRewrites; -} - -std::vector CConf::getDMRNetwork4PCRewrites() const -{ - return m_dmrNetwork4PCRewrites; -} - -std::vector CConf::getDMRNetwork4TypeRewrites() const -{ - return m_dmrNetwork4TypeRewrites; -} - -std::vector CConf::getDMRNetwork4SrcRewrites() const -{ - return m_dmrNetwork4SrcRewrites; -} - -std::vector CConf::getDMRNetwork4TGDynRewrites() const -{ - return m_dmrNetwork4TGDynRewrites; -} - -std::vector CConf::getDMRNetwork4IdRewrites() const -{ - return m_dmrNetwork4IdRewrites; -} - -std::vector CConf::getDMRNetwork4PassAllPC() const -{ - return m_dmrNetwork4PassAllPC; -} - -std::vector CConf::getDMRNetwork4PassAllTG() const -{ - return m_dmrNetwork4PassAllTG; -} - -bool CConf::getDMRNetwork5Enabled() const -{ - return m_dmrNetwork5Enabled; -} - -std::string CConf::getDMRNetwork5Name() const -{ - if (m_dmrNetwork5Name.empty()) - return "DMR-5"; - else - return m_dmrNetwork5Name; -} - -unsigned int CConf::getDMRNetwork5Id() const -{ - return m_dmrNetwork5Id; -} - -std::string CConf::getDMRNetwork5Address() const -{ - return m_dmrNetwork5Address; -} - -unsigned short CConf::getDMRNetwork5Port() const -{ - return m_dmrNetwork5Port; -} - -unsigned short CConf::getDMRNetwork5Local() const -{ - return m_dmrNetwork5Local; -} - -std::string CConf::getDMRNetwork5Password() const -{ - return m_dmrNetwork5Password; -} - -std::string CConf::getDMRNetwork5Options() const -{ - return m_dmrNetwork5Options; -} - -bool CConf::getDMRNetwork5Location() const -{ - return m_dmrNetwork5Location; -} - -bool CConf::getDMRNetwork5Debug() const -{ - return m_dmrNetwork5Debug; -} - -std::vector CConf::getDMRNetwork5TGRewrites() const -{ - return m_dmrNetwork5TGRewrites; -} - -std::vector CConf::getDMRNetwork5PCRewrites() const -{ - return m_dmrNetwork5PCRewrites; -} - -std::vector CConf::getDMRNetwork5TypeRewrites() const -{ - return m_dmrNetwork5TypeRewrites; -} - -std::vector CConf::getDMRNetwork5SrcRewrites() const -{ - return m_dmrNetwork5SrcRewrites; -} - -std::vector CConf::getDMRNetwork5TGDynRewrites() const -{ - return m_dmrNetwork5TGDynRewrites; -} - -std::vector CConf::getDMRNetwork5IdRewrites() const -{ - return m_dmrNetwork5IdRewrites; -} - -std::vector CConf::getDMRNetwork5PassAllPC() const -{ - return m_dmrNetwork5PassAllPC; -} - -std::vector CConf::getDMRNetwork5PassAllTG() const -{ - return m_dmrNetwork5PassAllTG; + return m_dmrNetworks[index].m_PassAllTG; } bool CConf::getGPSDEnabled() const diff --git a/Conf.h b/Conf.h index 40a9c9e..53fc3f7 100644 --- a/Conf.h +++ b/Conf.h @@ -69,6 +69,27 @@ struct CIdRewriteStruct { unsigned int m_netId; }; +struct CDMRNetConfStruct { + bool m_Enabled; + std::string m_Name; + unsigned int m_Id; + std::string m_Address; + unsigned short m_Port; + unsigned short m_Local; + std::string m_Password; + std::string m_Options; + bool m_Location; + bool m_Debug; + std::vector m_TGRewrites; + std::vector m_PCRewrites; + std::vector m_TypeRewrites; + std::vector m_SrcRewrites; + std::vector m_TGDynRewrites; + std::vector m_IdRewrites; + std::vector m_PassAllPC; + std::vector m_PassAllTG; +}; + class CConf { public: @@ -108,105 +129,26 @@ public: std::string getInfoDescription() const; std::string getInfoURL() const; - // The DMR Network 1 section - bool getDMRNetwork1Enabled() const; - std::string getDMRNetwork1Name() const; - unsigned int getDMRNetwork1Id() const; - std::string getDMRNetwork1Address() const; - unsigned short getDMRNetwork1Port() const; - unsigned short getDMRNetwork1Local() const; - std::string getDMRNetwork1Password() const; - std::string getDMRNetwork1Options() const; - bool getDMRNetwork1Location() const; - bool getDMRNetwork1Debug() const; - std::vector getDMRNetwork1TGRewrites() const; - std::vector getDMRNetwork1PCRewrites() const; - std::vector getDMRNetwork1TypeRewrites() const; - std::vector getDMRNetwork1SrcRewrites() const; - std::vector getDMRNetwork1TGDynRewrites() const; - std::vector getDMRNetwork1IdRewrites() const; - std::vector getDMRNetwork1PassAllPC() const; - std::vector getDMRNetwork1PassAllTG() const; - - // The DMR Network 2 section - bool getDMRNetwork2Enabled() const; - std::string getDMRNetwork2Name() const; - unsigned int getDMRNetwork2Id() const; - std::string getDMRNetwork2Address() const; - unsigned short getDMRNetwork2Port() const; - unsigned short getDMRNetwork2Local() const; - std::string getDMRNetwork2Password() const; - std::string getDMRNetwork2Options() const; - bool getDMRNetwork2Location() const; - bool getDMRNetwork2Debug() const; - std::vector getDMRNetwork2TGRewrites() const; - std::vector getDMRNetwork2PCRewrites() const; - std::vector getDMRNetwork2TypeRewrites() const; - std::vector getDMRNetwork2SrcRewrites() const; - std::vector getDMRNetwork2TGDynRewrites() const; - std::vector getDMRNetwork2IdRewrites() const; - std::vector getDMRNetwork2PassAllPC() const; - std::vector getDMRNetwork2PassAllTG() const; - - // The DMR Network 3 section - bool getDMRNetwork3Enabled() const; - std::string getDMRNetwork3Name() const; - unsigned int getDMRNetwork3Id() const; - std::string getDMRNetwork3Address() const; - unsigned short getDMRNetwork3Port() const; - unsigned short getDMRNetwork3Local() const; - std::string getDMRNetwork3Password() const; - std::string getDMRNetwork3Options() const; - bool getDMRNetwork3Location() const; - bool getDMRNetwork3Debug() const; - std::vector getDMRNetwork3TGRewrites() const; - std::vector getDMRNetwork3PCRewrites() const; - std::vector getDMRNetwork3TypeRewrites() const; - std::vector getDMRNetwork3SrcRewrites() const; - std::vector getDMRNetwork3TGDynRewrites() const; - std::vector getDMRNetwork3IdRewrites() const; - std::vector getDMRNetwork3PassAllPC() const; - std::vector getDMRNetwork3PassAllTG() const; - - // The DMR Network 4 section - bool getDMRNetwork4Enabled() const; - std::string getDMRNetwork4Name() const; - unsigned int getDMRNetwork4Id() const; - std::string getDMRNetwork4Address() const; - unsigned short getDMRNetwork4Port() const; - unsigned short getDMRNetwork4Local() const; - std::string getDMRNetwork4Password() const; - std::string getDMRNetwork4Options() const; - bool getDMRNetwork4Location() const; - bool getDMRNetwork4Debug() const; - std::vector getDMRNetwork4TGRewrites() const; - std::vector getDMRNetwork4PCRewrites() const; - std::vector getDMRNetwork4TypeRewrites() const; - std::vector getDMRNetwork4SrcRewrites() const; - std::vector getDMRNetwork4TGDynRewrites() const; - std::vector getDMRNetwork4IdRewrites() const; - std::vector getDMRNetwork4PassAllPC() const; - std::vector getDMRNetwork4PassAllTG() const; - - // The DMR Network 5 section - bool getDMRNetwork5Enabled() const; - std::string getDMRNetwork5Name() const; - unsigned int getDMRNetwork5Id() const; - std::string getDMRNetwork5Address() const; - unsigned short getDMRNetwork5Port() const; - unsigned short getDMRNetwork5Local() const; - std::string getDMRNetwork5Password() const; - std::string getDMRNetwork5Options() const; - bool getDMRNetwork5Location() const; - bool getDMRNetwork5Debug() const; - std::vector getDMRNetwork5TGRewrites() const; - std::vector getDMRNetwork5PCRewrites() const; - std::vector getDMRNetwork5TypeRewrites() const; - std::vector getDMRNetwork5SrcRewrites() const; - std::vector getDMRNetwork5TGDynRewrites() const; - std::vector getDMRNetwork5IdRewrites() const; - std::vector getDMRNetwork5PassAllPC() const; - std::vector getDMRNetwork5PassAllTG() const; + // DMR Network sections + unsigned int getDMRNetworksCount() const; // get [DMR Network X] sections count + bool getDMRNetworkEnabled(unsigned int index) const; + std::string getDMRNetworkName(unsigned int index) const; + unsigned int getDMRNetworkId(unsigned int index) const; + std::string getDMRNetworkAddress(unsigned int index) const; + unsigned short getDMRNetworkPort(unsigned int index) const; + unsigned short getDMRNetworkLocal(unsigned int index) const; + std::string getDMRNetworkPassword(unsigned int index) const; + std::string getDMRNetworkOptions(unsigned int index) const; + bool getDMRNetworkLocation(unsigned int index) const; + bool getDMRNetworkDebug(unsigned int index) const; + std::vector getDMRNetworkTGRewrites(unsigned int index) const; + std::vector getDMRNetworkPCRewrites(unsigned int index) const; + std::vector getDMRNetworkTypeRewrites(unsigned int index) const; + std::vector getDMRNetworkSrcRewrites(unsigned int index) const; + std::vector getDMRNetworkTGDynRewrites(unsigned int index) const; + std::vector getDMRNetworkIdRewrites(unsigned int index) const; + std::vector getDMRNetworkPassAllPC(unsigned int index) const; + std::vector getDMRNetworkPassAllTG(unsigned int index) const; // The XLX Network section bool getXLXNetworkEnabled() const; @@ -276,100 +218,8 @@ private: std::string m_infoDescription; std::string m_infoURL; - bool m_dmrNetwork1Enabled; - std::string m_dmrNetwork1Name; - unsigned int m_dmrNetwork1Id; - std::string m_dmrNetwork1Address; - unsigned short m_dmrNetwork1Port; - unsigned short m_dmrNetwork1Local; - std::string m_dmrNetwork1Password; - std::string m_dmrNetwork1Options; - bool m_dmrNetwork1Location; - bool m_dmrNetwork1Debug; - std::vector m_dmrNetwork1TGRewrites; - std::vector m_dmrNetwork1PCRewrites; - std::vector m_dmrNetwork1TypeRewrites; - std::vector m_dmrNetwork1SrcRewrites; - std::vector m_dmrNetwork1TGDynRewrites; - std::vector m_dmrNetwork1IdRewrites; - std::vector m_dmrNetwork1PassAllPC; - std::vector m_dmrNetwork1PassAllTG; - - bool m_dmrNetwork2Enabled; - std::string m_dmrNetwork2Name; - unsigned int m_dmrNetwork2Id; - std::string m_dmrNetwork2Address; - unsigned short m_dmrNetwork2Port; - unsigned short m_dmrNetwork2Local; - std::string m_dmrNetwork2Password; - std::string m_dmrNetwork2Options; - bool m_dmrNetwork2Location; - bool m_dmrNetwork2Debug; - std::vector m_dmrNetwork2TGRewrites; - std::vector m_dmrNetwork2PCRewrites; - std::vector m_dmrNetwork2TypeRewrites; - std::vector m_dmrNetwork2SrcRewrites; - std::vector m_dmrNetwork2TGDynRewrites; - std::vector m_dmrNetwork2IdRewrites; - std::vector m_dmrNetwork2PassAllPC; - std::vector m_dmrNetwork2PassAllTG; - - bool m_dmrNetwork3Enabled; - std::string m_dmrNetwork3Name; - unsigned int m_dmrNetwork3Id; - std::string m_dmrNetwork3Address; - unsigned short m_dmrNetwork3Port; - unsigned short m_dmrNetwork3Local; - std::string m_dmrNetwork3Password; - std::string m_dmrNetwork3Options; - bool m_dmrNetwork3Location; - bool m_dmrNetwork3Debug; - std::vector m_dmrNetwork3TGRewrites; - std::vector m_dmrNetwork3PCRewrites; - std::vector m_dmrNetwork3TypeRewrites; - std::vector m_dmrNetwork3SrcRewrites; - std::vector m_dmrNetwork3TGDynRewrites; - std::vector m_dmrNetwork3IdRewrites; - std::vector m_dmrNetwork3PassAllPC; - std::vector m_dmrNetwork3PassAllTG; - - bool m_dmrNetwork4Enabled; - std::string m_dmrNetwork4Name; - unsigned int m_dmrNetwork4Id; - std::string m_dmrNetwork4Address; - unsigned short m_dmrNetwork4Port; - unsigned short m_dmrNetwork4Local; - std::string m_dmrNetwork4Password; - std::string m_dmrNetwork4Options; - bool m_dmrNetwork4Location; - bool m_dmrNetwork4Debug; - std::vector m_dmrNetwork4TGRewrites; - std::vector m_dmrNetwork4PCRewrites; - std::vector m_dmrNetwork4TypeRewrites; - std::vector m_dmrNetwork4SrcRewrites; - std::vector m_dmrNetwork4TGDynRewrites; - std::vector m_dmrNetwork4IdRewrites; - std::vector m_dmrNetwork4PassAllPC; - std::vector m_dmrNetwork4PassAllTG; - - bool m_dmrNetwork5Enabled; - std::string m_dmrNetwork5Name; - unsigned int m_dmrNetwork5Id; - std::string m_dmrNetwork5Address; - unsigned short m_dmrNetwork5Port; - unsigned short m_dmrNetwork5Local; - std::string m_dmrNetwork5Password; - std::string m_dmrNetwork5Options; - bool m_dmrNetwork5Location; - bool m_dmrNetwork5Debug; - std::vector m_dmrNetwork5TGRewrites; - std::vector m_dmrNetwork5PCRewrites; - std::vector m_dmrNetwork5TypeRewrites; - std::vector m_dmrNetwork5SrcRewrites; - std::vector m_dmrNetwork5TGDynRewrites; - std::vector m_dmrNetwork5IdRewrites; - std::vector m_dmrNetwork5PassAllPC; - std::vector m_dmrNetwork5PassAllTG; + std::vector m_dmrNetworks; + CDMRNetConfStruct *addDMRNetwork(); bool m_xlxNetworkEnabled; unsigned int m_xlxNetworkId; From 366b32a29a51d93f3b920a62bd4123f8cd5dfbc9 Mon Sep 17 00:00:00 2001 From: Alexander Mokrov UR6LKW Date: Sun, 1 Jun 2025 20:30:57 +0300 Subject: [PATCH 3/5] [unlim-networks] DMRGateway --- DMRGateway.cpp | 1700 ++++++++--------------------------------------- DMRGateway.h | 64 +- RemoteControl.h | 7 + 3 files changed, 306 insertions(+), 1465 deletions(-) diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 57e5291..03b4380 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -133,20 +133,13 @@ int main(int argc, char** argv) CDMRGateway::CDMRGateway(const std::string& confFile) : m_conf(confFile), -m_status(nullptr), +m_extStatus(nullptr), m_repeater(nullptr), m_config(nullptr), m_configLen(0U), -m_dmrNetwork1(nullptr), -m_dmr1Name(), -m_dmrNetwork2(nullptr), -m_dmr2Name(), -m_dmrNetwork3(nullptr), -m_dmr3Name(), -m_dmrNetwork4(nullptr), -m_dmr4Name(), -m_dmrNetwork5(nullptr), -m_dmr5Name(), +m_dmrNetworkCount(0U), +m_dmrNetworks(), +m_dmrName(), m_xlxReflectors(nullptr), m_xlxNetwork(nullptr), m_xlxId(0U), @@ -168,26 +161,10 @@ m_xlxModule(), m_rptRewrite(nullptr), m_xlxRewrite(nullptr), m_xlxVoice(nullptr), -m_dmr1NetRewrites(), -m_dmr1RFRewrites(), -m_dmr1SrcRewrites(), -m_dmr2NetRewrites(), -m_dmr2RFRewrites(), -m_dmr2SrcRewrites(), -m_dmr3NetRewrites(), -m_dmr3RFRewrites(), -m_dmr3SrcRewrites(), -m_dmr4NetRewrites(), -m_dmr4RFRewrites(), -m_dmr4SrcRewrites(), -m_dmr5NetRewrites(), -m_dmr5RFRewrites(), -m_dmr5SrcRewrites(), -m_dmr1Passalls(), -m_dmr2Passalls(), -m_dmr3Passalls(), -m_dmr4Passalls(), -m_dmr5Passalls(), +m_dmrNetRewrites(), +m_dmrRFRewrites(), +m_dmrSrcRewrites(), +m_dmrPassalls(), m_dynVoices(), m_dynRF(), m_socket(nullptr), @@ -198,84 +175,36 @@ m_rxFrequency(0U), #if defined(USE_GPSD) m_gpsd(nullptr), #endif -m_network1Enabled(false), -m_network2Enabled(false), -m_network3Enabled(false), -m_network4Enabled(false), -m_network5Enabled(false), +m_networkEnabled(nullptr), m_networkXlxEnabled(false), m_remoteControl(nullptr) { CUDPSocket::startup(); - m_status = new DMRGW_STATUS[3U]; - m_status[1U] = DMRGW_STATUS::NONE; - m_status[2U] = DMRGW_STATUS::NONE; + m_extStatus = new CDMRGWExtStatus[3U]; + m_extStatus[1U].m_status = DMRGW_STATUS::NONE; + m_extStatus[2U].m_status = DMRGW_STATUS::NONE; m_config = new unsigned char[400U]; } CDMRGateway::~CDMRGateway() { - for (std::vector::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) - delete *it; + for (auto& dmrNetRewrites: m_dmrNetRewrites) + for (CRewrite* rewrite: dmrNetRewrites) + delete rewrite; - for (std::vector::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) - delete *it; + for (auto& dmrNetRewrites: m_dmrRFRewrites) + for (CRewrite* rewrite: dmrNetRewrites) + delete rewrite; - for (std::vector::iterator it = m_dmr1SrcRewrites.begin(); it != m_dmr1SrcRewrites.end(); ++it) - delete *it; + for (auto& dmrNetRewrites: m_dmrSrcRewrites) + for (CRewrite* rewrite: dmrNetRewrites) + delete rewrite; - for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr2SrcRewrites.begin(); it != m_dmr2SrcRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr3NetRewrites.begin(); it != m_dmr3NetRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr3RFRewrites.begin(); it != m_dmr3RFRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr3SrcRewrites.begin(); it != m_dmr3SrcRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr4NetRewrites.begin(); it != m_dmr4NetRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr4RFRewrites.begin(); it != m_dmr4RFRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr4SrcRewrites.begin(); it != m_dmr4SrcRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr5NetRewrites.begin(); it != m_dmr5NetRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr5RFRewrites.begin(); it != m_dmr5RFRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr5SrcRewrites.begin(); it != m_dmr5SrcRewrites.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr3Passalls.begin(); it != m_dmr3Passalls.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr4Passalls.begin(); it != m_dmr4Passalls.end(); ++it) - delete *it; - - for (std::vector::iterator it = m_dmr5Passalls.begin(); it != m_dmr5Passalls.end(); ++it) - delete *it; + for (auto& dmrNetRewrites: m_dmrPassalls) + for (CRewrite* rewrite: dmrNetRewrites) + delete rewrite; for (std::vector::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it) delete* it; @@ -283,8 +212,9 @@ CDMRGateway::~CDMRGateway() delete m_rptRewrite; delete m_xlxRewrite; - delete[] m_status; + delete[] m_extStatus; delete[] m_config; + delete[] m_networkEnabled; CUDPSocket::shutdown(); } @@ -328,7 +258,7 @@ int CDMRGateway::run() ::fprintf(stderr, "Could not get the mmdvm user, exiting\n"); return -1; } - + uid_t mmdvm_uid = user->pw_uid; gid_t mmdvm_gid = user->pw_gid; @@ -342,7 +272,7 @@ int CDMRGateway::run() ::fprintf(stderr, "Could not set mmdvm UID, exiting\n"); return -1; } - + // Double check it worked (AKA Paranoia) if (setuid(0) != -1) { ::fprintf(stderr, "It's possible to regain root - something is wrong!, exiting\n"); @@ -353,9 +283,9 @@ int CDMRGateway::run() #endif #if !defined(_WIN32) && !defined(_WIN64) - ret = ::LogInitialise(m_daemon, m_conf.getLogFilePath(), m_conf.getLogFileRoot(), m_conf.getLogFileLevel(), m_conf.getLogDisplayLevel(), m_conf.getLogFileRotate()); + ret = ::LogInitialise(m_daemon, m_conf.getLogFilePath(), m_conf.getLogFileRoot(), m_conf.getLogFileLevel(), m_conf.getLogDisplayLevel(), m_conf.getLogFileRotate()); #else - ret = ::LogInitialise(false, m_conf.getLogFilePath(), m_conf.getLogFileRoot(), m_conf.getLogFileLevel(), m_conf.getLogDisplayLevel(), m_conf.getLogFileRotate()); + ret = ::LogInitialise(false, m_conf.getLogFilePath(), m_conf.getLogFileRoot(), m_conf.getLogFileLevel(), m_conf.getLogDisplayLevel(), m_conf.getLogFileRotate()); #endif if (!ret) { ::fprintf(stderr, "DMRGateway: unable to open the log file\n"); @@ -370,13 +300,23 @@ int CDMRGateway::run() } #endif - m_network1Enabled = m_conf.getDMRNetwork1Enabled(); - m_network2Enabled = m_conf.getDMRNetwork2Enabled(); - m_network3Enabled = m_conf.getDMRNetwork3Enabled(); - m_network4Enabled = m_conf.getDMRNetwork4Enabled(); - m_network5Enabled = m_conf.getDMRNetwork5Enabled(); + m_dmrNetworkCount = m_conf.getDMRNetworksCount(); + + m_dmrNetworks.resize(m_dmrNetworkCount, nullptr); + m_dmrName.resize(m_dmrNetworkCount, ""); + m_networkEnabled = new bool[m_dmrNetworkCount]; + + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + m_networkEnabled[i] = m_conf.getDMRNetworkEnabled(i); + } + m_networkXlxEnabled = m_conf.getXLXNetworkEnabled(); + m_dmrNetRewrites.resize(m_dmrNetworkCount); + m_dmrRFRewrites.resize(m_dmrNetworkCount); + m_dmrSrcRewrites.resize(m_dmrNetworkCount); + m_dmrPassalls.resize(m_dmrNetworkCount); + LogInfo(HEADER1); LogInfo(HEADER2); LogInfo(HEADER3); @@ -476,34 +416,12 @@ int CDMRGateway::run() } } - if (m_network1Enabled && m_conf.getDMRNetwork1Enabled()) { - ret = createDMRNetwork1(); - if (!ret) - return 1; - } - - if (m_network2Enabled && m_conf.getDMRNetwork2Enabled()) { - ret = createDMRNetwork2(); - if (!ret) - return 1; - } - - if (m_network3Enabled && m_conf.getDMRNetwork3Enabled()) { - ret = createDMRNetwork3(); - if (!ret) - return 1; - } - - if (m_network4Enabled && m_conf.getDMRNetwork4Enabled()) { - ret = createDMRNetwork4(); - if (!ret) - return 1; - } - - if (m_network5Enabled && m_conf.getDMRNetwork5Enabled()) { - ret = createDMRNetwork5(); - if (!ret) - return 1; + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (m_networkEnabled[i] && m_conf.getDMRNetworkEnabled(i)) { + ret = createDMRNetwork(i); + if (!ret) + return 1; + } } if (m_conf.getDynamicTGControlEnabled()) { @@ -525,25 +443,8 @@ int CDMRGateway::run() unsigned int rfDstId[3U]; rfSrcId[1U] = rfSrcId[2U] = rfDstId[1U] = rfDstId[2U] = 0U; - unsigned int dmr1SrcId[3U]; - unsigned int dmr1DstId[3U]; - dmr1SrcId[1U] = dmr1SrcId[2U] = dmr1DstId[1U] = dmr1DstId[2U] = 0U; - - unsigned int dmr2SrcId[3U]; - unsigned int dmr2DstId[3U]; - dmr2SrcId[1U] = dmr2SrcId[2U] = dmr2DstId[1U] = dmr2DstId[2U] = 0U; - - unsigned int dmr3SrcId[3U]; - unsigned int dmr3DstId[3U]; - dmr3SrcId[1U] = dmr3SrcId[2U] = dmr3DstId[1U] = dmr3DstId[2U] = 0U; - - unsigned int dmr4SrcId[3U]; - unsigned int dmr4DstId[3U]; - dmr4SrcId[1U] = dmr4SrcId[2U] = dmr4DstId[1U] = dmr4DstId[2U] = 0U; - - unsigned int dmr5SrcId[3U]; - unsigned int dmr5DstId[3U]; - dmr5SrcId[1U] = dmr5SrcId[2U] = dmr5DstId[1U] = dmr5DstId[2U] = 0U; + std::vector> dmrSrcId(m_dmrNetworkCount, std::vector(3U, 0U)); + std::vector> dmrDstId(m_dmrNetworkCount, std::vector(3U, 0U)); CStopWatch stopWatch; stopWatch.start(); @@ -640,7 +541,7 @@ int CDMRGateway::run() if (m_networkXlxEnabled) { m_xlxNetwork->write(data); } - m_status[slotNo] = DMRGW_STATUS::XLXREFLECTOR; + m_extStatus[slotNo].m_status = DMRGW_STATUS::XLXREFLECTOR; timer[slotNo]->setTimeout(rfTimeout); timer[slotNo]->start(); } else if ((dstId <= (m_xlxBase + 26U) || dstId == (m_xlxBase + 1000U)) && flco == FLCO::USER_USER && slotNo == m_xlxSlot && dstId >= m_xlxBase && m_xlxUserControl) { @@ -668,7 +569,7 @@ int CDMRGateway::run() m_xlxRelink.stop(); } - m_status[slotNo] = DMRGW_STATUS::XLXREFLECTOR; + m_extStatus[slotNo].m_status = DMRGW_STATUS::XLXREFLECTOR; timer[slotNo]->setTimeout(rfTimeout); timer[slotNo]->start(); @@ -713,32 +614,15 @@ int CDMRGateway::run() PROCESS_RESULT result = PROCESS_RESULT::UNMATCHED; - if (m_network1Enabled && (m_dmrNetwork1 != nullptr)) { - // Rewrite the slot and/or TG or neither - for (std::vector::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } + // Match by m_dmrRFRewrites + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (result != PROCESS_RESULT::UNMATCHED) + break; - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK1) { - rewrite(m_dmr1SrcRewrites, data, trace); - m_dmrNetwork1->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK1; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network2Enabled && (m_dmrNetwork2 != nullptr)) { + if (m_networkEnabled[i] && (m_dmrNetworks[i] != nullptr)) { // Rewrite the slot and/or TG or neither - for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); + for (CRewrite* rewrite: m_dmrRFRewrites[i]) { + PROCESS_RESULT res = rewrite->process(data, trace); if (res != PROCESS_RESULT::UNMATCHED) { result = res; break; @@ -746,10 +630,14 @@ int CDMRGateway::run() } if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK2) { - rewrite(m_dmr2SrcRewrites, data, trace); - m_dmrNetwork2->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK2; + if (m_extStatus[slotNo].m_status == DMRGW_STATUS::NONE || ( + m_extStatus[slotNo].m_status == DMRGW_STATUS::DMRNETWORK && + m_extStatus[slotNo].m_dmrNetwork == i) + ) { + rewrite(m_dmrSrcRewrites[i], data, trace); + m_dmrNetworks[i]->write(data); + m_extStatus[slotNo].m_status = DMRGW_STATUS::DMRNETWORK; + m_extStatus[slotNo].m_dmrNetwork = i; timer[slotNo]->setTimeout(rfTimeout); timer[slotNo]->start(); } @@ -757,11 +645,14 @@ int CDMRGateway::run() } } - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network3Enabled && (m_dmrNetwork3 != nullptr)) { - // Rewrite the slot and/or TG or neither - for (std::vector::iterator it = m_dmr3RFRewrites.begin(); it != m_dmr3RFRewrites.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); + // Match by m_dmrPassalls + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (result != PROCESS_RESULT::UNMATCHED) + break; + + if (m_networkEnabled[i] && (m_dmrNetworks[i] != nullptr)) { + for (CRewrite* rewrite: m_dmrPassalls[i]) { + PROCESS_RESULT res = rewrite->process(data, trace); if (res != PROCESS_RESULT::UNMATCHED) { result = res; break; @@ -769,166 +660,14 @@ int CDMRGateway::run() } if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK3) { - rewrite(m_dmr3SrcRewrites, data, trace); - m_dmrNetwork3->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK3; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network4Enabled && (m_dmrNetwork4 != nullptr)) { - // Rewrite the slot and/or TG or neither - for (std::vector::iterator it = m_dmr4RFRewrites.begin(); it != m_dmr4RFRewrites.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK4) { - rewrite(m_dmr4SrcRewrites, data, trace); - m_dmrNetwork4->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK4; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network5Enabled && (m_dmrNetwork5 != nullptr)) { - // Rewrite the slot and/or TG or neither - for (std::vector::iterator it = m_dmr5RFRewrites.begin(); it != m_dmr5RFRewrites.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK5) { - rewrite(m_dmr5SrcRewrites, data, trace); - m_dmrNetwork5->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK5; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network1Enabled && (m_dmrNetwork1 != nullptr)) { - for (std::vector::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK1) { - rewrite(m_dmr1SrcRewrites, data, trace); - m_dmrNetwork1->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK1; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network2Enabled && (m_dmrNetwork2 != nullptr)) { - for (std::vector::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK2) { - rewrite(m_dmr2SrcRewrites, data, trace); - m_dmrNetwork2->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK2; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network3Enabled && (m_dmrNetwork3 != nullptr)) { - for (std::vector::iterator it = m_dmr3Passalls.begin(); it != m_dmr3Passalls.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK3) { - rewrite(m_dmr3SrcRewrites, data, trace); - m_dmrNetwork3->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK3; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network4Enabled && (m_dmrNetwork4 != nullptr)) { - for (std::vector::iterator it = m_dmr4Passalls.begin(); it != m_dmr4Passalls.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK4) { - rewrite(m_dmr4SrcRewrites, data, trace); - m_dmrNetwork4->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK4; - timer[slotNo]->setTimeout(rfTimeout); - timer[slotNo]->start(); - } - } - } - } - - if (result == PROCESS_RESULT::UNMATCHED) { - if (m_network5Enabled && (m_dmrNetwork5 != nullptr)) { - for (std::vector::iterator it = m_dmr5Passalls.begin(); it != m_dmr5Passalls.end(); ++it) { - PROCESS_RESULT res = (*it)->process(data, trace); - if (res != PROCESS_RESULT::UNMATCHED) { - result = res; - break; - } - } - - if (result == PROCESS_RESULT::MATCHED) { - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK5) { - rewrite(m_dmr5SrcRewrites, data, trace); - m_dmrNetwork5->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK5; + if (m_extStatus[slotNo].m_status == DMRGW_STATUS::NONE || ( + m_extStatus[slotNo].m_status == DMRGW_STATUS::DMRNETWORK && + m_extStatus[slotNo].m_dmrNetwork == i) + ) { + rewrite(m_dmrSrcRewrites[i], data, trace); + m_dmrNetworks[i]->write(data); + m_extStatus[slotNo].m_status = DMRGW_STATUS::DMRNETWORK; + m_extStatus[slotNo].m_dmrNetwork = i; timer[slotNo]->setTimeout(rfTimeout); timer[slotNo]->start(); } @@ -944,11 +683,13 @@ int CDMRGateway::run() if (m_networkXlxEnabled && (m_xlxNetwork != nullptr)) { ret = m_xlxNetwork->read(data); if (ret) { - if (m_status[m_xlxSlot] == DMRGW_STATUS::NONE || m_status[m_xlxSlot] == DMRGW_STATUS::XLXREFLECTOR) { + if (m_extStatus[m_xlxSlot].m_status == DMRGW_STATUS::NONE || + m_extStatus[m_xlxSlot].m_status == DMRGW_STATUS::XLXREFLECTOR + ) { PROCESS_RESULT ret = m_rptRewrite->process(data, false); if (ret == PROCESS_RESULT::MATCHED) { m_repeater->write(data); - m_status[m_xlxSlot] = DMRGW_STATUS::XLXREFLECTOR; + m_extStatus[m_xlxSlot].m_status = DMRGW_STATUS::XLXREFLECTOR; timer[m_xlxSlot]->setTimeout(netTimeout); timer[m_xlxSlot]->start(); } else { @@ -961,254 +702,61 @@ int CDMRGateway::run() } } - if (m_network1Enabled && (m_dmrNetwork1 != nullptr)) { - ret = m_dmrNetwork1->read(data); - if (ret) { - unsigned int slotNo = data.getSlotNo(); - unsigned int srcId = data.getSrcId(); - unsigned int dstId = data.getDstId(); - FLCO flco = data.getFLCO(); + //!!0 + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (m_networkEnabled[i] && (m_dmrNetworks[i] != nullptr)) { + ret = m_dmrNetworks[i]->read(data); + if (ret) { + unsigned int slotNo = data.getSlotNo(); + unsigned int srcId = data.getSrcId(); + unsigned int dstId = data.getDstId(); + FLCO flco = data.getFLCO(); - bool trace = false; - if (ruleTrace && (srcId != dmr1SrcId[slotNo] || dstId != dmr1DstId[slotNo])) { - dmr1SrcId[slotNo] = srcId; - dmr1DstId[slotNo] = dstId; - trace = true; - } - - if (trace) - LogDebug("Rule Trace, network 1 transmission: Slot=%u Src=%u Dst=%s%u", slotNo, srcId, flco == FLCO::GROUP ? "TG" : "", dstId); - - // Rewrite the slot and/or TG or neither - bool rewritten = false; - for (std::vector::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) { - PROCESS_RESULT ret = (*it)->process(data, trace); - if (ret == PROCESS_RESULT::MATCHED) { - rewritten = true; - break; + bool trace = false; + if (ruleTrace && (srcId != dmrSrcId[i][slotNo] || dstId != dmrDstId[i][slotNo])) { + dmrSrcId[i][slotNo] = srcId; + dmrDstId[i][slotNo] = dstId; + trace = true; } - } - if (rewritten) { - // Check that the rewritten slot is free to use. - slotNo = data.getSlotNo(); - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK1) { - for (std::vector::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it) - (*it)->stopVoice(slotNo); - m_repeater->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK1; - timer[slotNo]->setTimeout(netTimeout); - timer[slotNo]->start(); + if (trace) + LogDebug("Rule Trace, network %i transmission: Slot=%u Src=%u Dst=%s%u", i + 1, slotNo, srcId, flco == FLCO::GROUP ? "TG" : "", dstId); + + // Rewrite the slot and/or TG or neither + bool rewritten = false; + for (CRewrite* rewrite: m_dmrNetRewrites[i]) { + PROCESS_RESULT ret = rewrite->process(data, trace); + if (ret == PROCESS_RESULT::MATCHED) { + rewritten = true; + break; + } } + + if (rewritten) { + // Check that the rewritten slot is free to use. + slotNo = data.getSlotNo(); + if (m_extStatus[slotNo].m_status == DMRGW_STATUS::NONE || ( + m_extStatus[slotNo].m_status == DMRGW_STATUS::DMRNETWORK && + m_extStatus[slotNo].m_dmrNetwork == i) + ) { + for (std::vector::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it) + (*it)->stopVoice(slotNo); + m_repeater->write(data); + m_extStatus[slotNo].m_status = DMRGW_STATUS::DMRNETWORK; + m_extStatus[slotNo].m_dmrNetwork = i; + timer[slotNo]->setTimeout(netTimeout); + timer[slotNo]->start(); + } + } + + if (!rewritten && trace) + LogDebug("Rule Trace,\tnot matched so rejected"); } - if (!rewritten && trace) - LogDebug("Rule Trace,\tnot matched so rejected"); + ret = m_dmrNetworks[i]->wantsBeacon(); + if (ret) + m_repeater->writeBeacon(); } - - ret = m_dmrNetwork1->wantsBeacon(); - if (ret) - m_repeater->writeBeacon(); - } - - if (m_network2Enabled && (m_dmrNetwork2 != nullptr)) { - ret = m_dmrNetwork2->read(data); - if (ret) { - unsigned int slotNo = data.getSlotNo(); - unsigned int srcId = data.getSrcId(); - unsigned int dstId = data.getDstId(); - FLCO flco = data.getFLCO(); - - bool trace = false; - if (ruleTrace && (srcId != dmr2SrcId[slotNo] || dstId != dmr2DstId[slotNo])) { - dmr2SrcId[slotNo] = srcId; - dmr2DstId[slotNo] = dstId; - trace = true; - } - - if (trace) - LogDebug("Rule Trace, network 2 transmission: Slot=%u Src=%u Dst=%s%u", slotNo, srcId, flco == FLCO::GROUP ? "TG" : "", dstId); - - // Rewrite the slot and/or TG or neither - bool rewritten = false; - for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) { - PROCESS_RESULT ret = (*it)->process(data, trace); - if (ret == PROCESS_RESULT::MATCHED) { - rewritten = true; - break; - } - } - - if (rewritten) { - // Check that the rewritten slot is free to use. - slotNo = data.getSlotNo(); - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK2) { - for (std::vector::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it) - (*it)->stopVoice(slotNo); - m_repeater->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK2; - timer[slotNo]->setTimeout(netTimeout); - timer[slotNo]->start(); - } - } - - if (!rewritten && trace) - LogDebug("Rule Trace,\tnot matched so rejected"); - } - - ret = m_dmrNetwork2->wantsBeacon(); - if (ret) - m_repeater->writeBeacon(); - } - - if (m_network3Enabled && (m_dmrNetwork3 != nullptr)) { - ret = m_dmrNetwork3->read(data); - if (ret) { - unsigned int slotNo = data.getSlotNo(); - unsigned int srcId = data.getSrcId(); - unsigned int dstId = data.getDstId(); - FLCO flco = data.getFLCO(); - - bool trace = false; - if (ruleTrace && (srcId != dmr3SrcId[slotNo] || dstId != dmr3DstId[slotNo])) { - dmr3SrcId[slotNo] = srcId; - dmr3DstId[slotNo] = dstId; - trace = true; - } - - if (trace) - LogDebug("Rule Trace, network 3 transmission: Slot=%u Src=%u Dst=%s%u", slotNo, srcId, flco == FLCO::GROUP ? "TG" : "", dstId); - - // Rewrite the slot and/or TG or neither - bool rewritten = false; - for (std::vector::iterator it = m_dmr3NetRewrites.begin(); it != m_dmr3NetRewrites.end(); ++it) { - PROCESS_RESULT ret = (*it)->process(data, trace); - if (ret == PROCESS_RESULT::MATCHED) { - rewritten = true; - break; - } - } - - if (rewritten) { - // Check that the rewritten slot is free to use. - slotNo = data.getSlotNo(); - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK3) { - for (std::vector::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it) - (*it)->stopVoice(slotNo); - m_repeater->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK3; - timer[slotNo]->setTimeout(netTimeout); - timer[slotNo]->start(); - } - } - - if (!rewritten && trace) - LogDebug("Rule Trace,\tnot matched so rejected"); - } - - ret = m_dmrNetwork3->wantsBeacon(); - if (ret) - m_repeater->writeBeacon(); - } - - if (m_network4Enabled && (m_dmrNetwork4 != nullptr)) { - ret = m_dmrNetwork4->read(data); - if (ret) { - unsigned int slotNo = data.getSlotNo(); - unsigned int srcId = data.getSrcId(); - unsigned int dstId = data.getDstId(); - FLCO flco = data.getFLCO(); - - bool trace = false; - if (ruleTrace && (srcId != dmr4SrcId[slotNo] || dstId != dmr4DstId[slotNo])) { - dmr4SrcId[slotNo] = srcId; - dmr4DstId[slotNo] = dstId; - trace = true; - } - - if (trace) - LogDebug("Rule Trace, network 4 transmission: Slot=%u Src=%u Dst=%s%u", slotNo, srcId, flco == FLCO::GROUP ? "TG" : "", dstId); - - // Rewrite the slot and/or TG or neither - bool rewritten = false; - for (std::vector::iterator it = m_dmr4NetRewrites.begin(); it != m_dmr4NetRewrites.end(); ++it) { - PROCESS_RESULT ret = (*it)->process(data, trace); - if (ret == PROCESS_RESULT::MATCHED) { - rewritten = true; - break; - } - } - - if (rewritten) { - // Check that the rewritten slot is free to use. - slotNo = data.getSlotNo(); - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK4) { - for (std::vector::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it) - (*it)->stopVoice(slotNo); - m_repeater->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK4; - timer[slotNo]->setTimeout(netTimeout); - timer[slotNo]->start(); - } - } - - if (!rewritten && trace) - LogDebug("Rule Trace,\tnot matched so rejected"); - } - - ret = m_dmrNetwork4->wantsBeacon(); - if (ret) - m_repeater->writeBeacon(); - } - - if (m_network5Enabled && (m_dmrNetwork5 != nullptr)) { - ret = m_dmrNetwork5->read(data); - if (ret) { - unsigned int slotNo = data.getSlotNo(); - unsigned int srcId = data.getSrcId(); - unsigned int dstId = data.getDstId(); - FLCO flco = data.getFLCO(); - - bool trace = false; - if (ruleTrace && (srcId != dmr5SrcId[slotNo] || dstId != dmr5DstId[slotNo])) { - dmr5SrcId[slotNo] = srcId; - dmr5DstId[slotNo] = dstId; - trace = true; - } - - if (trace) - LogDebug("Rule Trace, network 5 transmission: Slot=%u Src=%u Dst=%s%u", slotNo, srcId, flco == FLCO::GROUP ? "TG" : "", dstId); - - // Rewrite the slot and/or TG or neither - bool rewritten = false; - for (std::vector::iterator it = m_dmr5NetRewrites.begin(); it != m_dmr5NetRewrites.end(); ++it) { - PROCESS_RESULT ret = (*it)->process(data, trace); - if (ret == PROCESS_RESULT::MATCHED) { - rewritten = true; - break; - } - } - - if (rewritten) { - // Check that the rewritten slot is free to use. - slotNo = data.getSlotNo(); - if (m_status[slotNo] == DMRGW_STATUS::NONE || m_status[slotNo] == DMRGW_STATUS::DMRNETWORK5) { - for (std::vector::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it) - (*it)->stopVoice(slotNo); - m_repeater->write(data); - m_status[slotNo] = DMRGW_STATUS::DMRNETWORK5; - timer[slotNo]->setTimeout(netTimeout); - timer[slotNo]->start(); - } - } - - if (!rewritten && trace) - LogDebug("Rule Trace,\tnot matched so rejected"); - } - - ret = m_dmrNetwork5->wantsBeacon(); - if (ret) - m_repeater->writeBeacon(); } processRadioPosition(); @@ -1219,7 +767,7 @@ int CDMRGateway::run() ret = m_xlxVoice->read(data); if (ret) { m_repeater->write(data); - m_status[m_xlxSlot] = DMRGW_STATUS::XLXREFLECTOR; + m_extStatus[m_xlxSlot].m_status = DMRGW_STATUS::XLXREFLECTOR; timer[m_xlxSlot]->setTimeout(netTimeout); timer[m_xlxSlot]->start(); } @@ -1243,20 +791,9 @@ int CDMRGateway::run() m_xlxRelink.clock(ms); - if (m_dmrNetwork1 != nullptr) - m_dmrNetwork1->clock(ms); - - if (m_dmrNetwork2 != nullptr) - m_dmrNetwork2->clock(ms); - - if (m_dmrNetwork3 != nullptr) - m_dmrNetwork3->clock(ms); - - if (m_dmrNetwork4 != nullptr) - m_dmrNetwork4->clock(ms); - - if (m_dmrNetwork5 != nullptr) - m_dmrNetwork5->clock(ms); + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) + if (m_dmrNetworks[i] != nullptr) + m_dmrNetworks[i]->clock(ms); if (m_xlxNetwork != nullptr) m_xlxNetwork->clock(ms); @@ -1278,10 +815,11 @@ int CDMRGateway::run() for (std::vector::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it) (*it)->clock(ms); + // Check timer for both slots & free if expired for (unsigned int i = 1U; i < 3U; i++) { timer[i]->clock(ms); if (timer[i]->isRunning() && timer[i]->hasExpired()) { - m_status[i] = DMRGW_STATUS::NONE; + m_extStatus[i].m_status = DMRGW_STATUS::NONE; timer[i]->stop(); } } @@ -1312,29 +850,11 @@ int CDMRGateway::run() delete m_writer; } - if (m_dmrNetwork1 != nullptr) { - m_dmrNetwork1->close(true); - delete m_dmrNetwork1; - } - - if (m_dmrNetwork2 != nullptr) { - m_dmrNetwork2->close(true); - delete m_dmrNetwork2; - } - - if (m_dmrNetwork3 != nullptr) { - m_dmrNetwork3->close(true); - delete m_dmrNetwork3; - } - - if (m_dmrNetwork4 != nullptr) { - m_dmrNetwork4->close(true); - delete m_dmrNetwork4; - } - - if (m_dmrNetwork5 != nullptr) { - m_dmrNetwork5->close(true); - delete m_dmrNetwork5; + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (m_dmrNetworks[i] != nullptr) { + m_dmrNetworks[i]->close(true); + delete m_dmrNetworks[i]; + } } if (m_xlxNetwork != nullptr) { @@ -1381,22 +901,22 @@ bool CDMRGateway::createMMDVM() return true; } -bool CDMRGateway::createDMRNetwork1() +bool CDMRGateway::createDMRNetwork(unsigned int index) { - std::string address = m_conf.getDMRNetwork1Address(); - unsigned short port = m_conf.getDMRNetwork1Port(); - unsigned short local = m_conf.getDMRNetwork1Local(); - unsigned int id = m_conf.getDMRNetwork1Id(); - std::string password = m_conf.getDMRNetwork1Password(); - bool location = m_conf.getDMRNetwork1Location(); - bool debug = m_conf.getDMRNetwork1Debug(); - m_dmr1Name = m_conf.getDMRNetwork1Name(); + std::string address = m_conf.getDMRNetworkAddress(index); + unsigned short port = m_conf.getDMRNetworkPort(index); + unsigned short local = m_conf.getDMRNetworkLocal(index); + unsigned int id = m_conf.getDMRNetworkId(index); + std::string password = m_conf.getDMRNetworkPassword(index); + bool location = m_conf.getDMRNetworkLocation(index); + bool debug = m_conf.getDMRNetworkDebug(index); + m_dmrName[index] = m_conf.getDMRNetworkName(index); if (id == 0U) id = m_repeater->getId(); - LogInfo("DMR Network 1 Parameters"); - LogInfo(" Name: %s", m_dmr1Name.c_str()); + LogInfo("DMR Network %i Parameters", index + 1); + LogInfo(" Name: %s", m_dmrName[index].c_str()); LogInfo(" Id: %u", id); LogInfo(" Address: %s", address.c_str()); LogInfo(" Port: %hu", port); @@ -1406,32 +926,32 @@ bool CDMRGateway::createDMRNetwork1() LogInfo(" Local: random"); LogInfo(" Location Data: %s", location ? "yes" : "no"); - m_dmrNetwork1 = new CDMRNetwork(address, port, local, id, password, m_dmr1Name, location, debug); + m_dmrNetworks[index] = new CDMRNetwork(address, port, local, id, password, m_dmrName[index], location, debug); - std::string options = m_conf.getDMRNetwork1Options(); + std::string options = m_conf.getDMRNetworkOptions(index); if (!options.empty()) { LogInfo(" Options: %s", options.c_str()); - m_dmrNetwork1->setOptions(options); + m_dmrNetworks[index]->setOptions(options); } unsigned char config[400U]; - unsigned int len = getConfig(m_dmr1Name, config); - m_dmrNetwork1->setConfig(config, len); + unsigned int len = getConfig(m_dmrName[index], config); + m_dmrNetworks[index]->setConfig(config, len); - bool ret = m_dmrNetwork1->open(); + bool ret = m_dmrNetworks[index]->open(); if (!ret) { - delete m_dmrNetwork1; - m_dmrNetwork1 = nullptr; + delete m_dmrNetworks[index]; + m_dmrNetworks[index] = nullptr; return false; } #if defined(USE_GPSD) if (location && (m_gpsd != nullptr)) - m_gpsd->addNetwork(m_dmrNetwork1); + m_gpsd->addNetwork(m_dmrNetworks[index]); #endif - std::vector tgRewrites = m_conf.getDMRNetwork1TGRewrites(); + std::vector tgRewrites = m_conf.getDMRNetworkTGRewrites(index); for (std::vector::const_iterator it = tgRewrites.begin(); it != tgRewrites.end(); ++it) { if ((*it).m_range == 1) LogInfo(" Rewrite RF: %u:TG%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG); @@ -1442,50 +962,50 @@ bool CDMRGateway::createDMRNetwork1() else LogInfo(" Rewrite Net: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U); - CRewriteTG* rfRewrite = new CRewriteTG(m_dmr1Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - CRewriteTG* netRewrite = new CRewriteTG(m_dmr1Name, (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_range); + CRewriteTG* rfRewrite = new CRewriteTG(m_dmrName[index], (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); + CRewriteTG* netRewrite = new CRewriteTG(m_dmrName[index], (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_range); - m_dmr1RFRewrites.push_back(rfRewrite); - m_dmr1NetRewrites.push_back(netRewrite); + m_dmrRFRewrites[index].push_back(rfRewrite); + m_dmrNetRewrites[index].push_back(netRewrite); } - std::vector pcRewrites = m_conf.getDMRNetwork1PCRewrites(); + std::vector pcRewrites = m_conf.getDMRNetworkPCRewrites(index); for (std::vector::const_iterator it = pcRewrites.begin(); it != pcRewrites.end(); ++it) { if ((*it).m_range == 1) LogInfo(" Rewrite RF: %u:%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId); else LogInfo(" Rewrite RF: %u:%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - CRewritePC* rewrite = new CRewritePC(m_dmr1Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId, (*it).m_range); + CRewritePC* rewrite = new CRewritePC(m_dmrName[index], (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - m_dmr1RFRewrites.push_back(rewrite); + m_dmrRFRewrites[index].push_back(rewrite); } - std::vector typeRewrites = m_conf.getDMRNetwork1TypeRewrites(); + std::vector typeRewrites = m_conf.getDMRNetworkTypeRewrites(index); for (std::vector::const_iterator it = typeRewrites.begin(); it != typeRewrites.end(); ++it) { if ((*it).m_range == 1) LogInfo(" Rewrite RF: %u:TG%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); else LogInfo(" Rewrite RF: %u:TG%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - CRewriteType* rewrite = new CRewriteType(m_dmr1Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId, (*it).m_range); + CRewriteType* rewrite = new CRewriteType(m_dmrName[index], (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - m_dmr1RFRewrites.push_back(rewrite); + m_dmrRFRewrites[index].push_back(rewrite); } - std::vector srcRewrites = m_conf.getDMRNetwork1SrcRewrites(); + std::vector srcRewrites = m_conf.getDMRNetworkSrcRewrites(index); for (std::vector::const_iterator it = srcRewrites.begin(); it != srcRewrites.end(); ++it) { if ((*it).m_range == 1) LogInfo(" Rewrite Net: %u:%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG); else LogInfo(" Rewrite Net: %u:%u-%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG); - CRewriteSrc* rewrite = new CRewriteSrc(m_dmr1Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); + CRewriteSrc* rewrite = new CRewriteSrc(m_dmrName[index], (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - m_dmr1NetRewrites.push_back(rewrite); + m_dmrNetRewrites[index].push_back(rewrite); } - std::vector dynRewrites = m_conf.getDMRNetwork1TGDynRewrites(); + std::vector dynRewrites = m_conf.getDMRNetworkTGDynRewrites(index); 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) (%u exclusions)", (*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, (*it).m_exclTGs.size()); @@ -1504,724 +1024,48 @@ bool CDMRGateway::createDMRNetwork1() } } - 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, (*it).m_exclTGs, netRewriteDynTG, voice); + CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmrName[index], (*it).m_slot, (*it).m_toTG); + CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmrName[index], (*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); + m_dmrRFRewrites[index].push_back(rfRewriteDynTG); + m_dmrNetRewrites[index].push_back(netRewriteDynTG); m_dynRF.push_back(rfRewriteDynTG); } - std::vector idRewrites = m_conf.getDMRNetwork1IdRewrites(); + std::vector idRewrites = m_conf.getDMRNetworkIdRewrites(index); for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); - CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr1Name, (*it).m_rfId, (*it).m_netId); - CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr1Name, (*it).m_netId, (*it).m_rfId); + CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmrName[index], (*it).m_rfId, (*it).m_netId); + CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmrName[index], (*it).m_netId, (*it).m_rfId); - m_dmr1SrcRewrites.push_back(rewriteSrcId); - m_dmr1NetRewrites.push_back(rewriteDstId); + m_dmrSrcRewrites[index].push_back(rewriteSrcId); + m_dmrNetRewrites[index].push_back(rewriteDstId); } - std::vector tgPassAll = m_conf.getDMRNetwork1PassAllTG(); + std::vector tgPassAll = m_conf.getDMRNetworkPassAllTG(index); for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { LogInfo(" Pass All TG: %u", *it); - CPassAllTG* rfPassAllTG = new CPassAllTG(m_dmr1Name, *it); - CPassAllTG* netPassAllTG = new CPassAllTG(m_dmr1Name, *it); + CPassAllTG* rfPassAllTG = new CPassAllTG(m_dmrName[index], *it); + CPassAllTG* netPassAllTG = new CPassAllTG(m_dmrName[index], *it); - m_dmr1Passalls.push_back(rfPassAllTG); - m_dmr1NetRewrites.push_back(netPassAllTG); + m_dmrPassalls[index].push_back(rfPassAllTG); + m_dmrNetRewrites[index].push_back(netPassAllTG); } - std::vector pcPassAll = m_conf.getDMRNetwork1PassAllPC(); + std::vector pcPassAll = m_conf.getDMRNetworkPassAllPC(index); for (std::vector::const_iterator it = pcPassAll.begin(); it != pcPassAll.end(); ++it) { LogInfo(" Pass All PC: %u", *it); - CPassAllPC* rfPassAllPC = new CPassAllPC(m_dmr1Name, *it); - CPassAllPC* netPassAllPC = new CPassAllPC(m_dmr1Name, *it); + CPassAllPC* rfPassAllPC = new CPassAllPC(m_dmrName[index], *it); + CPassAllPC* netPassAllPC = new CPassAllPC(m_dmrName[index], *it); - m_dmr1Passalls.push_back(rfPassAllPC); - m_dmr1NetRewrites.push_back(netPassAllPC); + m_dmrPassalls[index].push_back(rfPassAllPC); + m_dmrNetRewrites[index].push_back(netPassAllPC); } - m_dmrNetwork1->enable(true); - - return true; -} - -bool CDMRGateway::createDMRNetwork2() -{ - std::string address = m_conf.getDMRNetwork2Address(); - unsigned short port = m_conf.getDMRNetwork2Port(); - unsigned short local = m_conf.getDMRNetwork2Local(); - unsigned int id = m_conf.getDMRNetwork2Id(); - std::string password = m_conf.getDMRNetwork2Password(); - bool location = m_conf.getDMRNetwork2Location(); - bool debug = m_conf.getDMRNetwork2Debug(); - m_dmr2Name = m_conf.getDMRNetwork2Name(); - - if (id == 0U) - id = m_repeater->getId(); - - LogInfo("DMR Network 2 Parameters"); - LogInfo(" Name: %s", m_dmr2Name.c_str()); - LogInfo(" Id: %u", id); - LogInfo(" Address: %s", address.c_str()); - LogInfo(" Port: %hu", port); - if (local > 0U) - LogInfo(" Local: %hu", local); - else - LogInfo(" Local: random"); - LogInfo(" Location Data: %s", location ? "yes" : "no"); - - m_dmrNetwork2 = new CDMRNetwork(address, port, local, id, password, m_dmr2Name, location, debug); - - std::string options = m_conf.getDMRNetwork2Options(); - - if (!options.empty()) { - LogInfo(" Options: %s", options.c_str()); - m_dmrNetwork2->setOptions(options); - } - - unsigned char config[400U]; - unsigned int len = getConfig(m_dmr2Name, config); - m_dmrNetwork2->setConfig(config, len); - - bool ret = m_dmrNetwork2->open(); - if (!ret) { - delete m_dmrNetwork2; - m_dmrNetwork2 = nullptr; - return false; - } - -#if defined(USE_GPSD) - if (location && (m_gpsd != nullptr)) - m_gpsd->addNetwork(m_dmrNetwork2); -#endif - - std::vector tgRewrites = m_conf.getDMRNetwork2TGRewrites(); - for (std::vector::const_iterator it = tgRewrites.begin(); it != tgRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite RF: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U); - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:TG%u -> %u:TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG); - else - LogInfo(" Rewrite Net: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U); - - CRewriteTG* rfRewrite = new CRewriteTG(m_dmr2Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - CRewriteTG* netRewrite = new CRewriteTG(m_dmr2Name, (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_range); - - m_dmr2RFRewrites.push_back(rfRewrite); - m_dmr2NetRewrites.push_back(netRewrite); - } - - std::vector pcRewrites = m_conf.getDMRNetwork2PCRewrites(); - for (std::vector::const_iterator it = pcRewrites.begin(); it != pcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewritePC* rewrite = new CRewritePC(m_dmr2Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr2RFRewrites.push_back(rewrite); - } - - std::vector typeRewrites = m_conf.getDMRNetwork2TypeRewrites(); - for (std::vector::const_iterator it = typeRewrites.begin(); it != typeRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:TG%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewriteType* rewrite = new CRewriteType(m_dmr2Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr2RFRewrites.push_back(rewrite); - } - - std::vector srcRewrites = m_conf.getDMRNetwork2SrcRewrites(); - for (std::vector::const_iterator it = srcRewrites.begin(); it != srcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite Net: %u:%u-%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG); - - CRewriteSrc* rewrite = new CRewriteSrc(m_dmr2Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - - m_dmr2NetRewrites.push_back(rewrite); - } - - std::vector dynRewrites = m_conf.getDMRNetwork2TGDynRewrites(); - 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) (%u exclusions)", (*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, (*it).m_exclTGs.size()); - - CDynVoice* voice = nullptr; - 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 = nullptr; - } 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, (*it).m_exclTGs, netRewriteDynTG, voice); - - m_dmr2RFRewrites.push_back(rfRewriteDynTG); - m_dmr2NetRewrites.push_back(netRewriteDynTG); - m_dynRF.push_back(rfRewriteDynTG); - } - - std::vector idRewrites = m_conf.getDMRNetwork2IdRewrites(); - for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { - LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); - - CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr2Name, (*it).m_rfId, (*it).m_netId); - CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr2Name, (*it).m_netId, (*it).m_rfId); - - m_dmr2SrcRewrites.push_back(rewriteSrcId); - m_dmr2NetRewrites.push_back(rewriteDstId); - } - - std::vector tgPassAll = m_conf.getDMRNetwork2PassAllTG(); - for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { - LogInfo(" Pass All TG: %u", *it); - - CPassAllTG* rfPassAllTG = new CPassAllTG(m_dmr2Name, *it); - CPassAllTG* netPassAllTG = new CPassAllTG(m_dmr2Name, *it); - - m_dmr2Passalls.push_back(rfPassAllTG); - m_dmr2NetRewrites.push_back(netPassAllTG); - } - - std::vector pcPassAll = m_conf.getDMRNetwork2PassAllPC(); - for (std::vector::const_iterator it = pcPassAll.begin(); it != pcPassAll.end(); ++it) { - LogInfo(" Pass All PC: %u", *it); - - CPassAllPC* rfPassAllPC = new CPassAllPC(m_dmr2Name, *it); - CPassAllPC* netPassAllPC = new CPassAllPC(m_dmr2Name, *it); - - m_dmr2Passalls.push_back(rfPassAllPC); - m_dmr2NetRewrites.push_back(netPassAllPC); - } - - m_dmrNetwork2->enable(true); - - return true; -} - -bool CDMRGateway::createDMRNetwork3() -{ - std::string address = m_conf.getDMRNetwork3Address(); - unsigned short port = m_conf.getDMRNetwork3Port(); - unsigned short local = m_conf.getDMRNetwork3Local(); - unsigned int id = m_conf.getDMRNetwork3Id(); - std::string password = m_conf.getDMRNetwork3Password(); - bool location = m_conf.getDMRNetwork3Location(); - bool debug = m_conf.getDMRNetwork3Debug(); - m_dmr3Name = m_conf.getDMRNetwork3Name(); - - if (id == 0U) - id = m_repeater->getId(); - - LogInfo("DMR Network 3 Parameters"); - LogInfo(" Name: %s", m_dmr3Name.c_str()); - LogInfo(" Id: %u", id); - LogInfo(" Address: %s", address.c_str()); - LogInfo(" Port: %hu", port); - if (local > 0U) - LogInfo(" Local: %hu", local); - else - LogInfo(" Local: random"); - LogInfo(" Location Data: %s", location ? "yes" : "no"); - - m_dmrNetwork3 = new CDMRNetwork(address, port, local, id, password, m_dmr3Name, location, debug); - - std::string options = m_conf.getDMRNetwork3Options(); - - if (!options.empty()) { - LogInfo(" Options: %s", options.c_str()); - m_dmrNetwork3->setOptions(options); - } - - unsigned char config[400U]; - unsigned int len = getConfig(m_dmr3Name, config); - m_dmrNetwork3->setConfig(config, len); - - bool ret = m_dmrNetwork3->open(); - if (!ret) { - delete m_dmrNetwork3; - m_dmrNetwork3 = nullptr; - return false; - } - -#if defined(USE_GPSD) - if (location && (m_gpsd != nullptr)) - m_gpsd->addNetwork(m_dmrNetwork3); -#endif - - std::vector tgRewrites = m_conf.getDMRNetwork3TGRewrites(); - for (std::vector::const_iterator it = tgRewrites.begin(); it != tgRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite RF: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U); - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:TG%u -> %u:TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG); - else - LogInfo(" Rewrite Net: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U); - - CRewriteTG* rfRewrite = new CRewriteTG(m_dmr3Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - CRewriteTG* netRewrite = new CRewriteTG(m_dmr3Name, (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_range); - - m_dmr3RFRewrites.push_back(rfRewrite); - m_dmr3NetRewrites.push_back(netRewrite); - } - - std::vector pcRewrites = m_conf.getDMRNetwork3PCRewrites(); - for (std::vector::const_iterator it = pcRewrites.begin(); it != pcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewritePC* rewrite = new CRewritePC(m_dmr3Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr3RFRewrites.push_back(rewrite); - } - - std::vector typeRewrites = m_conf.getDMRNetwork3TypeRewrites(); - for (std::vector::const_iterator it = typeRewrites.begin(); it != typeRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:TG%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewriteType* rewrite = new CRewriteType(m_dmr3Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr3RFRewrites.push_back(rewrite); - } - - std::vector srcRewrites = m_conf.getDMRNetwork3SrcRewrites(); - for (std::vector::const_iterator it = srcRewrites.begin(); it != srcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite Net: %u:%u-%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG); - - CRewriteSrc* rewrite = new CRewriteSrc(m_dmr3Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - - m_dmr3NetRewrites.push_back(rewrite); - } - - std::vector dynRewrites = m_conf.getDMRNetwork3TGDynRewrites(); - 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) (%u exclusions)", (*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, (*it).m_exclTGs.size()); - - CDynVoice* voice = nullptr; - 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 = nullptr; - } 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, (*it).m_exclTGs, netRewriteDynTG, voice); - - m_dmr3RFRewrites.push_back(rfRewriteDynTG); - m_dmr3NetRewrites.push_back(netRewriteDynTG); - m_dynRF.push_back(rfRewriteDynTG); - } - - std::vector idRewrites = m_conf.getDMRNetwork3IdRewrites(); - for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { - LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); - - CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr3Name, (*it).m_rfId, (*it).m_netId); - CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr3Name, (*it).m_netId, (*it).m_rfId); - - m_dmr3SrcRewrites.push_back(rewriteSrcId); - m_dmr3NetRewrites.push_back(rewriteDstId); - } - - std::vector tgPassAll = m_conf.getDMRNetwork3PassAllTG(); - for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { - LogInfo(" Pass All TG: %u", *it); - - CPassAllTG* rfPassAllTG = new CPassAllTG(m_dmr3Name, *it); - CPassAllTG* netPassAllTG = new CPassAllTG(m_dmr3Name, *it); - - m_dmr3Passalls.push_back(rfPassAllTG); - m_dmr3NetRewrites.push_back(netPassAllTG); - } - - std::vector pcPassAll = m_conf.getDMRNetwork3PassAllPC(); - for (std::vector::const_iterator it = pcPassAll.begin(); it != pcPassAll.end(); ++it) { - LogInfo(" Pass All PC: %u", *it); - - CPassAllPC* rfPassAllPC = new CPassAllPC(m_dmr3Name, *it); - CPassAllPC* netPassAllPC = new CPassAllPC(m_dmr3Name, *it); - - m_dmr3Passalls.push_back(rfPassAllPC); - m_dmr3NetRewrites.push_back(netPassAllPC); - } - - m_dmrNetwork3->enable(true); - - return true; -} - -bool CDMRGateway::createDMRNetwork4() -{ - std::string address = m_conf.getDMRNetwork4Address(); - unsigned short port = m_conf.getDMRNetwork4Port(); - unsigned short local = m_conf.getDMRNetwork4Local(); - unsigned int id = m_conf.getDMRNetwork4Id(); - std::string password = m_conf.getDMRNetwork4Password(); - bool location = m_conf.getDMRNetwork4Location(); - bool debug = m_conf.getDMRNetwork4Debug(); - m_dmr4Name = m_conf.getDMRNetwork4Name(); - - if (id == 0U) - id = m_repeater->getId(); - - LogInfo("DMR Network 4 Parameters"); - LogInfo(" Name: %s", m_dmr4Name.c_str()); - LogInfo(" Id: %u", id); - LogInfo(" Address: %s", address.c_str()); - LogInfo(" Port: %hu", port); - if (local > 0U) - LogInfo(" Local: %hu", local); - else - LogInfo(" Local: random"); - LogInfo(" Location Data: %s", location ? "yes" : "no"); - - m_dmrNetwork4 = new CDMRNetwork(address, port, local, id, password, m_dmr4Name, location, debug); - - std::string options = m_conf.getDMRNetwork4Options(); - - if (!options.empty()) { - LogInfo(" Options: %s", options.c_str()); - m_dmrNetwork4->setOptions(options); - } - - unsigned char config[400U]; - unsigned int len = getConfig(m_dmr4Name, config); - m_dmrNetwork4->setConfig(config, len); - - bool ret = m_dmrNetwork4->open(); - if (!ret) { - delete m_dmrNetwork4; - m_dmrNetwork4 = nullptr; - return false; - } - -#if defined(USE_GPSD) - if (location && (m_gpsd != nullptr)) - m_gpsd->addNetwork(m_dmrNetwork4); -#endif - - std::vector tgRewrites = m_conf.getDMRNetwork4TGRewrites(); - for (std::vector::const_iterator it = tgRewrites.begin(); it != tgRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite RF: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U); - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:TG%u -> %u:TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG); - else - LogInfo(" Rewrite Net: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U); - - CRewriteTG* rfRewrite = new CRewriteTG(m_dmr4Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - CRewriteTG* netRewrite = new CRewriteTG(m_dmr4Name, (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_range); - - m_dmr4RFRewrites.push_back(rfRewrite); - m_dmr4NetRewrites.push_back(netRewrite); - } - - std::vector pcRewrites = m_conf.getDMRNetwork4PCRewrites(); - for (std::vector::const_iterator it = pcRewrites.begin(); it != pcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewritePC* rewrite = new CRewritePC(m_dmr4Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr4RFRewrites.push_back(rewrite); - } - - std::vector typeRewrites = m_conf.getDMRNetwork4TypeRewrites(); - for (std::vector::const_iterator it = typeRewrites.begin(); it != typeRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:TG%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewriteType* rewrite = new CRewriteType(m_dmr4Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr4RFRewrites.push_back(rewrite); - } - - std::vector srcRewrites = m_conf.getDMRNetwork4SrcRewrites(); - for (std::vector::const_iterator it = srcRewrites.begin(); it != srcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite Net: %u:%u-%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG); - - CRewriteSrc* rewrite = new CRewriteSrc(m_dmr4Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - - m_dmr4NetRewrites.push_back(rewrite); - } - - std::vector dynRewrites = m_conf.getDMRNetwork4TGDynRewrites(); - 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) (%u exclusions)", (*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, (*it).m_exclTGs.size()); - - CDynVoice* voice = nullptr; - 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 = nullptr; - } 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, (*it).m_exclTGs, netRewriteDynTG, voice); - - m_dmr4RFRewrites.push_back(rfRewriteDynTG); - m_dmr4NetRewrites.push_back(netRewriteDynTG); - m_dynRF.push_back(rfRewriteDynTG); - } - - std::vector idRewrites = m_conf.getDMRNetwork4IdRewrites(); - for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { - LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); - - CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr4Name, (*it).m_rfId, (*it).m_netId); - CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr4Name, (*it).m_netId, (*it).m_rfId); - - m_dmr4SrcRewrites.push_back(rewriteSrcId); - m_dmr4NetRewrites.push_back(rewriteDstId); - } - - std::vector tgPassAll = m_conf.getDMRNetwork4PassAllTG(); - for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { - LogInfo(" Pass All TG: %u", *it); - - CPassAllTG* rfPassAllTG = new CPassAllTG(m_dmr4Name, *it); - CPassAllTG* netPassAllTG = new CPassAllTG(m_dmr4Name, *it); - - m_dmr4Passalls.push_back(rfPassAllTG); - m_dmr4NetRewrites.push_back(netPassAllTG); - } - - std::vector pcPassAll = m_conf.getDMRNetwork4PassAllPC(); - for (std::vector::const_iterator it = pcPassAll.begin(); it != pcPassAll.end(); ++it) { - LogInfo(" Pass All PC: %u", *it); - - CPassAllPC* rfPassAllPC = new CPassAllPC(m_dmr4Name, *it); - CPassAllPC* netPassAllPC = new CPassAllPC(m_dmr4Name, *it); - - m_dmr4Passalls.push_back(rfPassAllPC); - m_dmr4NetRewrites.push_back(netPassAllPC); - } - - m_dmrNetwork4->enable(true); - - return true; -} - -bool CDMRGateway::createDMRNetwork5() -{ - std::string address = m_conf.getDMRNetwork5Address(); - unsigned short port = m_conf.getDMRNetwork5Port(); - unsigned short local = m_conf.getDMRNetwork5Local(); - unsigned int id = m_conf.getDMRNetwork5Id(); - std::string password = m_conf.getDMRNetwork5Password(); - bool location = m_conf.getDMRNetwork5Location(); - bool debug = m_conf.getDMRNetwork5Debug(); - m_dmr5Name = m_conf.getDMRNetwork5Name(); - - if (id == 0U) - id = m_repeater->getId(); - - LogInfo("DMR Network 5 Parameters"); - LogInfo(" Name: %s", m_dmr5Name.c_str()); - LogInfo(" Id: %u", id); - LogInfo(" Address: %s", address.c_str()); - LogInfo(" Port: %hu", port); - if (local > 0U) - LogInfo(" Local: %hu", local); - else - LogInfo(" Local: random"); - LogInfo(" Location Data: %s", location ? "yes" : "no"); - - m_dmrNetwork5 = new CDMRNetwork(address, port, local, id, password, m_dmr5Name, location, debug); - - std::string options = m_conf.getDMRNetwork5Options(); - - if (!options.empty()) { - LogInfo(" Options: %s", options.c_str()); - m_dmrNetwork5->setOptions(options); - } - - unsigned char config[400U]; - unsigned int len = getConfig(m_dmr5Name, config); - m_dmrNetwork5->setConfig(config, len); - - bool ret = m_dmrNetwork5->open(); - if (!ret) { - delete m_dmrNetwork5; - m_dmrNetwork5 = nullptr; - return false; - } - -#if defined(USE_GPSD) - if (location && (m_gpsd != nullptr)) - m_gpsd->addNetwork(m_dmrNetwork5); -#endif - - std::vector tgRewrites = m_conf.getDMRNetwork5TGRewrites(); - for (std::vector::const_iterator it = tgRewrites.begin(); it != tgRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite RF: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U); - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:TG%u -> %u:TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG); - else - LogInfo(" Rewrite Net: %u:TG%u-TG%u -> %u:TG%u-TG%u", (*it).m_toSlot, (*it).m_toTG, (*it).m_toTG + (*it).m_range - 1U, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U); - - CRewriteTG* rfRewrite = new CRewriteTG(m_dmr5Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - CRewriteTG* netRewrite = new CRewriteTG(m_dmr5Name, (*it).m_toSlot, (*it).m_toTG, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_range); - - m_dmr5RFRewrites.push_back(rfRewrite); - m_dmr5NetRewrites.push_back(netRewrite); - } - - std::vector pcRewrites = m_conf.getDMRNetwork5PCRewrites(); - for (std::vector::const_iterator it = pcRewrites.begin(); it != pcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewritePC* rewrite = new CRewritePC(m_dmr5Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr5RFRewrites.push_back(rewrite); - } - - std::vector typeRewrites = m_conf.getDMRNetwork5TypeRewrites(); - for (std::vector::const_iterator it = typeRewrites.begin(); it != typeRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite RF: %u:TG%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); - else - LogInfo(" Rewrite RF: %u:TG%u-%u -> %u:%u-%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toId, (*it).m_toId + (*it).m_range - 1U); - - CRewriteType* rewrite = new CRewriteType(m_dmr5Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId, (*it).m_range); - - m_dmr5RFRewrites.push_back(rewrite); - } - - std::vector srcRewrites = m_conf.getDMRNetwork5SrcRewrites(); - for (std::vector::const_iterator it = srcRewrites.begin(); it != srcRewrites.end(); ++it) { - if ((*it).m_range == 1) - LogInfo(" Rewrite Net: %u:%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG); - else - LogInfo(" Rewrite Net: %u:%u-%u -> %u:TG%u", (*it).m_fromSlot, (*it).m_fromId, (*it).m_fromId + (*it).m_range - 1U, (*it).m_toSlot, (*it).m_toTG); - - CRewriteSrc* rewrite = new CRewriteSrc(m_dmr5Name, (*it).m_fromSlot, (*it).m_fromId, (*it).m_toSlot, (*it).m_toTG, (*it).m_range); - - m_dmr5NetRewrites.push_back(rewrite); - } - - std::vector dynRewrites = m_conf.getDMRNetwork5TGDynRewrites(); - 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) (%u exclusions)", (*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, (*it).m_exclTGs.size()); - - CDynVoice* voice = nullptr; - 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 = nullptr; - } 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, (*it).m_exclTGs, netRewriteDynTG, voice); - - m_dmr5RFRewrites.push_back(rfRewriteDynTG); - m_dmr5NetRewrites.push_back(netRewriteDynTG); - m_dynRF.push_back(rfRewriteDynTG); - } - - std::vector idRewrites = m_conf.getDMRNetwork5IdRewrites(); - for (std::vector::const_iterator it = idRewrites.begin(); it != idRewrites.end(); ++it) { - LogInfo(" Rewrite Id: %u <-> %u", (*it).m_rfId, (*it).m_netId); - - CRewriteSrcId* rewriteSrcId = new CRewriteSrcId(m_dmr5Name, (*it).m_rfId, (*it).m_netId); - CRewriteDstId* rewriteDstId = new CRewriteDstId(m_dmr5Name, (*it).m_netId, (*it).m_rfId); - - m_dmr5SrcRewrites.push_back(rewriteSrcId); - m_dmr5NetRewrites.push_back(rewriteDstId); - } - - std::vector tgPassAll = m_conf.getDMRNetwork5PassAllTG(); - for (std::vector::const_iterator it = tgPassAll.begin(); it != tgPassAll.end(); ++it) { - LogInfo(" Pass All TG: %u", *it); - - CPassAllTG* rfPassAllTG = new CPassAllTG(m_dmr5Name, *it); - CPassAllTG* netPassAllTG = new CPassAllTG(m_dmr5Name, *it); - - m_dmr5Passalls.push_back(rfPassAllTG); - m_dmr5NetRewrites.push_back(netPassAllTG); - } - - std::vector pcPassAll = m_conf.getDMRNetwork5PassAllPC(); - for (std::vector::const_iterator it = pcPassAll.begin(); it != pcPassAll.end(); ++it) { - LogInfo(" Pass All PC: %u", *it); - - CPassAllPC* rfPassAllPC = new CPassAllPC(m_dmr5Name, *it); - CPassAllPC* netPassAllPC = new CPassAllPC(m_dmr5Name, *it); - - m_dmr5Passalls.push_back(rfPassAllPC); - m_dmr5NetRewrites.push_back(netPassAllPC); - } - - m_dmrNetwork5->enable(true); + m_dmrNetworks[index]->enable(true); return true; } @@ -2487,20 +1331,17 @@ void CDMRGateway::processRadioPosition() if (!ret) return; - if (m_network1Enabled && (m_dmrNetwork1 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK1 || m_status[2U] == DMRGW_STATUS::DMRNETWORK1)) - m_dmrNetwork1->writeRadioPosition(buffer, length); - - if (m_network2Enabled && (m_dmrNetwork2 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK2 || m_status[2U] == DMRGW_STATUS::DMRNETWORK2)) - m_dmrNetwork2->writeRadioPosition(buffer, length); - - if (m_network3Enabled && (m_dmrNetwork3 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK3 || m_status[2U] == DMRGW_STATUS::DMRNETWORK3)) - m_dmrNetwork3->writeRadioPosition(buffer, length); - - if (m_network4Enabled && (m_dmrNetwork4 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK4 || m_status[2U] == DMRGW_STATUS::DMRNETWORK4)) - m_dmrNetwork4->writeRadioPosition(buffer, length); - - if (m_network5Enabled && (m_dmrNetwork5 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK5 || m_status[2U] == DMRGW_STATUS::DMRNETWORK5)) - m_dmrNetwork5->writeRadioPosition(buffer, length); + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (m_networkEnabled[i] && + m_dmrNetworks[i] != nullptr && + ( + (m_extStatus[1U].m_status == DMRGW_STATUS::DMRNETWORK && m_extStatus[1U].m_dmrNetwork == i) || + (m_extStatus[2U].m_status == DMRGW_STATUS::DMRNETWORK && m_extStatus[2U].m_dmrNetwork == i) + ) + ) { + m_dmrNetworks[i]->writeRadioPosition(buffer, length); + } + } } void CDMRGateway::processTalkerAlias() @@ -2511,20 +1352,17 @@ void CDMRGateway::processTalkerAlias() if (!ret) return; - if (m_network1Enabled && (m_dmrNetwork1 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK1 || m_status[2U] == DMRGW_STATUS::DMRNETWORK1)) - m_dmrNetwork1->writeTalkerAlias(buffer, length); - - if (m_network2Enabled && (m_dmrNetwork2 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK2 || m_status[2U] == DMRGW_STATUS::DMRNETWORK2)) - m_dmrNetwork2->writeTalkerAlias(buffer, length); - - if (m_network3Enabled && (m_dmrNetwork3 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK3 || m_status[2U] == DMRGW_STATUS::DMRNETWORK3)) - m_dmrNetwork3->writeTalkerAlias(buffer, length); - - if (m_network4Enabled && (m_dmrNetwork4 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK4 || m_status[2U] == DMRGW_STATUS::DMRNETWORK4)) - m_dmrNetwork4->writeTalkerAlias(buffer, length); - - if (m_network5Enabled && (m_dmrNetwork5 != nullptr) && (m_status[1U] == DMRGW_STATUS::DMRNETWORK5 || m_status[2U] == DMRGW_STATUS::DMRNETWORK5)) - m_dmrNetwork5->writeTalkerAlias(buffer, length); + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + if (m_networkEnabled[i] && + m_dmrNetworks[i] != nullptr && + ( + (m_extStatus[1U].m_status == DMRGW_STATUS::DMRNETWORK && m_extStatus[1U].m_dmrNetwork == i) || + (m_extStatus[2U].m_status == DMRGW_STATUS::DMRNETWORK && m_extStatus[2U].m_dmrNetwork == i) + ) + ) { + m_dmrNetworks[i]->writeTalkerAlias(buffer, length); + } + } } void CDMRGateway::createAPRS() @@ -2600,20 +1438,38 @@ void CDMRGateway::remoteControl() REMOTE_COMMAND command = m_remoteControl->getCommand(); switch (command) { + //!!TODO: make command with argument to remove networks limit case REMOTE_COMMAND::ENABLE_NETWORK1: - processEnableCommand(m_dmrNetwork1, "DMR Network 1", m_network1Enabled, true); + if (m_dmrNetworkCount < 1) break; + processEnableCommand(m_dmrNetworks[0], "DMR Network 1", m_networkEnabled[0], true); break; case REMOTE_COMMAND::ENABLE_NETWORK2: - processEnableCommand(m_dmrNetwork2, "DMR Network 2", m_network2Enabled, true); + if (m_dmrNetworkCount < 2) break; + processEnableCommand(m_dmrNetworks[1], "DMR Network 2", m_networkEnabled[1], true); break; case REMOTE_COMMAND::ENABLE_NETWORK3: - processEnableCommand(m_dmrNetwork3, "DMR Network 3", m_network3Enabled, true); + if (m_dmrNetworkCount < 3) break; + processEnableCommand(m_dmrNetworks[2], "DMR Network 3", m_networkEnabled[2], true); break; case REMOTE_COMMAND::ENABLE_NETWORK4: - processEnableCommand(m_dmrNetwork4, "DMR Network 4", m_network4Enabled, true); + if (m_dmrNetworkCount < 4) break; + processEnableCommand(m_dmrNetworks[3], "DMR Network 4", m_networkEnabled[3], true); break; case REMOTE_COMMAND::ENABLE_NETWORK5: - processEnableCommand(m_dmrNetwork5, "DMR Network 5", m_network5Enabled, true); + if (m_dmrNetworkCount < 5) break; + processEnableCommand(m_dmrNetworks[4], "DMR Network 5", m_networkEnabled[4], true); + break; + case REMOTE_COMMAND::ENABLE_NETWORK6: + if (m_dmrNetworkCount < 6) break; + processEnableCommand(m_dmrNetworks[5], "DMR Network 6", m_networkEnabled[5], true); + break; + case REMOTE_COMMAND::ENABLE_NETWORK7: + if (m_dmrNetworkCount < 7) break; + processEnableCommand(m_dmrNetworks[6], "DMR Network 7", m_networkEnabled[6], true); + break; + case REMOTE_COMMAND::ENABLE_NETWORK8: + if (m_dmrNetworkCount < 8) break; + processEnableCommand(m_dmrNetworks[7], "DMR Network 8", m_networkEnabled[7], true); break; case REMOTE_COMMAND::ENABLE_XLX: if (m_xlxVoice != nullptr) { @@ -2621,20 +1477,38 @@ void CDMRGateway::remoteControl() } processEnableCommand(m_xlxNetwork, "XLX Network", m_networkXlxEnabled, true); break; + //!!TODO: make command with argument to remove networks limit case REMOTE_COMMAND::DISABLE_NETWORK1: - processEnableCommand(m_dmrNetwork1, "DMR Network 1", m_network1Enabled, false); + if (m_dmrNetworkCount < 1) break; + processEnableCommand(m_dmrNetworks[0], "DMR Network 1", m_networkEnabled[0], false); break; case REMOTE_COMMAND::DISABLE_NETWORK2: - processEnableCommand(m_dmrNetwork2, "DMR Network 2", m_network2Enabled, false); + if (m_dmrNetworkCount < 2) break; + processEnableCommand(m_dmrNetworks[1], "DMR Network 2", m_networkEnabled[1], false); break; case REMOTE_COMMAND::DISABLE_NETWORK3: - processEnableCommand(m_dmrNetwork3, "DMR Network 3", m_network3Enabled, false); + if (m_dmrNetworkCount < 3) break; + processEnableCommand(m_dmrNetworks[2], "DMR Network 3", m_networkEnabled[2], false); break; case REMOTE_COMMAND::DISABLE_NETWORK4: - processEnableCommand(m_dmrNetwork4, "DMR Network 4", m_network4Enabled, false); + if (m_dmrNetworkCount < 4) break; + processEnableCommand(m_dmrNetworks[3], "DMR Network 4", m_networkEnabled[3], false); break; case REMOTE_COMMAND::DISABLE_NETWORK5: - processEnableCommand(m_dmrNetwork5, "DMR Network 5", m_network5Enabled, false); + if (m_dmrNetworkCount < 5) break; + processEnableCommand(m_dmrNetworks[4], "DMR Network 5", m_networkEnabled[4], false); + break; + case REMOTE_COMMAND::DISABLE_NETWORK6: + if (m_dmrNetworkCount < 6) break; + processEnableCommand(m_dmrNetworks[5], "DMR Network 6", m_networkEnabled[5], false); + break; + case REMOTE_COMMAND::DISABLE_NETWORK7: + if (m_dmrNetworkCount < 7) break; + processEnableCommand(m_dmrNetworks[6], "DMR Network 7", m_networkEnabled[6], false); + break; + case REMOTE_COMMAND::DISABLE_NETWORK8: + if (m_dmrNetworkCount < 8) break; + processEnableCommand(m_dmrNetworks[7], "DMR Network 8", m_networkEnabled[7], false); break; case REMOTE_COMMAND::DISABLE_XLX: processEnableCommand(m_xlxNetwork, "XLX Network", m_networkXlxEnabled, false); @@ -2658,16 +1532,11 @@ void CDMRGateway::buildNetworkStatusString(std::string &str) { str = ""; buildNetworkStatusNetworkString(str, "xlx", m_xlxNetwork, m_networkXlxEnabled); - str += " "; - buildNetworkStatusNetworkString(str, "net1", m_dmrNetwork1, m_network1Enabled); - str += " "; - buildNetworkStatusNetworkString(str, "net2", m_dmrNetwork2, m_network2Enabled); - str += " "; - buildNetworkStatusNetworkString(str, "net3", m_dmrNetwork3, m_network3Enabled); - str += " "; - buildNetworkStatusNetworkString(str, "net4", m_dmrNetwork4, m_network4Enabled); - str += " "; - buildNetworkStatusNetworkString(str, "net5", m_dmrNetwork5, m_network5Enabled); + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + str += " "; + std::string netName = "net" + std::to_string(i + 1); + buildNetworkStatusNetworkString(str, netName, m_dmrNetworks[i], m_networkEnabled[i]); + } } void CDMRGateway::buildNetworkStatusNetworkString(std::string &str, const std::string& name, CDMRNetwork* network, bool enabled) @@ -2679,16 +1548,11 @@ void CDMRGateway::buildNetworkHostsString(std::string &str) { str = ""; buildNetworkHostNetworkString(str, "xlx", m_xlxNetwork); - str += " "; - buildNetworkHostNetworkString(str, "net1", m_dmrNetwork1); - str += " "; - buildNetworkHostNetworkString(str, "net2", m_dmrNetwork2); - str += " "; - buildNetworkHostNetworkString(str, "net3", m_dmrNetwork3); - str += " "; - buildNetworkHostNetworkString(str, "net4", m_dmrNetwork4); - str += " "; - buildNetworkHostNetworkString(str, "net5", m_dmrNetwork5); + for (unsigned int i = 0; i < m_dmrNetworkCount; i++) { + str += " "; + std::string netName = "net" + std::to_string(i + 1); + buildNetworkHostNetworkString(str, netName, m_dmrNetworks[i]); + } } void CDMRGateway::buildNetworkHostNetworkString(std::string &str, const std::string& name, CDMRNetwork* network) diff --git a/DMRGateway.h b/DMRGateway.h index 6f810fa..1d142c7 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -39,14 +39,15 @@ enum class DMRGW_STATUS { NONE, - DMRNETWORK1, - DMRNETWORK2, - DMRNETWORK3, - DMRNETWORK4, - DMRNETWORK5, + DMRNETWORK, XLXREFLECTOR }; +struct CDMRGWExtStatus { + DMRGW_STATUS m_status; + unsigned int m_dmrNetwork; +}; + class CDMRGateway { public: @@ -60,20 +61,13 @@ public: private: CConf m_conf; - DMRGW_STATUS* m_status; + CDMRGWExtStatus* m_extStatus; CMMDVMNetwork* m_repeater; unsigned char* m_config; unsigned int m_configLen; - CDMRNetwork* m_dmrNetwork1; - std::string m_dmr1Name; - CDMRNetwork* m_dmrNetwork2; - std::string m_dmr2Name; - CDMRNetwork* m_dmrNetwork3; - std::string m_dmr3Name; - CDMRNetwork* m_dmrNetwork4; - std::string m_dmr4Name; - CDMRNetwork* m_dmrNetwork5; - std::string m_dmr5Name; + unsigned int m_dmrNetworkCount; + std::vector m_dmrNetworks; + std::vector m_dmrName; CReflectors* m_xlxReflectors; CDMRNetwork* m_xlxNetwork; unsigned int m_xlxId; @@ -95,26 +89,10 @@ private: CRewriteTG* m_rptRewrite; CRewriteTG* m_xlxRewrite; CXLXVoice* m_xlxVoice; - std::vector m_dmr1NetRewrites; - std::vector m_dmr1RFRewrites; - std::vector m_dmr1SrcRewrites; - std::vector m_dmr2NetRewrites; - std::vector m_dmr2RFRewrites; - std::vector m_dmr2SrcRewrites; - std::vector m_dmr3NetRewrites; - std::vector m_dmr3RFRewrites; - std::vector m_dmr3SrcRewrites; - std::vector m_dmr4NetRewrites; - std::vector m_dmr4RFRewrites; - std::vector m_dmr4SrcRewrites; - std::vector m_dmr5NetRewrites; - std::vector m_dmr5RFRewrites; - std::vector m_dmr5SrcRewrites; - std::vector m_dmr1Passalls; - std::vector m_dmr2Passalls; - std::vector m_dmr3Passalls; - std::vector m_dmr4Passalls; - std::vector m_dmr5Passalls; + std::vector> m_dmrNetRewrites; + std::vector> m_dmrRFRewrites; + std::vector> m_dmrSrcRewrites; + std::vector> m_dmrPassalls; std::vector m_dynVoices; std::vector m_dynRF; CUDPSocket* m_socket; @@ -125,20 +103,12 @@ private: #if defined(USE_GPSD) CGPSD* m_gpsd; #endif - bool m_network1Enabled; - bool m_network2Enabled; - bool m_network3Enabled; - bool m_network4Enabled; - bool m_network5Enabled; + bool* m_networkEnabled; bool m_networkXlxEnabled; CRemoteControl* m_remoteControl; - + bool createMMDVM(); - bool createDMRNetwork1(); - bool createDMRNetwork2(); - bool createDMRNetwork3(); - bool createDMRNetwork4(); - bool createDMRNetwork5(); + bool createDMRNetwork(unsigned int index); bool createXLXNetwork(); bool createDynamicTGControl(); diff --git a/RemoteControl.h b/RemoteControl.h index 5ed11ca..4a934a8 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -25,17 +25,24 @@ #include enum class REMOTE_COMMAND { + //!!TODO: make command with argument to remove networks limit ENABLE_NETWORK1, ENABLE_NETWORK2, ENABLE_NETWORK3, ENABLE_NETWORK4, ENABLE_NETWORK5, + ENABLE_NETWORK6, + ENABLE_NETWORK7, + ENABLE_NETWORK8, ENABLE_XLX, DISABLE_NETWORK1, DISABLE_NETWORK2, DISABLE_NETWORK3, DISABLE_NETWORK4, DISABLE_NETWORK5, + DISABLE_NETWORK6, + DISABLE_NETWORK7, + DISABLE_NETWORK8, DISABLE_XLX, CONNECTION_STATUS, CONFIG_HOSTS, From fbdd2f36bf7c0f0e7f7bf8f2950606643859e613 Mon Sep 17 00:00:00 2001 From: Alexander Mokrov UR6LKW Date: Mon, 2 Jun 2025 18:31:23 +0300 Subject: [PATCH 4/5] [unlim-networks] RemoteControl --- RemoteControl.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/RemoteControl.cpp b/RemoteControl.cpp index ac1a9f1..8482a40 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -83,6 +83,12 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::ENABLE_NETWORK4; else if (m_args.at(1U) == "net5") m_command = REMOTE_COMMAND::ENABLE_NETWORK5; + else if (m_args.at(1U) == "net6") + m_command = REMOTE_COMMAND::ENABLE_NETWORK6; + else if (m_args.at(1U) == "net7") + m_command = REMOTE_COMMAND::ENABLE_NETWORK7; + else if (m_args.at(1U) == "net8") + m_command = REMOTE_COMMAND::ENABLE_NETWORK8; else if (m_args.at(1U) == "xlx") m_command = REMOTE_COMMAND::ENABLE_XLX; else @@ -98,6 +104,12 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::DISABLE_NETWORK4; else if (m_args.at(1U) == "net5") m_command = REMOTE_COMMAND::DISABLE_NETWORK5; + else if (m_args.at(1U) == "net6") + m_command = REMOTE_COMMAND::DISABLE_NETWORK6; + else if (m_args.at(1U) == "net7") + m_command = REMOTE_COMMAND::DISABLE_NETWORK7; + else if (m_args.at(1U) == "net8") + m_command = REMOTE_COMMAND::DISABLE_NETWORK8; else if (m_args.at(1U) == "xlx") m_command = REMOTE_COMMAND::DISABLE_XLX; else From 2aeaa71e874bd33d1658946d069e1c12bca9de43 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Sat, 7 Jun 2025 17:29:32 +0200 Subject: [PATCH 5/5] Fix nullptr instead of NULL argument usage in getaddrinfo(). Bump version. --- UDPSocket.cpp | 2 +- Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 27101fa..47a0774 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -94,7 +94,7 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned short port, sockadd /* Port is always digits, no needs to lookup service */ hints.ai_flags |= AI_NUMERICSERV; - int err = ::getaddrinfo(hostname.empty() ? nullptr : hostname.c_str(), portstr.c_str(), &hints, &res); + int err = ::getaddrinfo(hostname.empty() ? NULL : hostname.c_str(), portstr.c_str(), &hints, &res); if (err != 0) { sockaddr_in* paddr = (sockaddr_in*)&addr; ::memset(paddr, 0x00U, address_length = sizeof(sockaddr_in)); diff --git a/Version.h b/Version.h index 7e1a564..7b0968f 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250315"; +const char* VERSION = "20250607"; #endif