Implement device register groups rendering

This commit is contained in:
2023-02-20 02:53:48 +01:00
parent 90009e1cbd
commit 62ca7647c3
6 changed files with 85 additions and 48 deletions

View File

@@ -41,7 +41,7 @@ Item {
text: model.name text: model.name
} }
DmxSlider { DmxSlider {
onValueChanged: __controller.setRegisterGroup(model.id, value); onValueChanged: __controller.setRegisterGroupSlider(model.id, value);
} }
} }
} }

View File

@@ -118,6 +118,9 @@ void DeviceRegisterValueHelper::setValue(quint8 value)
auto &sliderStates = m_controller->sliderStates(); auto &sliderStates = m_controller->sliderStates();
{
QMutexLocker locker{&m_controller->mutex()};
if (sliderStates.size() <= index) if (sliderStates.size() <= index)
sliderStates.resize(index + 1); sliderStates.resize(index + 1);
@@ -126,8 +129,6 @@ void DeviceRegisterValueHelper::setValue(quint8 value)
if (sliderState.size() <= m_registerIndex) if (sliderState.size() <= m_registerIndex)
sliderState.resize(m_registerIndex + 1); sliderState.resize(m_registerIndex + 1);
{
QMutexLocker locker{&m_controller->mutex()};
sliderState[m_registerIndex] = value; sliderState[m_registerIndex] = value;
} }
emit valueChanged(value); emit valueChanged(value);

View File

@@ -166,9 +166,25 @@ bool DmxController::start()
return true; 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) void DmxController::setSliderStates(sliders_state_t &&sliderStates)
@@ -198,24 +214,23 @@ void DmxController::sendDmxBuffer()
{ {
QMutexLocker locker{&m_mutex}; QMutexLocker locker{&m_mutex};
// if (m_sliderStates.size() < m_lightProject.devices.size()) const auto apply = [&](const sliders_state_t &sliders, quint8 factor){
// m_sliderStates.resize(m_lightProject.devices.size()); auto iter = std::cbegin(sliders);
auto iter = std::cbegin(m_sliderStates);
for (const auto &light : m_lightProject.devices) for (const auto &light : m_lightProject.devices)
{ {
auto deviceTypePtr = m_lightProject.deviceTypes.findById(light.deviceTypeId); auto deviceTypePtr = m_lightProject.deviceTypes.findById(light.deviceTypeId);
if (!deviceTypePtr) if (!deviceTypePtr)
{ {
if (iter != std::cend(m_sliderStates)) if (iter != std::cend(sliders))
iter++; iter++;
continue; continue;
} }
const auto &deviceType = *deviceTypePtr; const auto &deviceType = *deviceTypePtr;
std::vector<int>::const_iterator iter2; {
if (iter != std::cend(m_sliderStates)) std::vector<quint8>::const_iterator iter2;
if (iter != std::cend(sliders))
iter2 = std::cbegin(*iter); iter2 = std::cbegin(*iter);
int i{}; int i{};
@@ -223,18 +238,38 @@ void DmxController::sendDmxBuffer()
{ {
const auto address = light.address + (i++); const auto address = light.address + (i++);
if (iter != std::cend(m_sliderStates) && iter2 != std::cend(*iter)) if (iter != std::cend(sliders) && iter2 != std::cend(*iter))
{ {
buf[address] = *iter2; const auto result = int(*iter2) * factor / 255;
if (result > buf[address])
buf[address] = result;
} }
else // else
buf[address] = 0; // buf[address] = 0;
if (iter != std::cend(m_sliderStates) && iter2 != std::cend(*iter)) if (iter != std::cend(sliders) && iter2 != std::cend(*iter))
iter2++; iter2++;
} }
}
if (iter != std::cend(m_sliderStates)) if (iter != std::cend(sliders))
iter++;
}
};
apply(m_sliderStates, 255);
auto iter = std::cbegin(m_registerGroupStates);
for (const auto &registerGroup : m_lightProject.registerGroups)
{
if (iter == std::cend(m_registerGroupStates))
break;
if (!*iter)
{
iter++;
continue;
}
apply(registerGroup.sliders, *iter);
iter++; iter++;
} }
} }

View File

@@ -18,7 +18,7 @@ public:
bool start(); bool start();
Q_INVOKABLE void setRegisterGroup(int registerGroupId, quint8 value); Q_INVOKABLE void setRegisterGroupSlider(int registerGroupId, quint8 value);
LightProject &lightProject() { return m_lightProject; } LightProject &lightProject() { return m_lightProject; }
const LightProject &lightProject() const { return m_lightProject; } const LightProject &lightProject() const { return m_lightProject; }
@@ -70,6 +70,7 @@ private:
LightProject m_lightProject; LightProject m_lightProject;
QMutex m_mutex; QMutex m_mutex;
sliders_state_t m_sliderStates; sliders_state_t m_sliderStates;
std::vector<quint8> m_registerGroupStates;
QDateTime m_lastInfo; QDateTime m_lastInfo;
int m_counter; int m_counter;

View File

@@ -111,7 +111,7 @@ public:
} }
}; };
using sliders_state_t = std::vector<std::vector<int>>; using sliders_state_t = std::vector<std::vector<quint8>>;
struct RegisterGroupConfig struct RegisterGroupConfig
{ {

View File

@@ -107,7 +107,7 @@ void RegisterGroupModel::setAllFadersLow()
for (const auto &device : devices) for (const auto &device : devices)
{ {
std::vector<int> sliderState; std::vector<quint8> sliderState;
if (device.deviceTypeId != -1) if (device.deviceTypeId != -1)
{ {
@@ -145,7 +145,7 @@ void RegisterGroupModel::setAllFadersMax()
for (const auto &device : devices) for (const auto &device : devices)
{ {
std::vector<int> sliderState; std::vector<quint8> sliderState;
if (device.deviceTypeId != -1) if (device.deviceTypeId != -1)
{ {