From 5736c4a1ab28ee0b2d517dd9d8f7d0098126e77e Mon Sep 17 00:00:00 2001 From: Reinder Feenstra Date: Sat, 12 Feb 2022 22:30:39 +0100 Subject: [PATCH] dcc++: added response handling for turnout/output command --- .../hardware/protocol/dccplusplus/kernel.cpp | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/server/src/hardware/protocol/dccplusplus/kernel.cpp b/server/src/hardware/protocol/dccplusplus/kernel.cpp index 59261f4b..2549e5fd 100644 --- a/server/src/hardware/protocol/dccplusplus/kernel.cpp +++ b/server/src/hardware/protocol/dccplusplus/kernel.cpp @@ -25,6 +25,7 @@ #include "../../decoder/decoder.hpp" #include "../../decoder/decoderchangeflags.hpp" #include "../../input/inputcontroller.hpp" +#include "../../output/outputcontroller.hpp" #include "../../../utils/setthreadname.hpp" #include "../../../utils/rtrim.hpp" #include "../../../core/eventloop.hpp" @@ -123,6 +124,30 @@ void Kernel::receive(std::string_view message) { switch(message[1]) { + case 'H': // Turnout response + { + uint16_t id; + if(auto r = fromChars(message.substr(3), id); r.ec == std::errc()) + { + const char state = *(r.ptr + 1); + TriState value = TriState::Undefined; + + if(state == '0' || state == 'C') + value = TriState::False; + else if(state == '1' || state == 'T') + value = TriState::True; + + if(value != TriState::Undefined) + { + EventLoop::call( + [this, id, value]() + { + m_outputController->updateOutputValue(OutputChannel::turnout, id, value); + }); + } + } + break; + } case 'p': // Power on/off response if(message[2] == '0') { @@ -169,6 +194,31 @@ void Kernel::receive(std::string_view message) } } break; + + case 'Y': // Output response + { + uint16_t id; + if(auto r = fromChars(message.substr(3), id); r.ec == std::errc()) + { + const char state = *(r.ptr + 1); + TriState value = TriState::Undefined; + + if(state == '0') + value = TriState::False; + else if(state == '1') + value = TriState::True; + + if(value != TriState::Undefined) + { + EventLoop::call( + [this, id, value]() + { + m_outputController->updateOutputValue(OutputChannel::output, id, value); + }); + } + } + break; + } } } }