diff --git a/Conf.cpp b/Conf.cpp index 4188319..02ac32b 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -35,6 +35,7 @@ enum SECTION { SECTION_DMR_NETWORK_1, SECTION_DMR_NETWORK_2, SECTION_DMR_NETWORK_3, + SECTION_DMR_NETWORK_4, SECTION_XLX_NETWORK }; @@ -114,6 +115,22 @@ m_dmrNetwork3TypeRewrites(), m_dmrNetwork3SrcRewrites(), 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_dmrNetwork4PassAllPC(), +m_dmrNetwork4PassAllTG(), m_xlxNetworkEnabled(false), m_xlxNetworkId(0U), m_xlxNetworkFile(), @@ -168,6 +185,8 @@ bool CConf::read() 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 section = SECTION_NONE; @@ -536,6 +555,92 @@ bool CConf::read() 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 int)::atoi(value); + else if (::strcmp(key, "Local") == 0) + m_dmrNetwork4Local = (unsigned int)::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(NULL, ", "); + char* p3 = ::strtok(NULL, ", "); + char* p4 = ::strtok(NULL, ", "); + char* p5 = ::strtok(NULL, " \r\n"); + if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL) { + 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(NULL, ", "); + char* p3 = ::strtok(NULL, ", "); + char* p4 = ::strtok(NULL, ", "); + char* p5 = ::strtok(NULL, " \r\n"); + if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL) { + 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(NULL, ", "); + char* p3 = ::strtok(NULL, ", "); + char* p4 = ::strtok(NULL, " \r\n"); + if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL) { + CTypeRewriteStruct rewrite; + rewrite.m_fromSlot = ::atoi(p1); + rewrite.m_fromTG = ::atoi(p2); + rewrite.m_toSlot = ::atoi(p3); + rewrite.m_toId = ::atoi(p4); + m_dmrNetwork4TypeRewrites.push_back(rewrite); + } + } else if (::strncmp(key, "SrcRewrite", 10U) == 0) { + char* p1 = ::strtok(value, ", "); + char* p2 = ::strtok(NULL, ", "); + char* p3 = ::strtok(NULL, ", "); + char* p4 = ::strtok(NULL, ", "); + char* p5 = ::strtok(NULL, " \r\n"); + if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL) { + 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, "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); + } } } @@ -995,3 +1100,86 @@ 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 int CConf::getDMRNetwork4Port() const +{ + return m_dmrNetwork4Port; +} + +unsigned int 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::getDMRNetwork4PassAllPC() const +{ + return m_dmrNetwork4PassAllPC; +} + +std::vector CConf::getDMRNetwork4PassAllTG() const +{ + return m_dmrNetwork4PassAllTG; +} diff --git a/Conf.h b/Conf.h index fd16f67..f6468a5 100644 --- a/Conf.h +++ b/Conf.h @@ -149,6 +149,24 @@ public: 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 int getDMRNetwork4Port() const; + unsigned int 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 getDMRNetwork4PassAllPC() const; + std::vector getDMRNetwork4PassAllTG() const; + // The XLX Network section bool getXLXNetworkEnabled() const; unsigned int getXLXNetworkId() const; @@ -249,6 +267,23 @@ private: std::vector m_dmrNetwork3PassAllPC; std::vector m_dmrNetwork3PassAllTG; + bool m_dmrNetwork4Enabled; + std::string m_dmrNetwork4Name; + unsigned int m_dmrNetwork4Id; + std::string m_dmrNetwork4Address; + unsigned int m_dmrNetwork4Port; + unsigned int 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_dmrNetwork4PassAllPC; + std::vector m_dmrNetwork4PassAllTG; + bool m_xlxNetworkEnabled; unsigned int m_xlxNetworkId; std::string m_xlxNetworkFile; diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 00beeea..b66672f 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -71,6 +71,7 @@ enum DMRGW_STATUS { DMRGWS_DMRNETWORK1, DMRGWS_DMRNETWORK2, DMRGWS_DMRNETWORK3, + DMRGWS_DMRNETWORK4, DMRGWS_XLXREFLECTOR }; @@ -140,6 +141,8 @@ m_dmrNetwork2(NULL), m_dmr2Name(), m_dmrNetwork3(NULL), m_dmr3Name(), +m_dmrNetwork4(NULL), +m_dmr4Name(), m_xlxReflectors(NULL), m_xlxNetwork(NULL), m_xlxId(0U), @@ -338,6 +341,12 @@ int CDMRGateway::run() return 1; } + if (m_conf.getDMRNetwork4Enabled()) { + ret = createDMRNetwork4(); + if (!ret) + return 1; + } + if (m_conf.getXLXNetworkEnabled()) { ret = createXLXNetwork(); if (!ret) @@ -389,6 +398,10 @@ int CDMRGateway::run() 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; + CStopWatch stopWatch; stopWatch.start(); @@ -612,6 +625,28 @@ int CDMRGateway::run() } } } + + if (!rewritten) { + if (m_dmrNetwork4 != NULL) { + // Rewrite the slot and/or TG or neither + for (std::vector::iterator it = m_dmr4RFRewrites.begin(); it != m_dmr4RFRewrites.end(); ++it) { + bool ret = (*it)->process(data, trace); + if (ret) { + rewritten = true; + break; + } + } + + if (rewritten) { + if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK4) { + m_dmrNetwork4->write(data); + status[slotNo] = DMRGWS_DMRNETWORK4; + timer[slotNo]->setTimeout(rfTimeout); + timer[slotNo]->start(); + } + } + } + } } } @@ -678,6 +713,27 @@ int CDMRGateway::run() } } + if (!rewritten) { + if (m_dmrNetwork4 != NULL) { + for (std::vector::iterator it = m_dmr4Passalls.begin(); it != m_dmr4Passalls.end(); ++it) { + bool ret = (*it)->process(data, trace); + if (ret) { + rewritten = true; + break; + } + } + + if (rewritten) { + if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK4) { + m_dmrNetwork4->write(data); + status[slotNo] = DMRGWS_DMRNETWORK4; + timer[slotNo]->setTimeout(rfTimeout); + timer[slotNo]->start(); + } + } + } + } + if (!rewritten && trace) LogDebug("Rule Trace,\tnot matched so rejected"); } @@ -847,6 +903,54 @@ int CDMRGateway::run() m_repeater->writeBeacon(); } + if (m_dmrNetwork4 != NULL) { + 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) { + bool ret = (*it)->process(data, trace); + if (ret) { + rewritten = true; + break; + } + } + + if (rewritten) { + // Check that the rewritten slot is free to use. + slotNo = data.getSlotNo(); + if (status[slotNo] == DMRGWS_NONE || status[slotNo] == DMRGWS_DMRNETWORK4) { + m_repeater->write(data); + status[slotNo] = DMRGWS_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(); + } + unsigned char buffer[50U]; unsigned int length; ret = m_repeater->readRadioPosition(buffer, length); @@ -859,6 +963,8 @@ int CDMRGateway::run() m_dmrNetwork2->writeRadioPosition(buffer, length); if (m_dmrNetwork3 != NULL) m_dmrNetwork3->writeRadioPosition(buffer, length); + if (m_dmrNetwork4 != NULL) + m_dmrNetwork4->writeRadioPosition(buffer, length); } ret = m_repeater->readTalkerAlias(buffer, length); if (ret) { @@ -870,6 +976,8 @@ int CDMRGateway::run() m_dmrNetwork2->writeTalkerAlias(buffer, length); if (m_dmrNetwork3 != NULL) m_dmrNetwork3->writeTalkerAlias(buffer, length); + if (m_dmrNetwork4 != NULL) + m_dmrNetwork4->writeTalkerAlias(buffer, length); } ret = m_repeater->readHomePosition(buffer, length); if (ret) { @@ -881,6 +989,8 @@ int CDMRGateway::run() m_dmrNetwork2->writeHomePosition(buffer, length); if (m_dmrNetwork3 != NULL) m_dmrNetwork3->writeHomePosition(buffer, length); + if (m_dmrNetwork4 != NULL) + m_dmrNetwork4->writeHomePosition(buffer, length); } if (voice != NULL) { @@ -909,6 +1019,9 @@ int CDMRGateway::run() if (m_dmrNetwork3 != NULL) m_dmrNetwork3->clock(ms); + if (m_dmrNetwork4 != NULL) + m_dmrNetwork4->clock(ms); + if (m_xlxNetwork != NULL) m_xlxNetwork->clock(ms); @@ -950,6 +1063,11 @@ int CDMRGateway::run() delete m_dmrNetwork3; } + if (m_dmrNetwork4 != NULL) { + m_dmrNetwork4->close(); + delete m_dmrNetwork4; + } + if (m_xlxNetwork != NULL) { m_xlxNetwork->close(); delete m_xlxNetwork; @@ -1370,6 +1488,133 @@ bool CDMRGateway::createDMRNetwork3() return true; } +bool CDMRGateway::createDMRNetwork4() +{ + std::string address = m_conf.getDMRNetwork4Address(); + unsigned int port = m_conf.getDMRNetwork4Port(); + unsigned int 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: %u", port); + if (local > 0U) + LogInfo(" Local: %u", local); + else + LogInfo(" Local: random"); + LogInfo(" Location Data: %s", location ? "yes" : "no"); + + m_dmrNetwork4 = new CDMRNetwork(address, port, local, id, password, m_dmr3Name, VERSION, debug); + + std::string options = m_conf.getDMRNetwork4Options(); + if (options.empty()) + options = m_repeater->getOptions(); + + if (!options.empty()) { + LogInfo(" Options: %s", options.c_str()); + m_dmrNetwork4->setOptions(options); + } + + unsigned char config[400U]; + unsigned int len = getConfig(m_dmr4Name, config); + + if (!location) + ::memcpy(config + 30U, "0.00000000.000000", 17U); + + m_dmrNetwork4->setConfig(config, len); + + bool ret = m_dmrNetwork4->open(); + if (!ret) { + delete m_dmrNetwork4; + m_dmrNetwork4 = NULL; + return false; + } + + 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_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_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_dmr3Name, (*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) { + LogInfo(" Rewrite RF: %u:TG%u -> %u:%u", (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); + + CRewriteType* rewrite = new CRewriteType(m_dmr4Name, (*it).m_fromSlot, (*it).m_fromTG, (*it).m_toSlot, (*it).m_toId); + + 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 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_dmr3Name, *it); + CPassAllTG* netPassAllTG = new CPassAllTG(m_dmr3Name, *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); + } + + return true; +} + bool CDMRGateway::createXLXNetwork() { std::string fileName = m_conf.getXLXNetworkFile(); diff --git a/DMRGateway.h b/DMRGateway.h index dffc360..5b6ad0e 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -49,6 +49,8 @@ private: std::string m_dmr2Name; CDMRNetwork* m_dmrNetwork3; std::string m_dmr3Name; + CDMRNetwork* m_dmrNetwork4; + std::string m_dmr4Name; CReflectors* m_xlxReflectors; CDMRNetwork* m_xlxNetwork; unsigned int m_xlxId; @@ -75,14 +77,18 @@ private: std::vector m_dmr2RFRewrites; std::vector m_dmr3NetRewrites; std::vector m_dmr3RFRewrites; + std::vector m_dmr4NetRewrites; + std::vector m_dmr4RFRewrites; std::vector m_dmr1Passalls; std::vector m_dmr2Passalls; std::vector m_dmr3Passalls; + std::vector m_dmr4Passalls; bool createMMDVM(); bool createDMRNetwork1(); bool createDMRNetwork2(); bool createDMRNetwork3(); + bool createDMRNetwork4(); bool createXLXNetwork(); bool linkXLX(unsigned int number);