Implement basic register group saving

This commit is contained in:
2023-02-20 00:36:55 +01:00
parent 657437452b
commit 79cc570347
15 changed files with 547 additions and 114 deletions

View File

@ -19,6 +19,8 @@ qt_add_executable(applightcontrol
devicesmodel.h devicesmodel.cpp
devicetyperegistersmodel.h devicetyperegistersmodel.cpp
registergroupsmodel.h registergroupsmodel.cpp
deviceregistervaluehelper.h deviceregistervaluehelper.cpp
registergroupmodel.h registergroupmodel.cpp
)
qt_add_qml_module(applightcontrol

View File

@ -2,6 +2,8 @@ import QtQuick
import QtQuick.Controls.Material
import QtQuick.Layouts
import lightcontrol
Item {
id: homePage
@ -25,66 +27,23 @@ Item {
}
}
ColumnLayout {
Flow{
anchors.fill: parent
flow: Flow.TopToBottom
GridLayout {
Layout.fillWidth: true
columns: 2
Label {
text: qsTr("Alle Dimmer:")
Repeater {
model: RegisterGroupsModel {
controller: __controller
}
DmxSlider {
onValueChanged: window.masterDimmer = value
delegate: RowLayout {
Label {
text: model.name
}
DmxSlider {
onValueChanged: __controller.setRegisterGroup(model.id, value);
}
}
Label {
text: qsTr("Alle Rot:")
}
DmxSlider {
onValueChanged: window.masterRed = value
}
Label {
text: qsTr("Alle Grün:")
}
DmxSlider {
onValueChanged: window.masterGreen = value
}
Label {
text: qsTr("Alle Blau:")
}
DmxSlider {
onValueChanged: window.masterBlue = value
}
Label {
text: qsTr("Alle Weiß:")
}
DmxSlider {
onValueChanged: window.masterWhite = value
}
Label {
text: qsTr("Alle Strobo:")
}
DmxSlider {
onValueChanged: window.masterStrobo = value
}
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
}
}
}

View File

@ -12,18 +12,11 @@ ApplicationWindow {
Material.theme: Material.Dark
Material.accent: Material.Purple
property int masterDimmer
property int masterRed
property int masterGreen
property int masterBlue
property int masterWhite
property int masterStrobo
ColumnLayout {
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
anchors.bottom: lampRegistersPanel.top
height: window.height - (lampRegistersPanel.active ? lampRegistersPanel.height : 0)
StatusBar {
Layout.fillWidth: true

View File

@ -1,8 +1,6 @@
import QtQuick
import QtQuick.Controls.Material
import QtQuick.Layouts
import QtQuick.Window
import QtQuick.VirtualKeyboard
import lightcontrol
@ -41,39 +39,22 @@ Pane {
horizontalAlignment: Text.AlignHCenter
}
DeviceRegisterValueHelper {
id: helper
controller: __controller
deviceId: light.id
registerIndex: index
value: slider.value
}
DmxSlider {
id: slider
Layout.fillWidth: true
Layout.fillHeight: true
value: helper.value
orientation: Qt.Vertical
onValueChanged: __controller.setChannel(registerAddress, value)
Binding on value {
value: masterDimmer
when: model.registerType === DeviceTypeRegisterType.Dimmer
}
Binding on value {
value: masterRed
when: model.registerType === DeviceTypeRegisterType.Red
}
Binding on value {
value: masterGreen
when: model.registerType === DeviceTypeRegisterType.Green
}
Binding on value {
value: masterBlue
when: model.registerType === DeviceTypeRegisterType.Blue
}
Binding on value {
value: masterWhite
when: model.registerType === DeviceTypeRegisterType.White
}
Binding on value {
value: masterStrobo
when: model.registerType === DeviceTypeRegisterType.Strobo
}
}
Label {

View File

@ -65,8 +65,8 @@ ColumnLayout {
enabled: listView.currentIndex !== -1
GridLayout {
Layout.preferredWidth: 600
Layout.maximumWidth: 600
Layout.preferredWidth: 300
Layout.maximumWidth: 300
columns: 2
@ -84,6 +84,36 @@ ColumnLayout {
onTextEdited: if (listView.currentData) listView.currentData.name = text; else console.warn('discarded');
}
}
GridLayout {
Layout.fillWidth: true
columns: 2
RegisterGroupModel {
id: registerGroupModel
controller: __controller
registerGroupId: listView.currentData ? listView.currentData.id : -1
}
Button {
text: qsTr('Auf Schieberegler\nunten kopieren');
onPressed: registerGroupModel.copyToFaders()
}
Button {
text: qsTr('Von Schieberegler\nunten kopieren');
onPressed: registerGroupModel.copyFromFaders()
}
Button {
text: qsTr('Alle auf\n0 setzen');
onPressed: registerGroupModel.setAllFadersLow()
}
Button {
text: qsTr('Alle auf\nMaximum setzen');
onPressed: registerGroupModel.setAllFadersMax()
}
}
Item {
Layout.fillHeight: true
}

View File

@ -0,0 +1,144 @@
#include "deviceregistervaluehelper.h"
#include <QDebug>
#include <QCoreApplication>
#include <QQmlEngine>
void DeviceRegisterValueHelper::setController(DmxController *controller)
{
if (m_controller == controller)
return;
if (m_controller)
{
disconnect(m_controller, &DmxController::sliderStatesChanged,
this, &DeviceRegisterValueHelper::sliderStatesChanged);
}
m_controller = controller;
if (m_controller)
{
connect(m_controller, &DmxController::sliderStatesChanged,
this, &DeviceRegisterValueHelper::sliderStatesChanged);
}
emit controllerChanged(m_controller);
}
void DeviceRegisterValueHelper::setDeviceId(int deviceId)
{
if (m_deviceId == deviceId)
return;
m_deviceId = deviceId;
emit deviceIdChanged(m_deviceId);
}
void DeviceRegisterValueHelper::setRegisterIndex(int registerIndex)
{
if (m_registerIndex == registerIndex)
return;
m_registerIndex = registerIndex;
emit registerIndexChanged(m_registerIndex);
}
quint8 DeviceRegisterValueHelper::value() const
{
if (!m_controller)
{
// qDebug() << "hilfe" << __LINE__;
return 0;
}
if (m_deviceId == -1)
{
qDebug() << "hilfe" << __LINE__;
return 0;
}
if (m_registerIndex == -1)
{
qDebug() << "hilfe" << __LINE__;
return 0;
}
const auto &devices = m_controller->lightProject().devices;
auto devicePtr = devices.findById(m_deviceId);
if (!devicePtr)
{
qDebug() << "hilfe" << __LINE__;
return 0;
}
const auto index = devicePtr - &*std::cbegin(devices);
const auto &sliderStates = m_controller->sliderStates();
if (sliderStates.size() <= index)
return 0;
const auto &sliderState = sliderStates.at(index);
if (sliderState.size() <= m_registerIndex)
return 0;
return sliderState.at(m_registerIndex);
}
void DeviceRegisterValueHelper::setValue(quint8 value)
{
if (m_deviceId == -1)
{
// qDebug() << "hilfe" << __LINE__;
return;
}
if (m_registerIndex == -1)
{
qDebug() << "hilfe" << __LINE__;
return;
}
if (m_registerIndex == -1)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto &devices = m_controller->lightProject().devices;
auto devicePtr = devices.findById(m_deviceId);
if (!devicePtr)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto index = devicePtr - &*std::cbegin(devices);
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);
sliderState[m_registerIndex] = value;
emit valueChanged(value);
}
void DeviceRegisterValueHelper::sliderStatesChanged()
{
emit valueChanged(value());
}
namespace {
void registrierDenShit()
{
qmlRegisterType<DeviceRegisterValueHelper>("lightcontrol", 1, 0, "DeviceRegisterValueHelper");
}
}
Q_COREAPP_STARTUP_FUNCTION(registrierDenShit)

View File

@ -0,0 +1,44 @@
#pragma once
#include <QObject>
#include "dmxcontroller.h"
class DeviceRegisterValueHelper : public QObject
{
Q_OBJECT
Q_PROPERTY(DmxController* controller READ controller WRITE setController NOTIFY controllerChanged)
Q_PROPERTY(int deviceId READ deviceId WRITE setDeviceId NOTIFY deviceIdChanged)
Q_PROPERTY(int registerIndex READ registerIndex WRITE setRegisterIndex NOTIFY registerIndexChanged)
Q_PROPERTY(quint8 value READ value WRITE setValue NOTIFY valueChanged)
public:
using QObject::QObject;
DmxController *controller() { return m_controller; }
const DmxController *controller() const { return m_controller; }
void setController(DmxController *controller);
int deviceId() const { return m_deviceId; }
void setDeviceId(int deviceId);
int registerIndex() const { return m_registerIndex; }
void setRegisterIndex(int registerIndex);
quint8 value() const;
void setValue(quint8 value);
signals:
void controllerChanged(DmxController *controller);
void deviceIdChanged(int deviceId);
void registerIndexChanged(int registerIndex);
void valueChanged(quint8 registerIndex);
private slots:
void sliderStatesChanged();
private:
DmxController *m_controller{};
int m_deviceId{-1};
int m_registerIndex{-1};
};

View File

@ -307,7 +307,7 @@ bool DevicesModel::insertRows(int row, int count, const QModelIndex &parent)
beginInsertRows({}, row, row+count-1);
auto iter = std::begin(devices) + row;
for (auto i = 0; i < count; i++)
iter = devices.insert(iter, LightConfig{ .id=id++, .name="<neu>", .deviceTypeId=0, .address=0, .position={} }) + 1;
iter = devices.insert(iter, DeviceConfig{ .id=id++, .name="<neu>", .deviceTypeId=0, .address=0, .position={} }) + 1;
endInsertRows();
disconnect(m_controller, &DmxController::deviceInserted,

View File

@ -1,5 +1,7 @@
#include "devicetypesmodel.h"
#include <algorithm>
#include <QDebug>
#include <QCoreApplication>
#include <QQmlEngine>

View File

@ -95,32 +95,32 @@ DmxController::DmxController(QObject *parent) :
{ .id=11, .name="Lampe 12", .deviceTypeId=4, .address=78 },
{ .id=12, .name="Lampe 13", .deviceTypeId=4, .address=85 },
{ .id=13, .name="Test 1", .deviceTypeId=1, .address=95 },
{ .id=14, .name="Test 2", .deviceTypeId=2, .address=120 },
{ .id=15, .name="Moving Head 1", .deviceTypeId=0, .address=150 },
{ .id=16, .name="Moving Head 2", .deviceTypeId=0, .address=160 },
{ .id=17, .name="Moving Head 3", .deviceTypeId=0, .address=170 },
{ .id=18, .name="Moving Head 4", .deviceTypeId=0, .address=180 },
{ .id=19, .name="Nebelmaschine", .deviceTypeId=3, .address=200 }
{ .id=14, .name="Test 2", .deviceTypeId=2, .address=105 },
{ .id=15, .name="Moving Head 1", .deviceTypeId=0, .address=115 },
{ .id=16, .name="Moving Head 2", .deviceTypeId=0, .address=131 },
{ .id=17, .name="Moving Head 3", .deviceTypeId=0, .address=147 },
{ .id=18, .name="Moving Head 4", .deviceTypeId=0, .address=163 },
{ .id=19, .name="Nebelmaschine", .deviceTypeId=3, .address=179 }
},
.registerGroups {
{ .id=0, .name="Alle Dimmmer" },
{ .id=0, .name="Alle Dimmer" },
{ .id=1, .name="Alle Roten" },
{ .id=2, .name="Alle Grünen" },
{ .id=3, .name="Alle Blauen" },
{ .id=4, .name="Alle Weißen" },
{ .id=5, .name="Alle Shutter" },
{ .id=6, .name="2n Dimmmer" },
{ .id=5, .name="Alle Shutter" },
{ .id=6, .name="2n Dimmer" },
{ .id=7, .name="2n Roten" },
{ .id=8, .name="2n Grünen" },
{ .id=9, .name="2n Blauen" },
{ .id=10, .name="2n Weißen" },
{ .id=11, .name="2n Shutter" },
{ .id=12, .name="2n+1 Dimmmer" },
{ .id=11, .name="2n Shutter" },
{ .id=12, .name="2n+1 Dimmer" },
{ .id=13, .name="2n+1 Roten" },
{ .id=14, .name="2n+1 Grünen" },
{ .id=15, .name="2n+1 Blauen" },
{ .id=16, .name="2n+1 Weißen" },
{ .id=17, .name="2n+1 Shutter" },
{ .id=17, .name="2n+1 Shutter" },
}
}
{
@ -166,10 +166,21 @@ bool DmxController::start()
return true;
}
void DmxController::setChannel(int channel, int value)
void DmxController::setRegisterGroup(int registerGroupId, quint8 value)
{
Q_ASSERT(channel >= 0 && channel < std::size(buf));
buf[channel] = value;
qDebug() << registerGroupId << value;
}
void DmxController::setSliderStates(sliders_state_t &&sliderStates)
{
m_sliderStates = std::move(sliderStates);
emit sliderStatesChanged(m_sliderStates);
}
void DmxController::setSliderStates(const sliders_state_t &sliderStates)
{
m_sliderStates = sliderStates;
emit sliderStatesChanged(m_sliderStates);
}
void DmxController::sendDmxBuffer()

View File

@ -18,7 +18,7 @@ public:
bool start();
Q_INVOKABLE void setChannel(int channel, int value);
Q_INVOKABLE void setRegisterGroup(int registerGroupId, quint8 value);
LightProject &lightProject() { return m_lightProject; }
const LightProject &lightProject() const { return m_lightProject; }
@ -27,6 +27,11 @@ public:
int performance() const { return m_lastCounter; }
sliders_state_t &sliderStates() { return m_sliderStates; }
const sliders_state_t &sliderStates() const { return m_sliderStates; }
void setSliderStates(sliders_state_t &&sliderStates);
void setSliderStates(const sliders_state_t &sliderStates);
signals:
void performanceChanged(int performance);
@ -50,6 +55,8 @@ signals:
void registerGroupRemoved(int first, int last);
void registerGroupNameChanged(int row, const QString &name);
void sliderStatesChanged(const sliders_state_t &sliderStates);
protected:
friend class DmxControllerThread;
@ -68,4 +75,6 @@ private:
QDateTime m_lastInfo;
int m_counter;
std::atomic<int> m_lastCounter;
sliders_state_t m_sliderStates;
};

View File

@ -80,7 +80,7 @@ public:
}
};
struct LightConfig
struct DeviceConfig
{
int id;
QString name;
@ -89,15 +89,62 @@ struct LightConfig
QVector3D position;
};
class DevicesContainer : public std::vector<DeviceConfig>
{
using base_t = std::vector<DeviceConfig>;
public:
using base_t::base_t;
DeviceConfig *findById(int id)
{
auto iter = std::find_if(std::begin(*this), std::end(*this),
[&id](const DeviceConfig &device){ return device.id == id; });
return iter != std::end(*this) ? &*iter : nullptr;
}
const DeviceConfig *findById(int id) const
{
auto iter = std::find_if(std::begin(*this), std::end(*this),
[&id](const DeviceConfig &device){ return device.id == id; });
return iter != std::end(*this) ? &*iter : nullptr;
}
};
using sliders_state_t = std::vector<std::vector<int>>;
struct RegisterGroupConfig
{
int id;
QString name;
sliders_state_t sliders;
};
class RegisterGroupsContainer : public std::vector<RegisterGroupConfig>
{
using base_t = std::vector<RegisterGroupConfig>;
public:
using base_t::base_t;
RegisterGroupConfig *findById(int id)
{
auto iter = std::find_if(std::begin(*this), std::end(*this),
[&id](const RegisterGroupConfig &registerGroup){ return registerGroup.id == id; });
return iter != std::end(*this) ? &*iter : nullptr;
}
const RegisterGroupConfig *findById(int id) const
{
auto iter = std::find_if(std::begin(*this), std::end(*this),
[&id](const RegisterGroupConfig &registerGroup){ return registerGroup.id == id; });
return iter != std::end(*this) ? &*iter : nullptr;
}
};
struct LightProject
{
DeviceTypesContainer deviceTypes;
std::vector<LightConfig> devices;
std::vector<RegisterGroupConfig> registerGroups;
DevicesContainer devices;
RegisterGroupsContainer registerGroups;
};

174
registergroupmodel.cpp Normal file
View File

@ -0,0 +1,174 @@
#include "registergroupmodel.h"
#include <QDebug>
#include <QCoreApplication>
#include <QQmlEngine>
void RegisterGroupModel::setController(DmxController *controller)
{
if (m_controller == controller)
return;
if (m_controller)
{
// disconnect(m_controller, &DmxController::registerGroupInserted,
// this, &RegisterGroupsModel::otherRegisterGroupInserted);
}
m_controller = controller;
if (m_controller)
{
// connect(m_controller, &DmxController::registerGroupInserted,
// this, &RegisterGroupsModel::otherRegisterGroupInserted);
}
emit controllerChanged(m_controller);
}
void RegisterGroupModel::setRegisterGroupId(int registerGroupId)
{
if (m_registerGroupId == registerGroupId)
return;
m_registerGroupId = registerGroupId;
emit registerGroupIdChanged(m_registerGroupId);
}
void RegisterGroupModel::copyFromFaders()
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
}
if (m_registerGroupId == -1)
{
qDebug() << "hilfe" << __LINE__;
return;
}
auto registerGroupPtr = m_controller->lightProject().registerGroups.findById(m_registerGroupId);
if (!registerGroupPtr)
{
qDebug() << "hilfe" << __LINE__;
return;
}
auto &registerGroup = *registerGroupPtr;
registerGroup.sliders = m_controller->sliderStates();
}
void RegisterGroupModel::copyToFaders()
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
}
if (m_registerGroupId == -1)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto registerGroupPtr = m_controller->lightProject().registerGroups.findById(m_registerGroupId);
if (!registerGroupPtr)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto &registerGroup = *registerGroupPtr;
m_controller->setSliderStates(registerGroup.sliders);
}
void RegisterGroupModel::setAllFadersLow()
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto &devices = m_controller->lightProject().devices;
sliders_state_t sliderStates;
sliderStates.reserve(devices.size());
for (const auto &device : devices)
{
std::vector<int> sliderState;
if (device.deviceTypeId != -1)
{
const auto deviceTypePtr = m_controller->lightProject().deviceTypes.findById(device.deviceTypeId);
if (!deviceTypePtr)
qWarning() << "hilfe" << __LINE__;
else
{
const auto &deviceType = *deviceTypePtr;
sliderState.reserve(deviceType.registers.size());
for (const auto &register_ : deviceType.registers)
sliderState.push_back(0);
}
}
sliderStates.push_back(std::move(sliderState));
}
m_controller->setSliderStates(std::move(sliderStates));
}
void RegisterGroupModel::setAllFadersMax()
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto &devices = m_controller->lightProject().devices;
sliders_state_t sliderStates;
sliderStates.reserve(devices.size());
for (const auto &device : devices)
{
std::vector<int> sliderState;
if (device.deviceTypeId != -1)
{
const auto deviceTypePtr = m_controller->lightProject().deviceTypes.findById(device.deviceTypeId);
if (!deviceTypePtr)
qWarning() << "hilfe" << __LINE__;
else
{
const auto &deviceType = *deviceTypePtr;
sliderState.reserve(deviceType.registers.size());
for (const auto &register_ : deviceType.registers)
sliderState.push_back(255);
}
}
sliderStates.push_back(std::move(sliderState));
}
m_controller->setSliderStates(std::move(sliderStates));
}
namespace {
void registrierDenShit()
{
qmlRegisterType<RegisterGroupModel>("lightcontrol", 1, 0, "RegisterGroupModel");
}
}
Q_COREAPP_STARTUP_FUNCTION(registrierDenShit)

