mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Added persistent file for configured settings.
Former-commit-id: dd14b9975c09ad50781eb947483069b65e1a5c35
This commit is contained in:
parent
fb23befdee
commit
daeec4077f
1
src/config-tool/ConfigTool/.gitignore
vendored
1
src/config-tool/ConfigTool/.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
/.settings
|
/.settings
|
||||||
/classes
|
/classes
|
||||||
|
/hyerpcon.dat
|
||||||
|
@ -0,0 +1,102 @@
|
|||||||
|
package org.hyperion.hypercon;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
|
public class ConfigurationFile {
|
||||||
|
private final Properties pProps = new Properties();
|
||||||
|
|
||||||
|
public void load(String pFilename) {
|
||||||
|
pProps.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);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
t.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void store(Object pObj) {
|
||||||
|
String className = pObj.getClass().getSimpleName();
|
||||||
|
// Retrieve the member variables
|
||||||
|
Field[] fields = pObj.getClass().getDeclaredFields();
|
||||||
|
// Iterate each variable
|
||||||
|
for (Field field : fields) {
|
||||||
|
if (!Modifier.isPublic(field.getModifiers())) {
|
||||||
|
System.out.println("Unable to synchronise non-public field(" + field.getName() + ") in configuration structure(" + className + ")");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String key = className + "." + field.getName();
|
||||||
|
try {
|
||||||
|
Object value = field.get(pObj);
|
||||||
|
|
||||||
|
if (value.getClass().isEnum()) {
|
||||||
|
pProps.setProperty(key, ((Enum<?>)value).name());
|
||||||
|
} else {
|
||||||
|
pProps.setProperty(key, value.toString());
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void restore(Object pObj) {
|
||||||
|
String className = pObj.getClass().getSimpleName();
|
||||||
|
|
||||||
|
// Retrieve the member variables
|
||||||
|
Field[] fields = pObj.getClass().getDeclaredFields();
|
||||||
|
// Iterate each variable
|
||||||
|
for (Field field : fields) {
|
||||||
|
String key = className + "." + field.getName();
|
||||||
|
String value = pProps.getProperty(key);
|
||||||
|
if (value == null) {
|
||||||
|
System.out.println("Persistent settings does not contain value for " + key);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (field.getType() == boolean.class) {
|
||||||
|
field.set(pObj, Boolean.parseBoolean(value));
|
||||||
|
} else if (field.getType() == int.class) {
|
||||||
|
field.set(pObj, Integer.parseInt(value));
|
||||||
|
} else if (field.getType() == double.class) {
|
||||||
|
field.set(pObj, Double.parseDouble(value));
|
||||||
|
} else if (field.getType().isEnum()) {
|
||||||
|
Method valMet = field.getType().getMethod("valueOf", String.class);
|
||||||
|
Object enumVal = valMet.invoke(null, value);
|
||||||
|
field.set(pObj, enumVal);
|
||||||
|
} else {
|
||||||
|
field.set(pObj, value);
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
System.out.println("Failed to parse value(" + value + ") for " + key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return pProps.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -1,34 +0,0 @@
|
|||||||
package org.hyperion.hypercon;
|
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
|
|
||||||
import javax.swing.JApplet;
|
|
||||||
|
|
||||||
import org.hyperion.hypercon.gui.ConfigPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for starting HyperCon (Hyperion configuration file builder) as a Applet (within a browser)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class HyperConApplet extends JApplet {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the HyperCon Applet
|
|
||||||
*/
|
|
||||||
public HyperConApplet() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
initialise();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialises this applet
|
|
||||||
*/
|
|
||||||
private void initialise() {
|
|
||||||
setPreferredSize(new Dimension(600, 300));
|
|
||||||
|
|
||||||
// Add the HyperCon configuration panel
|
|
||||||
add(new ConfigPanel(), BorderLayout.CENTER);
|
|
||||||
}
|
|
||||||
}
|
|
@ -60,7 +60,7 @@ public class LedFrameFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct the top-left led (if top-left is enabled)
|
// Construct the top-left led (if top-left is enabled)
|
||||||
if (frameSpec.topLeftCorner) {
|
if (frameSpec.topCorners) {
|
||||||
mLeds.add(createLed(frameSpec, processConfig, iLed, 0.0, 0.0, processConfig.getOverlapFraction(), BorderSide.top_left));
|
mLeds.add(createLed(frameSpec, processConfig, iLed, 0.0, 0.0, processConfig.getOverlapFraction(), BorderSide.top_left));
|
||||||
iLed = increase(frameSpec, iLed);
|
iLed = increase(frameSpec, iLed);
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ public class LedFrameFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct the top-right led (if top-right is enabled)
|
// Construct the top-right led (if top-right is enabled)
|
||||||
if (frameSpec.topRightCorner) {
|
if (frameSpec.topCorners) {
|
||||||
mLeds.add(createLed(frameSpec, processConfig, iLed, 1.0, 0.0, processConfig.getOverlapFraction(), BorderSide.top_right));
|
mLeds.add(createLed(frameSpec, processConfig, iLed, 1.0, 0.0, processConfig.getOverlapFraction(), BorderSide.top_right));
|
||||||
iLed = increase(frameSpec, iLed);
|
iLed = increase(frameSpec, iLed);
|
||||||
}
|
}
|
||||||
@ -106,7 +106,7 @@ public class LedFrameFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct the bottom-right led (if bottom-right is enabled)
|
// Construct the bottom-right led (if bottom-right is enabled)
|
||||||
if (frameSpec.bottomRightCorner) {
|
if (frameSpec.bottomCorners) {
|
||||||
mLeds.add(createLed(frameSpec, processConfig, iLed, 1.0, 1.0, processConfig.getOverlapFraction(), BorderSide.bottom_right));
|
mLeds.add(createLed(frameSpec, processConfig, iLed, 1.0, 1.0, processConfig.getOverlapFraction(), BorderSide.bottom_right));
|
||||||
iLed = increase(frameSpec, iLed);
|
iLed = increase(frameSpec, iLed);
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@ public class LedFrameFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct the bottom-left led (if bottom-left is enabled)
|
// Construct the bottom-left led (if bottom-left is enabled)
|
||||||
if (frameSpec.bottomLeftCorner) {
|
if (frameSpec.bottomCorners) {
|
||||||
mLeds.add(createLed(frameSpec, processConfig, iLed, 0.0, 1.0, processConfig.getOverlapFraction(), BorderSide.bottom_left));
|
mLeds.add(createLed(frameSpec, processConfig, iLed, 0.0, 1.0, processConfig.getOverlapFraction(), BorderSide.bottom_left));
|
||||||
iLed = increase(frameSpec, iLed);
|
iLed = increase(frameSpec, iLed);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package org.hyperion.hypercon;
|
package org.hyperion.hypercon;
|
||||||
|
|
||||||
|
import java.awt.event.WindowAdapter;
|
||||||
|
import java.awt.event.WindowEvent;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
@ -11,6 +15,7 @@ import org.hyperion.hypercon.gui.ConfigPanel;
|
|||||||
* JAVA application (contains the entry-point).
|
* JAVA application (contains the entry-point).
|
||||||
*/
|
*/
|
||||||
public class Main {
|
public class Main {
|
||||||
|
public static final String configFilename = "hyerpcon.dat";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry point to start HyperCon
|
* Entry point to start HyperCon
|
||||||
@ -18,6 +23,8 @@ public class Main {
|
|||||||
* @param pArgs HyperCon does not have command line arguments
|
* @param pArgs HyperCon does not have command line arguments
|
||||||
*/
|
*/
|
||||||
public static void main(String[] pArgs) {
|
public static void main(String[] pArgs) {
|
||||||
|
final LedString ledString = new LedString();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Configure swing to use the system default look and feel
|
// Configure swing to use the system default look and feel
|
||||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||||
@ -29,9 +36,31 @@ public class Main {
|
|||||||
frame.setSize(1300, 700);
|
frame.setSize(1300, 700);
|
||||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||||
frame.setIconImage(new ImageIcon(Main.class.getResource("HyperConIcon_64.png")).getImage());
|
frame.setIconImage(new ImageIcon(Main.class.getResource("HyperConIcon_64.png")).getImage());
|
||||||
|
frame.addWindowListener(new WindowAdapter() {
|
||||||
|
@Override
|
||||||
|
public void windowClosing(WindowEvent e) {
|
||||||
|
ConfigurationFile configFile = new ConfigurationFile();
|
||||||
|
configFile.store(ledString.mDeviceConfig);
|
||||||
|
configFile.store(ledString.mLedFrameConfig);
|
||||||
|
configFile.store(ledString.mProcessConfig);
|
||||||
|
configFile.store(ledString.mColorConfig);
|
||||||
|
configFile.store(ledString.mMiscConfig);
|
||||||
|
configFile.save(configFilename);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (new File(configFilename).exists()) {
|
||||||
|
ConfigurationFile configFile = new ConfigurationFile();
|
||||||
|
configFile.load(configFilename);
|
||||||
|
configFile.restore(ledString.mDeviceConfig);
|
||||||
|
configFile.restore(ledString.mLedFrameConfig);
|
||||||
|
configFile.restore(ledString.mProcessConfig);
|
||||||
|
configFile.restore(ledString.mColorConfig);
|
||||||
|
configFile.restore(ledString.mMiscConfig);
|
||||||
|
}
|
||||||
|
|
||||||
// Add the HyperCon configuration panel
|
// Add the HyperCon configuration panel
|
||||||
frame.setContentPane(new ConfigPanel());
|
frame.setContentPane(new ConfigPanel(ledString));
|
||||||
|
|
||||||
// Show the frame
|
// Show the frame
|
||||||
frame.setVisible(true);
|
frame.setVisible(true);
|
||||||
|
@ -7,6 +7,10 @@ import javax.swing.JLabel;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JSpinner;
|
import javax.swing.JSpinner;
|
||||||
import javax.swing.SpinnerNumberModel;
|
import javax.swing.SpinnerNumberModel;
|
||||||
|
import javax.swing.event.ChangeEvent;
|
||||||
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
|
import org.hyperion.hypercon.spec.ColorConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration panel for the ColorConfig.
|
* Configuration panel for the ColorConfig.
|
||||||
@ -14,6 +18,9 @@ import javax.swing.SpinnerNumberModel;
|
|||||||
* NB This has not been integrated in the GUI jet!
|
* NB This has not been integrated in the GUI jet!
|
||||||
*/
|
*/
|
||||||
public class ColorConfigPanel extends JPanel {
|
public class ColorConfigPanel extends JPanel {
|
||||||
|
|
||||||
|
private final ColorConfig mColorConfig;
|
||||||
|
|
||||||
private JPanel mRgbTransformPanel;
|
private JPanel mRgbTransformPanel;
|
||||||
private JLabel mThresholdLabel;
|
private JLabel mThresholdLabel;
|
||||||
private JLabel mGammaLabel;
|
private JLabel mGammaLabel;
|
||||||
@ -41,9 +48,11 @@ public class ColorConfigPanel extends JPanel {
|
|||||||
private JLabel mValueAdjustLabel;
|
private JLabel mValueAdjustLabel;
|
||||||
private JSpinner mValueAdjustSpinner;
|
private JSpinner mValueAdjustSpinner;
|
||||||
|
|
||||||
public ColorConfigPanel() {
|
public ColorConfigPanel(ColorConfig pColorConfig) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
mColorConfig = pColorConfig;
|
||||||
|
|
||||||
initialise();
|
initialise();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,35 +84,47 @@ public class ColorConfigPanel extends JPanel {
|
|||||||
|
|
||||||
mRedTransformLabel = new JLabel("RED");
|
mRedTransformLabel = new JLabel("RED");
|
||||||
mRgbTransformPanel.add(mRedTransformLabel);
|
mRgbTransformPanel.add(mRedTransformLabel);
|
||||||
mRedThresholdSpinner = new JSpinner(new SpinnerNumberModel());
|
mRedThresholdSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mRedThreshold, 0.0, 1.0, 0.1));
|
||||||
|
mRedThresholdSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mRedThresholdSpinner);
|
mRgbTransformPanel.add(mRedThresholdSpinner);
|
||||||
mRedGammaSpinner = new JSpinner(new SpinnerNumberModel());
|
mRedGammaSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mRedGamma, 0.0, 100.0, 0.1));
|
||||||
|
mRedThresholdSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mRedGammaSpinner);
|
mRgbTransformPanel.add(mRedGammaSpinner);
|
||||||
mRedBlacklevelSpinner = new JSpinner(new SpinnerNumberModel());
|
mRedBlacklevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mRedBlacklevel, 0.0, 1.0, 0.1));
|
||||||
|
mRedThresholdSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mRedBlacklevelSpinner);
|
mRgbTransformPanel.add(mRedBlacklevelSpinner);
|
||||||
mRedWhitelevelSpinner = new JSpinner(new SpinnerNumberModel());
|
mRedWhitelevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mRedWhitelevel, 0.0, 1.0, 0.1));
|
||||||
|
mRedThresholdSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mRedWhitelevelSpinner);
|
mRgbTransformPanel.add(mRedWhitelevelSpinner);
|
||||||
|
|
||||||
mGreenTransformLabel = new JLabel("GREEN");
|
mGreenTransformLabel = new JLabel("GREEN");
|
||||||
mRgbTransformPanel.add(mGreenTransformLabel);
|
mRgbTransformPanel.add(mGreenTransformLabel);
|
||||||
mGreenThresholdSpinner = new JSpinner(new SpinnerNumberModel());
|
mGreenThresholdSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mGreenThreshold, 0.0, 1.0, 0.1));
|
||||||
|
mGreenThresholdSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mGreenThresholdSpinner);
|
mRgbTransformPanel.add(mGreenThresholdSpinner);
|
||||||
mGreenGammaSpinner = new JSpinner(new SpinnerNumberModel());
|
mGreenGammaSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mGreenGamma, 0.0, 100.0, 0.1));
|
||||||
|
mGreenGammaSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mGreenGammaSpinner);
|
mRgbTransformPanel.add(mGreenGammaSpinner);
|
||||||
mGreenBlacklevelSpinner = new JSpinner(new SpinnerNumberModel());
|
mGreenBlacklevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mGreenBlacklevel, 0.0, 1.0, 0.1));
|
||||||
|
mGreenBlacklevelSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mGreenBlacklevelSpinner);
|
mRgbTransformPanel.add(mGreenBlacklevelSpinner);
|
||||||
mGreenWhitelevelSpinner = new JSpinner(new SpinnerNumberModel());
|
mGreenWhitelevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mGreenWhitelevel, 0.0, 1.0, 0.1));
|
||||||
|
mGreenWhitelevelSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mGreenWhitelevelSpinner);
|
mRgbTransformPanel.add(mGreenWhitelevelSpinner);
|
||||||
|
|
||||||
mBlueTransformLabel = new JLabel("BLUE");
|
mBlueTransformLabel = new JLabel("BLUE");
|
||||||
mRgbTransformPanel.add(mBlueTransformLabel);
|
mRgbTransformPanel.add(mBlueTransformLabel);
|
||||||
mBlueThresholdSpinner = new JSpinner(new SpinnerNumberModel());
|
mBlueThresholdSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mBlueThreshold, 0.0, 1.0, 0.1));
|
||||||
|
mBlueThresholdSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mBlueThresholdSpinner);
|
mRgbTransformPanel.add(mBlueThresholdSpinner);
|
||||||
mBlueGammaSpinner = new JSpinner(new SpinnerNumberModel());
|
mBlueGammaSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mBlueGamma, 0.0, 100.0, 0.1));
|
||||||
|
mBlueGammaSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mBlueGammaSpinner);
|
mRgbTransformPanel.add(mBlueGammaSpinner);
|
||||||
mBlueBlacklevelSpinner = new JSpinner(new SpinnerNumberModel());
|
mBlueBlacklevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mBlueBlacklevel, 0.0, 1.0, 0.1));
|
||||||
|
mBlueBlacklevelSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mBlueBlacklevelSpinner);
|
mRgbTransformPanel.add(mBlueBlacklevelSpinner);
|
||||||
mBlueWhitelevelSpinner = new JSpinner(new SpinnerNumberModel());
|
mBlueWhitelevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mBlueWhitelevel, 0.0, 1.0, 0.1));
|
||||||
|
mBlueWhitelevelSpinner.addChangeListener(mChangeListener);
|
||||||
mRgbTransformPanel.add(mBlueWhitelevelSpinner);
|
mRgbTransformPanel.add(mBlueWhitelevelSpinner);
|
||||||
|
|
||||||
layout.setHorizontalGroup(layout.createSequentialGroup()
|
layout.setHorizontalGroup(layout.createSequentialGroup()
|
||||||
@ -177,13 +198,15 @@ public class ColorConfigPanel extends JPanel {
|
|||||||
mSaturationAdjustLabel = new JLabel("Saturation");
|
mSaturationAdjustLabel = new JLabel("Saturation");
|
||||||
mHsvTransformPanel.add(mSaturationAdjustLabel);
|
mHsvTransformPanel.add(mSaturationAdjustLabel);
|
||||||
|
|
||||||
mSaturationAdjustSpinner = new JSpinner(new SpinnerNumberModel(1.0, 0.0, 1024.0, 0.01));
|
mSaturationAdjustSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mSaturationGain, 0.0, 1024.0, 0.01));
|
||||||
|
mSaturationAdjustSpinner.addChangeListener(mChangeListener);
|
||||||
mHsvTransformPanel.add(mSaturationAdjustSpinner);
|
mHsvTransformPanel.add(mSaturationAdjustSpinner);
|
||||||
|
|
||||||
mValueAdjustLabel = new JLabel("Value");
|
mValueAdjustLabel = new JLabel("Value");
|
||||||
mHsvTransformPanel.add(mValueAdjustLabel);
|
mHsvTransformPanel.add(mValueAdjustLabel);
|
||||||
|
|
||||||
mValueAdjustSpinner = new JSpinner(new SpinnerNumberModel(1.0, 0.0, 1024.0, 0.01));
|
mValueAdjustSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mValueGain, 0.0, 1024.0, 0.01));
|
||||||
|
mValueAdjustSpinner.addChangeListener(mChangeListener);
|
||||||
mHsvTransformPanel.add(mValueAdjustSpinner);
|
mHsvTransformPanel.add(mValueAdjustSpinner);
|
||||||
|
|
||||||
layout.setHorizontalGroup(layout.createSequentialGroup()
|
layout.setHorizontalGroup(layout.createSequentialGroup()
|
||||||
@ -211,4 +234,26 @@ public class ColorConfigPanel extends JPanel {
|
|||||||
return mHsvTransformPanel;
|
return mHsvTransformPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final ChangeListener mChangeListener = new ChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void stateChanged(ChangeEvent e) {
|
||||||
|
mColorConfig.mRedThreshold = (Double)mRedThresholdSpinner.getValue();
|
||||||
|
mColorConfig.mRedGamma = (Double)mRedGammaSpinner.getValue();
|
||||||
|
mColorConfig.mRedBlacklevel = (Double)mRedBlacklevelSpinner.getValue();
|
||||||
|
mColorConfig.mRedWhitelevel = (Double)mRedWhitelevelSpinner.getValue();
|
||||||
|
|
||||||
|
mColorConfig.mGreenThreshold = (Double)mGreenThresholdSpinner.getValue();
|
||||||
|
mColorConfig.mGreenGamma = (Double)mGreenGammaSpinner.getValue();
|
||||||
|
mColorConfig.mGreenBlacklevel = (Double)mGreenBlacklevelSpinner.getValue();
|
||||||
|
mColorConfig.mGreenWhitelevel = (Double)mGreenWhitelevelSpinner.getValue();
|
||||||
|
|
||||||
|
mColorConfig.mBlueThreshold = (Double)mBlueThresholdSpinner.getValue();
|
||||||
|
mColorConfig.mBlueGamma = (Double)mBlueGammaSpinner.getValue();
|
||||||
|
mColorConfig.mBlueBlacklevel = (Double)mBlueBlacklevelSpinner.getValue();
|
||||||
|
mColorConfig.mBlueWhitelevel = (Double)mBlueWhitelevelSpinner.getValue();
|
||||||
|
|
||||||
|
mColorConfig.mSaturationGain = (Double)mSaturationAdjustSpinner.getValue();
|
||||||
|
mColorConfig.mValueGain = (Double)mValueAdjustSpinner.getValue();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,10 @@ import javax.swing.JButton;
|
|||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import org.hyperion.hypercon.ConfigurationFile;
|
||||||
import org.hyperion.hypercon.LedFrameFactory;
|
import org.hyperion.hypercon.LedFrameFactory;
|
||||||
import org.hyperion.hypercon.LedString;
|
import org.hyperion.hypercon.LedString;
|
||||||
|
import org.hyperion.hypercon.Main;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main-config panel of HyperCon. Includes the configuration and the panels to edit and
|
* The main-config panel of HyperCon. Includes the configuration and the panels to edit and
|
||||||
@ -24,7 +26,7 @@ import org.hyperion.hypercon.LedString;
|
|||||||
public class ConfigPanel extends JPanel {
|
public class ConfigPanel extends JPanel {
|
||||||
|
|
||||||
/** The LED configuration information*/
|
/** The LED configuration information*/
|
||||||
private final LedString ledString = new LedString();
|
private final LedString ledString;
|
||||||
|
|
||||||
/** Action for write the Hyperion deamon configuration file */
|
/** Action for write the Hyperion deamon configuration file */
|
||||||
private final Action mSaveConfigAction = new AbstractAction("Create Hyperion Configuration") {
|
private final Action mSaveConfigAction = new AbstractAction("Create Hyperion Configuration") {
|
||||||
@ -37,6 +39,14 @@ public class ConfigPanel extends JPanel {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
ledString.saveConfigFile(fileChooser.getSelectedFile().getAbsolutePath());
|
ledString.saveConfigFile(fileChooser.getSelectedFile().getAbsolutePath());
|
||||||
|
|
||||||
|
ConfigurationFile configFile = new ConfigurationFile();
|
||||||
|
configFile.store(ledString.mDeviceConfig);
|
||||||
|
configFile.store(ledString.mLedFrameConfig);
|
||||||
|
configFile.store(ledString.mProcessConfig);
|
||||||
|
configFile.store(ledString.mColorConfig);
|
||||||
|
configFile.store(ledString.mMiscConfig);
|
||||||
|
configFile.save(Main.configFilename);
|
||||||
} catch (IOException e1) {
|
} catch (IOException e1) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e1.printStackTrace();
|
e1.printStackTrace();
|
||||||
@ -67,9 +77,11 @@ public class ConfigPanel extends JPanel {
|
|||||||
/**
|
/**
|
||||||
* Constructs the configuration panel with a default initialised led-frame and configuration
|
* Constructs the configuration panel with a default initialised led-frame and configuration
|
||||||
*/
|
*/
|
||||||
public ConfigPanel() {
|
public ConfigPanel(final LedString pLedString) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
ledString = pLedString;
|
||||||
|
|
||||||
initialise();
|
initialise();
|
||||||
|
|
||||||
// Compute the individual leds for the current configuration
|
// Compute the individual leds for the current configuration
|
||||||
@ -121,7 +133,7 @@ public class ConfigPanel extends JPanel {
|
|||||||
mSpecificationPanel = new JPanel();
|
mSpecificationPanel = new JPanel();
|
||||||
mSpecificationPanel.setLayout(new BoxLayout(mSpecificationPanel, BoxLayout.Y_AXIS));
|
mSpecificationPanel.setLayout(new BoxLayout(mSpecificationPanel, BoxLayout.Y_AXIS));
|
||||||
|
|
||||||
mConstructionPanel = new LedFramePanel(ledString.mLedFrameConfig);
|
mConstructionPanel = new LedFramePanel(ledString.mDeviceConfig, ledString.mLedFrameConfig);
|
||||||
mConstructionPanel.setBorder(BorderFactory.createTitledBorder("Construction"));
|
mConstructionPanel.setBorder(BorderFactory.createTitledBorder("Construction"));
|
||||||
mSpecificationPanel.add(mConstructionPanel);
|
mSpecificationPanel.add(mConstructionPanel);
|
||||||
|
|
||||||
|
@ -0,0 +1,69 @@
|
|||||||
|
package org.hyperion.hypercon.gui;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import org.hyperion.hypercon.spec.DeviceConfig;
|
||||||
|
import org.hyperion.hypercon.spec.RgbByteOrder;
|
||||||
|
|
||||||
|
public class DevicePanel extends JPanel {
|
||||||
|
|
||||||
|
private final DeviceConfig mDeviceConfig;
|
||||||
|
|
||||||
|
private JLabel mOutputLabel;
|
||||||
|
private JComboBox<String> mOutputCombo;
|
||||||
|
|
||||||
|
private JLabel mBaudrateLabel;
|
||||||
|
private JComboBox<Integer> mBaudrateCombo;
|
||||||
|
|
||||||
|
private JLabel mRgbLabel;
|
||||||
|
private JComboBox<RgbByteOrder> mRgbCombo;
|
||||||
|
|
||||||
|
public DevicePanel(DeviceConfig pDeviceConfig) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
mDeviceConfig = pDeviceConfig;
|
||||||
|
|
||||||
|
initialise();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialise() {
|
||||||
|
mOutputLabel = new JLabel("Output");
|
||||||
|
add(mOutputLabel);
|
||||||
|
|
||||||
|
mOutputCombo = new JComboBox<>(new String[] {"/dev/spidev0.0", " /dev/ttyUSB0", "/home/pi/test-output.txt", "/dev/null" });
|
||||||
|
mOutputCombo.setEditable(true);
|
||||||
|
mOutputCombo.setSelectedItem(mDeviceConfig.mOutput);
|
||||||
|
mOutputCombo.addActionListener(mActionListener);
|
||||||
|
add(mOutputCombo);
|
||||||
|
|
||||||
|
mBaudrateLabel = new JLabel("Baudrate");
|
||||||
|
add(mBaudrateLabel);
|
||||||
|
|
||||||
|
mBaudrateCombo = new JComboBox<>();
|
||||||
|
mRgbCombo.setSelectedItem(mDeviceConfig.mBaudrate);
|
||||||
|
mRgbCombo.addActionListener(mActionListener);
|
||||||
|
add(mBaudrateCombo);
|
||||||
|
|
||||||
|
mRgbLabel = new JLabel("RGB Byte Order");
|
||||||
|
add(mRgbLabel);
|
||||||
|
|
||||||
|
mRgbCombo = new JComboBox<>(RgbByteOrder.values());
|
||||||
|
mRgbCombo.setSelectedItem(mDeviceConfig.mRgbByteOrder);
|
||||||
|
mRgbCombo.addActionListener(mActionListener);
|
||||||
|
add(mRgbCombo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final ActionListener mActionListener = new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
mDeviceConfig.mOutput = (String)mOutputCombo.getSelectedItem();
|
||||||
|
mDeviceConfig.mBaudrate = (Integer)mBaudrateCombo.getSelectedItem();
|
||||||
|
mDeviceConfig.mRgbByteOrder = (RgbByteOrder)mRgbCombo.getSelectedItem();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@ -2,8 +2,6 @@ package org.hyperion.hypercon.gui;
|
|||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.util.Observable;
|
|
||||||
import java.util.Observer;
|
|
||||||
|
|
||||||
import javax.swing.GroupLayout;
|
import javax.swing.GroupLayout;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
@ -16,7 +14,7 @@ import javax.swing.event.ChangeListener;
|
|||||||
|
|
||||||
import org.hyperion.hypercon.spec.ImageProcessConfig;
|
import org.hyperion.hypercon.spec.ImageProcessConfig;
|
||||||
|
|
||||||
public class ImageProcessPanel extends JPanel implements Observer {
|
public class ImageProcessPanel extends JPanel {
|
||||||
|
|
||||||
private final ImageProcessConfig mProcessConfig;
|
private final ImageProcessConfig mProcessConfig;
|
||||||
|
|
||||||
@ -42,43 +40,41 @@ public class ImageProcessPanel extends JPanel implements Observer {
|
|||||||
mProcessConfig = pProcessConfig;
|
mProcessConfig = pProcessConfig;
|
||||||
|
|
||||||
initialise();
|
initialise();
|
||||||
|
|
||||||
update(mProcessConfig, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialise() {
|
private void initialise() {
|
||||||
mHorizontalDepthLabel = new JLabel("Horizontal depth [%]:");
|
mHorizontalDepthLabel = new JLabel("Horizontal depth [%]:");
|
||||||
add(mHorizontalDepthLabel);
|
add(mHorizontalDepthLabel);
|
||||||
|
|
||||||
mHorizontalDepthSpinner = new JSpinner(new SpinnerNumberModel(5.0, 1.0, 100.0, 1.0));
|
mHorizontalDepthSpinner = new JSpinner(new SpinnerNumberModel(mProcessConfig.mHorizontalDepth*100.0, 1.0, 100.0, 1.0));
|
||||||
mHorizontalDepthSpinner.addChangeListener(mChangeListener);
|
mHorizontalDepthSpinner.addChangeListener(mChangeListener);
|
||||||
add(mHorizontalDepthSpinner);
|
add(mHorizontalDepthSpinner);
|
||||||
|
|
||||||
mVerticalDepthLabel = new JLabel("Vertical depth [%]:");
|
mVerticalDepthLabel = new JLabel("Vertical depth [%]:");
|
||||||
add(mVerticalDepthLabel);
|
add(mVerticalDepthLabel);
|
||||||
|
|
||||||
mVerticalDepthSpinner = new JSpinner(new SpinnerNumberModel(5.0, 1.0, 100.0, 1.0));
|
mVerticalDepthSpinner = new JSpinner(new SpinnerNumberModel(mProcessConfig.mVerticalDepth*100.0, 1.0, 100.0, 1.0));
|
||||||
mVerticalDepthSpinner.addChangeListener(mChangeListener);
|
mVerticalDepthSpinner.addChangeListener(mChangeListener);
|
||||||
add(mVerticalDepthSpinner);
|
add(mVerticalDepthSpinner);
|
||||||
|
|
||||||
mHorizontalGapLabel = new JLabel("Horizontal gap [%]:");
|
mHorizontalGapLabel = new JLabel("Horizontal gap [%]:");
|
||||||
add(mHorizontalGapLabel);
|
add(mHorizontalGapLabel);
|
||||||
|
|
||||||
mHorizontalGapSpinner = new JSpinner(new SpinnerNumberModel(0.0, 0.0, 50.0, 1.0));
|
mHorizontalGapSpinner = new JSpinner(new SpinnerNumberModel(mProcessConfig.mHorizontalGap*100.0, 0.0, 50.0, 1.0));
|
||||||
mHorizontalGapSpinner.addChangeListener(mChangeListener);
|
mHorizontalGapSpinner.addChangeListener(mChangeListener);
|
||||||
add(mHorizontalGapSpinner);
|
add(mHorizontalGapSpinner);
|
||||||
|
|
||||||
mVerticalGapLabel = new JLabel("Vertical gap [%]:");
|
mVerticalGapLabel = new JLabel("Vertical gap [%]:");
|
||||||
add(mVerticalGapLabel);
|
add(mVerticalGapLabel);
|
||||||
|
|
||||||
mVerticalGapSpinner = new JSpinner(new SpinnerNumberModel(0.0, 0.0, 50.0, 1.0));
|
mVerticalGapSpinner = new JSpinner(new SpinnerNumberModel(mProcessConfig.mVerticalGap*100.0, 0.0, 50.0, 1.0));
|
||||||
mVerticalGapSpinner.addChangeListener(mChangeListener);
|
mVerticalGapSpinner.addChangeListener(mChangeListener);
|
||||||
add(mVerticalGapSpinner);
|
add(mVerticalGapSpinner);
|
||||||
|
|
||||||
mOverlapLabel = new JLabel("Overlap [%]:");
|
mOverlapLabel = new JLabel("Overlap [%]:");
|
||||||
add(mOverlapLabel);
|
add(mOverlapLabel);
|
||||||
|
|
||||||
mOverlapSpinner = new JSpinner(new SpinnerNumberModel(0.0, -100.0, 100.0, 1.0));
|
mOverlapSpinner = new JSpinner(new SpinnerNumberModel(mProcessConfig.mOverlapFraction*100.0, -100.0, 100.0, 1.0));
|
||||||
mOverlapSpinner.addChangeListener(mChangeListener);
|
mOverlapSpinner.addChangeListener(mChangeListener);
|
||||||
add(mOverlapSpinner);
|
add(mOverlapSpinner);
|
||||||
|
|
||||||
@ -86,7 +82,7 @@ public class ImageProcessPanel extends JPanel implements Observer {
|
|||||||
add(mBlackborderDetectorLabel);
|
add(mBlackborderDetectorLabel);
|
||||||
|
|
||||||
mBlackborderDetectorCombo = new JComboBox<>(new String[] {"On", "Off"});
|
mBlackborderDetectorCombo = new JComboBox<>(new String[] {"On", "Off"});
|
||||||
mBlackborderDetectorCombo.setSelectedItem("On");
|
mBlackborderDetectorCombo.setSelectedItem(mProcessConfig.mBlackBorderRemoval?"On":"Off");
|
||||||
mBlackborderDetectorCombo.setToolTipText("Enables or disables the blackborder detection and removal");
|
mBlackborderDetectorCombo.setToolTipText("Enables or disables the blackborder detection and removal");
|
||||||
mBlackborderDetectorCombo.addActionListener(mActionListener);
|
mBlackborderDetectorCombo.addActionListener(mActionListener);
|
||||||
add(mBlackborderDetectorCombo);
|
add(mBlackborderDetectorCombo);
|
||||||
@ -141,14 +137,6 @@ public class ImageProcessPanel extends JPanel implements Observer {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(Observable pObs, Object pArg) {
|
|
||||||
if (pObs == mProcessConfig && pArg != this) {
|
|
||||||
mHorizontalDepthSpinner.setValue(mProcessConfig.getHorizontalDepth() * 100.0);
|
|
||||||
mVerticalDepthSpinner.setValue(mProcessConfig.getVerticalDepth() * 100.0);
|
|
||||||
mOverlapSpinner.setValue(mProcessConfig.getOverlapFraction() * 100.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private final ActionListener mActionListener = new ActionListener() {
|
private final ActionListener mActionListener = new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
@ -12,11 +12,14 @@ import javax.swing.SpinnerNumberModel;
|
|||||||
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeEvent;
|
||||||
import javax.swing.event.ChangeListener;
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
|
import org.hyperion.hypercon.spec.DeviceConfig;
|
||||||
import org.hyperion.hypercon.spec.DeviceType;
|
import org.hyperion.hypercon.spec.DeviceType;
|
||||||
import org.hyperion.hypercon.spec.LedFrameConstruction;
|
import org.hyperion.hypercon.spec.LedFrameConstruction;
|
||||||
|
import org.hyperion.hypercon.spec.LedFrameConstruction.Direction;
|
||||||
|
|
||||||
public class LedFramePanel extends JPanel {
|
public class LedFramePanel extends JPanel {
|
||||||
|
|
||||||
|
private final DeviceConfig mDeviceConfig;
|
||||||
private final LedFrameConstruction mLedFrameSpec;
|
private final LedFrameConstruction mLedFrameSpec;
|
||||||
|
|
||||||
private JLabel mTypeLabel;
|
private JLabel mTypeLabel;
|
||||||
@ -41,9 +44,10 @@ public class LedFramePanel extends JPanel {
|
|||||||
private JLabel mOffsetLabel;
|
private JLabel mOffsetLabel;
|
||||||
private JSpinner mOffsetSpinner;
|
private JSpinner mOffsetSpinner;
|
||||||
|
|
||||||
public LedFramePanel(LedFrameConstruction ledFrameSpec) {
|
public LedFramePanel(DeviceConfig pDeviceConfig, LedFrameConstruction ledFrameSpec) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
mDeviceConfig = pDeviceConfig;
|
||||||
mLedFrameSpec = ledFrameSpec;
|
mLedFrameSpec = ledFrameSpec;
|
||||||
|
|
||||||
initialise();
|
initialise();
|
||||||
@ -53,24 +57,28 @@ public class LedFramePanel extends JPanel {
|
|||||||
mTypeLabel = new JLabel("LED Type:");
|
mTypeLabel = new JLabel("LED Type:");
|
||||||
add(mTypeLabel);
|
add(mTypeLabel);
|
||||||
mTypeCombo = new JComboBox<>(DeviceType.values());
|
mTypeCombo = new JComboBox<>(DeviceType.values());
|
||||||
|
mTypeCombo.setSelectedItem(mDeviceConfig.mType);
|
||||||
mTypeCombo.addActionListener(mActionListener);
|
mTypeCombo.addActionListener(mActionListener);
|
||||||
add(mTypeCombo);
|
add(mTypeCombo);
|
||||||
|
|
||||||
mTopCornerLabel = new JLabel("Led in top corners");
|
mTopCornerLabel = new JLabel("Led in top corners");
|
||||||
add(mTopCornerLabel);
|
add(mTopCornerLabel);
|
||||||
mTopCornerCombo = new JComboBox<>(new Boolean[] {true, false});
|
mTopCornerCombo = new JComboBox<>(new Boolean[] {true, false});
|
||||||
|
mTopCornerCombo.setSelectedItem(mLedFrameSpec.topCorners);
|
||||||
mTopCornerCombo.addActionListener(mActionListener);
|
mTopCornerCombo.addActionListener(mActionListener);
|
||||||
add(mTopCornerCombo);
|
add(mTopCornerCombo);
|
||||||
|
|
||||||
mBottomCornerLabel = new JLabel("Led in bottom corners");
|
mBottomCornerLabel = new JLabel("Led in bottom corners");
|
||||||
add(mBottomCornerLabel);
|
add(mBottomCornerLabel);
|
||||||
mBottomCornerCombo = new JComboBox<>(new Boolean[] {true, false});
|
mBottomCornerCombo = new JComboBox<>(new Boolean[] {true, false});
|
||||||
|
mBottomCornerCombo.setSelectedItem(mLedFrameSpec.bottomCorners);
|
||||||
mBottomCornerCombo.addActionListener(mActionListener);
|
mBottomCornerCombo.addActionListener(mActionListener);
|
||||||
add(mBottomCornerCombo);
|
add(mBottomCornerCombo);
|
||||||
|
|
||||||
mDirectionLabel = new JLabel("Direction");
|
mDirectionLabel = new JLabel("Direction");
|
||||||
add(mDirectionLabel);
|
add(mDirectionLabel);
|
||||||
mDirectionCombo = new JComboBox<>(LedFrameConstruction.Direction.values());
|
mDirectionCombo = new JComboBox<>(LedFrameConstruction.Direction.values());
|
||||||
|
mDirectionCombo.setSelectedItem(mLedFrameSpec.clockwiseDirection?Direction.clockwise:Direction.counter_clockwise);
|
||||||
mDirectionCombo.addActionListener(mActionListener);
|
mDirectionCombo.addActionListener(mActionListener);
|
||||||
add(mDirectionCombo);
|
add(mDirectionCombo);
|
||||||
|
|
||||||
@ -151,10 +159,10 @@ public class LedFramePanel extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateLedConstruction() {
|
void updateLedConstruction() {
|
||||||
mLedFrameSpec.topLeftCorner = (Boolean)mTopCornerCombo.getSelectedItem();
|
mDeviceConfig.mType = (DeviceType)mTypeCombo.getSelectedItem();
|
||||||
mLedFrameSpec.topRightCorner = (Boolean)mTopCornerCombo.getSelectedItem();
|
|
||||||
mLedFrameSpec.bottomLeftCorner = (Boolean)mBottomCornerCombo.getSelectedItem();
|
mLedFrameSpec.topCorners = (Boolean)mTopCornerCombo.getSelectedItem();
|
||||||
mLedFrameSpec.bottomRightCorner = (Boolean)mBottomCornerCombo.getSelectedItem();
|
mLedFrameSpec.bottomCorners = (Boolean)mBottomCornerCombo.getSelectedItem();
|
||||||
|
|
||||||
mLedFrameSpec.clockwiseDirection = ((LedFrameConstruction.Direction)mDirectionCombo.getSelectedItem()) == LedFrameConstruction.Direction.clockwise;
|
mLedFrameSpec.clockwiseDirection = ((LedFrameConstruction.Direction)mDirectionCombo.getSelectedItem()) == LedFrameConstruction.Direction.clockwise;
|
||||||
mLedFrameSpec.firstLedOffset = (Integer)mOffsetSpinner.getValue();
|
mLedFrameSpec.firstLedOffset = (Integer)mOffsetSpinner.getValue();
|
||||||
|
@ -80,8 +80,9 @@ public class MiscConfigPanel extends JPanel {
|
|||||||
add(mBootSequenceLabel);
|
add(mBootSequenceLabel);
|
||||||
|
|
||||||
mBootSequenceCombo = new JComboBox<>(BootSequence.values());
|
mBootSequenceCombo = new JComboBox<>(BootSequence.values());
|
||||||
mBootSequenceCombo.setSelectedItem(BootSequence.rainbow);
|
mBootSequenceCombo.setSelectedItem(mMiscConfig.mBootSequence);
|
||||||
mBootSequenceCombo.setToolTipText("The sequence used on startup to verify proper working of all the leds");
|
mBootSequenceCombo.setToolTipText("The sequence used on startup to verify proper working of all the leds");
|
||||||
|
mBootSequenceCombo.addActionListener(mActionListener);
|
||||||
add(mBootSequenceCombo);
|
add(mBootSequenceCombo);
|
||||||
|
|
||||||
layout.setHorizontalGroup(layout.createSequentialGroup()
|
layout.setHorizontalGroup(layout.createSequentialGroup()
|
||||||
|
@ -7,43 +7,43 @@ import java.util.Locale;
|
|||||||
*/
|
*/
|
||||||
public class ColorConfig {
|
public class ColorConfig {
|
||||||
/** The saturation gain (in HSV space) */
|
/** The saturation gain (in HSV space) */
|
||||||
double mSaturationGain = 1.0;
|
public double mSaturationGain = 1.0;
|
||||||
/** The value gain (in HSV space) */
|
/** The value gain (in HSV space) */
|
||||||
double mValueGain = 1.5;
|
public double mValueGain = 1.5;
|
||||||
|
|
||||||
/** The minimum required RED-value (in RGB space) */
|
/** The minimum required RED-value (in RGB space) */
|
||||||
double mRedThreshold = 0.1;
|
public double mRedThreshold = 0.1;
|
||||||
/** The gamma-curve correct for the RED-value (in RGB space) */
|
/** The gamma-curve correct for the RED-value (in RGB space) */
|
||||||
double mRedGamma = 2.0;
|
public double mRedGamma = 2.0;
|
||||||
/** The black-level of the RED-value (in RGB space) */
|
/** The black-level of the RED-value (in RGB space) */
|
||||||
double mRedBlacklevel = 0.0;
|
public double mRedBlacklevel = 0.0;
|
||||||
/** The white-level of the RED-value (in RGB space) */
|
/** The white-level of the RED-value (in RGB space) */
|
||||||
double mRedWhitelevel = 0.8;
|
public double mRedWhitelevel = 0.8;
|
||||||
|
|
||||||
/** The minimum required GREEN-value (in RGB space) */
|
/** The minimum required GREEN-value (in RGB space) */
|
||||||
double mGreenThreshold = 0.1;
|
public double mGreenThreshold = 0.1;
|
||||||
/** The gamma-curve correct for the GREEN-value (in RGB space) */
|
/** The gamma-curve correct for the GREEN-value (in RGB space) */
|
||||||
double mGreenGamma = 2.0;
|
public double mGreenGamma = 2.0;
|
||||||
/** The black-level of the GREEN-value (in RGB space) */
|
/** The black-level of the GREEN-value (in RGB space) */
|
||||||
double mGreenBlacklevel = 0.0;
|
public double mGreenBlacklevel = 0.0;
|
||||||
/** The white-level of the GREEN-value (in RGB space) */
|
/** The white-level of the GREEN-value (in RGB space) */
|
||||||
double mGreenWhitelevel = 1.0;
|
public double mGreenWhitelevel = 1.0;
|
||||||
|
|
||||||
/** The minimum required BLUE-value (in RGB space) */
|
/** The minimum required BLUE-value (in RGB space) */
|
||||||
double mBlueThreshold = 0.1;
|
public double mBlueThreshold = 0.1;
|
||||||
/** The gamma-curve correct for the BLUE-value (in RGB space) */
|
/** The gamma-curve correct for the BLUE-value (in RGB space) */
|
||||||
double mBlueGamma = 2.0;
|
public double mBlueGamma = 2.0;
|
||||||
/** The black-level of the BLUE-value (in RGB space) */
|
/** The black-level of the BLUE-value (in RGB space) */
|
||||||
double mBlueBlacklevel = 0.0;
|
public double mBlueBlacklevel = 0.0;
|
||||||
/** The white-level of the BLUE-value (in RGB space) */
|
/** The white-level of the BLUE-value (in RGB space) */
|
||||||
double mBlueWhitelevel = 1.0;
|
public double mBlueWhitelevel = 1.0;
|
||||||
|
|
||||||
/** The type of smoothing algorithm */
|
/** The type of smoothing algorithm */
|
||||||
ColorSmoothingType mSmoothingType = ColorSmoothingType.none;
|
public ColorSmoothingType mSmoothingType = ColorSmoothingType.none;
|
||||||
/** The time constant for smoothing algorithm in milliseconds */
|
/** The time constant for smoothing algorithm in milliseconds */
|
||||||
int mSmoothingTime = 200;
|
public int mSmoothingTime_ms = 200;
|
||||||
/** The update frequency of the leds in Hz */
|
/** The update frequency of the leds in Hz */
|
||||||
double mSmoothingUpdateFrequency = 20.0;
|
public double mSmoothingUpdateFrequency_Hz = 20.0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the JSON string of the configuration as used in the Hyperion daemon configfile
|
* Creates the JSON string of the configuration as used in the Hyperion daemon configfile
|
||||||
@ -138,8 +138,8 @@ public class ColorConfig {
|
|||||||
strBuf.append("\t\t\"smoothing\" :\n");
|
strBuf.append("\t\t\"smoothing\" :\n");
|
||||||
strBuf.append("\t\t{\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\"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\"time_ms\" : %d,\n", mSmoothingTime_ms));
|
||||||
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"updateFrequency\" : %.4f\n", mSmoothingUpdateFrequency));
|
strBuf.append(String.format(Locale.ROOT, "\t\t\t\"updateFrequency\" : %.4f\n", mSmoothingUpdateFrequency_Hz));
|
||||||
|
|
||||||
strBuf.append("\t\t}");
|
strBuf.append("\t\t}");
|
||||||
return strBuf.toString();
|
return strBuf.toString();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package org.hyperion.hypercon.spec;
|
package org.hyperion.hypercon.spec;
|
||||||
|
|
||||||
enum ColorSmoothingType {
|
public enum ColorSmoothingType {
|
||||||
/** No smoothing in the time domain */
|
/** No smoothing in the time domain */
|
||||||
none("None"),
|
none("None"),
|
||||||
|
|
||||||
|
@ -1,20 +1,21 @@
|
|||||||
package org.hyperion.hypercon.spec;
|
package org.hyperion.hypercon.spec;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The device specific configuration
|
* The device specific configuration
|
||||||
*/
|
*/
|
||||||
public class DeviceConfig {
|
public class DeviceConfig {
|
||||||
|
|
||||||
/** The name of the device */
|
/** The name of the device */
|
||||||
String mName = "MyPi";
|
public String mName = "MyPi";
|
||||||
/** The type specification of the device */
|
/** The type specification of the device */
|
||||||
DeviceType mType = DeviceType.ws2801;
|
public DeviceType mType = DeviceType.ws2801;
|
||||||
/** The device 'file' name */
|
/** The device 'file' name */
|
||||||
String mOutput = "/dev/spidev0.0";
|
public String mOutput = "/dev/spidev0.0";
|
||||||
/** The baudrate of the device */
|
/** The baudrate of the device */
|
||||||
int mBaudrate = 1000000;
|
public int mBaudrate = 1000000;
|
||||||
/** Flag indicating if the red and blue should be reversed */
|
/** Ordering of the rgb-color channels */
|
||||||
boolean mBgrOutput = false;
|
public RgbByteOrder mRgbByteOrder = RgbByteOrder.rbg;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the JSON string of the configuration as used in the Hyperion daemon configfile
|
* Creates the JSON string of the configuration as used in the Hyperion daemon configfile
|
||||||
@ -31,7 +32,7 @@ public class DeviceConfig {
|
|||||||
strBuf.append("\t/// - 'ws2801' this is the device (eg '/dev/spidev0.0')\n");
|
strBuf.append("\t/// - 'ws2801' this is the device (eg '/dev/spidev0.0')\n");
|
||||||
strBuf.append("\t/// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out')\n");
|
strBuf.append("\t/// - 'test' this is the file used to write test output (eg '/home/pi/hyperion.out')\n");
|
||||||
strBuf.append("\t/// * 'rate' : The baudrate of the output to the device (only applicable for 'ws2801')\n");
|
strBuf.append("\t/// * 'rate' : The baudrate of the output to the device (only applicable for 'ws2801')\n");
|
||||||
strBuf.append("\t/// * 'bgr-output' : Use BGR output instead of RGB (reverse red and blue).\n");
|
strBuf.append("\t/// * 'colorOrder' : The order of the byte color channel (rgb, rbg, bgr, brg, gbr, grb).\n");
|
||||||
|
|
||||||
strBuf.append("\t\"device\" :\n");
|
strBuf.append("\t\"device\" :\n");
|
||||||
strBuf.append("\t{\n");
|
strBuf.append("\t{\n");
|
||||||
@ -40,7 +41,7 @@ public class DeviceConfig {
|
|||||||
strBuf.append("\t\t\"type\" : \"").append(mType.name()).append("\",\n");
|
strBuf.append("\t\t\"type\" : \"").append(mType.name()).append("\",\n");
|
||||||
strBuf.append("\t\t\"output\" : \"").append(mOutput).append("\",\n");
|
strBuf.append("\t\t\"output\" : \"").append(mOutput).append("\",\n");
|
||||||
strBuf.append("\t\t\"rate\" : ").append(mBaudrate).append(",\n");
|
strBuf.append("\t\t\"rate\" : ").append(mBaudrate).append(",\n");
|
||||||
strBuf.append("\t\t\"bgr-output\" : ").append(mBgrOutput).append("\n");
|
strBuf.append("\t\t\"colorOrder\" : ").append(mRgbByteOrder.name()).append("\n");
|
||||||
|
|
||||||
strBuf.append("\t}");
|
strBuf.append("\t}");
|
||||||
|
|
||||||
|
@ -13,20 +13,20 @@ import org.hyperion.hypercon.LedFrameFactory;
|
|||||||
public class ImageProcessConfig extends Observable {
|
public class ImageProcessConfig extends Observable {
|
||||||
|
|
||||||
/** The 'integration depth' of the leds along the horizontal axis of the tv */
|
/** The 'integration depth' of the leds along the horizontal axis of the tv */
|
||||||
private double mHorizontalDepth = 0.08;
|
public double mHorizontalDepth = 0.08;
|
||||||
/** The 'integration depth' of the leds along the vertical axis of the tv */
|
/** The 'integration depth' of the leds along the vertical axis of the tv */
|
||||||
private double mVerticalDepth = 0.05;
|
public double mVerticalDepth = 0.05;
|
||||||
|
|
||||||
/** The gap between the border integration area for the horizontal leds */
|
/** The gap between the border integration area for the horizontal leds */
|
||||||
private double mHorizontalGap = 0.0;
|
public double mHorizontalGap = 0.0;
|
||||||
/** The gap between the border integration area for the vertical leds */
|
/** The gap between the border integration area for the vertical leds */
|
||||||
private double mVerticalGap = 0.0;
|
public double mVerticalGap = 0.0;
|
||||||
|
|
||||||
/** The fraction of overlap from one to another led */
|
/** The fraction of overlap from one to another led */
|
||||||
private double mOverlapFraction = 0.0;
|
public double mOverlapFraction = 0.0;
|
||||||
|
|
||||||
/** Flag indicating that black borders are excluded in the image processing */
|
/** Flag indicating that black borders are excluded in the image processing */
|
||||||
private boolean mBlackBorderRemoval = true;
|
public boolean mBlackBorderRemoval = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the horizontal depth (top and bottom) of the image integration as a fraction of the
|
* Returns the horizontal depth (top and bottom) of the image integration as a fraction of the
|
||||||
|
@ -21,14 +21,10 @@ public class LedFrameConstruction extends Observable {
|
|||||||
/** True if the leds are organised clockwise else false (counter clockwise) */
|
/** True if the leds are organised clockwise else false (counter clockwise) */
|
||||||
public boolean clockwiseDirection = true;
|
public boolean clockwiseDirection = true;
|
||||||
|
|
||||||
/** True if the top left corner has a led else false */
|
/** True if the top corners have a led else false */
|
||||||
public boolean topLeftCorner = true;
|
public boolean topCorners = true;
|
||||||
/** True if the top right corner has a led else false */
|
/** True if the bottom corners have a led else false */
|
||||||
public boolean topRightCorner = true;
|
public boolean bottomCorners = true;
|
||||||
/** True if the bottom left corner has a led else false */
|
|
||||||
public boolean bottomLeftCorner = true;
|
|
||||||
/** True if the bottom right corner has a led else false */
|
|
||||||
public boolean bottomRightCorner = true;
|
|
||||||
|
|
||||||
/** The number of leds between the top-left corner and the top-right corner of the screen
|
/** The number of leds between the top-left corner and the top-right corner of the screen
|
||||||
(excluding the corner leds) */
|
(excluding the corner leds) */
|
||||||
@ -54,10 +50,8 @@ public class LedFrameConstruction extends Observable {
|
|||||||
*/
|
*/
|
||||||
public int getLedCount() {
|
public int getLedCount() {
|
||||||
int cornerLedCnt = 0;
|
int cornerLedCnt = 0;
|
||||||
if (topLeftCorner) ++cornerLedCnt;
|
if (topCorners) cornerLedCnt+=2;
|
||||||
if (topRightCorner) ++cornerLedCnt;
|
if (bottomCorners) cornerLedCnt+=2;
|
||||||
if (bottomLeftCorner) ++cornerLedCnt;
|
|
||||||
if (bottomRightCorner) ++cornerLedCnt;
|
|
||||||
|
|
||||||
return topLedCnt + bottomLedCnt + leftLedCnt + rightLedCnt + cornerLedCnt;
|
return topLedCnt + bottomLedCnt + leftLedCnt + rightLedCnt + cornerLedCnt;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package org.hyperion.hypercon.spec;
|
||||||
|
|
||||||
|
public enum RgbByteOrder {
|
||||||
|
rgb,
|
||||||
|
rbg,
|
||||||
|
grb,
|
||||||
|
gbr,
|
||||||
|
brg,
|
||||||
|
bgr;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
package org.hyperion.hypercon.test;
|
||||||
|
|
||||||
|
import org.hyperion.hypercon.ConfigurationFile;
|
||||||
|
import org.hyperion.hypercon.spec.ColorConfig;
|
||||||
|
import org.hyperion.hypercon.spec.DeviceConfig;
|
||||||
|
import org.hyperion.hypercon.spec.DeviceType;
|
||||||
|
import org.hyperion.hypercon.spec.ImageProcessConfig;
|
||||||
|
import org.hyperion.hypercon.spec.LedFrameConstruction;
|
||||||
|
import org.hyperion.hypercon.spec.MiscConfig;
|
||||||
|
import org.hyperion.hypercon.spec.RgbByteOrder;
|
||||||
|
|
||||||
|
public class TesConfigWriter {
|
||||||
|
|
||||||
|
public static void main(String[] pArgs) {
|
||||||
|
DeviceConfig deviceConfig = new DeviceConfig();
|
||||||
|
LedFrameConstruction frameConfig = new LedFrameConstruction();
|
||||||
|
ColorConfig colorConfig = new ColorConfig();
|
||||||
|
ImageProcessConfig imageConfig = new ImageProcessConfig();
|
||||||
|
MiscConfig miscConfig = new MiscConfig();
|
||||||
|
|
||||||
|
deviceConfig.mBaudrate = 4800;
|
||||||
|
deviceConfig.mRgbByteOrder = RgbByteOrder.bgr;
|
||||||
|
deviceConfig.mName = "DAG";
|
||||||
|
deviceConfig.mOutput = "/dev/null";
|
||||||
|
deviceConfig.mType = DeviceType.ldp6803;
|
||||||
|
|
||||||
|
|
||||||
|
ConfigurationFile configFile = new ConfigurationFile();
|
||||||
|
configFile.store(deviceConfig);
|
||||||
|
configFile.store(frameConfig);
|
||||||
|
configFile.store(colorConfig);
|
||||||
|
configFile.store(imageConfig);
|
||||||
|
configFile.store(miscConfig);
|
||||||
|
configFile.save("./HyperCon.dat");
|
||||||
|
|
||||||
|
ConfigurationFile configFile2 = new ConfigurationFile();
|
||||||
|
configFile2.load("./HyperCon.dat");
|
||||||
|
configFile2.restore(deviceConfig);
|
||||||
|
configFile2.restore(frameConfig);
|
||||||
|
configFile2.restore(colorConfig);
|
||||||
|
configFile2.restore(imageConfig);
|
||||||
|
configFile2.restore(miscConfig);
|
||||||
|
|
||||||
|
System.out.println(configFile2);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user