From 7320bb44b21814aa964906da782803a5a935a3fd Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 29 Oct 2020 15:04:28 +0000 Subject: [PATCH] Allow a DG-Id of zero for accessing YSF Gateway from DG-Id Gateway. --- DGIdGateway/DGIdGateway.cpp | 40 +++++++++++++++++++++++++++---------- DGIdGateway/DGIdGateway.ini | 13 +++++++++++- DGIdGateway/Version.h | 2 +- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/DGIdGateway/DGIdGateway.cpp b/DGIdGateway/DGIdGateway.cpp index fb19f95..aafd75e 100644 --- a/DGIdGateway/DGIdGateway.cpp +++ b/DGIdGateway/DGIdGateway.cpp @@ -53,6 +53,8 @@ const char* DEFAULT_INI_FILE = "/etc/DGIdGateway.ini"; #include #include +const unsigned int UNSET_DGID = 999U; + const unsigned char DT_VD_MODE1 = 0x01U; const unsigned char DT_VD_MODE2 = 0x02U; const unsigned char DT_VOICE_FR_MODE = 0x04U; @@ -218,7 +220,7 @@ int CDGIdGateway::run() imrs = NULL; } - unsigned int currentDGId = 0U; + unsigned int currentDGId = UNSET_DGID; bool fromRF = false; CDGIdNetwork* dgIdNetwork[100U]; @@ -298,6 +300,22 @@ int CDGIdGateway::run() LogMessage("Added IMRS:%s to DG-ID %u%s", name.c_str(), dgid, statc ? " (Static)" : ""); } + } else if (type == "Gateway") { + unsigned int local = (*it)->m_local; + + sockaddr_storage addr; + unsigned int addrLen; + if (CUDPSocket::lookup((*it)->m_address, (*it)->m_port, addr, addrLen) == 0) { + dgIdNetwork[dgid] = new CYSFNetwork(local, "YSFGateway", addr, addrLen, m_callsign, statc, debug); + dgIdNetwork[dgid]->m_modes = DT_VD_MODE1 | DT_VD_MODE2 | DT_VOICE_FR_MODE | DT_DATA_FR_MODE; + dgIdNetwork[dgid]->m_static = statc; + dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; + dgIdNetwork[dgid]->m_netHangTime = netHangTime; + + LogMessage("Added YSF Gateway to DG-ID %u%s", dgid, statc ? " (Static)" : ""); + } else { + LogWarning("Unable to resolve the address for the YSF Gateway"); + } } else if (type == "Parrot") { unsigned int local = (*it)->m_local; @@ -406,8 +424,8 @@ int CDGIdGateway::run() unsigned char ft = fich.getFT(); unsigned char dgId = fich.getDGId(); - if (dgId != 0U && dgId != currentDGId) { - if (dgIdNetwork[currentDGId] != NULL && !dgIdNetwork[currentDGId]->m_static) { + if (dgId != currentDGId) { + if (currentDGId != UNSET_DGID && dgIdNetwork[currentDGId] != NULL && !dgIdNetwork[currentDGId]->m_static) { dgIdNetwork[currentDGId]->unlink(); dgIdNetwork[currentDGId]->unlink(); dgIdNetwork[currentDGId]->unlink(); @@ -435,7 +453,7 @@ int CDGIdGateway::run() if (m_gps != NULL) m_gps->data(buffer + 14U, buffer + 35U, fi, dt, fn, ft); - if (currentDGId != 0U && dgIdNetwork[currentDGId] != NULL) { + if (currentDGId != UNSET_DGID && dgIdNetwork[currentDGId] != NULL) { // Only allow the wanted modes through if ((dt == YSF_DT_VD_MODE1 && (dgIdNetwork[currentDGId]->m_modes & DT_VD_MODE1) != 0U) || (dt == YSF_DT_DATA_FR_MODE && (dgIdNetwork[currentDGId]->m_modes & DT_DATA_FR_MODE) != 0U) || @@ -461,10 +479,10 @@ int CDGIdGateway::run() } } - for (unsigned int i = 1U; i < 100U; i++) { + for (unsigned int i = 0U; i < 100U; i++) { if (dgIdNetwork[i] != NULL) { unsigned int len = dgIdNetwork[i]->read(i, buffer); - if (len > 0U && (i == currentDGId || currentDGId == 0U)) { + if (len > 0U && (i == currentDGId || currentDGId == UNSET_DGID)) { CYSFFICH fich; bool valid = fich.decode(buffer + 35U); if (valid) { @@ -476,7 +494,7 @@ int CDGIdGateway::run() inactivityTimer.setTimeout(dgIdNetwork[i]->m_netHangTime); inactivityTimer.start(); - if (currentDGId == 0U) { + if (currentDGId == UNSET_DGID) { std::string desc = dgIdNetwork[i]->getDesc(i); LogMessage("DG-ID set to %u (%s) via Network", i, desc.c_str()); currentDGId = i; @@ -493,7 +511,7 @@ int CDGIdGateway::run() rptNetwork.clock(ms); - for (unsigned int i = 1U; i < 100U; i++) { + for (unsigned int i = 0U; i < 100U; i++) { if (dgIdNetwork[i] != NULL) dgIdNetwork[i]->clock(ms); } @@ -509,10 +527,10 @@ int CDGIdGateway::run() dgIdNetwork[currentDGId]->unlink(); } - LogMessage("DG-ID set to 0 (None) via timeout"); + LogMessage("DG-ID set to None via timeout"); state = DS_NOTLINKED; - currentDGId = 0U; + currentDGId = UNSET_DGID; inactivityTimer.stop(); if (fromRF) { @@ -557,7 +575,7 @@ int CDGIdGateway::run() delete m_gps; } - for (unsigned int i = 1U; i < 100U; i++) { + for (unsigned int i = 0U; i < 100U; i++) { if (dgIdNetwork[i] != NULL && dgIdNetwork[i] != imrs) { dgIdNetwork[i]->unlink(); dgIdNetwork[i]->unlink(); diff --git a/DGIdGateway/DGIdGateway.ini b/DGIdGateway/DGIdGateway.ini index 1c9f07b..f5a97eb 100644 --- a/DGIdGateway/DGIdGateway.ini +++ b/DGIdGateway/DGIdGateway.ini @@ -52,6 +52,17 @@ RFHangTime=240 NetHangTime=240 Debug=0 +[DGId=0] +# Local YSF Gateway, this must be DGId=0 for Wires-X to work. +Type=Gateway +Static=1 +Address=127.0.0.1 +Port=42025 +Local=42026 +#RFHangTime=120 +#NetHangTime=60 +Debug=0 + [DGId=1] # YSF Local Parrot Type=Parrot @@ -120,7 +131,7 @@ Debug=0 [DGId=45] # YSF Reflector Alabama-Link Type=YSF -Static=0 +Static=1 Name=Alabama-Link Local=42023 #RFHangTime=120 diff --git a/DGIdGateway/Version.h b/DGIdGateway/Version.h index f88bd0f..fa16a60 100644 --- a/DGIdGateway/Version.h +++ b/DGIdGateway/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20201005"; +const char* VERSION = "20201029"; #endif