From ed84e8bde452d17793e6716b408288388dd381c0 Mon Sep 17 00:00:00 2001 From: Jussi Kuokkanen Date: Sun, 17 Nov 2019 15:11:41 +0200 Subject: [PATCH] qt: add ReadableMasterObsevable --- .../qt/data/ReadableMasterObservable.cpp | 32 +++++++++++++++++++ .../qt/data/ReadableMasterObservable.h | 26 +++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/modules/interface/qt/data/ReadableMasterObservable.cpp create mode 100644 src/modules/interface/qt/data/ReadableMasterObservable.h diff --git a/src/modules/interface/qt/data/ReadableMasterObservable.cpp b/src/modules/interface/qt/data/ReadableMasterObservable.cpp new file mode 100644 index 0000000..cd719ec --- /dev/null +++ b/src/modules/interface/qt/data/ReadableMasterObservable.cpp @@ -0,0 +1,32 @@ +#include "ReadableMasterObservable.h" + +ReadableMasterObservable::ReadableMasterObservable(ReadableData *data, QObject *parent) : QObject(parent) { + m_lowestInterval = std::chrono::milliseconds(-1); + + m_readableData = data; + + m_emitTimer = new QTimer; +} + +void ReadableMasterObservable::notifyChangedInterval(std::chrono::milliseconds interval) { + // Interval hasn't been set yet or new one is in the range 0 < new < old + if ((m_lowestInterval < std::chrono::milliseconds(0) || interval < m_lowestInterval) && interval > std::chrono::milliseconds(0)) { + m_lowestInterval = interval; + } + + m_emitTimer->start(m_lowestInterval); + + connect(m_emitTimer, &QTimer::timeout, [=]() { + emit valueUpdated(m_readableData->value()); + }); +} + +/*ReadableObservable *ReadableMasterObservable::observable(ReadableData *data, std::chrono::milliseconds updateInterval) { + QTimer *timer = new QTimer; + + ReadableObservable *masterObservable = new ReadableObservable(data, this); // Create master observable for this node + + connect(timer, &QTimer::timeout, [=]() { + + }); +}*/ diff --git a/src/modules/interface/qt/data/ReadableMasterObservable.h b/src/modules/interface/qt/data/ReadableMasterObservable.h new file mode 100644 index 0000000..900ba78 --- /dev/null +++ b/src/modules/interface/qt/data/ReadableMasterObservable.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include + +#include "ReadableManager.h" +#include "ReadableData.h" +#include "ReadableObservable.h" + +// Class that updates readable values from nodes and emits signals for observers. This prevents CPU overhead when the same value is being observed in multiple places. + +class ReadableMasterObservable : public QObject { +public: + ReadableMasterObservable(ReadableData *data, QObject *parent = nullptr); + void notifyChangedInterval(std::chrono::milliseconds interval); // Called when an observable changes its emission interval + //ReadableObservable *observable(ReadableData *data, std::chrono::milliseconds updateInterval); +signals: + void valueUpdated(tc_readable_result_t value); +private: + Q_OBJECT + + ReadableData *m_readableData; // Node to update value from + std::chrono::milliseconds m_lowestInterval; // The lowest interval that an observer wants to update its value + QTimer *m_emitTimer; // Updates the value +};