diff --git a/FMNetwork.cpp b/FMNetwork.cpp index 4e3df87..67d0f2e 100644 --- a/FMNetwork.cpp +++ b/FMNetwork.cpp @@ -33,7 +33,8 @@ m_address(), m_port(gatewayPort), m_debug(debug), m_enabled(false), -m_buffer(2000U, "FM Network") +m_buffer(2000U, "FM Network"), +m_pollTimer(1000U, 5U) { assert(gatewayPort > 0U); assert(!gatewayAddress.empty()); @@ -52,6 +53,8 @@ bool CFMNetwork::open() if (m_address.s_addr == INADDR_NONE) return false; + m_pollTimer.start(); + return m_socket.open(); } @@ -84,13 +87,19 @@ bool CFMNetwork::writeEOT() buffer[2U] = 'E'; if (m_debug) - CUtils::dump(1U, "FM Network Data Sent", buffer, 3U); + CUtils::dump(1U, "FM Network End of Transmission Sent", buffer, 3U); return m_socket.write(buffer, 3U, m_address, m_port); } void CFMNetwork::clock(unsigned int ms) { + m_pollTimer.clock(ms); + if (m_pollTimer.hasExpired()) { + writePoll(); + m_pollTimer.start(); + } + unsigned char buffer[BUFFER_LENGTH]; in_addr address; @@ -105,6 +114,10 @@ void CFMNetwork::clock(unsigned int ms) return; } + // Ignore incoming polls + if (::memcmp(buffer, "FMP", 3U) == 0) + return; + // Invalid packet type? if (::memcmp(buffer, "FMD", 3U) != 0) return; @@ -159,3 +172,17 @@ void CFMNetwork::enable(bool enabled) m_enabled = enabled; } + +bool CFMNetwork::writePoll() +{ + unsigned char buffer[3U]; + + buffer[0U] = 'F'; + buffer[1U] = 'M'; + buffer[2U] = 'P'; + + if (m_debug) + CUtils::dump(1U, "FM Network Poll Sent", buffer, 3U); + + return m_socket.write(buffer, 3U, m_address, m_port); +} diff --git a/FMNetwork.h b/FMNetwork.h index fba36d2..453e776 100644 --- a/FMNetwork.h +++ b/FMNetwork.h @@ -54,6 +54,9 @@ private: bool m_debug; bool m_enabled; CRingBuffer m_buffer; + CTimer m_pollTimer; + + bool writePoll(); }; #endif