diff --git a/Conf.cpp b/Conf.cpp index dc9083c..5d4d630 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020,2023,2025 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2020,2023,2025,2026 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -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, XLX_NETWORK, GPSD, APRS, @@ -67,96 +64,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(), @@ -197,82 +105,77 @@ 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; - } + 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; + SECTION section = SECTION::NONE; + CDMRNetConfStruct *lastDmrNet = nullptr; - char buffer[BUFFER_SIZE]; - while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) { - if (buffer[0U] == '#') - continue; + char buffer[BUFFER_SIZE]; + while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) { + if (buffer[0U] == '#') + 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; + 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, "[MQTT]", 6U) == 0) + } else if (::strncmp(buffer, "[MQTT]", 6U) == 0) { section = SECTION::MQTT; - 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 Commands]", 17U) == 0) + } else if (::strncmp(buffer, "[Remote Commands]", 17U) == 0) { section = SECTION::REMOTE_COMMANDS; - else + } else { section = SECTION::NONE; + } continue; } - char* key = ::strtok(buffer, " \t=\r\n"); - if (key == nullptr) - continue; + char* key = ::strtok(buffer, " \t=\r\n"); + if (key == nullptr) + continue; - char* value = ::strtok(nullptr, "\r\n"); - if (value == nullptr) - continue; + 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; + // 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'; + // 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'; - } + // remove trailing tab/space + for (p = value + strlen(value) - 1U; p >= value && (*p == '\t' || *p == ' '); p--) + *p = '\0'; + } - if (section == SECTION::GENERAL) { + if (section == SECTION::GENERAL) { if (::strcmp(key, "Daemon") == 0) m_daemon = ::atoi(value) == 1; else if (::strcmp(key, "Timeout") == 0) @@ -346,7 +249,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); } else if (::strcmp(key, "Relink") == 0) @@ -357,27 +260,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) { + 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, ", "); @@ -391,7 +295,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, ", "); @@ -406,7 +310,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, ", "); @@ -421,7 +325,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, ", "); @@ -436,7 +340,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; @@ -461,7 +365,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, ", "); @@ -470,502 +374,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) @@ -1176,478 +592,129 @@ bool CConf::getXLXNetworkDebug() const { return m_xlxNetworkDebug; } + bool CConf::getXLXNetworkUserControl() const { return m_xlxNetworkUserControl; } + 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 (unsigned int)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 22f4c98..d8cfaf7 100644 --- a/Conf.h +++ b/Conf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2019,2020,2023,2025 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2019,2020,2023,2025,2026 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -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: @@ -105,105 +126,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; @@ -274,100 +216,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; diff --git a/DMRGateway.cpp b/DMRGateway.cpp index a189c98..7b3f151 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2021,2023,2024,2025 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021,2023,2024,2025,2026 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -140,20 +140,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), @@ -175,26 +168,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_writer(nullptr), @@ -204,84 +181,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; @@ -289,8 +218,9 @@ CDMRGateway::~CDMRGateway() delete m_rptRewrite; delete m_xlxRewrite; - delete[] m_status; + delete[] m_extStatus; delete[] m_config; + delete[] m_networkEnabled; CUDPSocket::shutdown(); } @@ -334,7 +264,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; @@ -348,7 +278,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"); @@ -365,6 +295,7 @@ int CDMRGateway::run() ::close(STDERR_FILENO); } #endif + ::LogInitialise(m_conf.getLogDisplayLevel(), m_conf.getLogMQTTLevel()); std::vector> subscriptions; @@ -378,13 +309,22 @@ int CDMRGateway::run() if (!ret) return 1; - 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); @@ -471,34 +411,12 @@ int CDMRGateway::run() if (remoteCommandsEnabled) m_remoteControl = new CRemoteControl(this); - 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; + } } createAPRS(); @@ -514,25 +432,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(); @@ -630,7 +531,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) { @@ -658,7 +559,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(); @@ -703,32 +604,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; @@ -736,10 +620,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(); } @@ -747,11 +635,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; @@ -759,166 +650,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(); } @@ -934,11 +673,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 { @@ -951,254 +692,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(); @@ -1209,7 +757,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(); } @@ -1228,20 +776,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); @@ -1263,10 +800,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(); } } @@ -1297,29 +835,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) { @@ -1361,22 +881,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); @@ -1386,32 +906,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); @@ -1422,50 +942,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()); @@ -1484,724 +1004,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; } @@ -2451,20 +1295,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() @@ -2475,20 +1316,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() @@ -2561,20 +1399,38 @@ void CDMRGateway::remoteControl(const std::string& commandStr) REMOTE_COMMAND command = m_remoteControl->processCommand(commandStr); 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) { @@ -2582,20 +1438,38 @@ void CDMRGateway::remoteControl(const std::string& commandStr) } 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); @@ -2619,16 +1493,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) @@ -2640,16 +1509,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 0956cda..4987ff9 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; CAPRSWriter* m_writer; @@ -124,20 +102,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 linkXLX(const std::string &number); diff --git a/DMRGateway.vcxproj b/DMRGateway.vcxproj index e29eab9..d1084ae 100644 --- a/DMRGateway.vcxproj +++ b/DMRGateway.vcxproj @@ -28,26 +28,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode diff --git a/RemoteControl.h b/RemoteControl.h index 15a929d..5fc9317 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -23,17 +23,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, 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 bdf647f..90309c4 100644 --- a/Version.h +++ b/Version.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2025 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2026 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250321"; +const char* VERSION = "20260214"; #endif