From 6050be64063ca4039b7b7d4219a7fd1e4726e23b Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 19 Jun 2017 18:50:36 +0100 Subject: [PATCH 1/4] Timeout XLX reflectors and return to startup after period of inactivity --- DMRGateway.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 690b0fd..ef714f3 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -376,6 +376,10 @@ int CDMRGateway::run() unsigned int dmr2DstId[3U]; dmr2SrcId[1U] = dmr2SrcId[2U] = dmr2DstId[1U] = dmr2DstId[2U] = 0U; + //XLX timeouts + unsigned int xlx1LastSeenTime[0U]; + unsigned int xlx2LastSeenTime[0U]; + CStopWatch stopWatch; stopWatch.start(); @@ -405,6 +409,9 @@ int CDMRGateway::run() m_xlx1Reflector = 4000U; m_xlx1Connected = false; + } else if (xlx1LastSeenTime - time(NULL) > 600U) { + writeXLXLink(m_xlx1Id,m_xlx1Startup,m_xlxNetwork1); + LogMessage("XLX-1, Re-linking to startup reflector %u due to inactivity timeout", m_xlx1Startup); } } @@ -429,7 +436,10 @@ int CDMRGateway::run() m_xlx2Reflector = 4000U; m_xlx2Connected = false; - } + } else if (xlx2LastSeenTime - time(NULL) > 600U) { + writeXLXLink(m_xlx2Id,m_xlx1Startup,m_xlxNetwork2); + LogMessage("XLX-2, Re-linking to startup reflector %u due to inactivity timeout", m_xlx2Startup); + } } CDMRData data; @@ -442,11 +452,19 @@ int CDMRGateway::run() FLCO flco = data.getFLCO(); if (flco == FLCO_GROUP && slotNo == m_xlx1Slot && dstId == m_xlx1TG) { + + //set lastseen + xlx1LastSeenTime = time(NULL); + m_xlx1Rewrite->process(data, false); m_xlxNetwork1->write(data); status[slotNo] = DMRGWS_XLXREFLECTOR1; timer[slotNo]->start(); } else if (flco == FLCO_GROUP && slotNo == m_xlx2Slot && dstId == m_xlx2TG) { + + //set lastseen + xlx2LastSeenTime = time(NULL); + m_xlx2Rewrite->process(data, false); m_xlxNetwork2->write(data); status[slotNo] = DMRGWS_XLXREFLECTOR2; From 7f4c586036412efb44ee20b7e8e0bca095a02cc2 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 20 Jun 2017 13:48:01 +0100 Subject: [PATCH 2/4] Add configuration option "Relink" to specify re-link timeout for XLX --- Conf.cpp | 16 ++++++++++++++++ Conf.h | 4 ++++ DMRGateway.cpp | 45 +++++++++++++++++++++++++++++++++++++-------- DMRGateway.h | 2 ++ DMRGateway.ini | 1 + 5 files changed, 60 insertions(+), 8 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index d6b86bc..e13ac15 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -92,6 +92,7 @@ m_xlxNetwork1Slot(1U), m_xlxNetwork1TG(8U), m_xlxNetwork1Base(84000U), m_xlxNetwork1Startup(4000U), +m_xlxNetwork1Relink(0U), m_xlxNetwork1Options(), m_xlxNetwork1Debug(false), m_xlxNetwork2Enabled(false), @@ -104,6 +105,7 @@ m_xlxNetwork2Slot(1U), m_xlxNetwork2TG(7U), m_xlxNetwork2Base(74000U), m_xlxNetwork2Startup(4000U), +m_xlxNetwork2Relink(0U), m_xlxNetwork2Options(), m_xlxNetwork2Debug(false) { @@ -211,6 +213,8 @@ bool CConf::read() m_xlxNetwork1Base = (unsigned int)::atoi(value); else if (::strcmp(key, "Startup") == 0) m_xlxNetwork1Startup = (unsigned int)::atoi(value); + else if (::strcmp(key, "Relink") == 0) + m_xlxNetwork1Relink = (unsigned int)::atoi(value); else if (::strcmp(key, "Options") == 0) m_xlxNetwork1Options = value; else if (::strcmp(key, "Debug") == 0) @@ -236,6 +240,8 @@ bool CConf::read() m_xlxNetwork2Base = (unsigned int)::atoi(value); else if (::strcmp(key, "Startup") == 0) m_xlxNetwork2Startup = (unsigned int)::atoi(value); + else if (::strcmp(key, "Relink") == 0) + m_xlxNetwork2Relink = (unsigned int)::atoi(value); else if (::strcmp(key, "Options") == 0) m_xlxNetwork2Options = value; else if (::strcmp(key, "Debug") == 0) @@ -532,6 +538,11 @@ unsigned int CConf::getXLXNetwork1Startup() const return m_xlxNetwork1Startup; } +unsigned int CConf::getXLXNetwork1Relink() const +{ + return m_xlxNetwork1Relink; +} + std::string CConf::getXLXNetwork1Password() const { return m_xlxNetwork1Password; @@ -592,6 +603,11 @@ unsigned int CConf::getXLXNetwork2Startup() const return m_xlxNetwork2Startup; } +unsigned int CConf::getXLXNetwork2Relink() const +{ + return m_xlxNetwork2Relink; +} + std::string CConf::getXLXNetwork2Password() const { return m_xlxNetwork2Password; diff --git a/Conf.h b/Conf.h index 9f17c37..375aaae 100644 --- a/Conf.h +++ b/Conf.h @@ -125,6 +125,7 @@ public: unsigned int getXLXNetwork1TG() const; unsigned int getXLXNetwork1Base() const; unsigned int getXLXNetwork1Startup() const; + unsigned int getXLXNetwork1Relink() const; std::string getXLXNetwork1Options() const; bool getXLXNetwork1Debug() const; @@ -139,6 +140,7 @@ public: unsigned int getXLXNetwork2TG() const; unsigned int getXLXNetwork2Base() const; unsigned int getXLXNetwork2Startup() const; + unsigned int getXLXNetwork2Relink() const; std::string getXLXNetwork2Options() const; bool getXLXNetwork2Debug() const; @@ -202,6 +204,7 @@ private: unsigned int m_xlxNetwork1TG; unsigned int m_xlxNetwork1Base; unsigned int m_xlxNetwork1Startup; + unsigned int m_xlxNetwork1Relink; std::string m_xlxNetwork1Options; bool m_xlxNetwork1Debug; @@ -215,6 +218,7 @@ private: unsigned int m_xlxNetwork2TG; unsigned int m_xlxNetwork2Base; unsigned int m_xlxNetwork2Startup; + unsigned int m_xlxNetwork2Relink; std::string m_xlxNetwork2Options; bool m_xlxNetwork2Debug; }; diff --git a/DMRGateway.cpp b/DMRGateway.cpp index ef714f3..3ca6477 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -36,6 +36,8 @@ #include #include +#include + #if !defined(_WIN32) && !defined(_WIN64) #include #include @@ -142,6 +144,7 @@ m_xlx1Slot(0U), m_xlx1TG(0U), m_xlx1Base(0U), m_xlx1Startup(4000U), +m_xlx1Relink(0U), m_xlx1Connected(false), m_rpt1Rewrite(NULL), m_xlx1Rewrite(NULL), @@ -151,6 +154,7 @@ m_xlx2Slot(0U), m_xlx2TG(0U), m_xlx2Base(0U), m_xlx2Startup(4000U), +m_xlx2Relink(0U), m_xlx2Connected(false), m_rpt2Rewrite(NULL), m_xlx2Rewrite(NULL), @@ -376,9 +380,9 @@ int CDMRGateway::run() unsigned int dmr2DstId[3U]; dmr2SrcId[1U] = dmr2SrcId[2U] = dmr2DstId[1U] = dmr2DstId[2U] = 0U; - //XLX timeouts - unsigned int xlx1LastSeenTime[0U]; - unsigned int xlx2LastSeenTime[0U]; + //Last seen RF transmissions on XLX, to implement relinking. + std::time_t xlx1LastSeenTime = 0; + std::time_t xlx2LastSeenTime = 0; CStopWatch stopWatch; stopWatch.start(); @@ -409,9 +413,17 @@ int CDMRGateway::run() m_xlx1Reflector = 4000U; m_xlx1Connected = false; - } else if (xlx1LastSeenTime - time(NULL) > 600U) { + } else if (xlx1LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx1LastSeenTime)) > (m_xlx1Relink*60) && m_xlx1Reflector != m_xlx1Startup) { writeXLXLink(m_xlx1Id,m_xlx1Startup,m_xlxNetwork1); - LogMessage("XLX-1, Re-linking to startup reflector %u due to inactivity timeout", m_xlx1Startup); + LogMessage("XLX-1, Re-linking to startup reflector %u due to RF inactivity timeout (%u minutes)", m_xlx1Startup, m_xlx1Relink); + m_xlx1Reflector = m_xlx1Startup; + if (voice1 != NULL) { + if (m_xlx1Reflector == 4000U) { + voice1->unlinked(); + } else { + voice1->linkedTo(m_xlx1Startup); + } + } } } @@ -436,9 +448,18 @@ int CDMRGateway::run() m_xlx2Reflector = 4000U; m_xlx2Connected = false; - } else if (xlx2LastSeenTime - time(NULL) > 600U) { - writeXLXLink(m_xlx2Id,m_xlx1Startup,m_xlxNetwork2); - LogMessage("XLX-2, Re-linking to startup reflector %u due to inactivity timeout", m_xlx2Startup); + } else if (xlx2LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx2LastSeenTime)) > (m_xlx2Relink*60) && m_xlx2Reflector != m_xlx2Startup) { + writeXLXLink(m_xlx2Id,m_xlx2Startup,m_xlxNetwork2); + LogMessage("XLX-2, Re-linking to startup reflector %u due to RF inactivity timeout (%u minutes)", m_xlx2Startup, m_xlx2Relink); + m_xlx2Reflector = m_xlx2Startup; + if (voice1 != NULL) { + if (m_xlx1Reflector == 4000U) { + voice1->unlinked(); + } else { + voice1->linkedTo(m_xlx2Startup); + + } + } } } @@ -491,6 +512,7 @@ int CDMRGateway::run() if (dstId != 5000U ) { writeXLXLink(srcId, dstId, m_xlxNetwork1); m_xlx1Reflector = dstId; + xlx1LastSeenTime = time(NULL); changed = true; } } @@ -532,6 +554,7 @@ int CDMRGateway::run() if (dstId != 5000U ) { writeXLXLink(srcId, dstId, m_xlxNetwork2); m_xlx2Reflector = dstId; + xlx2LastSeenTime = time(NULL); changed = true; } } @@ -1180,12 +1203,15 @@ bool CDMRGateway::createXLXNetwork1() m_xlx1TG = m_conf.getXLXNetwork1TG(); m_xlx1Base = m_conf.getXLXNetwork1Base(); m_xlx1Startup = m_conf.getXLXNetwork1Startup(); + m_xlx1Relink = m_conf.getXLXNetwork1Relink(); LogInfo(" Slot: %u", m_xlx1Slot); LogInfo(" TG: %u", m_xlx1TG); LogInfo(" Base: %u", m_xlx1Base); if (m_xlx1Startup != 4000U) LogInfo(" Startup: %u", m_xlx1Startup); + if (m_xlx1Relink) + LogInfo(" Relink: %u minutes", m_xlx1Relink); m_rpt1Rewrite = new CRewriteTG("XLX-1", XLX_SLOT, XLX_TG, m_xlx1Slot, m_xlx1TG, 1U); m_xlx1Rewrite = new CRewriteTG("XLX-1", m_xlx1Slot, m_xlx1TG, XLX_SLOT, XLX_TG, 1U); @@ -1238,12 +1264,15 @@ bool CDMRGateway::createXLXNetwork2() m_xlx2TG = m_conf.getXLXNetwork2TG(); m_xlx2Base = m_conf.getXLXNetwork2Base(); m_xlx2Startup = m_conf.getXLXNetwork2Startup(); + m_xlx2Relink = m_conf.getXLXNetwork2Relink(); LogInfo(" Slot: %u", m_xlx2Slot); LogInfo(" TG: %u", m_xlx2TG); LogInfo(" Base: %u", m_xlx2Base); if (m_xlx2Startup != 4000U) LogInfo(" Startup: %u", m_xlx2Startup); + if (m_xlx2Relink) + LogInfo(" Relink: %u minutes", m_xlx2Relink); m_rpt2Rewrite = new CRewriteTG("XLX-2", XLX_SLOT, XLX_TG, m_xlx2Slot, m_xlx2TG, 1U); m_xlx2Rewrite = new CRewriteTG("XLX-2", m_xlx2Slot, m_xlx2TG, XLX_SLOT, XLX_TG, 1U); diff --git a/DMRGateway.h b/DMRGateway.h index 345ac5d..f58c14c 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -49,6 +49,7 @@ private: unsigned int m_xlx1TG; unsigned int m_xlx1Base; unsigned int m_xlx1Startup; + unsigned int m_xlx1Relink; bool m_xlx1Connected; CRewriteTG* m_rpt1Rewrite; CRewriteTG* m_xlx1Rewrite; @@ -58,6 +59,7 @@ private: unsigned int m_xlx2TG; unsigned int m_xlx2Base; unsigned int m_xlx2Startup; + unsigned int m_xlx2Relink; bool m_xlx2Connected; CRewriteTG* m_rpt2Rewrite; CRewriteTG* m_xlx2Rewrite; diff --git a/DMRGateway.ini b/DMRGateway.ini index ed824ea..fba5941 100644 --- a/DMRGateway.ini +++ b/DMRGateway.ini @@ -30,6 +30,7 @@ Slot=1 TG=6 Base=64000 Startup=4005 +Relink=10 Password=passw0rd Debug=0 From 982faf30efb7610c49c6c0372b48b520e1a9477b Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 20 Jun 2017 14:00:54 +0100 Subject: [PATCH 3/4] XLX: Add connected check to relink code. --- DMRGateway.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DMRGateway.cpp b/DMRGateway.cpp index 3ca6477..dad7cc3 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -413,7 +413,7 @@ int CDMRGateway::run() m_xlx1Reflector = 4000U; m_xlx1Connected = false; - } else if (xlx1LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx1LastSeenTime)) > (m_xlx1Relink*60) && m_xlx1Reflector != m_xlx1Startup) { + } else if (connected && xlx1LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx1LastSeenTime)) > (m_xlx1Relink*60) && m_xlx1Reflector != m_xlx1Startup) { writeXLXLink(m_xlx1Id,m_xlx1Startup,m_xlxNetwork1); LogMessage("XLX-1, Re-linking to startup reflector %u due to RF inactivity timeout (%u minutes)", m_xlx1Startup, m_xlx1Relink); m_xlx1Reflector = m_xlx1Startup; @@ -448,7 +448,7 @@ int CDMRGateway::run() m_xlx2Reflector = 4000U; m_xlx2Connected = false; - } else if (xlx2LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx2LastSeenTime)) > (m_xlx2Relink*60) && m_xlx2Reflector != m_xlx2Startup) { + } else if (connected && xlx2LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx2LastSeenTime)) > (m_xlx2Relink*60) && m_xlx2Reflector != m_xlx2Startup) { writeXLXLink(m_xlx2Id,m_xlx2Startup,m_xlxNetwork2); LogMessage("XLX-2, Re-linking to startup reflector %u due to RF inactivity timeout (%u minutes)", m_xlx2Startup, m_xlx2Relink); m_xlx2Reflector = m_xlx2Startup; From 1002f399eabc2c288058353445801f1b2fc2a0b2 Mon Sep 17 00:00:00 2001 From: phl0 Date: Tue, 20 Jun 2017 16:22:30 +0200 Subject: [PATCH 4/4] Make Relink timer disabled if set to 0 --- DMRGateway.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/DMRGateway.cpp b/DMRGateway.cpp index dad7cc3..c0aab99 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -413,7 +413,7 @@ int CDMRGateway::run() m_xlx1Reflector = 4000U; m_xlx1Connected = false; - } else if (connected && xlx1LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx1LastSeenTime)) > (m_xlx1Relink*60) && m_xlx1Reflector != m_xlx1Startup) { + } else if (connected && m_xlx1Relink && xlx1LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx1LastSeenTime)) > (m_xlx1Relink*60) && m_xlx1Reflector != m_xlx1Startup) { writeXLXLink(m_xlx1Id,m_xlx1Startup,m_xlxNetwork1); LogMessage("XLX-1, Re-linking to startup reflector %u due to RF inactivity timeout (%u minutes)", m_xlx1Startup, m_xlx1Relink); m_xlx1Reflector = m_xlx1Startup; @@ -448,7 +448,7 @@ int CDMRGateway::run() m_xlx2Reflector = 4000U; m_xlx2Connected = false; - } else if (connected && xlx2LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx2LastSeenTime)) > (m_xlx2Relink*60) && m_xlx2Reflector != m_xlx2Startup) { + } else if (connected && m_xlx2Relink && xlx2LastSeenTime && (unsigned(time(NULL)) - unsigned(xlx2LastSeenTime)) > (m_xlx2Relink*60) && m_xlx2Reflector != m_xlx2Startup) { writeXLXLink(m_xlx2Id,m_xlx2Startup,m_xlxNetwork2); LogMessage("XLX-2, Re-linking to startup reflector %u due to RF inactivity timeout (%u minutes)", m_xlx2Startup, m_xlx2Relink); m_xlx2Reflector = m_xlx2Startup; @@ -1212,6 +1212,8 @@ bool CDMRGateway::createXLXNetwork1() LogInfo(" Startup: %u", m_xlx1Startup); if (m_xlx1Relink) LogInfo(" Relink: %u minutes", m_xlx1Relink); + else + LogInfo(" Relink: disabled"); m_rpt1Rewrite = new CRewriteTG("XLX-1", XLX_SLOT, XLX_TG, m_xlx1Slot, m_xlx1TG, 1U); m_xlx1Rewrite = new CRewriteTG("XLX-1", m_xlx1Slot, m_xlx1TG, XLX_SLOT, XLX_TG, 1U); @@ -1273,6 +1275,8 @@ bool CDMRGateway::createXLXNetwork2() LogInfo(" Startup: %u", m_xlx2Startup); if (m_xlx2Relink) LogInfo(" Relink: %u minutes", m_xlx2Relink); + else + LogInfo(" Relink: disabled"); m_rpt2Rewrite = new CRewriteTG("XLX-2", XLX_SLOT, XLX_TG, m_xlx2Slot, m_xlx2TG, 1U); m_xlx2Rewrite = new CRewriteTG("XLX-2", m_xlx2Slot, m_xlx2TG, XLX_SLOT, XLX_TG, 1U);