From 4a075284b247fe2bb80f2a12699e0f746fdbd1be Mon Sep 17 00:00:00 2001 From: Awawa <69086569+awawa-dev@users.noreply.github.com> Date: Sat, 28 Dec 2024 21:43:03 +0100 Subject: [PATCH] Zigbee2mqtt: improved synchronization --- include/led-drivers/net/DriverNetZigbee2mqtt.h | 7 +++++++ sources/led-drivers/net/DriverNetZigbee2mqtt.cpp | 14 +++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/led-drivers/net/DriverNetZigbee2mqtt.h b/include/led-drivers/net/DriverNetZigbee2mqtt.h index 9993fff00..59aa82a04 100644 --- a/include/led-drivers/net/DriverNetZigbee2mqtt.h +++ b/include/led-drivers/net/DriverNetZigbee2mqtt.h @@ -6,8 +6,12 @@ #include #include #include + #include + #include #endif +#include + #include #include @@ -59,5 +63,8 @@ public slots: int _timeLogger; QString _discoveryMessage; + std::mutex _mtx; + std::condition_variable _cv; + static bool isRegistered; }; diff --git a/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp b/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp index add0cd16d..7f25a07a5 100644 --- a/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp +++ b/sources/led-drivers/net/DriverNetZigbee2mqtt.cpp @@ -6,6 +6,7 @@ namespace { constexpr auto ZIGBEE_DISCOVERY_MESSAGE = "zigbee2mqtt/bridge/devices"; constexpr int DEFAULT_TIME_MEASURE_MESSAGE = 25; + constexpr int DEFAULT_COMMUNICATION_TIMEOUT_MS = 200; } DriverNetZigbee2mqtt::DriverNetZigbee2mqtt(const QJsonObject& deviceConfig) @@ -149,12 +150,15 @@ int DriverNetZigbee2mqtt::write(const std::vector& ledValues) auto start = InternalClock::nowPrecise(); - for (int timeout = 0; timeout < 25 && _colorsFinished > 0; timeout++) + std::unique_lock lck(_mtx); + _cv.wait_for(lck, std::chrono::milliseconds(DEFAULT_COMMUNICATION_TIMEOUT_MS)); + + for (int timeout = 0; timeout < 20 && _colorsFinished > 0 && (InternalClock::nowPrecise() < start + DEFAULT_COMMUNICATION_TIMEOUT_MS); timeout++) { - QThread::msleep(8); + QThread::msleep(10); } - if (_colorsFinished > 0) + if (_colorsFinished.exchange(0) > 0) { Warning(_log, "The communication timed out after %ims (%i)", (int)(InternalClock::nowPrecise() - start), (++_timeLogger)); } @@ -176,6 +180,10 @@ void DriverNetZigbee2mqtt::handlerSignalMqttReceived(QString topic, QString payl else if (_colorsFinished > 0) { _colorsFinished--; + if (_colorsFinished == 0) + { + _cv.notify_all(); + } } }