diff --git a/YSFGateway/FCSNetwork.cpp b/YSFGateway/FCSNetwork.cpp index cf6f4e4..a2529ce 100644 --- a/YSFGateway/FCSNetwork.cpp +++ b/YSFGateway/FCSNetwork.cpp @@ -25,7 +25,7 @@ #include #include -const char* FCS_VERSION = "MMDVM v.01"; +const char* FCS_VERSION = "MMDVM"; const unsigned int BUFFER_LENGTH = 200U; @@ -44,9 +44,11 @@ m_state(FCS_UNLINKED) { m_info = new unsigned char[100U]; ::sprintf((char*)m_info, "%9u%9u%-6.6s%-12.12s%7u", rxFrequency, txFrequency, locator.c_str(), FCS_VERSION, id); + ::memset(m_info + 43U, ' ', 57U); m_ping = new unsigned char[25U]; - ::sprintf((char*)m_ping, "PING%6.6s ", callsign.c_str()); + ::sprintf((char*)m_ping, "PING%6.6s", callsign.c_str()); + ::memset(m_ping + 10U, ' ', 15U); } CFCSNetwork::~CFCSNetwork() diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index ce20871..61cabb4 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -85,6 +85,8 @@ m_dtmf(), m_ysfNetwork(NULL), m_fcsNetwork(NULL), m_linkType(LINK_NONE), +m_current(), +m_startup(), m_exclude(false), m_inactivityTimer(1000U), m_lostTimer(1000U, 120U) @@ -171,13 +173,13 @@ int CYSFGateway::run() #endif m_callsign = m_conf.getCallsign(); - m_suffix = m_conf.getSuffix(); + m_suffix = m_conf.getSuffix(); - bool debug = m_conf.getNetworkDebug(); - in_addr rptAddress = CUDPSocket::lookup(m_conf.getRptAddress()); - unsigned int rptPort = m_conf.getRptPort(); + bool debug = m_conf.getNetworkDebug(); + in_addr rptAddress = CUDPSocket::lookup(m_conf.getRptAddress()); + unsigned int rptPort = m_conf.getRptPort(); std::string myAddress = m_conf.getMyAddress(); - unsigned int myPort = m_conf.getMyPort(); + unsigned int myPort = m_conf.getMyPort(); CYSFNetwork rptNetwork(myAddress, myPort, m_callsign, debug); rptNetwork.setDestination(rptAddress, rptPort); @@ -222,6 +224,7 @@ int CYSFGateway::run() m_inactivityTimer.setTimeout(m_conf.getNetworkInactivityTimeout() * 60U); + m_startup = m_conf.getNetworkStartup(); bool revert = m_conf.getNetworkRevert(); startupLinking(); @@ -317,25 +320,47 @@ int CYSFGateway::run() m_inactivityTimer.clock(ms); if (m_inactivityTimer.isRunning() && m_inactivityTimer.hasExpired()) { - if (m_linkType == LINK_YSF) { - LogMessage("Disconnecting due to inactivity"); - m_wiresX->processDisconnect(); - m_ysfNetwork->writeUnlink(3U); - m_ysfNetwork->clearDestination(); - } - - if (m_linkType == LINK_FCS) { - LogMessage("Disconnecting due to inactivity"); - m_fcsNetwork->writeUnlink(3U); - m_fcsNetwork->clearDestination(); - } - - m_inactivityTimer.stop(); - m_lostTimer.stop(); + if (revert) { + if (m_current != m_startup) { + if (m_linkType == LINK_YSF) { + m_wiresX->processDisconnect(); + m_ysfNetwork->writeUnlink(3U); + m_ysfNetwork->clearDestination(); + } + + if (m_linkType == LINK_FCS) { + m_fcsNetwork->writeUnlink(3U); + m_fcsNetwork->clearDestination(); + } + + m_current.clear(); + m_inactivityTimer.stop(); + m_lostTimer.stop(); + m_linkType = LINK_NONE; + + startupLinking(); + } else { + m_inactivityTimer.start(); + } + } else { + if (m_linkType == LINK_YSF) { + LogMessage("Disconnecting due to inactivity"); + m_wiresX->processDisconnect(); + m_ysfNetwork->writeUnlink(3U); + m_ysfNetwork->clearDestination(); + } - m_linkType = LINK_NONE; + if (m_linkType == LINK_FCS) { + LogMessage("Disconnecting due to inactivity"); + m_fcsNetwork->writeUnlink(3U); + m_fcsNetwork->clearDestination(); + } - startupLinking(); + m_current.clear(); + m_inactivityTimer.stop(); + m_lostTimer.stop(); + m_linkType = LINK_NONE; + } } m_lostTimer.clock(ms); @@ -351,9 +376,9 @@ int CYSFGateway::run() m_fcsNetwork->clearDestination(); } + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_linkType = LINK_NONE; } @@ -463,9 +488,9 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port); m_ysfNetwork->writePoll(3U); + m_current = reflector->m_id; m_inactivityTimer.start(); m_lostTimer.start(); - m_linkType = LINK_YSF; } break; @@ -476,9 +501,9 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_linkType = LINK_NONE; } if (m_linkType == LINK_FCS) { @@ -487,9 +512,9 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u m_fcsNetwork->writeUnlink(3U); m_fcsNetwork->clearDestination(); + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_linkType = LINK_NONE; } break; @@ -531,9 +556,9 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port); m_ysfNetwork->writePoll(3U); + m_current = id; m_inactivityTimer.start(); m_lostTimer.start(); - m_linkType = LINK_YSF; } } @@ -552,6 +577,7 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) if (m_linkType == LINK_FCS) m_fcsNetwork->writeUnlink(3U); + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); m_linkType = LINK_NONE; @@ -560,6 +586,7 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) bool ok = m_fcsNetwork->writeLink(id); if (ok) { + m_current = id; m_inactivityTimer.start(); m_lostTimer.start(); m_linkType = LINK_FCS; @@ -577,9 +604,9 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_linkType = LINK_NONE; } if (m_linkType == LINK_FCS) { @@ -588,9 +615,9 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) m_fcsNetwork->writeUnlink(3U); m_fcsNetwork->clearDestination(); + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_linkType = LINK_NONE; } break; @@ -651,39 +678,40 @@ std::string CYSFGateway::calculateLocator() void CYSFGateway::startupLinking() { - std::string startup = m_conf.getNetworkStartup(); - bool revert = m_conf.getNetworkRevert(); - - if (!startup.empty()) { - if (startup.substr(0U, 3U) == "FCS" && m_fcsNetwork != NULL) { - LogMessage("Automatic (re-)connection to %s", startup.c_str()); - + if (!m_startup.empty()) { + if (m_startup.substr(0U, 3U) == "FCS" && m_fcsNetwork != NULL) { + m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); m_linkType = LINK_NONE; - bool ok = m_fcsNetwork->writeLink(startup); + bool ok = m_fcsNetwork->writeLink(m_startup); if (ok) { - if (!revert) - m_inactivityTimer.start(); + LogMessage("Automatic (re-)connection to %s", m_startup.c_str()); + + m_current = m_startup; + m_inactivityTimer.start(); m_lostTimer.start(); m_linkType = LINK_FCS; } else { - LogMessage("Unknown reflector - %s", startup.c_str()); + LogMessage("Unknown reflector - %s", m_startup.c_str()); } } else if (m_ysfNetwork != NULL) { - CYSFReflector* reflector = m_wiresX->getReflector(startup); + m_current.clear(); + m_inactivityTimer.stop(); + m_lostTimer.stop(); + m_linkType = LINK_NONE; + + CYSFReflector* reflector = m_wiresX->getReflector(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_ysfNetwork->writePoll(3U); - if (!revert) - m_inactivityTimer.start(); - + m_current = m_startup; + m_inactivityTimer.start(); m_lostTimer.start(); - m_linkType = LINK_YSF; } } diff --git a/YSFGateway/YSFGateway.h b/YSFGateway/YSFGateway.h index 5e71b75..7b05afb 100644 --- a/YSFGateway/YSFGateway.h +++ b/YSFGateway/YSFGateway.h @@ -53,6 +53,8 @@ private: 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; diff --git a/YSFGateway/YSFGateway.ini b/YSFGateway/YSFGateway.ini index 16b41af..b6c82f6 100644 --- a/YSFGateway/YSFGateway.ini +++ b/YSFGateway/YSFGateway.ini @@ -37,7 +37,7 @@ Description=APRS Description [Network] # Startup=FCS00120 InactivityTimeout=10 -# Revert=0 +Revert=0 Debug=0 [YSF Network]