35
registergroupmodel.h Normal file
View File

@ -0,0 +1,35 @@
#pragma once
#include <QObject>
#include "dmxcontroller.h"
class RegisterGroupModel : public QObject
{
Q_OBJECT
Q_PROPERTY(DmxController* controller READ controller WRITE setController NOTIFY controllerChanged)
Q_PROPERTY(int registerGroupId READ registerGroupId WRITE setRegisterGroupId NOTIFY registerGroupIdChanged)
public:
using QObject::QObject;
DmxController *controller() { return m_controller; }
const DmxController *controller() const { return m_controller; }
void setController(DmxController *controller);
int registerGroupId() const { return m_registerGroupId; }
void setRegisterGroupId(int registerGroupId);
Q_INVOKABLE void copyFromFaders();
Q_INVOKABLE void copyToFaders();
Q_INVOKABLE void setAllFadersLow();
Q_INVOKABLE void setAllFadersMax();
signals:
void controllerChanged(DmxController *controller);
void registerGroupIdChanged(int registerGroupId);
private:
DmxController *m_controller{};
int m_registerGroupId{-1};
};

View File

@ -1,5 +1,7 @@
#include "registergroupsmodel.h"
#include <algorithm>
#include <QDebug>
#include <QCoreApplication>
#include <QQmlEngine>