Updated the way colororder is configured per led

Former-commit-id: 2a77b551c5b504f4ce9b0a179d4c20eaf6128f6b
This commit is contained in:
T. van der Zwan 2015-02-23 16:11:33 +01:00
parent e8ae9c36e6
commit 9f5caacc75
4 changed files with 70 additions and 19 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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)
{

View File

@ -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};