1
0
Fork 0

Almost complete, but it doesn't work!

ycs232-kbc
Jonathan Naylor 7 years ago
parent 22e5bb523f
commit 28a0a78d84

@ -38,7 +38,9 @@ m_ping(NULL),
m_info(NULL), m_info(NULL),
m_reflector(), m_reflector(),
m_buffer(1000U, "FCS Network Buffer"), m_buffer(1000U, "FCS Network Buffer"),
m_n(0U) m_n(0U),
m_pingTimer(1000U, 5U),
m_state(FCS_UNLINKED)
{ {
m_info = new unsigned char[100U]; 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); ::sprintf((char*)m_info, "%9u%9u%-6.6s%-12.12s%7u", rxFrequency, txFrequency, locator.c_str(), FCS_VERSION, id);
@ -71,6 +73,10 @@ void CFCSNetwork::clearDestination()
{ {
m_address.s_addr = INADDR_NONE; m_address.s_addr = INADDR_NONE;
m_port = 0U; m_port = 0U;
m_pingTimer.stop();
m_state = FCS_UNLINKED;
} }
void CFCSNetwork::write(const unsigned char* data) void CFCSNetwork::write(const unsigned char* data)
@ -80,6 +86,9 @@ void CFCSNetwork::write(const unsigned char* data)
if (m_port == 0U) if (m_port == 0U)
return; return;
if (m_state != FCS_LINKED)
return;
unsigned char buffer[130U]; unsigned char buffer[130U];
::memset(buffer + 0U, ' ', 130U); ::memset(buffer + 0U, ' ', 130U);
::memcpy(buffer + 0U, data + 35U, 120U); ::memcpy(buffer + 0U, data + 35U, 120U);
@ -114,6 +123,10 @@ void CFCSNetwork::writeLink(const std::string& reflector)
::memcpy(m_ping + 10U, m_reflector.c_str(), 8U); ::memcpy(m_ping + 10U, m_reflector.c_str(), 8U);
writePing(); writePing();
m_pingTimer.start();
m_state = FCS_LINKING;
} }
void CFCSNetwork::writeUnlink(unsigned int count) void CFCSNetwork::writeUnlink(unsigned int count)
@ -123,6 +136,10 @@ void CFCSNetwork::writeUnlink(unsigned int count)
for (unsigned int i = 0U; i < count; i++) for (unsigned int i = 0U; i < count; i++)
m_socket.write((unsigned char*)"CLOSE ", 11U, m_address, m_port); m_socket.write((unsigned char*)"CLOSE ", 11U, m_address, m_port);
m_pingTimer.stop();
m_state = FCS_UNLINKED;
} }
void CFCSNetwork::clock(unsigned int ms) void CFCSNetwork::clock(unsigned int ms)
@ -138,17 +155,33 @@ void CFCSNetwork::clock(unsigned int ms)
if (m_port == 0U) if (m_port == 0U)
return; return;
m_pingTimer.clock(ms);
if (m_pingTimer.isRunning() && m_pingTimer.hasExpired()) {
writePing();
m_pingTimer.start();
}
if (address.s_addr != m_address.s_addr || port != m_port) if (address.s_addr != m_address.s_addr || port != m_port)
return; return;
if (m_debug) if (m_debug)
CUtils::dump(1U, "FCS Network Data Received", buffer, length); CUtils::dump(1U, "FCS Network Data Received", buffer, length);
if (length == 7 || length == 10) if (length == 7) {
m_state = FCS_LINKED;
writeInfo(); writeInfo();
}
if (length == 10 && m_state == FCS_LINKING) {
m_state = FCS_LINKED;
writeInfo();
}
if (length == 130) if (length == 10 || length == 130) {
m_buffer.addData(buffer, 130U); unsigned char len = length;
m_buffer.addData(&len, 1U);
m_buffer.addData(buffer, len);
}
} }
unsigned int CFCSNetwork::read(unsigned char* data) unsigned int CFCSNetwork::read(unsigned char* data)
@ -158,8 +191,17 @@ unsigned int CFCSNetwork::read(unsigned char* data)
if (m_buffer.isEmpty()) if (m_buffer.isEmpty())
return 0U; return 0U;
unsigned char len = 0U;
m_buffer.getData(&len, 1U);
// Pass pings up to the gateway to reset the lost timer.
if (len == 10U) {
m_buffer.getData(data, len);
return 10U;
}
unsigned char buffer[130U]; unsigned char buffer[130U];
m_buffer.getData(buffer, 130U); m_buffer.getData(buffer, len);
::memcpy(data + 0U, "YSFDDB0SAT DB0SAT-RPTALL ", 35U); ::memcpy(data + 0U, "YSFDDB0SAT DB0SAT-RPTALL ", 35U);
::memcpy(data + 35U, buffer, 120U); ::memcpy(data + 35U, buffer, 120U);

