diff --git a/YSFGateway/WiresX.cpp b/YSFGateway/WiresX.cpp index dce4b25..db0aede 100644 --- a/YSFGateway/WiresX.cpp +++ b/YSFGateway/WiresX.cpp @@ -42,11 +42,11 @@ const unsigned char DEFAULT_FICH[] = {0x20U, 0x00U, 0x01U, 0x00U}; const unsigned char NET_HEADER[] = "YSFD ALL "; -CWiresX::CWiresX(const std::string& callsign, const std::string& suffix, CYSFNetwork* network, const std::string& hostsFile, unsigned int reloadTime) : +CWiresX::CWiresX(const std::string& callsign, const std::string& suffix, CYSFNetwork* network, CYSFReflectors& reflectors) : m_callsign(callsign), m_node(), m_network(network), -m_reflectors(hostsFile, reloadTime), +m_reflectors(reflectors), m_reflector(NULL), m_id(), m_name(), @@ -159,10 +159,6 @@ void CWiresX::setYSF2DMR(const std::string& address, unsigned int port) bool CWiresX::start() { - bool ret = m_reflectors.load(); - if (!ret) - return false; - m_reflectors.reload(); return true; @@ -239,11 +235,9 @@ CYSFReflector* CWiresX::getReflector() const return m_reflector; } -CYSFReflector* CWiresX::getReflector(const std::string& id) +void CWiresX::setReflector(CYSFReflector* reflector) { - m_reflector = m_reflectors.find(id); - - return m_reflector; + m_reflector = reflector; } void CWiresX::processDX(const unsigned char* source) @@ -287,7 +281,7 @@ WX_STATUS CWiresX::processConnect(const unsigned char* source, const unsigned ch std::string id = std::string((char*)data, 5U); - m_reflector = m_reflectors.find(id); + m_reflector = m_reflectors.findById(id); if (m_reflector == NULL) return WXS_NONE; diff --git a/YSFGateway/WiresX.h b/YSFGateway/WiresX.h index e1128cf..d979147 100644 --- a/YSFGateway/WiresX.h +++ b/YSFGateway/WiresX.h @@ -43,7 +43,7 @@ enum WXSI_STATUS { class CWiresX { public: - CWiresX(const std::string& callsign, const std::string& suffix, CYSFNetwork* network, const std::string& hostsFile, unsigned int reloadTime); + CWiresX(const std::string& callsign, const std::string& suffix, CYSFNetwork* network, CYSFReflectors& reflectors); ~CWiresX(); void setInfo(const std::string& name, unsigned int txFrequency, unsigned int rxFrequency); @@ -55,7 +55,7 @@ public: WX_STATUS process(const unsigned char* data, const unsigned char* source, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft); CYSFReflector* getReflector() const; - CYSFReflector* getReflector(const std::string& id); + void setReflector(CYSFReflector* reflector); void processConnect(CYSFReflector* reflector); void processDisconnect(const unsigned char* source = NULL); @@ -63,25 +63,25 @@ public: void clock(unsigned int ms); private: - std::string m_callsign; - std::string m_node; - CYSFNetwork* m_network; - CYSFReflectors m_reflectors; - CYSFReflector* m_reflector; - std::string m_id; - std::string m_name; - unsigned char* m_command; - unsigned int m_txFrequency; - unsigned int m_rxFrequency; - CTimer m_timer; - unsigned char m_seqNo; - unsigned char* m_header; - unsigned char* m_csd1; - unsigned char* m_csd2; - unsigned char* m_csd3; - WXSI_STATUS m_status; - unsigned int m_start; - std::string m_search; + std::string m_callsign; + std::string m_node; + CYSFNetwork* m_network; + CYSFReflectors& m_reflectors; + CYSFReflector* m_reflector; + std::string m_id; + std::string m_name; + unsigned char* m_command; + unsigned int m_txFrequency; + unsigned int m_rxFrequency; + CTimer m_timer; + unsigned char m_seqNo; + unsigned char* m_header; + unsigned char* m_csd1; + unsigned char* m_csd2; + unsigned char* m_csd3; + WXSI_STATUS m_status; + unsigned int m_start; + std::string m_search; WX_STATUS processConnect(const unsigned char* source, const unsigned char* data); void processDX(const unsigned char* source); diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index d24527b..3cc0384 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -17,7 +17,6 @@ */ #include "YSFGateway.h" -#include "YSFReflectors.h" #include "UDPSocket.h" #include "StopWatch.h" #include "Version.h" @@ -80,6 +79,7 @@ m_callsign(), m_suffix(), m_conf(configFile), m_gps(NULL), +m_reflectors(NULL), m_wiresX(NULL), m_dtmf(), m_ysfNetwork(NULL), @@ -182,7 +182,7 @@ int CYSFGateway::run() unsigned int myPort = m_conf.getMyPort(); CYSFNetwork rptNetwork(myAddress, myPort, m_callsign, debug); - rptNetwork.setDestination(rptAddress, rptPort); + rptNetwork.setDestination("MMDVM", rptAddress, rptPort); ret = rptNetwork.open(); if (!ret) { @@ -224,6 +224,17 @@ int CYSFGateway::run() m_inactivityTimer.setTimeout(m_conf.getNetworkInactivityTimeout() * 60U); + std::string fileName = m_conf.getYSFNetworkHosts(); + unsigned int reloadTime = m_conf.getYSFNetworkReloadTime(); + + m_reflectors = new CYSFReflectors(fileName, reloadTime); + m_reflectors->load(); + m_reflectors->reload(); + + createWiresX(&rptNetwork); + + createGPS(); + m_startup = m_conf.getNetworkStartup(); bool revert = m_conf.getNetworkRevert(); @@ -234,10 +245,6 @@ int CYSFGateway::run() LogMessage("Starting YSFGateway-%s", VERSION); - createWiresX(&rptNetwork); - - createGPS(); - for (;;) { unsigned char buffer[200U]; @@ -441,10 +448,7 @@ void CYSFGateway::createWiresX(CYSFNetwork* rptNetwork) { assert(rptNetwork != NULL); - std::string fileName = m_conf.getYSFNetworkHosts(); - unsigned int reloadTime = m_conf.getYSFNetworkReloadTime(); - - m_wiresX = new CWiresX(m_callsign, m_suffix, rptNetwork, fileName, reloadTime); + m_wiresX = new CWiresX(m_callsign, m_suffix, rptNetwork, *m_reflectors); std::string name = m_conf.getName(); @@ -485,7 +489,7 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u CYSFReflector* reflector = m_wiresX->getReflector(); LogMessage("Connect to %5.5s - \"%s\" has been requested by %10.10s", reflector->m_id.c_str(), reflector->m_name.c_str(), buffer + 14U); - m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port); + m_ysfNetwork->setDestination(reflector->m_name, reflector->m_address, reflector->m_port); m_ysfNetwork->writePoll(3U); m_current = reflector->m_id; @@ -539,7 +543,7 @@ void CYSFGateway::processDTMF(unsigned char* buffer, unsigned char dt) switch (status) { case WXS_CONNECT_YSF: { std::string id = m_dtmf.getReflector(); - CYSFReflector* reflector = m_wiresX->getReflector(id); + CYSFReflector* reflector = m_reflectors->findById(id); if (reflector != NULL) { m_wiresX->processConnect(reflector); @@ -553,7 +557,7 @@ void CYSFGateway::processDTMF(unsigned char* buffer, unsigned char dt) LogMessage("Connect via DTMF to %5.5s - \"%s\" has been requested by %10.10s", reflector->m_id.c_str(), reflector->m_name.c_str(), buffer + 14U); - m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port); + m_ysfNetwork->setDestination(reflector->m_name, reflector->m_address, reflector->m_port); m_ysfNetwork->writePoll(3U); m_current = id; @@ -576,6 +580,7 @@ void CYSFGateway::processDTMF(unsigned char* buffer, unsigned char dt) } if (m_linkType == LINK_YSF) { + m_wiresX->processDisconnect(); m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); } @@ -707,11 +712,13 @@ void CYSFGateway::startupLinking() m_lostTimer.stop(); m_linkType = LINK_NONE; - CYSFReflector* reflector = m_wiresX->getReflector(m_startup); + CYSFReflector* reflector = m_reflectors->findByName(m_startup); if (reflector != NULL) { LogMessage("Automatic (re-)connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str()); - m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port); + m_wiresX->setReflector(reflector); + + m_ysfNetwork->setDestination(reflector->m_name, reflector->m_address, reflector->m_port); m_ysfNetwork->writePoll(3U); m_current = m_startup; diff --git a/YSFGateway/YSFGateway.h b/YSFGateway/YSFGateway.h index d401565..238277c 100644 --- a/YSFGateway/YSFGateway.h +++ b/YSFGateway/YSFGateway.h @@ -20,6 +20,7 @@ #define YSFGateway_H #include "YSFNetwork.h" +#include "YSFReflectors.h" #include "FCSNetwork.h" #include "WiresX.h" #include "Timer.h" @@ -44,20 +45,21 @@ public: int run(); private: - std::string m_callsign; - std::string m_suffix; - CConf m_conf; - CGPS* m_gps; - CWiresX* m_wiresX; - CDTMF m_dtmf; - CYSFNetwork* m_ysfNetwork; - CFCSNetwork* m_fcsNetwork; - LINK_TYPE m_linkType; - std::string m_current; - std::string m_startup; - bool m_exclude; - CTimer m_inactivityTimer; - CTimer m_lostTimer; + std::string m_callsign; + std::string m_suffix; + CConf m_conf; + CGPS* m_gps; + CYSFReflectors* m_reflectors; + CWiresX* m_wiresX; + CDTMF m_dtmf; + CYSFNetwork* m_ysfNetwork; + CFCSNetwork* m_fcsNetwork; + LINK_TYPE m_linkType; + std::string m_current; + std::string m_startup; + bool m_exclude; + CTimer m_inactivityTimer; + CTimer m_lostTimer; void startupLinking(); std::string calculateLocator(); diff --git a/YSFGateway/YSFGateway.ini b/YSFGateway/YSFGateway.ini index b6c82f6..5ecddd3 100644 --- a/YSFGateway/YSFGateway.ini +++ b/YSFGateway/YSFGateway.ini @@ -36,6 +36,7 @@ Description=APRS Description [Network] # Startup=FCS00120 +# Startup=Alabama-Link InactivityTimeout=10 Revert=0 Debug=0 diff --git a/YSFGateway/YSFNetwork.cpp b/YSFGateway/YSFNetwork.cpp index 8a99c1d..b291be6 100644 --- a/YSFGateway/YSFNetwork.cpp +++ b/YSFGateway/YSFNetwork.cpp @@ -35,7 +35,9 @@ m_port(0U), m_poll(NULL), m_unlink(NULL), m_buffer(1000U, "YSF Network Buffer"), -m_pollTimer(1000U, 5U) +m_pollTimer(1000U, 5U), +m_name(), +m_linked(false) { m_poll = new unsigned char[14U]; ::memcpy(m_poll + 0U, "YSFP", 4U); @@ -89,16 +91,19 @@ bool CYSFNetwork::open() return m_socket.open(); } -void CYSFNetwork::setDestination(const in_addr& address, unsigned int port) +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(); } @@ -136,6 +141,8 @@ void CYSFNetwork::writeUnlink(unsigned int count) for (unsigned int i = 0U; i < count; i++) m_socket.write(m_unlink, 14U, m_address, m_port); + + m_linked = false; } void CYSFNetwork::clock(unsigned int ms) @@ -158,6 +165,11 @@ void CYSFNetwork::clock(unsigned int ms) if (address.s_addr != m_address.s_addr || port != m_port) return; + if (::memcmp(buffer, "YSFP", 4U) == 0 && !m_linked) { + LogMessage("Linked to %s", m_name.c_str()); + m_linked = true; + } + if (m_debug) CUtils::dump(1U, "YSF Network Data Received", buffer, length); diff --git a/YSFGateway/YSFNetwork.h b/YSFGateway/YSFNetwork.h index eeb9708..30bfb39 100644 --- a/YSFGateway/YSFNetwork.h +++ b/YSFGateway/YSFNetwork.h @@ -35,7 +35,7 @@ public: bool open(); - void setDestination(const in_addr& address, unsigned int port); + void setDestination(const std::string& name, const in_addr& address, unsigned int port); void clearDestination(); void write(const unsigned char* data); @@ -58,6 +58,8 @@ private: unsigned char* m_unlink; CRingBuffer m_buffer; CTimer m_pollTimer; + std::string m_name; + bool m_linked; }; #endif diff --git a/YSFGateway/YSFReflectors.cpp b/YSFGateway/YSFReflectors.cpp index e72661a..134f674 100644 --- a/YSFGateway/YSFReflectors.cpp +++ b/YSFGateway/YSFReflectors.cpp @@ -163,9 +163,9 @@ bool CYSFReflectors::load() return true; } -CYSFReflector* CYSFReflectors::find(const std::string& id) +CYSFReflector* CYSFReflectors::findById(const std::string& id) { - for (std::vector::iterator it = m_currReflectors.begin(); it != m_currReflectors.end(); ++it) { + for (std::vector::const_iterator it = m_currReflectors.cbegin(); it != m_currReflectors.cend(); ++it) { if (id == (*it)->m_id) return *it; } @@ -175,6 +175,21 @@ CYSFReflector* CYSFReflectors::find(const std::string& id) return NULL; } +CYSFReflector* CYSFReflectors::findByName(const std::string& name) +{ + std::string fullName = name; + fullName.resize(16U, ' '); + + for (std::vector::const_iterator it = m_currReflectors.cbegin(); it != m_currReflectors.cend(); ++it) { + if (fullName == (*it)->m_name) + return *it; + } + + LogMessage("Trying to find non existent YSF reflector with a name of %s", name.c_str()); + + return NULL; +} + std::vector& CYSFReflectors::current() { return m_currReflectors; diff --git a/YSFGateway/YSFReflectors.h b/YSFGateway/YSFReflectors.h index bd5b7a7..cb5fed4 100644 --- a/YSFGateway/YSFReflectors.h +++ b/YSFGateway/YSFReflectors.h @@ -55,7 +55,8 @@ public: bool load(); - CYSFReflector* find(const std::string& id); + CYSFReflector* findById(const std::string& id); + CYSFReflector* findByName(const std::string& name); std::vector& current();