2727#include < effectengine/EffectEngine.h>
2828
2929
30- Hyperion:: ColorOrder Hyperion::createColorOrder (const Json::Value &deviceConfig)
30+ ColorOrder Hyperion::createColorOrder (const Json::Value &deviceConfig)
3131{
3232 // deprecated: force BGR when the deprecated flag is present and set to true
3333 if (deviceConfig.get (" bgr-output" , false ).asBool ())
@@ -187,14 +187,16 @@ RgbChannelTransform* Hyperion::createRgbChannelTransform(const Json::Value& colo
187187 return transform;
188188}
189189
190- LedString Hyperion::createLedString (const Json::Value& ledsConfig)
190+ LedString Hyperion::createLedString (const Json::Value& ledsConfig, const ColorOrder deviceOrder )
191191{
192192 LedString ledString;
193193
194+ const std::string deviceOrderStr = colorOrderToString (deviceOrder);
194195 for (const Json::Value& ledConfig : ledsConfig)
195196 {
196197 Led led;
197198 led.index = ledConfig[" index" ].asInt ();
199+
198200 const Json::Value& hscanConfig = ledConfig[" hscan" ];
199201 const Json::Value& vscanConfig = ledConfig[" vscan" ];
200202 led.minX_frac = std::max (0.0 , std::min (1.0 , hscanConfig[" minimum" ].asDouble ()));
@@ -212,6 +214,10 @@ LedString Hyperion::createLedString(const Json::Value& ledsConfig)
212214 std::swap (led.minY_frac , led.maxY_frac );
213215 }
214216
217+ // Get the order of the rgb channels for this led (default is device order)
218+ const std::string ledOrderStr = ledConfig.get (" colorOrder" , deviceOrderStr).asString ();
219+ led.colorOrder = stringToColorOrder (ledOrderStr);
220+
215221 ledString.leds ().push_back (led);
216222 }
217223
@@ -262,10 +268,9 @@ LedDevice * Hyperion::createColorSmoothing(const Json::Value & smoothingConfig,
262268
263269
264270Hyperion::Hyperion (const Json::Value &jsonConfig) :
265- _ledString(createLedString(jsonConfig[" leds" ])),
271+ _ledString(createLedString(jsonConfig[" leds" ], createColorOrder(jsonConfig[ " device " ]) )),
266272 _muxer(_ledString.leds().size()),
267273 _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"])),
268- _colorOrder(createColorOrder(jsonConfig[" device" ])),
269274 _device(LedDeviceFactory::construct(jsonConfig[" device" ])),
270275 _effectEngine(nullptr ),
271276 _timer()
@@ -429,10 +434,13 @@ void Hyperion::update()
429434
430435 // Apply the transform to each led and color-channel
431436 std::vector<ColorRgb> ledColors = _raw2ledTransform->applyTransform (priorityInfo.ledColors );
437+ const std::vector<Led>& leds = _ledString.leds ();
438+ int i = 0 ;
432439 for (ColorRgb& color : ledColors)
433440 {
441+ const ColorOrder ledColorOrder = leds.at (i).colorOrder ;
434442 // correct the color byte order
435- switch (_colorOrder )
443+ switch (ledColorOrder )
436444 {
437445 case ORDER_RGB:
438446 // leave as it is
@@ -463,6 +471,7 @@ void Hyperion::update()
463471 break ;
464472 }
465473 }
474+ i++;
466475 }
467476
468477 // Write the data to the device
0 commit comments