From 3e4c38b57a247b1d40fa83360e3bab4b9fc70e83 Mon Sep 17 00:00:00 2001 From: johan Date: Sun, 27 Oct 2013 21:06:35 +0100 Subject: [PATCH] Added smoothing to the Hyperion configuration Former-commit-id: 85e27d54841de5030199dd7f70bb0f29250abb6a --- config/hyperion.config.json | 22 +++++--- deploy/HyperCon.jar.REMOVED.git-id | 2 +- deploy/hyperion-remote | Bin 244044 -> 244044 bytes deploy/hyperiond.REMOVED.git-id | 2 +- libsrc/hyperion/Hyperion.cpp | 42 ++++++++++++++-- libsrc/hyperion/LinearColorSmoothing.cpp | 6 +-- libsrc/hyperion/LinearColorSmoothing.h | 2 +- libsrc/hyperion/hyperion.schema.json | 23 +++++++++ .../hyperion/hypercon/spec/ColorConfig.java | 47 ++++++++++++++---- .../hypercon/spec/ColorSmoothingType.java | 20 ++++++++ 10 files changed, 139 insertions(+), 27 deletions(-) create mode 100644 src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorSmoothingType.java diff --git a/config/hyperion.config.json b/config/hyperion.config.json index 09235203..8a8f6065 100644 --- a/config/hyperion.config.json +++ b/config/hyperion.config.json @@ -21,13 +21,17 @@ /// Color manipulation configuration used to tune the output colors to specific surroundings. Contains the following fields: /// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following tuning parameters: - /// - 'saturationGain' The gain adjustement of the saturation - /// - 'valueGain' The gain adjustement of the value + /// - 'saturationGain' The gain adjustement of the saturation + /// - 'valueGain' The gain adjustement of the value /// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the following tuning parameters for each channel: - /// - 'threshold' The minimum required input value for the channel to be on (else zero) - /// - 'gamma' The gamma-curve correction factor - /// - 'blacklevel' The lowest possible value (when the channel is black) - /// - 'whitelevel' The highest possible value (when the channel is white) + /// - 'threshold' The minimum required input value for the channel to be on (else zero) + /// - 'gamma' The gamma-curve correction factor + /// - 'blacklevel' The lowest possible value (when the channel is black) + /// - 'whitelevel' The highest possible value (when the channel is white) + /// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters: + /// - 'type' The type of smoothing algorithm ('linear' or 'none') + /// - 'time_ms' The time constant for smoothing algorithm in milliseconds + /// - 'updateFrequency' The update frequency of the leds in Hz "color" : { "hsv" : @@ -55,6 +59,12 @@ "gamma" : 2.0000, "blacklevel" : 0.0000, "whitelevel" : 1.0000 + }, + "smoothing" : + { + "type" : "none", + "time_ms" : 200, + "updateFrequency" : 20.0000 } }, diff --git a/deploy/HyperCon.jar.REMOVED.git-id b/deploy/HyperCon.jar.REMOVED.git-id index 544ca37a..0e21a5ef 100644 --- a/deploy/HyperCon.jar.REMOVED.git-id +++ b/deploy/HyperCon.jar.REMOVED.git-id @@ -1 +1 @@ -948743846fb38a0f1f9a91ebb721884f3890f965 \ No newline at end of file +35cdefd478667e83a1e20cda67cef4763b59ec25 \ No newline at end of file diff --git a/deploy/hyperion-remote b/deploy/hyperion-remote index 2617294ee88c07820ebca2b0b9ab5581b3924af0..ad1653d62f38c0283f2cf345ef53b37587bbe48d 100755 GIT binary patch delta 39 vcmX@}iSNuOzJ?aYElf*i@S7_b85kNf7#UcZSXh}@wr`oiw0+AA<{1hAEE^5~ delta 39 vcmX@}iSNuOzJ?aYElf*i@Ea-^85kNf7#Ua@nOhlKv~QWgw0+AA<{1hAD?$zQ diff --git a/deploy/hyperiond.REMOVED.git-id b/deploy/hyperiond.REMOVED.git-id index 7af28f7e..b236bfc4 100644 --- a/deploy/hyperiond.REMOVED.git-id +++ b/deploy/hyperiond.REMOVED.git-id @@ -1 +1 @@ -c2bbbf969d7dbe0e096670758e37284b827b3d03 \ No newline at end of file +460c18a960c7f021eb18eddc5b43f322cb40fced \ No newline at end of file diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 24825ebe..532f40e7 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -21,8 +21,12 @@ LedDevice* Hyperion::createDevice(const Json::Value& deviceConfig) { std::cout << "Device configuration: " << deviceConfig << std::endl; + + std::string type = deviceConfig.get("type", "UNSPECIFIED").asString(); + std::transform(type.begin(), type.end(), type.begin(), ::tolower); + LedDevice* device = nullptr; - if (deviceConfig["type"].asString() == "ws2801") + if (type == "ws2801") { const std::string output = deviceConfig["output"].asString(); const unsigned rate = deviceConfig["rate"].asInt(); @@ -32,13 +36,13 @@ LedDevice* Hyperion::createDevice(const Json::Value& deviceConfig) device = deviceWs2801; } - else if (deviceConfig["type"].asString() == "test") + else if (type == "test") { device = new LedDeviceTest(); } else { - std::cout << "Unable to create device" << std::endl; + std::cout << "Unable to create device " << type << std::endl; // Unknown / Unimplemented device } return device; @@ -95,7 +99,35 @@ LedString Hyperion::createLedString(const Json::Value& ledsConfig) LedDevice * Hyperion::createColorSmoothing(const Json::Value & smoothingConfig, LedDevice * ledDevice) { - //return new LinearColorSmoothing(ledDevice, 20.0, .3); + std::string type = smoothingConfig.get("type", "none").asString(); + std::transform(type.begin(), type.end(), type.begin(), ::tolower); + + if (type == "none") + { + std::cout << "Not creating any smoothing" << std::endl; + return ledDevice; + } + else if (type == "linear") + { + if (!smoothingConfig.isMember("time_ms")) + { + std::cout << "Unable to create smoothing of type linear because of missing parameter 'time_ms'" << std::endl; + } + else if (!smoothingConfig.isMember("updateFrequency")) + { + std::cout << "Unable to create smoothing of type linear because of missing parameter 'updateFrequency'" << std::endl; + } + else + { + std::cout << "Creating linear smoothing" << std::endl; + return new LinearColorSmoothing(ledDevice, smoothingConfig["updateFrequency"].asDouble(), smoothingConfig["time_ms"].asInt()); + } + } + else + { + std::cout << "Unable to create smoothing of type " << type << std::endl; + } + return ledDevice; } @@ -114,7 +146,7 @@ Hyperion::Hyperion(const Json::Value &jsonConfig) : ImageProcessorFactory::getInstance().init(_ledString, jsonConfig["blackborderdetector"].get("enable", true).asBool()); // initialize the color smoothing filter - _device = createColorSmoothing(jsonConfig["smoothing"], _device); + _device = createColorSmoothing(jsonConfig["color"]["smoothing"], _device); // setup the timer _timer.setSingleShot(true); diff --git a/libsrc/hyperion/LinearColorSmoothing.cpp b/libsrc/hyperion/LinearColorSmoothing.cpp index e591921b..e484688f 100644 --- a/libsrc/hyperion/LinearColorSmoothing.cpp +++ b/libsrc/hyperion/LinearColorSmoothing.cpp @@ -3,12 +3,12 @@ #include "LinearColorSmoothing.h" -LinearColorSmoothing::LinearColorSmoothing(LedDevice *ledDevice, double ledUpdateFrequency, double settlingTime) : +LinearColorSmoothing::LinearColorSmoothing(LedDevice *ledDevice, double ledUpdateFrequency_hz, int settlingTime_ms) : QObject(), LedDevice(), _ledDevice(ledDevice), - _updateInterval(1000.0 / ledUpdateFrequency), - _settlingTime(1000 * settlingTime), + _updateInterval(1000 / ledUpdateFrequency_hz), + _settlingTime(settlingTime_ms), _timer() { _timer.setSingleShot(false); diff --git a/libsrc/hyperion/LinearColorSmoothing.h b/libsrc/hyperion/LinearColorSmoothing.h index 4aaafe86..9380c655 100644 --- a/libsrc/hyperion/LinearColorSmoothing.h +++ b/libsrc/hyperion/LinearColorSmoothing.h @@ -26,7 +26,7 @@ public: /// @param LedDevice the led device /// @param LedUpdatFrequency The frequency at which the leds will be updated (Hz) /// @param settingTime The time after which the updated led values have been fully applied (sec) - LinearColorSmoothing(LedDevice *ledDevice, double ledUpdateFrequency, double settlingTime); + LinearColorSmoothing(LedDevice *ledDevice, double ledUpdateFrequency, int settlingTime); /// Destructor virtual ~LinearColorSmoothing(); diff --git a/libsrc/hyperion/hyperion.schema.json b/libsrc/hyperion/hyperion.schema.json index 755ed98e..31683d5d 100644 --- a/libsrc/hyperion/hyperion.schema.json +++ b/libsrc/hyperion/hyperion.schema.json @@ -125,7 +125,30 @@ } }, "additionalProperties" : false + }, + "smoothing" : { + "type" : "object", + "required" : false, + "properties" : { + "type" : { + "type" : "enum", + "required" : true, + "values" : ["none", "linear"] + }, + "time_ms" : { + "type" : "integer", + "required" : false, + "minimum" : 10 + }, + "updateFrequency" : { + "type" : "number", + "required" : false, + "minimum" : 0.001 + } + }, + "additionalProperties" : false } + }, "additionalProperties" : false }, diff --git a/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorConfig.java b/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorConfig.java index 3018b8ae..8aacfe8a 100644 --- a/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorConfig.java +++ b/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorConfig.java @@ -6,7 +6,6 @@ import java.util.Locale; * The color tuning parameters of the different color channels (both in RGB space as in HSV space) */ public class ColorConfig { - /** The saturation gain (in HSV space) */ double mSaturationGain = 1.0; /** The value gain (in HSV space) */ @@ -39,6 +38,13 @@ public class ColorConfig { /** The white-level of the BLUE-value (in RGB space) */ double mBlueWhitelevel = 1.0; + /** The type of smoothing algorithm */ + ColorSmoothingType mSmoothingType = ColorSmoothingType.none; + /** The time constant for smoothing algorithm in milliseconds */ + int mSmoothingTime = 200; + /** The update frequency of the leds in Hz */ + double mSmoothingUpdateFrequency = 20.0; + /** * Creates the JSON string of the configuration as used in the Hyperion daemon configfile * @@ -49,25 +55,30 @@ public class ColorConfig { strBuf.append("\t/// Color manipulation configuration used to tune the output colors to specific surroundings. Contains the following fields:\n"); strBuf.append("\t/// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following tuning parameters:\n"); - strBuf.append("\t/// - 'saturationGain' The gain adjustement of the saturation\n"); - strBuf.append("\t/// - 'valueGain' The gain adjustement of the value\n"); + strBuf.append("\t/// - 'saturationGain' The gain adjustement of the saturation\n"); + strBuf.append("\t/// - 'valueGain' The gain adjustement of the value\n"); strBuf.append("\t/// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the following tuning parameters for each channel:\n"); - strBuf.append("\t/// - 'threshold' The minimum required input value for the channel to be on (else zero)\n"); - strBuf.append("\t/// - 'gamma' The gamma-curve correction factor\n"); - strBuf.append("\t/// - 'blacklevel' The lowest possible value (when the channel is black)\n"); - strBuf.append("\t/// - 'whitelevel' The highest possible value (when the channel is white)\n"); + strBuf.append("\t/// - 'threshold' The minimum required input value for the channel to be on (else zero)\n"); + strBuf.append("\t/// - 'gamma' The gamma-curve correction factor\n"); + strBuf.append("\t/// - 'blacklevel' The lowest possible value (when the channel is black)\n"); + strBuf.append("\t/// - 'whitelevel' The highest possible value (when the channel is white)\n"); + strBuf.append("\t/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters:\n"); + strBuf.append("\t/// - 'type' The type of smoothing algorithm ('linear' or 'none')\n"); + strBuf.append("\t/// - 'time_ms' The time constant for smoothing algorithm in milliseconds\n"); + strBuf.append("\t/// - 'updateFrequency' The update frequency of the leds in Hz\n"); strBuf.append("\t\"color\" :\n"); strBuf.append("\t{\n"); strBuf.append(hsvToJsonString() + ",\n"); - strBuf.append(rgbToJsonString() + "\n"); + strBuf.append(rgbToJsonString() + ",\n"); + strBuf.append(smoothingToString() + "\n"); strBuf.append("\t}"); return strBuf.toString(); } /** - * Creates the JSON string of the HSV-subconfiguration as used in the Hyperion deaomn configfile + * Creates the JSON string of the HSV-subconfiguration as used in the Hyperion deamon configfile * * @return The JSON string of the HSV-config */ @@ -83,7 +94,7 @@ public class ColorConfig { } /** - * Creates the JSON string of the RGB-subconfiguration as used in the Hyperion deaomn configfile + * Creates the JSON string of the RGB-subconfiguration as used in the Hyperion deamon configfile * * @return The JSON string of the RGB-config */ @@ -117,4 +128,20 @@ public class ColorConfig { return strBuf.toString(); } + /** + * Creates the JSON string of the smoothing subconfiguration as used in the Hyperion deamon configfile + * + * @return The JSON string of the HSV-config + */ + private String smoothingToString() { + StringBuffer strBuf = new StringBuffer(); + strBuf.append("\t\t\"smoothing\" :\n"); + strBuf.append("\t\t{\n"); + strBuf.append(String.format(Locale.ROOT, "\t\t\t\"type\" : \"%s\",\n", mSmoothingType.name())); + strBuf.append(String.format(Locale.ROOT, "\t\t\t\"time_ms\" : %d,\n", mSmoothingTime)); + strBuf.append(String.format(Locale.ROOT, "\t\t\t\"updateFrequency\" : %.4f\n", mSmoothingUpdateFrequency)); + + strBuf.append("\t\t}"); + return strBuf.toString(); + } } diff --git a/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorSmoothingType.java b/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorSmoothingType.java new file mode 100644 index 00000000..b1f59255 --- /dev/null +++ b/src/config-tool/ConfigTool/src/org/hyperion/hypercon/spec/ColorSmoothingType.java @@ -0,0 +1,20 @@ +package org.hyperion.hypercon.spec; + +enum ColorSmoothingType { + /** No smoothing in the time domain */ + none("None"), + + /** Linear smoothing of led data */ + linear("Linear smoothing"); + + private final String mName; + + private ColorSmoothingType(String name) { + mName = name; + } + + @Override + public String toString() { + return mName; + } +} \ No newline at end of file