From 62ca7647c389722b67bc4501e0ff20d7b66af1b0 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Mon, 20 Feb 2023 02:53:48 +0100 Subject: [PATCH] Implement device register groups rendering --- HomePage.qml | 2 +- deviceregistervaluehelper.cpp | 17 +++--- dmxcontroller.cpp | 105 ++++++++++++++++++++++------------ dmxcontroller.h | 3 +- lightproject.h | 2 +- registergroupmodel.cpp | 4 +- 6 files changed, 85 insertions(+), 48 deletions(-) diff --git a/HomePage.qml b/HomePage.qml index 73e9e88..86b0573 100644 --- a/HomePage.qml +++ b/HomePage.qml @@ -41,7 +41,7 @@ Item { text: model.name } DmxSlider { - onValueChanged: __controller.setRegisterGroup(model.id, value); + onValueChanged: __controller.setRegisterGroupSlider(model.id, value); } } } diff --git a/deviceregistervaluehelper.cpp b/deviceregistervaluehelper.cpp index 3516ec1..105c5c9 100644 --- a/deviceregistervaluehelper.cpp +++ b/deviceregistervaluehelper.cpp @@ -118,16 +118,17 @@ void DeviceRegisterValueHelper::setValue(quint8 value) auto &sliderStates = m_controller->sliderStates(); - if (sliderStates.size() <= index) - sliderStates.resize(index + 1); - - auto &sliderState = sliderStates.at(index); - - if (sliderState.size() <= m_registerIndex) - sliderState.resize(m_registerIndex + 1); - { QMutexLocker locker{&m_controller->mutex()}; + + if (sliderStates.size() <= index) + sliderStates.resize(index + 1); + + auto &sliderState = sliderStates.at(index); + + if (sliderState.size() <= m_registerIndex) + sliderState.resize(m_registerIndex + 1); + sliderState[m_registerIndex] = value; } emit valueChanged(value); diff --git a/dmxcontroller.cpp b/dmxcontroller.cpp index e431d15..a3e3389 100644 --- a/dmxcontroller.cpp +++ b/dmxcontroller.cpp @@ -166,9 +166,25 @@ bool DmxController::start() return true; } -void DmxController::setRegisterGroup(int registerGroupId, quint8 value) +void DmxController::setRegisterGroupSlider(int registerGroupId, quint8 value) { - qDebug() << registerGroupId << value; + const auto registerGroupPtr = m_lightProject.registerGroups.findById(registerGroupId); + if (!registerGroupPtr) + { + qWarning() << "hilfe" << __LINE__; + return; + } + + const auto index = registerGroupPtr - &*std::cbegin(m_lightProject.registerGroups); + + { + QMutexLocker locker{&m_mutex}; + + if (index >= m_registerGroupStates.size()) + m_registerGroupStates.resize(index + 1); + + m_registerGroupStates[index] = value; + } } void DmxController::setSliderStates(sliders_state_t &&sliderStates) @@ -198,44 +214,63 @@ void DmxController::sendDmxBuffer() { QMutexLocker locker{&m_mutex}; -// if (m_sliderStates.size() < m_lightProject.devices.size()) -// m_sliderStates.resize(m_lightProject.devices.size()); + const auto apply = [&](const sliders_state_t &sliders, quint8 factor){ + auto iter = std::cbegin(sliders); - auto iter = std::cbegin(m_sliderStates); - - for (const auto &light : m_lightProject.devices) - { - auto deviceTypePtr = m_lightProject.deviceTypes.findById(light.deviceTypeId); - if (!deviceTypePtr) + for (const auto &light : m_lightProject.devices) { - if (iter != std::cend(m_sliderStates)) + auto deviceTypePtr = m_lightProject.deviceTypes.findById(light.deviceTypeId); + if (!deviceTypePtr) + { + if (iter != std::cend(sliders)) + iter++; + continue; + } + const auto &deviceType = *deviceTypePtr; + + { + std::vector::const_iterator iter2; + if (iter != std::cend(sliders)) + iter2 = std::cbegin(*iter); + + int i{}; + for (const auto ®ister_ : deviceType.registers) + { + const auto address = light.address + (i++); + + if (iter != std::cend(sliders) && iter2 != std::cend(*iter)) + { + const auto result = int(*iter2) * factor / 255; + if (result > buf[address]) + buf[address] = result; + } +// else +// buf[address] = 0; + + if (iter != std::cend(sliders) && iter2 != std::cend(*iter)) + iter2++; + } + } + + if (iter != std::cend(sliders)) iter++; + } + }; + + apply(m_sliderStates, 255); + + auto iter = std::cbegin(m_registerGroupStates); + for (const auto ®isterGroup : m_lightProject.registerGroups) + { + if (iter == std::cend(m_registerGroupStates)) + break; + if (!*iter) + { + iter++; continue; } - const auto &deviceType = *deviceTypePtr; - - std::vector::const_iterator iter2; - if (iter != std::cend(m_sliderStates)) - iter2 = std::cbegin(*iter); - - int i{}; - for (const auto ®ister_ : deviceType.registers) - { - const auto address = light.address + (i++); - - if (iter != std::cend(m_sliderStates) && iter2 != std::cend(*iter)) - { - buf[address] = *iter2; - } - else - buf[address] = 0; - - if (iter != std::cend(m_sliderStates) && iter2 != std::cend(*iter)) - iter2++; - } - - if (iter != std::cend(m_sliderStates)) - iter++; + apply(registerGroup.sliders, *iter); + iter++; } } diff --git a/dmxcontroller.h b/dmxcontroller.h index 596c85e..d810940 100644 --- a/dmxcontroller.h +++ b/dmxcontroller.h @@ -18,7 +18,7 @@ public: bool start(); - Q_INVOKABLE void setRegisterGroup(int registerGroupId, quint8 value); + Q_INVOKABLE void setRegisterGroupSlider(int registerGroupId, quint8 value); LightProject &lightProject() { return m_lightProject; } const LightProject &lightProject() const { return m_lightProject; } @@ -70,6 +70,7 @@ private: LightProject m_lightProject; QMutex m_mutex; sliders_state_t m_sliderStates; + std::vector m_registerGroupStates; QDateTime m_lastInfo; int m_counter; diff --git a/lightproject.h b/lightproject.h index 5768346..b0c195a 100644 --- a/lightproject.h +++ b/lightproject.h @@ -111,7 +111,7 @@ public: } }; -using sliders_state_t = std::vector>; +using sliders_state_t = std::vector>; struct RegisterGroupConfig { diff --git a/registergroupmodel.cpp b/registergroupmodel.cpp index df5ffb3..59f9a17 100644 --- a/registergroupmodel.cpp +++ b/registergroupmodel.cpp @@ -107,7 +107,7 @@ void RegisterGroupModel::setAllFadersLow() for (const auto &device : devices) { - std::vector sliderState; + std::vector sliderState; if (device.deviceTypeId != -1) { @@ -145,7 +145,7 @@ void RegisterGroupModel::setAllFadersMax() for (const auto &device : devices) { - std::vector sliderState; + std::vector sliderState; if (device.deviceTypeId != -1) {