From a8adeeaad764d117fe6d1f72c0df7c1f7be2fdcb Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Thu, 28 Mar 2024 19:54:54 -0400 Subject: [PATCH] implement missing parrot delay timer; fix bad implementation where parrot frames were only played if network packets were received (this logic changed when threaded network Rx was implemented); --- src/fne/network/FNENetwork.cpp | 40 +++++++++++++++++------------ src/fne/network/FNENetwork.h | 1 + src/fne/network/fne/TagDMRData.cpp | 2 +- src/fne/network/fne/TagNXDNData.cpp | 2 +- src/fne/network/fne/TagP25Data.cpp | 2 +- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/fne/network/FNENetwork.cpp b/src/fne/network/FNENetwork.cpp index c53e975d..ff836968 100644 --- a/src/fne/network/FNENetwork.cpp +++ b/src/fne/network/FNENetwork.cpp @@ -82,6 +82,7 @@ FNENetwork::FNENetwork(HostFNE* host, const std::string& address, uint16_t port, m_p25Enabled(p25), m_nxdnEnabled(nxdn), m_parrotDelay(parrotDelay), + m_parrotDelayTimer(1000U, 0U, parrotDelay), m_parrotGrantDemand(parrotGrantDemand), m_ridLookup(nullptr), m_tidLookup(nullptr), @@ -209,22 +210,6 @@ void FNENetwork::processNetwork() return; } } - else { - // if the DMR handler has parrot frames to playback, playback a frame - if (m_tagDMR->hasParrotFrames()) { - m_tagDMR->playbackParrot(); - } - - // if the P25 handler has parrot frames to playback, playback a frame - if (m_tagP25->hasParrotFrames()) { - m_tagP25->playbackParrot(); - } - - // if the NXDN handler has parrot frames to playback, playback a frame - if (m_tagNXDN->hasParrotFrames()) { - m_tagNXDN->playbackParrot(); - } - } } /// @@ -276,6 +261,29 @@ void FNENetwork::clock(uint32_t ms) m_maintainenceTimer.start(); } + + m_parrotDelayTimer.clock(ms); + if (m_parrotDelayTimer.isRunning() && m_parrotDelayTimer.hasExpired()) { + // if the DMR handler has parrot frames to playback, playback a frame + if (m_tagDMR->hasParrotFrames()) { + m_tagDMR->playbackParrot(); + } + + // if the P25 handler has parrot frames to playback, playback a frame + if (m_tagP25->hasParrotFrames()) { + m_tagP25->playbackParrot(); + } + + // if the NXDN handler has parrot frames to playback, playback a frame + if (m_tagNXDN->hasParrotFrames()) { + m_tagNXDN->playbackParrot(); + } + } + + if (!m_tagDMR->hasParrotFrames() && !m_tagP25->hasParrotFrames() && !m_tagNXDN->hasParrotFrames() && + m_parrotDelayTimer.isRunning() && m_parrotDelayTimer.hasExpired()) { + m_parrotDelayTimer.stop(); + } } /// diff --git a/src/fne/network/FNENetwork.h b/src/fne/network/FNENetwork.h index 7392010a..565af180 100644 --- a/src/fne/network/FNENetwork.h +++ b/src/fne/network/FNENetwork.h @@ -263,6 +263,7 @@ namespace network bool m_nxdnEnabled; uint32_t m_parrotDelay; + Timer m_parrotDelayTimer; bool m_parrotGrantDemand; lookups::RadioIdLookup* m_ridLookup; diff --git a/src/fne/network/fne/TagDMRData.cpp b/src/fne/network/fne/TagDMRData.cpp index e19d8bf4..824eef1e 100644 --- a/src/fne/network/fne/TagDMRData.cpp +++ b/src/fne/network/fne/TagDMRData.cpp @@ -149,8 +149,8 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId if (tg.config().parrot()) { if (m_parrotFrames.size() > 0) { m_parrotFramesReady = true; - Thread::sleep(m_network->m_parrotDelay); LogMessage(LOG_NET, "DMR, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + m_network->m_parrotDelayTimer.start(); } } diff --git a/src/fne/network/fne/TagNXDNData.cpp b/src/fne/network/fne/TagNXDNData.cpp index 09d0dbef..0b34bb44 100644 --- a/src/fne/network/fne/TagNXDNData.cpp +++ b/src/fne/network/fne/TagNXDNData.cpp @@ -122,8 +122,8 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI if (tg.config().parrot()) { if (m_parrotFrames.size() > 0) { m_parrotFramesReady = true; - Thread::sleep(m_network->m_parrotDelay); LogMessage(LOG_NET, "NXDN, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + m_network->m_parrotDelayTimer.start(); } } diff --git a/src/fne/network/fne/TagP25Data.cpp b/src/fne/network/fne/TagP25Data.cpp index f0a41517..7a7096e0 100644 --- a/src/fne/network/fne/TagP25Data.cpp +++ b/src/fne/network/fne/TagP25Data.cpp @@ -180,8 +180,8 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId if (m_parrotFrames.size() > 0) { m_parrotFramesReady = true; m_parrotFirstFrame = true; - Thread::sleep(m_network->m_parrotDelay); LogMessage(LOG_NET, "P25, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + m_network->m_parrotDelayTimer.start(); } }