feat: Implement LED offset in HyperionProcessor

This commit is contained in:
Tobias J. Endres 2025-08-16 06:30:39 +02:00
parent 845dc5c0a6
commit da1890f237
3 changed files with 18 additions and 2 deletions

View File

@ -9,7 +9,8 @@ HyperionProcessor::HyperionProcessor(const LedLayout &layout, const QJsonObject
_borderDetector(config.value("blackborderdetector").toObject()), _borderDetector(config.value("blackborderdetector").toObject()),
_lastImageSize(0, 0), _lastImageSize(0, 0),
_colorSmoother(config.value("smoothing").toObject()), _colorSmoother(config.value("smoothing").toObject()),
_colorAlgorithm(config.value("colorAlgorithm").toString("mean_sqrt")) // Default to mean_sqrt _colorAlgorithm(config.value("colorAlgorithm").toString("mean_sqrt")),
_offset(config.value("offset").toInt(0)) // Default offset is 0
{ {
} }
@ -40,7 +41,20 @@ QVector<QColor> HyperionProcessor::process(const QImage &image)
QVector<QColor> calculatedColors = calculateLedColors(image); QVector<QColor> calculatedColors = calculateLedColors(image);
// 4. Apply smoothing // 4. Apply smoothing
return _colorSmoother.smooth(calculatedColors); QVector<QColor> finalColors = _colorSmoother.smooth(calculatedColors);
// 5. Apply offset if needed
if (_offset != 0 && !finalColors.isEmpty()) {
QVector<QColor> shiftedColors(finalColors.size());
int totalLeds = finalColors.size();
for (int i = 0; i < totalLeds; ++i) {
shiftedColors[i] = finalColors[(i + _offset) % totalLeds];
}
return shiftedColors;
}
return finalColors;
} }
void HyperionProcessor::buildLedMap(int imageWidth, int imageHeight, const BlackBorder &border) void HyperionProcessor::buildLedMap(int imageWidth, int imageHeight, const BlackBorder &border)

View File

@ -29,6 +29,7 @@ private:
LedLayout _layout; LedLayout _layout;
QJsonObject _config; QJsonObject _config;
QString _colorAlgorithm; QString _colorAlgorithm;
int _offset;
BlackBorderDetector _borderDetector; BlackBorderDetector _borderDetector;
BlackBorder _lastBorder; BlackBorder _lastBorder;

View File

@ -181,6 +181,7 @@ int main(int argc, char *argv[])
processorConfig["blackborderdetector"] = blackBorderDetectorConfig; processorConfig["blackborderdetector"] = blackBorderDetectorConfig;
processorConfig["smoothing"] = smoothingConfig; processorConfig["smoothing"] = smoothingConfig;
processorConfig["colorAlgorithm"] = qgetenv("HYPERION_GRABBER_COLOR_ALGORITHM").isEmpty() ? QString("mean_sqrt") : QString(qgetenv("HYPERION_GRABBER_COLOR_ALGORITHM")); processorConfig["colorAlgorithm"] = qgetenv("HYPERION_GRABBER_COLOR_ALGORITHM").isEmpty() ? QString("mean_sqrt") : QString(qgetenv("HYPERION_GRABBER_COLOR_ALGORITHM"));
processorConfig["offset"] = qgetenv("HYPERION_GRABBER_OFFSET").isEmpty() ? 0 : qgetenv("HYPERION_GRABBER_OFFSET").toInt();
QString wledColorOrder = qgetenv("HYPERION_GRABBER_WLED_COLOR_ORDER").isEmpty() ? QString("GRB") : QString(qgetenv("HYPERION_GRABBER_WLED_COLOR_ORDER")); QString wledColorOrder = qgetenv("HYPERION_GRABBER_WLED_COLOR_ORDER").isEmpty() ? QString("GRB") : QString(qgetenv("HYPERION_GRABBER_WLED_COLOR_ORDER"));