diff --git a/YSFGateway/Conf.cpp b/YSFGateway/Conf.cpp index 6ed3b01..2cb7413 100644 --- a/YSFGateway/Conf.cpp +++ b/YSFGateway/Conf.cpp @@ -74,6 +74,7 @@ m_aprsSymbol("/r"), m_networkStartup(), m_networkOptions(), m_networkInactivityTimeout(0U), +m_networkReconnect(false), m_networkRevert(false), m_networkDebug(false), m_ysfNetworkEnabled(false), @@ -245,6 +246,8 @@ bool CConf::read() m_networkOptions = value; else if (::strcmp(key, "InactivityTimeout") == 0) m_networkInactivityTimeout = (unsigned int)::atoi(value); + else if (::strcmp(key, "Reconnect") == 0) + m_networkReconnect = ::atoi(value) == 1; else if (::strcmp(key, "Revert") == 0) m_networkRevert = ::atoi(value) == 1; else if (::strcmp(key, "Debug") == 0) @@ -466,6 +469,11 @@ unsigned int CConf::getNetworkInactivityTimeout() const return m_networkInactivityTimeout; } +bool CConf::getNetworkReconnect() const +{ + return m_networkReconnect; +} + bool CConf::getNetworkRevert() const { return m_networkRevert; diff --git a/YSFGateway/Conf.h b/YSFGateway/Conf.h index 430613d..1d11e39 100644 --- a/YSFGateway/Conf.h +++ b/YSFGateway/Conf.h @@ -71,6 +71,7 @@ public: std::string getNetworkStartup() const; std::string getNetworkOptions() const; unsigned int getNetworkInactivityTimeout() const; + bool getNetworkReconnect() const; bool getNetworkRevert() const; bool getNetworkDebug() const; @@ -141,6 +142,7 @@ private: std::string m_networkStartup; std::string m_networkOptions; unsigned int m_networkInactivityTimeout; + bool m_networkReconnect; bool m_networkRevert; bool m_networkDebug; diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 476c2f4..bbdc5c5 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -300,6 +300,7 @@ int CYSFGateway::run() m_startup = m_conf.getNetworkStartup(); m_options = m_conf.getNetworkOptions(); bool revert = m_conf.getNetworkRevert(); + bool reconnect = m_conf.getNetworkReconnect(); bool wiresXCommandPassthrough = m_conf.getWiresXCommandPassthrough(); startupLinking(); @@ -401,40 +402,23 @@ int CYSFGateway::run() m_inactivityTimer.clock(ms); if (m_inactivityTimer.isRunning() && m_inactivityTimer.hasExpired()) { if (revert) { - if (m_current != m_startup) { - if (m_linkType == LINK_TYPE::YSF) { - m_wiresX->processDisconnect(); - m_ysfNetwork->writeUnlink(3U); - m_ysfNetwork->clearDestination(); - } - - if (m_linkType == LINK_TYPE::FCS) { - m_fcsNetwork->writeUnlink(3U); - m_fcsNetwork->clearDestination(); - } - - m_current.clear(); - m_lostTimer.stop(); - m_linkType = LINK_TYPE::NONE; - + if (m_linkType != LINK_TYPE::NONE && m_current != m_startup) { + LogMessage("Reverting to startup ref due to inactivity"); + disconnectCurrentReflector(); + startupLinking(); + } else if (m_linkType == LINK_TYPE::NONE && reconnect) { + // reconnect if current one is timeout and reconnect = 1 + LogMessage("Reconnecting startup reflector ..."); startupLinking(); } } else { - if (m_linkType == LINK_TYPE::YSF) { + if (m_linkType != LINK_TYPE::NONE && !reconnect) { LogMessage("Disconnecting due to inactivity"); - m_wiresX->processDisconnect(); - m_ysfNetwork->writeUnlink(3U); - m_ysfNetwork->clearDestination(); + disconnectCurrentReflector(); + } else if (m_linkType == LINK_TYPE::NONE && reconnect) { + LogMessage("Reconnecting reflector ..."); + reconnectReflector(m_current); } - - if (m_linkType == LINK_TYPE::FCS) { - LogMessage("Disconnecting due to inactivity"); - m_fcsNetwork->writeUnlink(3U); - m_fcsNetwork->clearDestination(); - } - - m_lostTimer.stop(); - m_linkType = LINK_TYPE::NONE; } m_inactivityTimer.start(); @@ -668,42 +652,9 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, const CYSFFICH& fic } break; case WX_STATUS::RECONNECT_CURRENT: { - if (m_wiresX->getReflector() == nullptr && !m_current.empty()) { - // trying to reconnect - if (m_current.substr(0U, 3U) == "FCS" && m_fcsNetwork != nullptr) { - m_inactivityTimer.stop(); - m_lostTimer.stop(); + if (m_linkType == LINK_TYPE::NONE && !m_current.empty()) + reconnectReflector(m_current); - bool ok = m_fcsNetwork->writeLink(m_current); - m_fcsNetwork->setOptions(m_options); - - if (ok) { - LogMessage("Automatic (re-)connection to %s", m_current.c_str()); - - m_inactivityTimer.start(); - m_lostTimer.start(); - m_linkType = LINK_TYPE::FCS;; - } - } else if (m_ysfNetwork != nullptr) { - m_inactivityTimer.stop(); - m_lostTimer.stop(); - - CYSFReflector* reflector = m_reflectors->findByName(m_current); - if (reflector != nullptr) { - LogMessage("Automatic (re-)connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str()); - - m_wiresX->setReflector(reflector); - - m_ysfNetwork->setDestination(reflector->m_name, reflector->m_addr, reflector->m_addrLen); - m_ysfNetwork->setOptions(m_options); - m_ysfNetwork->writePoll(3U); - - m_inactivityTimer.start(); - m_lostTimer.start(); - m_linkType = LINK_TYPE::YSF; - } - } - } } break; default: @@ -924,6 +875,63 @@ void CYSFGateway::startupLinking() LogMessage("No connection startup"); } +void CYSFGateway::reconnectReflector(const std::string& refNameOrId) { + if (refNameOrId.substr(0U, 3U) == "FCS" && m_fcsNetwork != nullptr) { + m_inactivityTimer.stop(); + m_lostTimer.stop(); + + bool ok = m_fcsNetwork->writeLink(refNameOrId); + m_fcsNetwork->setOptions(m_options); + + if (ok) { + LogMessage("(re-)connection to %s", refNameOrId.c_str()); + + m_inactivityTimer.start(); + m_lostTimer.start(); + m_linkType = LINK_TYPE::FCS; + } + } else if (m_ysfNetwork != nullptr) { + m_inactivityTimer.stop(); + m_lostTimer.stop(); + + CYSFReflector* reflector = m_reflectors->findById(refNameOrId); + if (reflector == nullptr) + reflector = m_reflectors->findByName(refNameOrId); + + if (reflector != nullptr) { + LogMessage("(re-)connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str()); + + m_wiresX->setReflector(reflector); + + m_ysfNetwork->setDestination(reflector->m_name, reflector->m_addr, reflector->m_addrLen); + + m_ysfNetwork->setOptions(m_options); + m_ysfNetwork->writePoll(3U); + + m_inactivityTimer.start(); + m_lostTimer.start(); + m_linkType = LINK_TYPE::YSF; + } + } +} + +void CYSFGateway::disconnectCurrentReflector() { + if (m_linkType == LINK_TYPE::YSF) { + m_wiresX->processDisconnect(); + m_ysfNetwork->writeUnlink(3U); + m_ysfNetwork->clearDestination(); + } + + if (m_linkType == LINK_TYPE::FCS) { + m_fcsNetwork->writeUnlink(3U); + m_fcsNetwork->clearDestination(); + } + + // m_current.clear(); + m_lostTimer.stop(); + m_linkType = LINK_TYPE::NONE; +} + void CYSFGateway::readFCSRoomsFile(const std::string& filename) { FILE* fp = ::fopen(filename.c_str(), "rt"); diff --git a/YSFGateway/YSFGateway.h b/YSFGateway/YSFGateway.h index 809b321..60e9f9c 100644 --- a/YSFGateway/YSFGateway.h +++ b/YSFGateway/YSFGateway.h @@ -68,6 +68,8 @@ private: CUDPSocket* m_remoteSocket; void startupLinking(); + void reconnectReflector(const std::string& nameOrId); + void disconnectCurrentReflector(); std::string calculateLocator(); void processWiresX(const unsigned char* buffer, const CYSFFICH& fich, bool dontProcessWiresXLocal, bool wiresXCommandPassthrough); void processDTMF(unsigned char* buffer, unsigned char dt); diff --git a/YSFGateway/YSFGateway.ini b/YSFGateway/YSFGateway.ini index bdfef4c..55132f9 100644 --- a/YSFGateway/YSFGateway.ini +++ b/YSFGateway/YSFGateway.ini @@ -44,6 +44,7 @@ Suffix=Y # book DG-ID for Reflector # Options=20;21; InactivityTimeout=10 +Reconnect=0 Revert=0 Debug=0