@@ -54,31 +54,7 @@ Hyperion* Hyperion::getInstance()
54
54
55
55
ColorOrder Hyperion::createColorOrder (const Json::Value &deviceConfig)
56
56
{
57
- std::string order = deviceConfig.get (" colorOrder" , " rgb" ).asString ();
58
- if (order == " bgr" )
59
- {
60
- return ORDER_BGR;
61
- }
62
- if (order == " rbg" )
63
- {
64
- return ORDER_RBG;
65
- }
66
- if (order == " brg" )
67
- {
68
- return ORDER_BRG;
69
- }
70
- if (order == " gbr" )
71
- {
72
- return ORDER_GBR;
73
- }
74
- if (order == " grb" )
75
- {
76
- return ORDER_GRB;
77
- }
78
-
79
- WarningIf ( order != " rgb" , Logger::getInstance (" Core" ), " Unknown color order defined (%s). Using RGB." , order.c_str ());
80
-
81
- return ORDER_RGB;
57
+ return stringToColorOrder ( deviceConfig.get (" colorOrder" , " rgb" ).asString () );
82
58
}
83
59
84
60
ColorTransform * Hyperion::createColorTransform (const Json::Value & transformConfig)
@@ -443,40 +419,81 @@ RgbChannelAdjustment* Hyperion::createRgbChannelAdjustment(const Json::Value& co
443
419
LedString Hyperion::createLedString (const Json::Value& ledsConfig, const ColorOrder deviceOrder)
444
420
{
445
421
LedString ledString;
446
-
447
422
const std::string deviceOrderStr = colorOrderToString (deviceOrder);
423
+ int maxLedId = ledsConfig.size ();
448
424
for (const Json::Value& ledConfig : ledsConfig)
449
425
{
450
426
Led led;
451
427
led.index = ledConfig[" index" ].asInt ();
428
+ led.clone = ledConfig.get (" clone" ,-1 ).asInt ();
429
+ if ( led.clone < -1 || led.clone >= maxLedId )
430
+ {
431
+ Warning (Logger::getInstance (" Core" ), " LED %d: clone index of %d is out of range, clone ignored" , led.index , led.clone );
432
+ led.clone = -1 ;
433
+ }
452
434
453
- const Json::Value& hscanConfig = ledConfig[" hscan" ];
454
- const Json::Value& vscanConfig = ledConfig[" vscan" ];
455
- led.minX_frac = std::max (0.0 , std::min (1.0 , hscanConfig[" minimum" ].asDouble ()));
456
- led.maxX_frac = std::max (0.0 , std::min (1.0 , hscanConfig[" maximum" ].asDouble ()));
457
- led.minY_frac = std::max (0.0 , std::min (1.0 , vscanConfig[" minimum" ].asDouble ()));
458
- led.maxY_frac = std::max (0.0 , std::min (1.0 , vscanConfig[" maximum" ].asDouble ()));
459
-
460
- // Fix if the user swapped min and max
461
- if (led.minX_frac > led.maxX_frac )
435
+ if ( led.clone < 0 )
462
436
{
463
- std::swap (led.minX_frac , led.maxX_frac );
437
+ const Json::Value& hscanConfig = ledConfig[" hscan" ];
438
+ const Json::Value& vscanConfig = ledConfig[" vscan" ];
439
+ led.minX_frac = std::max (0.0 , std::min (1.0 , hscanConfig[" minimum" ].asDouble ()));
440
+ led.maxX_frac = std::max (0.0 , std::min (1.0 , hscanConfig[" maximum" ].asDouble ()));
441
+ led.minY_frac = std::max (0.0 , std::min (1.0 , vscanConfig[" minimum" ].asDouble ()));
442
+ led.maxY_frac = std::max (0.0 , std::min (1.0 , vscanConfig[" maximum" ].asDouble ()));
443
+ // Fix if the user swapped min and max
444
+ if (led.minX_frac > led.maxX_frac )
445
+ {
446
+ std::swap (led.minX_frac , led.maxX_frac );
447
+ }
448
+ if (led.minY_frac > led.maxY_frac )
449
+ {
450
+ std::swap (led.minY_frac , led.maxY_frac );
451
+ }
452
+
453
+ // Get the order of the rgb channels for this led (default is device order)
454
+ led.colorOrder = stringToColorOrder (ledConfig.get (" colorOrder" , deviceOrderStr).asString ());
455
+ ledString.leds ().push_back (led);
464
456
}
465
- if (led.minY_frac > led.maxY_frac )
457
+ }
458
+
459
+ // Make sure the leds are sorted (on their indices)
460
+ std::sort (ledString.leds ().begin (), ledString.leds ().end (), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index ; });
461
+ return ledString;
462
+ }
463
+
464
+ LedString Hyperion::createLedStringClone (const Json::Value& ledsConfig, const ColorOrder deviceOrder)
465
+ {
466
+ LedString ledString;
467
+ const std::string deviceOrderStr = colorOrderToString (deviceOrder);
468
+ int maxLedId = ledsConfig.size ();
469
+ for (const Json::Value& ledConfig : ledsConfig)
470
+ {
471
+ Led led;
472
+ led.index = ledConfig[" index" ].asInt ();
473
+ led.clone = ledConfig.get (" clone" ,-1 ).asInt ();
474
+ if ( led.clone < -1 || led.clone >= maxLedId )
466
475
{
467
- std::swap (led.minY_frac , led.maxY_frac );
476
+ Warning (Logger::getInstance (" Core" ), " LED %d: clone index of %d is out of range, clone ignored" , led.index , led.clone );
477
+ led.clone = -1 ;
468
478
}
469
479
470
- // Get the order of the rgb channels for this led (default is device order)
471
- const std::string ledOrderStr = ledConfig.get (" colorOrder" , deviceOrderStr).asString ();
472
- led.colorOrder = stringToColorOrder (ledOrderStr);
480
+ if ( led.clone >= 0 )
481
+ {
482
+ Debug (Logger::getInstance (" Core" ), " LED %d: clone from led %d" , led.index , led.clone );
483
+ led.minX_frac = 0 ;
484
+ led.maxX_frac = 0 ;
485
+ led.minY_frac = 0 ;
486
+ led.maxY_frac = 0 ;
487
+ // Get the order of the rgb channels for this led (default is device order)
488
+ led.colorOrder = stringToColorOrder (ledConfig.get (" colorOrder" , deviceOrderStr).asString ());
489
+
490
+ ledString.leds ().push_back (led);
491
+ }
473
492
474
- ledString.leds ().push_back (led);
475
493
}
476
494
477
495
// Make sure the leds are sorted (on their indices)
478
496
std::sort (ledString.leds ().begin (), ledString.leds ().end (), [](const Led& lhs, const Led& rhs){ return lhs.index < rhs.index ; });
479
-
480
497
return ledString;
481
498
}
482
499
@@ -543,6 +560,7 @@ MessageForwarder * Hyperion::getForwarder()
543
560
544
561
Hyperion::Hyperion (const Json::Value &jsonConfig, const std::string configFile)
545
562
: _ledString(createLedString(jsonConfig[" leds" ], createColorOrder(jsonConfig[" device" ])))
563
+ , _ledStringClone(createLedStringClone(jsonConfig[" leds" ], createColorOrder(jsonConfig[" device" ])))
546
564
, _muxer(_ledString.leds().size())
547
565
, _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"]))
548
566
, _raw2ledTemperature(createLedColorsTemperature(_ledString.leds().size(), jsonConfig["color"]))
@@ -595,7 +613,7 @@ Hyperion::Hyperion(const Json::Value &jsonConfig, const std::string configFile)
595
613
QObject::connect (&_timer, SIGNAL (timeout ()), this , SLOT (update ()));
596
614
597
615
// create the effect engine
598
- _effectEngine = new EffectEngine (this , jsonConfig[" effects" ]);
616
+ _effectEngine = new EffectEngine (this ,jsonConfig[" effects" ]);
599
617
600
618
unsigned int hwLedCount = jsonConfig[" device" ].get (" ledCount" ,getLedCount ()).asUInt ();
601
619
_hwLedCount = std::max (hwLedCount, getLedCount ());
@@ -867,14 +885,32 @@ void Hyperion::update()
867
885
if (_adjustmentEnabled) _raw2ledAdjustment->applyAdjustment (_ledBuffer);
868
886
if (_temperatureEnabled) _raw2ledTemperature->applyCorrection (_ledBuffer);
869
887
870
- const std::vector<Led>& leds = _ledString.leds ();
871
-
888
+ // init colororder vector, if nempty
889
+ if (_ledStringColorOrder.empty ())
890
+ {
891
+ for (Led& led : _ledString.leds ())
892
+ {
893
+ _ledStringColorOrder.push_back (led.colorOrder );
894
+ }
895
+ for (Led& led : _ledStringClone.leds ())
896
+ {
897
+ _ledStringColorOrder.insert (_ledStringColorOrder.begin () + led.index , led.colorOrder );
898
+ }
899
+ }
900
+
901
+ // insert cloned leds into buffer
902
+ for (Led& led : _ledStringClone.leds ())
903
+ {
904
+ _ledBuffer.insert (_ledBuffer.begin () + led.index , _ledBuffer.at (led.clone ));
905
+ }
906
+
872
907
int i = 0 ;
873
908
for (ColorRgb& color : _ledBuffer)
874
909
{
875
- const ColorOrder ledColorOrder = leds.at (i).colorOrder ;
910
+ // const ColorOrder ledColorOrder = leds.at(i).colorOrder;
911
+
876
912
// correct the color byte order
877
- switch (ledColorOrder )
913
+ switch (_ledStringColorOrder. at (i) )
878
914
{
879
915
case ORDER_RGB:
880
916
// leave as it is
0 commit comments