From 9719b1d2694030e348d32ff85a022bd1f6acfe3e Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 22 Feb 2018 19:11:21 +0000 Subject: [PATCH] Lots of small changes. --- YSFGateway/Conf.cpp | 8 --- YSFGateway/Conf.h | 2 - YSFGateway/FCSNetwork.cpp | 67 +++++++++-------- YSFGateway/FCSNetwork.h | 9 +-- YSFGateway/YSFGateway.cpp | 148 +++++++++++++++++++------------------- YSFGateway/YSFGateway.h | 2 +- YSFGateway/YSFGateway.ini | 1 - YSFGateway/YSFNetwork.cpp | 42 +++++++---- YSFGateway/YSFNetwork.h | 8 ++- 9 files changed, 151 insertions(+), 136 deletions(-) diff --git a/YSFGateway/Conf.cpp b/YSFGateway/Conf.cpp index 01e9f8a..90ee901 100644 --- a/YSFGateway/Conf.cpp +++ b/YSFGateway/Conf.cpp @@ -51,7 +51,6 @@ m_txFrequency(0U), m_power(0U), m_latitude(0.0F), m_longitude(0.0F), -m_locator(), m_height(0), m_name(), m_description(), @@ -159,8 +158,6 @@ bool CConf::read() m_latitude = float(::atof(value)); else if (::strcmp(key, "Longitude") == 0) m_longitude = float(::atof(value)); - else if (::strcmp(key, "Locator") == 0) - m_locator = value; else if (::strcmp(key, "Height") == 0) m_height = ::atoi(value); else if (::strcmp(key, "Name") == 0) @@ -292,11 +289,6 @@ float CConf::getLongitude() const return m_longitude; } -std::string CConf::getLocator() const -{ - return m_locator; -} - int CConf::getHeight() const { return m_height; diff --git a/YSFGateway/Conf.h b/YSFGateway/Conf.h index 1c05cb8..01e20af 100644 --- a/YSFGateway/Conf.h +++ b/YSFGateway/Conf.h @@ -46,7 +46,6 @@ public: unsigned int getPower() const; float getLatitude() const; float getLongitude() const; - std::string getLocator() const; int getHeight() const; std::string getName() const; std::string getDescription() const; @@ -99,7 +98,6 @@ private: unsigned int m_power; float m_latitude; float m_longitude; - std::string m_locator; int m_height; std::string m_name; std::string m_description; diff --git a/YSFGateway/FCSNetwork.cpp b/YSFGateway/FCSNetwork.cpp index 7b8cb70..4923205 100644 --- a/YSFGateway/FCSNetwork.cpp +++ b/YSFGateway/FCSNetwork.cpp @@ -34,23 +34,23 @@ m_socket(port), m_debug(debug), m_address(), m_port(0U), +m_ping(NULL), m_info(NULL), -m_callsign(callsign), m_reflector(), m_buffer(1000U, "FCS Network Buffer"), m_n(0U) { m_info = new unsigned char[100U]; - ::memset(m_info, ' ', 100U); - - m_callsign.resize(6U, ' '); - ::sprintf((char*)m_info, "%9u%9u%-6.6s%-12.12s%7u", rxFrequency, txFrequency, locator.c_str(), FCS_VERSION, id); + + m_ping = new unsigned char[25U]; + ::sprintf((char*)m_ping, "PING%6.6s ", callsign.c_str()); } CFCSNetwork::~CFCSNetwork() { delete[] m_info; + delete[] m_ping; } bool CFCSNetwork::open() @@ -73,12 +73,12 @@ void CFCSNetwork::clearDestination() m_port = 0U; } -bool CFCSNetwork::write(const unsigned char* data) +void CFCSNetwork::write(const unsigned char* data) { assert(data != NULL); if (m_port == 0U) - return true; + return; unsigned char buffer[130U]; ::memset(buffer + 0U, ' ', 130U); @@ -88,55 +88,45 @@ bool CFCSNetwork::write(const unsigned char* data) if (m_debug) CUtils::dump(1U, "FCS Network Data Sent", buffer, 130U); - return m_socket.write(buffer, 130U, m_address, m_port); + m_socket.write(buffer, 130U, m_address, m_port); } -bool CFCSNetwork::writeLink(const std::string& reflector) +void CFCSNetwork::writeLink(const std::string& reflector) { if (m_port == 0U) { std::string name = reflector.substr(0U, 6U); if (m_addresses.count(name) == 0U) { LogError("Unknown FCS reflector - %s", name.c_str()); - return false; + return; } m_address = m_addresses[name]; if (m_address.s_addr == INADDR_NONE) { LogError("FCS reflector %s has no address", name.c_str()); - return false; + return; } } m_port = FCS_PORT; m_reflector = reflector; - m_reflector.resize(8U, ' '); - - unsigned char buffer[25U]; - ::memset(buffer + 0U, ' ', 25U); - ::memcpy(buffer + 0U, "PING", 4U); - ::memcpy(buffer + 4U, m_callsign.c_str(), 6U); - ::memcpy(buffer + 10U, m_reflector.c_str(), 6U); - if (m_debug) - CUtils::dump(1U, "FCS Network Data Sent", buffer, 25U); + ::memcpy(m_ping + 10U, m_reflector.c_str(), 8U); - return m_socket.write(buffer, 25U, m_address, m_port); + writePing(); } -bool CFCSNetwork::writeUnlink() +void CFCSNetwork::writeUnlink(unsigned int count) { if (m_port == 0U) - return true; + return; - return m_socket.write((unsigned char*)"CLOSE ", 11U, m_address, m_port); + for (unsigned int i = 0U; i < count; i++) + m_socket.write((unsigned char*)"CLOSE ", 11U, m_address, m_port); } void CFCSNetwork::clock(unsigned int ms) { - if (m_port == 0U) - return; - unsigned char buffer[BUFFER_LENGTH]; in_addr address; @@ -145,6 +135,9 @@ void CFCSNetwork::clock(unsigned int ms) if (length <= 0) return; + if (m_port == 0U) + return; + if (address.s_addr != m_address.s_addr || port != m_port) return; @@ -155,7 +148,7 @@ void CFCSNetwork::clock(unsigned int ms) writeInfo(); if (length == 130) - m_buffer.addData(buffer, 120U); + m_buffer.addData(buffer, 130U); } unsigned int CFCSNetwork::read(unsigned char* data) @@ -165,9 +158,14 @@ unsigned int CFCSNetwork::read(unsigned char* data) if (m_buffer.isEmpty()) return 0U; + unsigned char buffer[130U]; + m_buffer.getData(buffer, 130U); + ::memcpy(data + 0U, "YSFDDB0SAT DB0SAT-RPTALL ", 35U); + ::memcpy(data + 35U, buffer, 120U); - m_buffer.getData(data + 35U, 120U); + // Put the reflector name as the via callsign. + ::memcpy(data + 4U, buffer + 121U, 8U); data[34U] = m_n; m_n += 2U; @@ -192,3 +190,14 @@ void CFCSNetwork::writeInfo() m_socket.write(m_info, 100U, m_address, m_port); } + +void CFCSNetwork::writePing() +{ + if (m_port == 0U) + return; + + if (m_debug) + CUtils::dump(1U, "FCS Network Data Sent", m_ping, 25U); + + m_socket.write(m_ping, 25U, m_address, m_port); +} diff --git a/YSFGateway/FCSNetwork.h b/YSFGateway/FCSNetwork.h index bf6d610..a5ce229 100644 --- a/YSFGateway/FCSNetwork.h +++ b/YSFGateway/FCSNetwork.h @@ -36,11 +36,11 @@ public: void clearDestination(); - bool write(const unsigned char* data); + void write(const unsigned char* data); - bool writeLink(const std::string& reflector); + void writeLink(const std::string& reflector); - bool writeUnlink(); + void writeUnlink(unsigned int count = 1U); unsigned int read(unsigned char* data); @@ -53,14 +53,15 @@ private: bool m_debug; in_addr m_address; unsigned int m_port; + unsigned char* m_ping; unsigned char* m_info; - std::string m_callsign; std::string m_reflector; CRingBuffer m_buffer; std::map m_addresses; unsigned char m_n; void writeInfo(); + void writePing(); }; #endif diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 6db2dc2..c4a80a6 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -46,6 +46,7 @@ const char* DEFAULT_INI_FILE = "/etc/YSFGateway.ini"; #include #include #include +#include int main(int argc, char** argv) { @@ -86,8 +87,7 @@ m_fcsNetwork(NULL), m_linkType(LINK_NONE), m_exclude(false), m_inactivityTimer(1000U), -m_lostTimer(1000U, 120U), -m_ysfPollTimer(1000U, 5U) +m_lostTimer(1000U, 120U) { } @@ -200,7 +200,7 @@ int CYSFGateway::run() unsigned int txFrequency = m_conf.getTxFrequency(); unsigned int rxFrequency = m_conf.getRxFrequency(); - std::string locator = m_conf.getLocator(); + std::string locator = calculateLocator(); unsigned int id = m_conf.getId(); unsigned int fcsPort = m_conf.getFCSNetworkPort(); @@ -250,15 +250,12 @@ int CYSFGateway::run() 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(); - m_ysfNetwork->writePoll(); - m_ysfNetwork->writePoll(); + m_ysfNetwork->writePoll(3U); if (!revert) m_inactivityTimer.start(); m_lostTimer.start(); - m_ysfPollTimer.start(); m_linkType = LINK_YSF; } @@ -358,30 +355,22 @@ int CYSFGateway::run() if (m_wiresX != NULL) m_wiresX->processConnect(reflector); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); + m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->setDestination(reflector->m_address, reflector->m_port); - m_ysfNetwork->writePoll(); - m_ysfNetwork->writePoll(); - m_ysfNetwork->writePoll(); + m_ysfNetwork->writePoll(3U); m_lostTimer.start(); - m_ysfPollTimer.start(); } else { LogMessage("Disconnecting due to inactivity"); if (m_wiresX != NULL) m_wiresX->processDisconnect(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); + m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); m_lostTimer.stop(); - m_ysfPollTimer.stop(); m_linkType = LINK_NONE; } @@ -405,17 +394,10 @@ int CYSFGateway::run() m_inactivityTimer.stop(); m_lostTimer.stop(); - m_ysfPollTimer.stop(); m_linkType = LINK_NONE; } - m_ysfPollTimer.clock(ms); - if (m_ysfPollTimer.isRunning() && m_ysfPollTimer.hasExpired()) { - m_ysfNetwork->writePoll(); - m_ysfPollTimer.start(); - } - if (ms < 5U) CThread::sleep(5U); } @@ -472,15 +454,11 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u WX_STATUS status = m_wiresX->process(buffer + 35U, buffer + 14U, fi, dt, fn, ft); switch (status) { case WXS_CONNECT_YSF: { - if (m_linkType == LINK_YSF) { - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - } + if (m_linkType == LINK_YSF) + m_ysfNetwork->writeUnlink(3U); + if (m_linkType == LINK_FCS) { - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); + m_fcsNetwork->writeUnlink(3U); m_fcsNetwork->clearDestination(); } @@ -488,13 +466,10 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u 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->writePoll(); - m_ysfNetwork->writePoll(); - m_ysfNetwork->writePoll(); + m_ysfNetwork->writePoll(3U); m_inactivityTimer.start(); m_lostTimer.start(); - m_ysfPollTimer.start(); m_linkType = LINK_YSF; } @@ -503,23 +478,18 @@ void CYSFGateway::processWiresX(const unsigned char* buffer, unsigned char fi, u if (m_linkType == LINK_YSF) { LogMessage("Disconnect has been requested by %10.10s", buffer + 14U); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); + m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_ysfPollTimer.stop(); m_linkType = LINK_NONE; } if (m_linkType == LINK_FCS) { LogMessage("Disconnect has been requested by %10.10s", buffer + 14U); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); + m_fcsNetwork->writeUnlink(3U); m_fcsNetwork->clearDestination(); m_inactivityTimer.stop(); @@ -554,28 +524,21 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) if (m_wiresX != NULL) m_wiresX->processConnect(reflector); - if (m_linkType == LINK_YSF) { - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - } + if (m_linkType == LINK_YSF) + m_ysfNetwork->writeUnlink(3U); + if (m_linkType == LINK_FCS) { - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); + m_fcsNetwork->writeUnlink(3U); m_fcsNetwork->clearDestination(); } 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->writePoll(); - m_ysfNetwork->writePoll(); - m_ysfNetwork->writePoll(); + m_ysfNetwork->writePoll(3U); m_inactivityTimer.start(); m_lostTimer.start(); - m_ysfPollTimer.start(); m_linkType = LINK_YSF; } @@ -589,22 +552,14 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) id = "FCS00" + id.at(0U) + id.at(1U) + id.at(2U); if (m_linkType == LINK_YSF) { - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); + m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); - m_ysfPollTimer.stop(); - } - if (m_linkType == LINK_FCS) { - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); } + if (m_linkType == LINK_FCS) + m_fcsNetwork->writeUnlink(3U); LogMessage("Connect via DTMF to %s has been requested by %10.10s", id.c_str(), buffer + 14U); - m_fcsNetwork->writeLink(id); - m_fcsNetwork->writeLink(id); m_fcsNetwork->writeLink(id); m_inactivityTimer.start(); @@ -620,23 +575,18 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) LogMessage("Disconnect via DTMF has been requested by %10.10s", buffer + 14U); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); - m_ysfNetwork->writeUnlink(); + m_ysfNetwork->writeUnlink(3U); m_ysfNetwork->clearDestination(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_ysfPollTimer.stop(); m_linkType = LINK_NONE; } if (m_linkType == LINK_FCS) { LogMessage("Disconnect via DTMF has been requested by %10.10s", buffer + 14U); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); - m_fcsNetwork->writeUnlink(); + m_fcsNetwork->writeUnlink(3U); m_fcsNetwork->clearDestination(); m_inactivityTimer.stop(); @@ -649,3 +599,53 @@ void CYSFGateway::processDTMF(const unsigned char* buffer, unsigned char dt) break; } } + +std::string CYSFGateway::calculateLocator() +{ + std::string locator; + + float latitude = m_conf.getLatitude(); + float longitude = m_conf.getLongitude(); + + if (latitude < -90.0F || latitude > 90.0F) + return "AA00AA"; + + if (longitude < -360.0F || longitude > 360.0F) + return "AA00AA"; + + latitude += 90.0F; + + if (longitude > 180.0F) + longitude -= 360.0F; + + if (longitude < -180.0F) + longitude += 360.0F; + + longitude += 180.0F; + + float lon = ::floor(longitude / 20.0F); + float lat = ::floor(latitude / 10.0F); + + locator += 'A' + (unsigned int)lon; + locator += 'A' + (unsigned int)lat; + + longitude -= lon * 20.0F; + latitude -= lat * 10.0F; + + lon = ::floor(longitude / 2.0F); + lat = ::floor(latitude / 1.0F); + + locator += '0' + (unsigned int)lon; + locator += '0' + (unsigned int)lat; + + longitude -= lon * 2.0F; + latitude -= lat * 1.0F; + + lon = ::floor(longitude / (2.0F / 24.0F)); + lat = ::floor(latitude / (1.0F / 24.0F)); + + locator += 'A' + (unsigned int)lon; + locator += 'A' + (unsigned int)lat; + + return locator; +} diff --git a/YSFGateway/YSFGateway.h b/YSFGateway/YSFGateway.h index 1aebf76..6396073 100644 --- a/YSFGateway/YSFGateway.h +++ b/YSFGateway/YSFGateway.h @@ -56,8 +56,8 @@ private: bool m_exclude; CTimer m_inactivityTimer; CTimer m_lostTimer; - CTimer m_ysfPollTimer; + std::string calculateLocator(); 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 createGPS(); diff --git a/YSFGateway/YSFGateway.ini b/YSFGateway/YSFGateway.ini index 85d6d42..37c4ab0 100644 --- a/YSFGateway/YSFGateway.ini +++ b/YSFGateway/YSFGateway.ini @@ -15,7 +15,6 @@ TXFrequency=439475000 Power=1 Latitude=0.0 Longitude=0.0 -Locator=IO90TT Height=0 Name=Nowhere Description=Multi-Mode Repeater diff --git a/YSFGateway/YSFNetwork.cpp b/YSFGateway/YSFNetwork.cpp index 93e84f0..8a99c1d 100644 --- a/YSFGateway/YSFNetwork.cpp +++ b/YSFGateway/YSFNetwork.cpp @@ -34,7 +34,8 @@ m_address(), m_port(0U), m_poll(NULL), m_unlink(NULL), -m_buffer(1000U, "YSF Network Buffer") +m_buffer(1000U, "YSF Network Buffer"), +m_pollTimer(1000U, 5U) { m_poll = new unsigned char[14U]; ::memcpy(m_poll + 0U, "YSFP", 4U); @@ -58,7 +59,8 @@ m_address(), m_port(0U), m_poll(NULL), m_unlink(NULL), -m_buffer(1000U, "YSF Network Buffer") +m_buffer(1000U, "YSF Network Buffer"), +m_pollTimer(1000U, 5U) { m_poll = new unsigned char[14U]; ::memcpy(m_poll + 0U, "YSFP", 4U); @@ -97,42 +99,47 @@ void CYSFNetwork::clearDestination() { m_address.s_addr = INADDR_NONE; m_port = 0U; + + m_pollTimer.stop(); } -bool CYSFNetwork::write(const unsigned char* data) +void CYSFNetwork::write(const unsigned char* data) { assert(data != NULL); if (m_port == 0U) - return true; + return; if (m_debug) CUtils::dump(1U, "YSF Network Data Sent", data, 155U); - return m_socket.write(data, 155U, m_address, m_port); + m_socket.write(data, 155U, m_address, m_port); } -bool CYSFNetwork::writePoll() +void CYSFNetwork::writePoll(unsigned int count) { if (m_port == 0U) - return true; + return; + + m_pollTimer.start(); - return m_socket.write(m_poll, 14U, m_address, m_port); + for (unsigned int i = 0U; i < count; i++) + m_socket.write(m_poll, 14U, m_address, m_port); } -bool CYSFNetwork::writeUnlink() +void CYSFNetwork::writeUnlink(unsigned int count) { + m_pollTimer.stop(); + if (m_port == 0U) - return true; + return; - return m_socket.write(m_unlink, 14U, m_address, m_port); + for (unsigned int i = 0U; i < count; i++) + m_socket.write(m_unlink, 14U, m_address, m_port); } void CYSFNetwork::clock(unsigned int ms) { - if (m_port == 0U) - return; - unsigned char buffer[BUFFER_LENGTH]; in_addr address; @@ -141,6 +148,13 @@ void CYSFNetwork::clock(unsigned int ms) if (length <= 0) return; + if (m_port == 0U) + return; + + m_pollTimer.clock(ms); + if (m_pollTimer.isRunning() && m_pollTimer.hasExpired()) + writePoll(); + if (address.s_addr != m_address.s_addr || port != m_port) return; diff --git a/YSFGateway/YSFNetwork.h b/YSFGateway/YSFNetwork.h index bd8e746..eeb9708 100644 --- a/YSFGateway/YSFNetwork.h +++ b/YSFGateway/YSFNetwork.h @@ -22,6 +22,7 @@ #include "YSFDefines.h" #include "UDPSocket.h" #include "RingBuffer.h" +#include "Timer.h" #include #include @@ -37,10 +38,10 @@ public: void setDestination(const in_addr& address, unsigned int port); void clearDestination(); - bool write(const unsigned char* data); + void write(const unsigned char* data); - bool writePoll(); - bool writeUnlink(); + void writePoll(unsigned int count = 1U); + void writeUnlink(unsigned int count = 1U); unsigned int read(unsigned char* data); @@ -56,6 +57,7 @@ private: unsigned char* m_poll; unsigned char* m_unlink; CRingBuffer m_buffer; + CTimer m_pollTimer; }; #endif