add single step rainbow generator

This commit is contained in:
Peter Poetzi
2023-03-05 00:20:34 +01:00
committed by 0xFEEDC0DE64
parent 588f5e1d39
commit b22734b2be
3 changed files with 84 additions and 0 deletions

View File

@ -212,6 +212,30 @@ ColumnLayout {
onPressed: patternMaker.setPattern(nSpinBox.value, kSpinBox.value, registerTypeComboBox.currentValue, valueSlider.value) onPressed: patternMaker.setPattern(nSpinBox.value, kSpinBox.value, registerTypeComboBox.currentValue, valueSlider.value)
} }
} }
RowLayout {
DoubleSpinBox {
id: phaseAdvanceSlider
Layout.preferredWidth: 120
realFrom: 1
realTo: 360
realValue: 60
}
SpinBox {
id: generateSteps
Layout.preferredWidth: 120
from: 1
to: 1000
value: 360
}
Button {
text: qsTr('Rainbow')
onPressed: patternMaker.setRainbow(0, phaseAdvanceSlider.realValue / 360.)
}
}
} }
} }
} }

View File

@ -1,4 +1,6 @@
#include "patternmaker.h" #include "patternmaker.h"
#include <QColor>
#include <cmath>
void PatternMaker::setController(DmxController *controller) void PatternMaker::setController(DmxController *controller)
{ {
@ -138,3 +140,60 @@ void PatternMaker::setPattern(int n, int k, DeviceTypeRegisterType registerType,
m_controller->setSliderStates(std::move(sliderStates)); m_controller->setSliderStates(std::move(sliderStates));
} }
void PatternMaker::setRainbow(float phase, float advancePerLamp)
{
if (!m_controller)
{
qDebug() << "hilfe" << __LINE__;
return;
}
const auto &devices = m_controller->lightProject().devices;
sliders_state_t sliderStates;
sliderStates.reserve(devices.size());
int i{};
for (const auto &device : devices)
{
const auto current_i = i++;
const auto color = QColor::fromHsvF(fmod(phase,1.),1.,1.);
std::vector<quint8> 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){
switch (register_.type) {
case DeviceTypeRegisterType::Red:
sliderState.push_back(color.red());
break;
case DeviceTypeRegisterType::Green:
sliderState.push_back(color.green());
break;
case DeviceTypeRegisterType::Blue:
sliderState.push_back(color.blue());
break;
default:
sliderState.push_back(0);
}
}
}
}
sliderStates.push_back(std::move(sliderState));
phase += advancePerLamp;
}
m_controller->setSliderStates(std::move(sliderStates));
}

View File

@ -21,6 +21,7 @@ public:
Q_INVOKABLE void setAllFadersLow(); Q_INVOKABLE void setAllFadersLow();
Q_INVOKABLE void setAllFadersMax(); Q_INVOKABLE void setAllFadersMax();
Q_INVOKABLE void setPattern(int n, int k, DeviceTypeRegisterType registerType, quint8 value); Q_INVOKABLE void setPattern(int n, int k, DeviceTypeRegisterType registerType, quint8 value);
Q_INVOKABLE void setRainbow(float phase, float advancePerLamp);
signals: signals:
void controllerChanged(DmxController *controller); void controllerChanged(DmxController *controller);