From 852a3a0518c6f5f9b943613cc340c5ee2f330013 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Wed, 19 Aug 2020 16:09:41 +0100 Subject: [PATCH] First compiling version. --- .gitignore | 1 + DGIdGateway/DGIdGateway.cpp | 53 ++++++++++----------------- DGIdGateway/FCSNetwork.cpp | 33 +++++++++-------- DGIdGateway/IMRSNetwork.cpp | 72 +++++++++++++++++++++++++++++++++++++ DGIdGateway/IMRSNetwork.h | 51 ++++++++++++++++++++++++++ DGIdGateway/Makefile | 5 +-- DGIdGateway/Version.h | 2 +- DGIdGateway/YSFFICH.cpp | 4 +-- DGIdGateway/YSFNetwork.cpp | 67 ++++++++++++---------------------- DGIdGateway/YSFNetwork.h | 13 ++++--- 10 files changed, 194 insertions(+), 107 deletions(-) create mode 100644 DGIdGateway/IMRSNetwork.cpp create mode 100644 DGIdGateway/IMRSNetwork.h diff --git a/.gitignore b/.gitignore index 525f188..cead316 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ x64 *.user *.VC.db .vs +DGIdGateway/DGIdGateway YSFGateway/YSFGateway YSFParrot/YSFParrot YSFReflector/YSFReflector diff --git a/DGIdGateway/DGIdGateway.cpp b/DGIdGateway/DGIdGateway.cpp index bec6cf6..0ac6556 100644 --- a/DGIdGateway/DGIdGateway.cpp +++ b/DGIdGateway/DGIdGateway.cpp @@ -19,6 +19,7 @@ #include "YSFReflectors.h" #include "DGIdGateway.h" #include "DGIdNetwork.h" +#include "IMRSNetwork.h" #include "YSFNetwork.h" #include "FCSNetwork.h" #include "UDPSocket.h" @@ -171,7 +172,6 @@ int CDGIdGateway::run() ::close(STDERR_FILENO); } #endif - m_callsign = m_conf.getCallsign(); m_suffix = m_conf.getSuffix(); @@ -181,9 +181,7 @@ int CDGIdGateway::run() std::string myAddress = m_conf.getMyAddress(); unsigned int myPort = m_conf.getMyPort(); - CYSFNetwork rptNetwork(myAddress, myPort, m_callsign, debug); - rptNetwork.setDestination("MMDVM", rptAddress, rptPort); - + CYSFNetwork rptNetwork(myAddress, myPort, "MMDVM", rptAddress, rptPort, m_callsign, debug); ret = rptNetwork.open(); if (!ret) { ::LogError("Cannot open the repeater network port"); @@ -192,7 +190,6 @@ int CDGIdGateway::run() } std::string fileName = m_conf.getYSFNetHosts(); - CYSFReflectors* reflectors = new CYSFReflectors(fileName); reflectors->load(); @@ -230,33 +227,27 @@ int CDGIdGateway::run() CYSFReflector* reflector = reflectors->findByName(name); if (reflector != NULL) { - CYSFNetwork* ysf = new CYSFNetwork(local, m_callsign, debug); - ysf->setDestination(reflector->m_name, reflector->m_address, reflector->m_port); - - dgIdNetwork[dgid] = ysf; + dgIdNetwork[dgid] = new CYSFNetwork(local, reflector->m_name, reflector->m_address, reflector->m_port, m_callsign, debug);; dgIdNetwork[dgid]->m_modes = YSF_DT_VD_MODE1 | YSF_DT_VD_MODE2 | YSF_DT_VOICE_FR_MODE | YSF_DT_DATA_FR_MODE; dgIdNetwork[dgid]->m_static = statc; dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; dgIdNetwork[dgid]->m_netHangTime = netHangTime; } -/* } else if (type == "IMRS") { - dgIdNetwork[dgid] = new CIMRSNetwork; + std::vector destinations = (*it)->m_destinations; + + dgIdNetwork[dgid] = new CIMRSNetwork(destinations, debug); dgIdNetwork[dgid]->m_modes = YSF_DT_VD_MODE1 | YSF_DT_VD_MODE2 | YSF_DT_VOICE_FR_MODE | YSF_DT_DATA_FR_MODE; dgIdNetwork[dgid]->m_static = statc; dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; dgIdNetwork[dgid]->m_netHangTime = netHangTime; -*/ } else if (type == "Parrot") { in_addr address = CUDPSocket::lookup((*it)->m_address); unsigned int port = (*it)->m_port; unsigned int local = (*it)->m_local; if (address.s_addr != INADDR_NONE) { - CYSFNetwork* ysf = new CYSFNetwork(local, m_callsign, debug); - ysf->setDestination("PARROT", address, port); - - dgIdNetwork[dgid] = ysf; + dgIdNetwork[dgid] = new CYSFNetwork(local, "PARROT", address, port, m_callsign, debug);; dgIdNetwork[dgid]->m_modes = YSF_DT_VD_MODE1 | YSF_DT_VD_MODE2 | YSF_DT_VOICE_FR_MODE | YSF_DT_DATA_FR_MODE; dgIdNetwork[dgid]->m_static = statc; dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; @@ -268,10 +259,7 @@ int CDGIdGateway::run() unsigned int local = (*it)->m_local; if (address.s_addr != INADDR_NONE) { - CYSFNetwork* ysf = new CYSFNetwork(local, m_callsign, debug); - ysf->setDestination("YSF2DMR", address, port); - - dgIdNetwork[dgid] = ysf; + dgIdNetwork[dgid] = new CYSFNetwork(local, "YSF2DMR", address, port, m_callsign, debug);; dgIdNetwork[dgid]->m_modes = YSF_DT_VD_MODE1 | YSF_DT_VD_MODE2; dgIdNetwork[dgid]->m_static = statc; dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; @@ -283,10 +271,7 @@ int CDGIdGateway::run() unsigned int local = (*it)->m_local; if (address.s_addr != INADDR_NONE) { - CYSFNetwork* ysf = new CYSFNetwork(local, m_callsign, debug); - ysf->setDestination("YSF2NXDN", address, port); - - dgIdNetwork[dgid] = ysf; + dgIdNetwork[dgid] = new CYSFNetwork(local, "YSF2NXDN", address, port, m_callsign, debug);; dgIdNetwork[dgid]->m_modes = YSF_DT_VD_MODE1 | YSF_DT_VD_MODE2; dgIdNetwork[dgid]->m_static = statc; dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; @@ -298,10 +283,7 @@ int CDGIdGateway::run() unsigned int local = (*it)->m_local; if (address.s_addr != INADDR_NONE) { - CYSFNetwork* ysf = new CYSFNetwork(local, m_callsign, debug); - ysf->setDestination("YSF2P25", address, port); - - dgIdNetwork[dgid] = ysf; + dgIdNetwork[dgid] = new CYSFNetwork(local, "YSF2P25", address, port, m_callsign, debug);; dgIdNetwork[dgid]->m_modes = YSF_DT_VOICE_FR_MODE; dgIdNetwork[dgid]->m_static = statc; dgIdNetwork[dgid]->m_rfHangTime = rfHangTime; @@ -370,11 +352,11 @@ int CDGIdGateway::run() if (currentDGId != 0U && dgIdNetwork[currentDGId] != NULL) { // Only allow the wanted modes through - if ((dgIdNetwork[currentDGId]->m_modes & dt) != 0U) { + if ((dgIdNetwork[currentDGId]->m_modes & dt) != 0U) dgIdNetwork[currentDGId]->write(currentDGId, buffer); - inactivityTimer.setTimeout(dgIdNetwork[currentDGId]->m_rfHangTime); - inactivityTimer.start(); - } + + inactivityTimer.setTimeout(dgIdNetwork[currentDGId]->m_rfHangTime); + inactivityTimer.start(); } } @@ -397,6 +379,7 @@ int CDGIdGateway::run() fich.encode(buffer + 35U); rptNetwork.write(0U, buffer); + inactivityTimer.setTimeout(dgIdNetwork[i]->m_netHangTime); inactivityTimer.start(); @@ -414,10 +397,12 @@ int CDGIdGateway::run() stopWatch.start(); rptNetwork.clock(ms); - for (unsigned int i = 0U; i < 100U; i++) { + + for (unsigned int i = 1U; i < 100U; i++) { if (dgIdNetwork[i] != NULL) dgIdNetwork[i]->clock(ms); } + if (m_writer != NULL) m_writer->clock(ms); @@ -428,7 +413,7 @@ int CDGIdGateway::run() dgIdNetwork[currentDGId]->unlink(); dgIdNetwork[currentDGId]->unlink(); } - } + LogDebug("DG-ID set to 0 via timeout"); currentDGId = 0U; diff --git a/DGIdGateway/FCSNetwork.cpp b/DGIdGateway/FCSNetwork.cpp index 559ec29..0f0ed9f 100644 --- a/DGIdGateway/FCSNetwork.cpp +++ b/DGIdGateway/FCSNetwork.cpp @@ -53,6 +53,8 @@ m_state(FCS_UNLINKED) ::memcpy(m_ping + 4U, callsign.c_str(), callsign.size()); ::memset(m_ping + 10U, 0x00U, 15U); ::memcpy(m_ping + 10U, reflector.c_str(), 8U); + + m_print = reflector.substr(0U, 6U) + "-" + reflector.substr(6U); } CFCSNetwork::~CFCSNetwork() @@ -79,7 +81,7 @@ bool CFCSNetwork::open() return m_socket.open(); } -void CFCSNetwork::write(const unsigned char* data) +void CFCSNetwork::write(unsigned int dgid, const unsigned char* data) { assert(data != NULL); @@ -99,29 +101,26 @@ void CFCSNetwork::write(const unsigned char* data) void CFCSNetwork::link() { - if (m_state != FCS_LINKED) { - std::string name = m_reflector.substr(0U, 6U); - if (m_addresses.count(name) == 0U) { - LogError("Unknown FCS reflector - %s", name.c_str()); - return; - } - - m_address = m_addresses[name]; - if (m_address.s_addr == INADDR_NONE) { - LogError("FCS reflector %s has no address", name.c_str()); - return; - } + if (m_state == FCS_LINKING || m_state == FCS_LINKED) + return; + + std::string name = m_reflector.substr(0U, 6U); + if (m_addresses.count(name) == 0U) { + LogError("Unknown FCS reflector - %s", name.c_str()); + return; } - m_print = m_reflector.substr(0U, 6U) + "-" + m_reflector.substr(6U); + m_address = m_addresses[name]; + if (m_address.s_addr == INADDR_NONE) { + LogError("FCS reflector %s has no address", name.c_str()); + return; + } m_state = FCS_LINKING; m_pingTimer.start(); writePing(); - - return true; } void CFCSNetwork::unlink() @@ -183,7 +182,7 @@ void CFCSNetwork::clock(unsigned int ms) } } -unsigned int CFCSNetwork::read(unsigned char* data) +unsigned int CFCSNetwork::read(unsigned int dgid, unsigned char* data) { assert(data != NULL); diff --git a/DGIdGateway/IMRSNetwork.cpp b/DGIdGateway/IMRSNetwork.cpp new file mode 100644 index 0000000..eb7fee4 --- /dev/null +++ b/DGIdGateway/IMRSNetwork.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2009-2014,2016,2017,2018,2020 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "IMRSNetwork.h" +#include "YSFDefines.h" +#include "Utils.h" +#include "Log.h" + +#include +#include +#include + + +CIMRSNetwork::CIMRSNetwork(const std::vector& destinations, bool debug) +{ +} + +CIMRSNetwork::~CIMRSNetwork() +{ +} + +bool CIMRSNetwork::open() +{ + LogMessage("Opening IMRS network connection"); + + return true; +} + +void CIMRSNetwork::write(unsigned int dgid, const unsigned char* data) +{ + assert(data != NULL); +} + +void CIMRSNetwork::link() +{ +} + +void CIMRSNetwork::unlink() +{ +} + +void CIMRSNetwork::clock(unsigned int ms) +{ +} + +unsigned int CIMRSNetwork::read(unsigned int dgid, unsigned char* data) +{ + assert(data != NULL); + + return 0U; +} + +void CIMRSNetwork::close() +{ + LogMessage("Closing IMRS network connection"); +} + diff --git a/DGIdGateway/IMRSNetwork.h b/DGIdGateway/IMRSNetwork.h new file mode 100644 index 0000000..063d916 --- /dev/null +++ b/DGIdGateway/IMRSNetwork.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009-2014,2016,2017,2018,2020 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef IMRSNetwork_H +#define IMRSNetwork_H + +#include "DGIdNetwork.h" +#include "YSFDefines.h" +#include "Conf.h" + +#include +#include + +class CIMRSNetwork : public CDGIdNetwork { +public: + CIMRSNetwork(const std::vector& destinations, bool debug); + virtual ~CIMRSNetwork(); + + virtual bool open(); + + virtual void link(); + + virtual void write(unsigned int dgId, const unsigned char* data); + + virtual unsigned int read(unsigned int dgId, unsigned char* data); + + virtual void clock(unsigned int ms); + + virtual void unlink(); + + virtual void close(); + +private: +}; + +#endif diff --git a/DGIdGateway/Makefile b/DGIdGateway/Makefile index 43e868a..b83d970 100644 --- a/DGIdGateway/Makefile +++ b/DGIdGateway/Makefile @@ -11,8 +11,9 @@ LIBS = -lm -lpthread LDFLAGS = -g -OBJECTS = APRSWriter.o Conf.o CRC.o DGIdGateway.o DGIdNetwork.o FCSNetwork.o Golay24128.o GPS.o Log.o StopWatch.o Sync.o Thread.o Timer.o \ - UDPSocket.o Utils.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o YSFReflectors.o +OBJECTS = APRSWriter.o Conf.o CRC.o DGIdGateway.o DGIdNetwork.o FCSNetwork.o Golay24128.o GPS.o IMRSNetwork.o \ + Log.o StopWatch.o Sync.o Thread.o Timer.o UDPSocket.o Utils.o YSFConvolution.o YSFFICH.o YSFNetwork.o \ + YSFPayload.o YSFReflectors.o all: DGIdGateway diff --git a/DGIdGateway/Version.h b/DGIdGateway/Version.h index 8fabccf..997a270 100644 --- a/DGIdGateway/Version.h +++ b/DGIdGateway/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200803"; +const char* VERSION = "20200819"; #endif diff --git a/DGIdGateway/YSFFICH.cpp b/DGIdGateway/YSFFICH.cpp index 967b339..8f99b05 100644 --- a/DGIdGateway/YSFFICH.cpp +++ b/DGIdGateway/YSFFICH.cpp @@ -111,7 +111,7 @@ bool CYSFFICH::decode(const unsigned char* bytes) m_fich[4U] = ((b2 << 4) & 0xF0U) | ((b3 >> 8) & 0x0FU); m_fich[5U] = (b3 >> 0) & 0xFFU; - return CCRC::checkCCITT162(m_fich, 6U); + return CCRC::checkCCITT16(m_fich, 6U); } void CYSFFICH::encode(unsigned char* bytes) @@ -121,7 +121,7 @@ void CYSFFICH::encode(unsigned char* bytes) // Skip the sync bytes bytes += YSF_SYNC_LENGTH_BYTES; - CCRC::addCCITT162(m_fich, 6U); + CCRC::addCCITT16(m_fich, 6U); unsigned int b0 = ((m_fich[0U] << 4) & 0xFF0U) | ((m_fich[1U] >> 4) & 0x00FU); unsigned int b1 = ((m_fich[1U] << 8) & 0xF00U) | ((m_fich[2U] >> 0) & 0x0FFU); diff --git a/DGIdGateway/YSFNetwork.cpp b/DGIdGateway/YSFNetwork.cpp index 91076d1..593e79a 100644 --- a/DGIdGateway/YSFNetwork.cpp +++ b/DGIdGateway/YSFNetwork.cpp @@ -27,16 +27,16 @@ const unsigned int BUFFER_LENGTH = 200U; -CYSFNetwork::CYSFNetwork(const std::string& address, unsigned int port, const std::string& callsign, bool debug) : -m_socket(address, port), +CYSFNetwork::CYSFNetwork(const std::string& localAddress, unsigned int localPort, const std::string& name, const in_addr& address, unsigned int port, const std::string& callsign, bool debug) : +m_socket(localAddress, localPort), m_debug(debug), -m_address(), -m_port(0U), +m_address(address), +m_port(port), m_poll(NULL), m_unlink(NULL), m_buffer(1000U, "YSF Network Buffer"), m_pollTimer(1000U, 5U), -m_name(), +m_name(name), m_linked(false) { m_poll = new unsigned char[14U]; @@ -49,20 +49,22 @@ m_linked(false) node.resize(YSF_CALLSIGN_LENGTH, ' '); for (unsigned int i = 0U; i < YSF_CALLSIGN_LENGTH; i++) { - m_poll[i + 4U] = node.at(i); + m_poll[i + 4U] = node.at(i); m_unlink[i + 4U] = node.at(i); } } -CYSFNetwork::CYSFNetwork(unsigned int port, const std::string& callsign, bool debug) : -m_socket(port), +CYSFNetwork::CYSFNetwork(unsigned int localPort, const std::string& name, const in_addr& address, unsigned int port, const std::string& callsign, bool debug) : +m_socket(localPort), m_debug(debug), -m_address(), -m_port(0U), +m_address(address), +m_port(port), m_poll(NULL), m_unlink(NULL), m_buffer(1000U, "YSF Network Buffer"), -m_pollTimer(1000U, 5U) +m_pollTimer(1000U, 5U), +m_name(name), +m_linked(false) { m_poll = new unsigned char[14U]; ::memcpy(m_poll + 0U, "YSFP", 4U); @@ -91,56 +93,33 @@ bool CYSFNetwork::open() return m_socket.open(); } -void CYSFNetwork::setDestination(const std::string& name, const in_addr& address, unsigned int port) -{ - m_name = name; - m_address = address; - m_port = port; - m_linked = false; -} - -void CYSFNetwork::clearDestination() -{ - m_address.s_addr = INADDR_NONE; - m_port = 0U; - m_linked = false; - - m_pollTimer.stop(); -} - -void CYSFNetwork::write(const unsigned char* data) +void CYSFNetwork::write(unsigned int dgid, const unsigned char* data) { assert(data != NULL); - if (m_port == 0U) - return; - if (m_debug) CUtils::dump(1U, "YSF Network Data Sent", data, 155U); m_socket.write(data, 155U, m_address, m_port); } -void CYSFNetwork::writePoll(unsigned int count) +void CYSFNetwork::link() { - if (m_port == 0U) - return; + writePoll(); +} +void CYSFNetwork::writePoll() +{ m_pollTimer.start(); - for (unsigned int i = 0U; i < count; i++) - m_socket.write(m_poll, 14U, m_address, m_port); + m_socket.write(m_poll, 14U, m_address, m_port); } -void CYSFNetwork::writeUnlink(unsigned int count) +void CYSFNetwork::unlink() { m_pollTimer.stop(); - if (m_port == 0U) - return; - - for (unsigned int i = 0U; i < count; i++) - m_socket.write(m_unlink, 14U, m_address, m_port); + m_socket.write(m_unlink, 14U, m_address, m_port); m_linked = false; } @@ -183,7 +162,7 @@ void CYSFNetwork::clock(unsigned int ms) m_buffer.addData(buffer, length); } -unsigned int CYSFNetwork::read(unsigned char* data) +unsigned int CYSFNetwork::read(unsigned int dgid, unsigned char* data) { assert(data != NULL); diff --git a/DGIdGateway/YSFNetwork.h b/DGIdGateway/YSFNetwork.h index 7abb5b6..6b774fb 100644 --- a/DGIdGateway/YSFNetwork.h +++ b/DGIdGateway/YSFNetwork.h @@ -30,25 +30,22 @@ class CYSFNetwork : public CDGIdNetwork { public: - CYSFNetwork(const std::string& address, unsigned int port, const std::string& callsign, bool debug); - CYSFNetwork(unsigned int port, const std::string& callsign, bool debug); + CYSFNetwork(const std::string& localAddress, unsigned int localPort, const std::string& name, const in_addr& address, unsigned int port, const std::string& callsign, bool debug); + CYSFNetwork(unsigned int localPort, const std::string& name, const in_addr& address, unsigned int port, const std::string& callsign, bool debug); virtual ~CYSFNetwork(); virtual bool open(); virtual void link(); - void setDestination(const std::string& name, const in_addr& address, unsigned int port); - virtual void write(unsigned int dgId, const unsigned char* data); - void writePoll(unsigned int count = 1U); - virtual void unlink(); - virtual unsigned int read(unsigned int dgId, unsigned char* data); virtual void clock(unsigned int ms); + virtual void unlink(); + virtual void close(); private: @@ -62,6 +59,8 @@ private: CTimer m_pollTimer; std::string m_name; bool m_linked; + + void writePoll(); }; #endif