@ -22,11 +22,18 @@
#include "YSFDefines.h" #include "YSFDefines.h"
#include "UDPSocket.h" #include "UDPSocket.h"
#include "RingBuffer.h" #include "RingBuffer.h"
#include "Timer.h"
#include <cstdint> #include <cstdint>
#include <string> #include <string>
#include <map> #include <map>
enum FCS_STATE {
FCS_UNLINKED,
FCS_LINKING,
FCS_LINKED
};
class CFCSNetwork { class CFCSNetwork {
public: public:
CFCSNetwork(unsigned int port, const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, const std::string& locator, unsigned int id, bool debug); CFCSNetwork(unsigned int port, const std::string& callsign, unsigned int rxFrequency, unsigned int txFrequency, const std::string& locator, unsigned int id, bool debug);
@ -59,6 +66,8 @@ private:
CRingBuffer<unsigned char> m_buffer; CRingBuffer<unsigned char> m_buffer;
std::map<std::string, in_addr> m_addresses; std::map<std::string, in_addr> m_addresses;
unsigned char m_n; unsigned char m_n;
CTimer m_pingTimer;
FCS_STATE m_state;
void writeInfo(); void writeInfo();
void writePing(); void writePing();

@ -223,37 +223,8 @@ int CYSFGateway::run()
m_inactivityTimer.setTimeout(m_conf.getNetworkInactivityTimeout() * 60U); m_inactivityTimer.setTimeout(m_conf.getNetworkInactivityTimeout() * 60U);
bool revert = m_conf.getNetworkRevert(); bool revert = m_conf.getNetworkRevert();
std::string startup = m_conf.getNetworkStartup();
if (!startup.empty()) {
if (startup.substr(0U, 3U) == "FCS" && m_fcsNetwork != NULL) {
LogMessage("Automatic connection to %s", startup.c_str());
m_fcsNetwork->writeLink(startup);
if (!revert)
m_inactivityTimer.start();
m_lostTimer.start();
m_linkType = LINK_FCS;
} else if (m_ysfNetwork != NULL) {
CYSFReflector* reflector = m_wiresX->getReflector(startup);
if (reflector != NULL) {
LogMessage("Automatic 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_lostTimer.start();
m_linkType = LINK_YSF; startupLinking();
}
}
}
CStopWatch stopWatch; CStopWatch stopWatch;
stopWatch.start(); stopWatch.start();
@ -347,50 +318,38 @@ int CYSFGateway::run()
m_inactivityTimer.clock(ms); m_inactivityTimer.clock(ms);
if (m_inactivityTimer.isRunning() && m_inactivityTimer.hasExpired()) { if (m_inactivityTimer.isRunning() && m_inactivityTimer.hasExpired()) {
if (m_linkType == LINK_YSF) { if (m_linkType == LINK_YSF) {
CYSFReflector* reflector = NULL; LogMessage("Disconnecting due to inactivity");
if (revert && !startup.empty()) m_wiresX->processDisconnect();
reflector = m_wiresX->getReflector(startup); m_ysfNetwork->writeUnlink(3U);
m_ysfNetwork->clearDestination();
if (reflector != NULL) { }
LogMessage("Reverting connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str());
m_wiresX->processConnect(reflector);
m_ysfNetwork->writeUnlink(3U);
m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port);
m_ysfNetwork->writePoll(3U);
m_lostTimer.start();
} else {
LogMessage("Disconnecting due to inactivity");
m_wiresX->processDisconnect();
m_ysfNetwork->writeUnlink(3U);
m_ysfNetwork->clearDestination();
m_lostTimer.stop();
m_linkType = LINK_NONE; if (m_linkType == LINK_FCS) {
} LogMessage("Disconnecting due to inactivity");
m_fcsNetwork->writeUnlink(3U);
m_fcsNetwork->clearDestination();
} }
m_inactivityTimer.stop(); m_inactivityTimer.stop();
m_lostTimer.stop();
m_linkType = LINK_NONE;
startupLinking();
} }
m_lostTimer.clock(ms); m_lostTimer.clock(ms);
if (m_lostTimer.isRunning() && m_lostTimer.hasExpired()) { if (m_lostTimer.isRunning() && m_lostTimer.hasExpired()) {
LogWarning("Link has failed, polls lost"); if (m_linkType == LINK_YSF) {
LogWarning("Link has failed, polls lost");
if (m_linkType == LINK_YSF)
m_wiresX->processDisconnect(); m_wiresX->processDisconnect();
m_ysfNetwork->clearDestination();
}
if (m_fcsNetwork != NULL) if (m_fcsNetwork != NULL) {
LogWarning("Link has failed, polls lost");
m_fcsNetwork->clearDestination(); m_fcsNetwork->clearDestination();
}
if (m_ysfNetwork != NULL)
m_ysfNetwork->clearDestination();
m_inactivityTimer.stop(); m_inactivityTimer.stop();
m_lostTimer.stop(); m_lostTimer.stop();
@ -683,3 +642,39 @@ std::string CYSFGateway::calculateLocator()
return locator; return locator;
} }
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());
m_fcsNetwork->writeLink(startup);
if (!revert)
m_inactivityTimer.start();
m_lostTimer.start();
m_linkType = LINK_FCS;
} else if (m_ysfNetwork != NULL) {
CYSFReflector* reflector = m_wiresX->getReflector(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_lostTimer.start();
m_linkType = LINK_YSF;
}
}
}
}

@ -57,6 +57,7 @@ private:
CTimer m_inactivityTimer; CTimer m_inactivityTimer;
CTimer m_lostTimer; CTimer m_lostTimer;
void startupLinking();
std::string calculateLocator(); std::string calculateLocator();
void processWiresX(const unsigned char* buffer, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft); void processWiresX(const unsigned char* buffer, unsigned char fi, unsigned char dt, unsigned char fn, unsigned char ft);
void processDTMF(const unsigned char* buffer, unsigned char dt); void processDTMF(const unsigned char* buffer, unsigned char dt);

@ -35,7 +35,7 @@ Password=9999
Description=APRS Description Description=APRS Description
[Network] [Network]
# Startup= # Startup=FCS00120
InactivityTimeout=10 InactivityTimeout=10
# Revert=0 # Revert=0
Debug=0 Debug=0

Loading…
Cancel
Save