From 9f5caacc759c873650fd601cbd142cfa280e5c35 Mon Sep 17 00:00:00 2001 From: "T. van der Zwan" Date: Mon, 23 Feb 2015 16:11:33 +0100 Subject: [PATCH] Updated the way colororder is configured per led Former-commit-id: 2a77b551c5b504f4ce9b0a179d4c20eaf6128f6b --- include/hyperion/Hyperion.h | 12 +++++--- include/hyperion/LedString.h | 53 +++++++++++++++++++++++++++++++++++- libsrc/hyperion/Hyperion.cpp | 22 ++++++--------- test/TestImage2LedsMap.cpp | 2 +- 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index aa353a33..b6ed0946 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -153,7 +153,14 @@ public slots: public: static ColorOrder createColorOrder(const Json::Value & deviceConfig); - static LedString createLedString(const Json::Value & ledsConfig); + /** + * Construct the 'led-string' with the integration area definition per led and the color + * ordering of the RGB channels + * @param ledsConfig The configuration of the led areas + * @param deviceOrder The default RGB channel ordering + * @return The constructed ledstring + */ + static LedString createLedString(const Json::Value & ledsConfig, const ColorOrder deviceOrder); static MultiColorTransform * createLedColorsTransform(const unsigned ledCnt, const Json::Value & colorTransformConfig); static ColorTransform * createColorTransform(const Json::Value & transformConfig); @@ -188,9 +195,6 @@ private: /// The transformation from raw colors to led colors MultiColorTransform * _raw2ledTransform; - /// Value with the desired color byte order - ColorOrder _colorOrder; - /// The actual LedDevice LedDevice * _device; diff --git a/include/hyperion/LedString.h b/include/hyperion/LedString.h index af25290c..2c9a0cb3 100644 --- a/include/hyperion/LedString.h +++ b/include/hyperion/LedString.h @@ -15,9 +15,60 @@ namespace Json { class Value; } /// Enumeration containing the possible orders of device color byte data enum ColorOrder { - ORDER_RGB, ORDER_RBG, ORDER_GRB, ORDER_BRG, ORDER_GBR, ORDER_BGR, ORDER_DEFAULT + ORDER_RGB, ORDER_RBG, ORDER_GRB, ORDER_BRG, ORDER_GBR, ORDER_BGR }; +inline std::string colorOrderToString(const ColorOrder colorOrder) +{ + switch (colorOrder) + { + case ORDER_RGB: + return "rgb"; + case ORDER_RBG: + return "rbg"; + case ORDER_GRB: + return "grb"; + case ORDER_BRG: + return "brg"; + case ORDER_GBR: + return "gbr"; + case ORDER_BGR: + return "bgr"; + default: + return "not-a-colororder"; + } +} +inline ColorOrder stringToColorOrder(const std::string & order) +{ + if (order == "rgb") + { + return ORDER_RGB; + } + else if (order == "bgr") + { + return ORDER_BGR; + } + else if (order == "rbg") + { + return ORDER_RBG; + } + else if (order == "brg") + { + return ORDER_BRG; + } + else if (order == "gbr") + { + return ORDER_GBR; + } + else if (order == "grb") + { + return ORDER_GRB; + } + + std::cout << "Unknown color order defined (" << order << "). Using RGB." << std::endl; + return ORDER_RGB; +} + /// /// The Led structure contains the definition of the image portion used to determine a single led's /// color. diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index e6d2824b..d6657046 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -187,26 +187,22 @@ RgbChannelTransform* Hyperion::createRgbChannelTransform(const Json::Value& colo return transform; } -LedString Hyperion::createLedString(const Json::Value& ledsConfig) +LedString Hyperion::createLedString(const Json::Value& ledsConfig, const ColorOrder deviceOrder) { LedString ledString; + const std::string deviceOrderStr = colorOrderToString(deviceOrder); for (const Json::Value& ledConfig : ledsConfig) { Led led; led.index = ledConfig["index"].asInt(); + const Json::Value& hscanConfig = ledConfig["hscan"]; const Json::Value& vscanConfig = ledConfig["vscan"]; led.minX_frac = std::max(0.0, std::min(1.0, hscanConfig["minimum"].asDouble())); led.maxX_frac = std::max(0.0, std::min(1.0, hscanConfig["maximum"].asDouble())); led.minY_frac = std::max(0.0, std::min(1.0, vscanConfig["minimum"].asDouble())); led.maxY_frac = std::max(0.0, std::min(1.0, vscanConfig["maximum"].asDouble())); - if (ledConfig.get("colorOrder", false).asBool()) { - led.colorOrder = createColorOrder(ledConfig); - } else { - led.colorOrder = ORDER_DEFAULT; - } - // Fix if the user swapped min and max if (led.minX_frac > led.maxX_frac) @@ -218,6 +214,10 @@ LedString Hyperion::createLedString(const Json::Value& ledsConfig) std::swap(led.minY_frac, led.maxY_frac); } + // Get the order of the rgb channels for this led (default is device order) + const std::string ledOrderStr = ledConfig.get("colorOrder", deviceOrderStr).asString(); + led.colorOrder = stringToColorOrder(ledOrderStr); + ledString.leds().push_back(led); } @@ -268,10 +268,9 @@ LedDevice * Hyperion::createColorSmoothing(const Json::Value & smoothingConfig, Hyperion::Hyperion(const Json::Value &jsonConfig) : - _ledString(createLedString(jsonConfig["leds"])), + _ledString(createLedString(jsonConfig["leds"], createColorOrder(jsonConfig["device"]))), _muxer(_ledString.leds().size()), _raw2ledTransform(createLedColorsTransform(_ledString.leds().size(), jsonConfig["color"])), - _colorOrder(createColorOrder(jsonConfig["device"])), _device(LedDeviceFactory::construct(jsonConfig["device"])), _effectEngine(nullptr), _timer() @@ -439,10 +438,7 @@ void Hyperion::update() int i = 0; for (ColorRgb& color : ledColors) { - ColorOrder ledColorOrder = leds.at(i).colorOrder; - if(ledColorOrder == ORDER_DEFAULT) { - ledColorOrder = _colorOrder; - } + const ColorOrder ledColorOrder = leds.at(i).colorOrder; // correct the color byte order switch (ledColorOrder) { diff --git a/test/TestImage2LedsMap.cpp b/test/TestImage2LedsMap.cpp index 5def8632..b3ba4242 100644 --- a/test/TestImage2LedsMap.cpp +++ b/test/TestImage2LedsMap.cpp @@ -23,7 +23,7 @@ int main() return -1; } - const LedString ledString = Hyperion::createLedString(config["leds"]); + const LedString ledString = Hyperion::createLedString(config["leds"], Hyperion::createColorOrder(config["device"])); const ColorRgb testColor = {64, 123, 12};