mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Merge branch 'master' into add_effect_engine
Conflicts: include/hyperion/Hyperion.h libsrc/hyperion/Hyperion.cpp libsrc/jsonserver/JsonClientConnection.cpp Former-commit-id: 1df163d1880691ded2fc8b5902c6ad3501912c48
This commit is contained in:
@@ -8,19 +8,19 @@ import java.io.OutputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.util.Properties;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
import java.util.Vector;
|
||||
|
||||
public class ConfigurationFile {
|
||||
private final Properties pProps = new Properties();
|
||||
private final Properties mProps = new Properties();
|
||||
|
||||
public void load(String pFilename) {
|
||||
pProps.clear();
|
||||
mProps.clear();
|
||||
// try (InputStream in = new InflaterInputStream(new FileInputStream(pFilename))){
|
||||
try (InputStream in = new GZIPInputStream(new FileInputStream(pFilename))){
|
||||
// try (InputStream in = new FileInputStream(pFilename)) {
|
||||
pProps.load(in);
|
||||
// try (InputStream in = new GZIPInputStream(new FileInputStream(pFilename))){
|
||||
try (InputStream in = new FileInputStream(pFilename)) {
|
||||
mProps.load(in);
|
||||
} catch (Throwable t) {
|
||||
// TODO Auto-generated catch block
|
||||
t.printStackTrace();
|
||||
@@ -29,15 +29,18 @@ public class ConfigurationFile {
|
||||
|
||||
public void save(String pFilename) {
|
||||
// try (OutputStream out = new DeflaterOutputStream(new FileOutputStream(pFilename))) {
|
||||
try (OutputStream out = new GZIPOutputStream(new FileOutputStream(pFilename))) {
|
||||
// try (OutputStream out = (new FileOutputStream(pFilename))) {
|
||||
pProps.store(out, "Pesistent settings file for HyperCon");
|
||||
// try (OutputStream out = new GZIPOutputStream(new FileOutputStream(pFilename))) {
|
||||
try (OutputStream out = (new FileOutputStream(pFilename))) {
|
||||
mProps.store(out, "Pesistent settings file for HyperCon");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void store(Object pObj) {
|
||||
store(pObj, pObj.getClass().getSimpleName(), "");
|
||||
}
|
||||
public void store(Object pObj, String preamble, String postamble) {
|
||||
String className = pObj.getClass().getSimpleName();
|
||||
// Retrieve the member variables
|
||||
Field[] fields = pObj.getClass().getDeclaredFields();
|
||||
@@ -48,27 +51,99 @@ public class ConfigurationFile {
|
||||
continue;
|
||||
}
|
||||
|
||||
String key = className + "." + field.getName();
|
||||
String key = preamble + "." + field.getName() + postamble;
|
||||
try {
|
||||
Object value = field.get(pObj);
|
||||
|
||||
if (value.getClass().isEnum()) {
|
||||
pProps.setProperty(key, ((Enum<?>)value).name());
|
||||
mProps.setProperty(key, ((Enum<?>)value).name());
|
||||
} else if (value.getClass().isAssignableFrom(Vector.class)) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Vector<Object> v = (Vector<Object>) value;
|
||||
for (int i=0; i<v.size(); ++i) {
|
||||
store(v.get(i), key + "[" + i + "]", "");
|
||||
}
|
||||
} else {
|
||||
pProps.setProperty(key, value.toString());
|
||||
mProps.setProperty(key, value.toString());
|
||||
}
|
||||
} catch (Throwable t) {}
|
||||
}
|
||||
}
|
||||
|
||||
public void restore(Object pObj) {
|
||||
restore(pObj, mProps);
|
||||
}
|
||||
|
||||
public void restore(Object pObj, Properties pProps) {
|
||||
String className = pObj.getClass().getSimpleName();
|
||||
|
||||
restore(pObj, pProps, className + ".");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void restore(Object pObj, Properties pProps, String pPreamble) {
|
||||
// Retrieve the member variables
|
||||
Field[] fields = pObj.getClass().getDeclaredFields();
|
||||
// Iterate each variable
|
||||
for (Field field : fields) {
|
||||
String key = className + "." + field.getName();
|
||||
if (field.getType().isAssignableFrom(Vector.class)) {
|
||||
// Obtain the Vector
|
||||
Vector<Object> vector;
|
||||
try {
|
||||
vector = (Vector<Object>)field.get(pObj);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
break;
|
||||
}
|
||||
// Clear existing elements from the vector
|
||||
vector.clear();
|
||||
|
||||
// Iterate through the properties to find the indices of the vector
|
||||
int i=0;
|
||||
while (true) {
|
||||
String curIndexKey = pPreamble + field.getName() + "[" + i + "]";
|
||||
Properties elemProps = new Properties();
|
||||
// Find all the elements for the current vector index
|
||||
for (Object keyObj : pProps.keySet()) {
|
||||
String keyStr = (String)keyObj;
|
||||
if (keyStr.startsWith(curIndexKey)) {
|
||||
// Remove the name and dot
|
||||
elemProps.put(keyStr.substring(curIndexKey.length()+1), pProps.get(keyStr));
|
||||
}
|
||||
}
|
||||
if (elemProps.isEmpty()) {
|
||||
// Found no more elements for the vector
|
||||
break;
|
||||
}
|
||||
|
||||
// Construct new instance of vectors generic type
|
||||
ParameterizedType vectorElementType = (ParameterizedType) field.getGenericType();
|
||||
Class<?> vectorElementClass = (Class<?>) vectorElementType.getActualTypeArguments()[0];
|
||||
// Find the constructor with no arguments and create a new instance
|
||||
Object newElement = null;
|
||||
try {
|
||||
newElement = vectorElementClass.getConstructor().newInstance();
|
||||
} catch (Throwable t) {
|
||||
System.err.println("Failed to find empty default constructor for " + vectorElementClass.getName());
|
||||
break;
|
||||
}
|
||||
if (newElement == null) {
|
||||
System.err.println("Failed to construct instance for " + vectorElementClass.getName());
|
||||
break;
|
||||
}
|
||||
|
||||
// Restore the instance members from the collected properties
|
||||
restore(newElement, elemProps, "");
|
||||
|
||||
// Add the instance to the vector
|
||||
vector.addElement(newElement);
|
||||
|
||||
++i;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
String key = pPreamble + field.getName();
|
||||
String value = pProps.getProperty(key);
|
||||
if (value == null) {
|
||||
System.out.println("Persistent settings does not contain value for " + key);
|
||||
@@ -97,6 +172,6 @@ public class ConfigurationFile {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return pProps.toString();
|
||||
return mProps.toString();
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package org.hyperion.hypercon.gui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridLayout;
|
||||
import java.beans.Transient;
|
||||
@@ -11,20 +12,27 @@ import javax.swing.GroupLayout;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
|
||||
import org.hyperion.hypercon.spec.ColorConfig;
|
||||
import org.hyperion.hypercon.spec.TransformConfig;
|
||||
|
||||
/**
|
||||
* Configuration panel for the ColorConfig.
|
||||
*
|
||||
* NB This has not been integrated in the GUI jet!
|
||||
*/
|
||||
public class ColorPanel extends JPanel {
|
||||
public class ColorTransformPanel extends JPanel {
|
||||
|
||||
private final ColorConfig mColorConfig;
|
||||
private final TransformConfig mColorConfig;
|
||||
|
||||
private JPanel mIndexPanel;
|
||||
private JLabel mIndexLabel;
|
||||
private JTextField mIndexField;
|
||||
|
||||
private JPanel mRgbTransformPanel;
|
||||
private JLabel mThresholdLabel;
|
||||
@@ -53,10 +61,10 @@ public class ColorPanel extends JPanel {
|
||||
private JLabel mValueAdjustLabel;
|
||||
private JSpinner mValueAdjustSpinner;
|
||||
|
||||
public ColorPanel(ColorConfig pColorConfig) {
|
||||
public ColorTransformPanel(TransformConfig pTransformConfig) {
|
||||
super();
|
||||
|
||||
mColorConfig = pColorConfig;
|
||||
mColorConfig = pTransformConfig;
|
||||
|
||||
initialise();
|
||||
}
|
||||
@@ -70,12 +78,32 @@ public class ColorPanel extends JPanel {
|
||||
}
|
||||
|
||||
private void initialise() {
|
||||
setBorder(BorderFactory.createTitledBorder("Color transform"));
|
||||
setBorder(BorderFactory.createTitledBorder("Transform [" + mColorConfig.mId + "]"));
|
||||
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
|
||||
|
||||
add(getIndexPanel());
|
||||
add(Box.createVerticalStrut(10));
|
||||
add(getRgbPanel());
|
||||
add(Box.createVerticalStrut(10));
|
||||
add(getHsvPanel());
|
||||
add(Box.createVerticalGlue());
|
||||
}
|
||||
|
||||
private JPanel getIndexPanel() {
|
||||
if (mIndexPanel == null) {
|
||||
mIndexPanel = new JPanel();
|
||||
mIndexPanel.setMaximumSize(new Dimension(1024, 25));
|
||||
mIndexPanel.setLayout(new BorderLayout(10,10));
|
||||
|
||||
mIndexLabel = new JLabel("Indices:");
|
||||
mIndexPanel.add(mIndexLabel, BorderLayout.WEST);
|
||||
|
||||
mIndexField = new JTextField(mColorConfig.mLedIndexString);
|
||||
mIndexField.setToolTipText("Comma seperated indices or index ranges (eg '1-10, 13, 14, 17-19')");
|
||||
mIndexField.getDocument().addDocumentListener(mDocumentListener);
|
||||
mIndexPanel.add(mIndexField, BorderLayout.CENTER);
|
||||
}
|
||||
return mIndexPanel;
|
||||
}
|
||||
|
||||
private JPanel getRgbPanel() {
|
||||
@@ -216,4 +244,18 @@ public class ColorPanel extends JPanel {
|
||||
mColorConfig.mValueGain = (Double)mValueAdjustSpinner.getValue();
|
||||
}
|
||||
};
|
||||
private final DocumentListener mDocumentListener = new DocumentListener() {
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
mColorConfig.mLedIndexString = mIndexField.getText();
|
||||
}
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
mColorConfig.mLedIndexString = mIndexField.getText();
|
||||
}
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
mColorConfig.mLedIndexString = mIndexField.getText();
|
||||
}
|
||||
};
|
||||
}
|
@@ -0,0 +1,130 @@
|
||||
package org.hyperion.hypercon.gui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.DefaultComboBoxModel;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import org.hyperion.hypercon.spec.ColorConfig;
|
||||
import org.hyperion.hypercon.spec.TransformConfig;
|
||||
|
||||
public class ColorsPanel extends JPanel {
|
||||
|
||||
private final ColorConfig mColorConfig;
|
||||
private final DefaultComboBoxModel<TransformConfig> mTransformsModel;
|
||||
|
||||
private JPanel mControlPanel;
|
||||
private JComboBox<TransformConfig> mTransformCombo;
|
||||
private JButton mAddTransformButton;
|
||||
private JButton mDelTransformButton;
|
||||
|
||||
private JPanel mTransformPanel;
|
||||
|
||||
private final Map<TransformConfig, ColorTransformPanel> mTransformPanels = new HashMap<>();
|
||||
|
||||
|
||||
public ColorsPanel(ColorConfig pColorConfig) {
|
||||
super();
|
||||
|
||||
mColorConfig = pColorConfig;
|
||||
mTransformsModel = new DefaultComboBoxModel<TransformConfig>(mColorConfig.mTransforms);
|
||||
|
||||
initialise();
|
||||
}
|
||||
|
||||
private void initialise() {
|
||||
setLayout(new BorderLayout(10,10));
|
||||
setBorder(BorderFactory.createTitledBorder("Colors"));
|
||||
|
||||
add(getControlPanel(), BorderLayout.NORTH);
|
||||
|
||||
mTransformPanel = new JPanel();
|
||||
mTransformPanel.setLayout(new BorderLayout());
|
||||
add(mTransformPanel, BorderLayout.CENTER);
|
||||
|
||||
for (TransformConfig config : mColorConfig.mTransforms) {
|
||||
mTransformPanels.put(config, new ColorTransformPanel(config));
|
||||
}
|
||||
ColorTransformPanel currentPanel = mTransformPanels.get(mColorConfig.mTransforms.get(0));
|
||||
mTransformPanel.add(currentPanel, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
private JPanel getControlPanel() {
|
||||
if (mControlPanel == null) {
|
||||
mControlPanel = new JPanel();
|
||||
mControlPanel.setLayout(new BoxLayout(mControlPanel, BoxLayout.LINE_AXIS));
|
||||
|
||||
mTransformCombo = new JComboBox<>(mTransformsModel);
|
||||
mTransformCombo.addActionListener(mComboListener);
|
||||
mControlPanel.add(mTransformCombo);
|
||||
|
||||
mAddTransformButton = new JButton(mAddAction);
|
||||
mControlPanel.add(mAddTransformButton);
|
||||
|
||||
mDelTransformButton = new JButton(mDelAction);
|
||||
mDelTransformButton.setEnabled(mTransformCombo.getItemCount() > 1);
|
||||
mControlPanel.add(mDelTransformButton);
|
||||
}
|
||||
return mControlPanel;
|
||||
}
|
||||
|
||||
private final Action mAddAction = new AbstractAction("Add") {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String newId = JOptionPane.showInputDialog("Give an identifier for the new color-transform:");
|
||||
if (newId == null || newId.isEmpty()) {
|
||||
// No proper value given
|
||||
return;
|
||||
}
|
||||
|
||||
TransformConfig config = new TransformConfig();
|
||||
config.mId = newId;
|
||||
|
||||
ColorTransformPanel panel = new ColorTransformPanel(config);
|
||||
mTransformPanels.put(config, panel);
|
||||
|
||||
mTransformsModel.addElement(config);
|
||||
mTransformsModel.setSelectedItem(config);
|
||||
|
||||
mDelTransformButton.setEnabled(true);
|
||||
}
|
||||
};
|
||||
private final Action mDelAction = new AbstractAction("Del") {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
TransformConfig config = (TransformConfig) mTransformCombo.getSelectedItem();
|
||||
mTransformPanels.remove(config);
|
||||
mTransformsModel.removeElement(config);
|
||||
|
||||
mDelTransformButton.setEnabled(mTransformCombo.getItemCount() > 1);
|
||||
}
|
||||
};
|
||||
|
||||
private final ActionListener mComboListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
TransformConfig selConfig = (TransformConfig) mTransformsModel.getSelectedItem();
|
||||
if (selConfig == null) {
|
||||
// Something went wrong here, there should always be a selection!
|
||||
return;
|
||||
}
|
||||
|
||||
ColorTransformPanel panel = mTransformPanels.get(selConfig);
|
||||
mTransformPanel.removeAll();
|
||||
mTransformPanel.add(panel, BorderLayout.CENTER);
|
||||
mTransformPanel.revalidate();
|
||||
mTransformPanel.repaint();
|
||||
}
|
||||
};
|
||||
}
|
@@ -175,7 +175,7 @@ public class ConfigPanel extends JPanel {
|
||||
mProcessPanel.add(new BootSequencePanel(ledString.mMiscConfig));
|
||||
mProcessPanel.add(new FrameGrabberPanel(ledString.mMiscConfig));
|
||||
mProcessPanel.add(new ColorSmoothingPanel(ledString.mColorConfig));
|
||||
mProcessPanel.add(new ColorPanel(ledString.mColorConfig));
|
||||
mProcessPanel.add(new ColorsPanel(ledString.mColorConfig));
|
||||
mProcessPanel.add(Box.createVerticalGlue());
|
||||
}
|
||||
return mProcessPanel;
|
||||
|
@@ -0,0 +1,48 @@
|
||||
package org.hyperion.hypercon.gui;
|
||||
|
||||
import java.awt.GridLayout;
|
||||
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
|
||||
public class LedDivideDialog extends JFrame {
|
||||
|
||||
private final int mLedCount;
|
||||
private final int mTransformCount;
|
||||
|
||||
private JPanel mContentPanel;
|
||||
|
||||
public LedDivideDialog(int pLedCnt, int pTransformCnt) {
|
||||
super();
|
||||
|
||||
mLedCount = pLedCnt;
|
||||
mTransformCount = pTransformCnt;
|
||||
|
||||
initialise();
|
||||
}
|
||||
|
||||
private void initialise() {
|
||||
mContentPanel = new JPanel();
|
||||
mContentPanel.setLayout(new GridLayout(mLedCount, mTransformCount, 5, 5));
|
||||
|
||||
for (int iLed=0; iLed<mLedCount; ++iLed) {
|
||||
ButtonGroup ledGroup = new ButtonGroup();
|
||||
for (int iTransform=0; iTransform<mTransformCount; ++iTransform) {
|
||||
JRadioButton ledTransformButton = new JRadioButton();
|
||||
ledGroup.add(ledTransformButton);
|
||||
mContentPanel.add(ledTransformButton);
|
||||
}
|
||||
}
|
||||
|
||||
setContentPane(mContentPanel);
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] pArgs) {
|
||||
LedDivideDialog dialog = new LedDivideDialog(50, 3);
|
||||
dialog.setSize(600, 800);
|
||||
dialog.setVisible(true);
|
||||
}
|
||||
}
|
@@ -1,42 +1,18 @@
|
||||
package org.hyperion.hypercon.spec;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* 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) */
|
||||
public double mSaturationGain = 1.0;
|
||||
/** The value gain (in HSV space) */
|
||||
public double mValueGain = 1.5;
|
||||
|
||||
/** The minimum required RED-value (in RGB space) */
|
||||
public double mRedThreshold = 0.1;
|
||||
/** The gamma-curve correct for the RED-value (in RGB space) */
|
||||
public double mRedGamma = 2.0;
|
||||
/** The black-level of the RED-value (in RGB space) */
|
||||
public double mRedBlacklevel = 0.0;
|
||||
/** The white-level of the RED-value (in RGB space) */
|
||||
public double mRedWhitelevel = 0.8;
|
||||
|
||||
/** The minimum required GREEN-value (in RGB space) */
|
||||
public double mGreenThreshold = 0.1;
|
||||
/** The gamma-curve correct for the GREEN-value (in RGB space) */
|
||||
public double mGreenGamma = 2.0;
|
||||
/** The black-level of the GREEN-value (in RGB space) */
|
||||
public double mGreenBlacklevel = 0.0;
|
||||
/** The white-level of the GREEN-value (in RGB space) */
|
||||
public double mGreenWhitelevel = 1.0;
|
||||
|
||||
/** The minimum required BLUE-value (in RGB space) */
|
||||
public double mBlueThreshold = 0.1;
|
||||
/** The gamma-curve correct for the BLUE-value (in RGB space) */
|
||||
public double mBlueGamma = 2.0;
|
||||
/** The black-level of the BLUE-value (in RGB space) */
|
||||
public double mBlueBlacklevel = 0.0;
|
||||
/** The white-level of the BLUE-value (in RGB space) */
|
||||
public double mBlueWhitelevel = 1.0;
|
||||
/** List with color transformations */
|
||||
public Vector<TransformConfig> mTransforms = new Vector<>();
|
||||
{
|
||||
mTransforms.add(new TransformConfig());
|
||||
}
|
||||
|
||||
public boolean mSmoothingEnabled = false;
|
||||
/** The type of smoothing algorithm */
|
||||
@@ -54,81 +30,53 @@ public class ColorConfig {
|
||||
public String toJsonString() {
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
|
||||
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/// Color manipulation configuration used to tune the output colors to specific surroundings. \n");
|
||||
strBuf.append("\t/// The configuration contains a list of color-transforms. Each transform contains the \n");
|
||||
strBuf.append("\t/// following fields:\n");
|
||||
strBuf.append("\t/// * 'id' : The unique identifier of the color transformation (eg 'device_1')");
|
||||
strBuf.append("\t/// * 'leds' : The indices (or index ranges) of the leds to which this color transform applies\n");
|
||||
strBuf.append("\t/// (eg '0-5, 9, 11, 12-17'). The indices are zero based.");
|
||||
strBuf.append("\t/// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following \n");
|
||||
strBuf.append("\t/// 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/// * '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/// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the \n");
|
||||
strBuf.append("\t/// following tuning parameters for each channel:\n");
|
||||
strBuf.append("\t/// - 'threshold' The minimum required input value for the channel to be on \n");
|
||||
strBuf.append("\t/// (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///");
|
||||
strBuf.append("\t/// Next to the list with color transforms there is also a smoothing option.");
|
||||
strBuf.append("\t/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning \n");
|
||||
strBuf.append("\t/// 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("\t\t\"transform\" :\n");
|
||||
strBuf.append("\t\t[\n");
|
||||
for (int i=0; i<mTransforms.size(); ++i) {
|
||||
TransformConfig transform = mTransforms.get(i);
|
||||
strBuf.append(transform.toJsonString());
|
||||
if (i == mTransforms.size()-1) {
|
||||
strBuf.append("\n");
|
||||
} else {
|
||||
strBuf.append(",\n");
|
||||
}
|
||||
}
|
||||
strBuf.append("\t\t],\n");
|
||||
|
||||
strBuf.append(smoothingToString() + "\n");
|
||||
strBuf.append("\t}");
|
||||
|
||||
return strBuf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the JSON string of the HSV-subconfiguration as used in the Hyperion deamon configfile
|
||||
*
|
||||
* @return The JSON string of the HSV-config
|
||||
*/
|
||||
private String hsvToJsonString() {
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
strBuf.append("\t\t\"hsv\" :\n");
|
||||
strBuf.append("\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"saturationGain\" : %.4f,\n", mSaturationGain));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"valueGain\" : %.4f\n", mValueGain));
|
||||
|
||||
strBuf.append("\t\t}");
|
||||
return strBuf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the JSON string of the RGB-subconfiguration as used in the Hyperion deamon configfile
|
||||
*
|
||||
* @return The JSON string of the RGB-config
|
||||
*/
|
||||
private String rgbToJsonString() {
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
|
||||
strBuf.append("\t\t\"red\" :\n");
|
||||
strBuf.append("\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"threshold\" : %.4f,\n", mRedThreshold));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"gamma\" : %.4f,\n", mRedGamma));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"blacklevel\" : %.4f,\n", mRedBlacklevel));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"whitelevel\" : %.4f\n", mRedWhitelevel));
|
||||
strBuf.append("\t\t},\n");
|
||||
|
||||
strBuf.append("\t\t\"green\" :\n");
|
||||
strBuf.append("\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"threshold\" : %.4f,\n", mGreenThreshold));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"gamma\" : %.4f,\n", mGreenGamma));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"blacklevel\" : %.4f,\n", mGreenBlacklevel));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"whitelevel\" : %.4f\n", mGreenWhitelevel));
|
||||
strBuf.append("\t\t},\n");
|
||||
|
||||
strBuf.append("\t\t\"blue\" :\n");
|
||||
strBuf.append("\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"threshold\" : %.4f,\n", mBlueThreshold));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"gamma\" : %.4f,\n", mBlueGamma));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"blacklevel\" : %.4f,\n", mBlueBlacklevel));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"whitelevel\" : %.4f\n", mBlueWhitelevel));
|
||||
strBuf.append("\t\t}");
|
||||
|
||||
return strBuf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the JSON string of the smoothing subconfiguration as used in the Hyperion deamon configfile
|
||||
*
|
||||
|
@@ -0,0 +1,111 @@
|
||||
package org.hyperion.hypercon.spec;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class TransformConfig {
|
||||
/** The identifier of this ColorTransform configuration */
|
||||
public String mId = "default";
|
||||
|
||||
/** The indices to which this transform applies */
|
||||
public String mLedIndexString = "0-49";
|
||||
|
||||
/** The saturation gain (in HSV space) */
|
||||
public double mSaturationGain = 1.0;
|
||||
/** The value gain (in HSV space) */
|
||||
public double mValueGain = 1.5;
|
||||
|
||||
/** The minimum required RED-value (in RGB space) */
|
||||
public double mRedThreshold = 0.1;
|
||||
/** The gamma-curve correct for the RED-value (in RGB space) */
|
||||
public double mRedGamma = 2.0;
|
||||
/** The black-level of the RED-value (in RGB space) */
|
||||
public double mRedBlacklevel = 0.0;
|
||||
/** The white-level of the RED-value (in RGB space) */
|
||||
public double mRedWhitelevel = 0.8;
|
||||
|
||||
/** The minimum required GREEN-value (in RGB space) */
|
||||
public double mGreenThreshold = 0.1;
|
||||
/** The gamma-curve correct for the GREEN-value (in RGB space) */
|
||||
public double mGreenGamma = 2.0;
|
||||
/** The black-level of the GREEN-value (in RGB space) */
|
||||
public double mGreenBlacklevel = 0.0;
|
||||
/** The white-level of the GREEN-value (in RGB space) */
|
||||
public double mGreenWhitelevel = 1.0;
|
||||
|
||||
/** The minimum required BLUE-value (in RGB space) */
|
||||
public double mBlueThreshold = 0.1;
|
||||
/** The gamma-curve correct for the BLUE-value (in RGB space) */
|
||||
public double mBlueGamma = 2.0;
|
||||
/** The black-level of the BLUE-value (in RGB space) */
|
||||
public double mBlueBlacklevel = 0.0;
|
||||
/** The white-level of the BLUE-value (in RGB space) */
|
||||
public double mBlueWhitelevel = 1.0;
|
||||
|
||||
public String toJsonString() {
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
|
||||
strBuf.append("\t\t\t{\n");
|
||||
strBuf.append("\t\t\t\t\"id\" : \"" + mId + "\",\n");
|
||||
strBuf.append("\t\t\t\t\"leds\" : \"" + mLedIndexString + "\",\n");
|
||||
strBuf.append(hsvToJsonString() + ",\n");
|
||||
strBuf.append(rgbToJsonString() + "\n");
|
||||
strBuf.append("\t\t\t}");
|
||||
|
||||
return strBuf.toString();
|
||||
}
|
||||
/**
|
||||
* Creates the JSON string of the HSV-subconfiguration as used in the Hyperion deamon configfile
|
||||
*
|
||||
* @return The JSON string of the HSV-config
|
||||
*/
|
||||
private String hsvToJsonString() {
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
strBuf.append("\t\t\t\t\"hsv\" :\n");
|
||||
strBuf.append("\t\t\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"saturationGain\" : %.4f,\n", mSaturationGain));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"valueGain\" : %.4f\n", mValueGain));
|
||||
|
||||
strBuf.append("\t\t\t\t}");
|
||||
return strBuf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the JSON string of the RGB-subconfiguration as used in the Hyperion deamon configfile
|
||||
*
|
||||
* @return The JSON string of the RGB-config
|
||||
*/
|
||||
private String rgbToJsonString() {
|
||||
StringBuffer strBuf = new StringBuffer();
|
||||
|
||||
strBuf.append("\t\t\t\t\"red\" :\n");
|
||||
strBuf.append("\t\t\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"threshold\" : %.4f,\n", mRedThreshold));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"gamma\" : %.4f,\n", mRedGamma));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"blacklevel\" : %.4f,\n", mRedBlacklevel));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"whitelevel\" : %.4f\n", mRedWhitelevel));
|
||||
strBuf.append("\t\t\t\t},\n");
|
||||
|
||||
strBuf.append("\t\t\t\t\"green\" :\n");
|
||||
strBuf.append("\t\t\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"threshold\" : %.4f,\n", mGreenThreshold));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"gamma\" : %.4f,\n", mGreenGamma));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"blacklevel\" : %.4f,\n", mGreenBlacklevel));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"whitelevel\" : %.4f\n", mGreenWhitelevel));
|
||||
strBuf.append("\t\t\t\t},\n");
|
||||
|
||||
strBuf.append("\t\t\t\t\"blue\" :\n");
|
||||
strBuf.append("\t\t\t\t{\n");
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"threshold\" : %.4f,\n", mBlueThreshold));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"gamma\" : %.4f,\n", mBlueGamma));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"blacklevel\" : %.4f,\n", mBlueBlacklevel));
|
||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\t\t\"whitelevel\" : %.4f\n", mBlueWhitelevel));
|
||||
strBuf.append("\t\t\t\t}");
|
||||
|
||||
return strBuf.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return mId;
|
||||
}
|
||||
}
|
@@ -189,7 +189,7 @@ void JsonConnection::clearAll()
|
||||
parseReply(reply);
|
||||
}
|
||||
|
||||
void JsonConnection::setTransform(double * saturation, double * value, ColorTransformValues *threshold, ColorTransformValues *gamma, ColorTransformValues *blacklevel, ColorTransformValues *whitelevel)
|
||||
void JsonConnection::setTransform(std::string * transformId, double * saturation, double * value, ColorTransformValues *threshold, ColorTransformValues *gamma, ColorTransformValues *blacklevel, ColorTransformValues *whitelevel)
|
||||
{
|
||||
std::cout << "Set color transforms" << std::endl;
|
||||
|
||||
@@ -198,6 +198,11 @@ void JsonConnection::setTransform(double * saturation, double * value, ColorTran
|
||||
command["command"] = "transform";
|
||||
Json::Value & transform = command["transform"];
|
||||
|
||||
if (transformId != nullptr)
|
||||
{
|
||||
transform["id"] = *transformId;
|
||||
}
|
||||
|
||||
if (saturation != nullptr)
|
||||
{
|
||||
transform["saturationGain"] = *saturation;
|
||||
|
@@ -86,6 +86,7 @@ public:
|
||||
///
|
||||
/// @note Note that providing a NULL will leave the settings on the server unchanged
|
||||
///
|
||||
/// @param transformId The identifier of the transform to set
|
||||
/// @param saturation The HSV saturation gain
|
||||
/// @param value The HSV value gain
|
||||
/// @param threshold The threshold
|
||||
@@ -94,6 +95,7 @@ public:
|
||||
/// @param whitelevel The whitelevel
|
||||
///
|
||||
void setTransform(
|
||||
std::string * transformId,
|
||||
double * saturation,
|
||||
double * value,
|
||||
ColorTransformValues * threshold,
|
||||
|
@@ -47,6 +47,7 @@ int main(int argc, char * argv[])
|
||||
SwitchParameter<> & argServerInfo = parameters.add<SwitchParameter<> >('l', "list" , "List server info");
|
||||
SwitchParameter<> & argClear = parameters.add<SwitchParameter<> >('x', "clear" , "Clear data for the priority channel provided by the -p option");
|
||||
SwitchParameter<> & argClearAll = parameters.add<SwitchParameter<> >(0x0, "clearall" , "Clear data for all active priority channels");
|
||||
StringParameter & argId = parameters.add<StringParameter> ('q', "qualifier" , "Identifier(qualifier) of the transform to set");
|
||||
DoubleParameter & argSaturation = parameters.add<DoubleParameter> ('s', "saturation", "Set the HSV saturation gain of the leds");
|
||||
DoubleParameter & argValue = parameters.add<DoubleParameter> ('v', "value" , "Set the HSV value gain of the leds");
|
||||
TransformParameter & argGamma = parameters.add<TransformParameter>('g', "gamma" , "Set the gamma of the leds (requires 3 space seperated values)");
|
||||
@@ -87,6 +88,7 @@ int main(int argc, char * argv[])
|
||||
std::cerr << " " << argClear.usageLine() << std::endl;
|
||||
std::cerr << " " << argClearAll.usageLine() << std::endl;
|
||||
std::cerr << "or one or more of the available color transformations:" << std::endl;
|
||||
std::cerr << " " << argId.usageLine() << std::endl;
|
||||
std::cerr << " " << argSaturation.usageLine() << std::endl;
|
||||
std::cerr << " " << argValue.usageLine() << std::endl;
|
||||
std::cerr << " " << argThreshold.usageLine() << std::endl;
|
||||
@@ -127,9 +129,11 @@ int main(int argc, char * argv[])
|
||||
}
|
||||
else if (colorTransform)
|
||||
{
|
||||
std::string transId;
|
||||
double saturation, value;
|
||||
ColorTransformValues threshold, gamma, blacklevel, whitelevel;
|
||||
|
||||
if (argId.isSet()) transId = argId.getValue();
|
||||
if (argSaturation.isSet()) saturation = argSaturation.getValue();
|
||||
if (argValue.isSet()) value = argValue.getValue();
|
||||
if (argThreshold.isSet()) threshold = argThreshold.getValue();
|
||||
@@ -138,6 +142,7 @@ int main(int argc, char * argv[])
|
||||
if (argWhitelevel.isSet()) whitelevel = argWhitelevel.getValue();
|
||||
|
||||
connection.setTransform(
|
||||
argId.isSet() ? &transId : nullptr,
|
||||
argSaturation.isSet() ? &saturation : nullptr,
|
||||
argValue.isSet() ? &value : nullptr,
|
||||
argThreshold.isSet() ? &threshold : nullptr,
|
||||
|
Reference in New Issue
Block a user