From 5b48969fbb0c14830c2a8d5c8ec75a8fc3f2ebc4 Mon Sep 17 00:00:00 2001 From: Filippo Gentile Date: Mon, 19 Jun 2023 10:21:36 +0200 Subject: [PATCH] server: Z21 ClientKernel prevent speed trend override --- server/src/hardware/protocol/z21/clientkernel.cpp | 14 ++++++++++---- server/src/hardware/protocol/z21/clientkernel.hpp | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/server/src/hardware/protocol/z21/clientkernel.cpp b/server/src/hardware/protocol/z21/clientkernel.cpp index 8237654c..67222cfe 100644 --- a/server/src/hardware/protocol/z21/clientkernel.cpp +++ b/server/src/hardware/protocol/z21/clientkernel.cpp @@ -148,10 +148,15 @@ void ClientKernel::receive(const Message& message) targetSpeedStep = float(targetSpeedStep) / float(cache->speedSteps) * 126.0; } - if(cache->lastReceivedSpeedStep <= currentSpeedStep) - cache->speedTrend = LocoCache::Trend::Ascending; - else - cache->speedTrend = LocoCache::Trend::Descending; + if(!cache->speedTrendExplicitlySet) + { + //Calculate new speed trend + if(cache->lastReceivedSpeedStep <= currentSpeedStep) + cache->speedTrend = LocoCache::Trend::Ascending; + else + cache->speedTrend = LocoCache::Trend::Descending; + } + cache->speedTrendExplicitlySet = false; if(reply.speedSteps() != cache->speedSteps || reply.speedStep() != cache->speedStep) { @@ -591,6 +596,7 @@ void ClientKernel::decoderChanged(const Decoder& decoder, DecoderChangeFlags cha if(cache->lastReceivedSpeedStep < newTargetSpeedStep) cache->lastReceivedSpeedStep = 126; //Reset to maximum } + cache->speedTrendExplicitlySet = true; //Update last seen time to ignore feedback messages of our own changes //This potentially ignores also user commands coming from Z21 if issued diff --git a/server/src/hardware/protocol/z21/clientkernel.hpp b/server/src/hardware/protocol/z21/clientkernel.hpp index c4aef9be..11030d7e 100644 --- a/server/src/hardware/protocol/z21/clientkernel.hpp +++ b/server/src/hardware/protocol/z21/clientkernel.hpp @@ -122,6 +122,7 @@ class ClientKernel final : public Kernel uint8_t speedSteps = 0; uint8_t lastReceivedSpeedStep = 0; //Always in 126 steps Trend speedTrend = Trend::Ascending; + bool speedTrendExplicitlySet = false; Direction direction = Direction::Unknown; std::chrono::steady_clock::time_point lastSetTime; };