mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	Added persistent file for configured settings.
Former-commit-id: dd14b9975c09ad50781eb947483069b65e1a5c35
This commit is contained in:
		
							
								
								
									
										1
									
								
								src/config-tool/ConfigTool/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/config-tool/ConfigTool/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,3 @@ | ||||
| /.settings | ||||
| /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) | ||||
| 		if (frameSpec.topLeftCorner) { | ||||
| 		if (frameSpec.topCorners) { | ||||
| 			mLeds.add(createLed(frameSpec, processConfig, iLed, 0.0, 0.0, processConfig.getOverlapFraction(), BorderSide.top_left)); | ||||
| 			iLed = increase(frameSpec, iLed); | ||||
| 		} | ||||
| @@ -83,7 +83,7 @@ public class LedFrameFactory { | ||||
| 		} | ||||
| 		 | ||||
| 		// 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)); | ||||
| 			iLed = increase(frameSpec, iLed); | ||||
| 		} | ||||
| @@ -106,7 +106,7 @@ public class LedFrameFactory { | ||||
| 		} | ||||
| 		 | ||||
| 		// 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)); | ||||
| 			iLed = increase(frameSpec, iLed); | ||||
| 		} | ||||
| @@ -133,7 +133,7 @@ public class LedFrameFactory { | ||||
| 		} | ||||
| 		 | ||||
| 		// 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)); | ||||
| 			iLed = increase(frameSpec, iLed); | ||||
| 		} | ||||
|   | ||||
| @@ -1,5 +1,9 @@ | ||||
| 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.JFrame; | ||||
| import javax.swing.UIManager; | ||||
| @@ -11,6 +15,7 @@ import org.hyperion.hypercon.gui.ConfigPanel; | ||||
|  * JAVA application (contains the entry-point). | ||||
|  */ | ||||
| public class Main { | ||||
| 	public static final String configFilename = "hyerpcon.dat"; | ||||
|  | ||||
| 	/** | ||||
| 	 * Entry point to start HyperCon  | ||||
| @@ -18,6 +23,8 @@ public class Main { | ||||
| 	 * @param pArgs HyperCon does not have command line arguments | ||||
| 	 */ | ||||
| 	public static void main(String[] pArgs) { | ||||
| 		final LedString ledString = new LedString(); | ||||
| 		 | ||||
| 		try { | ||||
| 			// Configure swing to use the system default look and feel | ||||
| 			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); | ||||
| @@ -29,9 +36,31 @@ public class Main { | ||||
| 		frame.setSize(1300, 700); | ||||
| 		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); | ||||
| 		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 | ||||
| 		frame.setContentPane(new ConfigPanel()); | ||||
| 		frame.setContentPane(new ConfigPanel(ledString)); | ||||
| 		 | ||||
| 		// Show the frame | ||||
| 		frame.setVisible(true); | ||||
|   | ||||
| @@ -7,6 +7,10 @@ import javax.swing.JLabel; | ||||
| import javax.swing.JPanel; | ||||
| import javax.swing.JSpinner; | ||||
| 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. | ||||
| @@ -14,6 +18,9 @@ import javax.swing.SpinnerNumberModel; | ||||
|  * NB This has not been integrated in the GUI jet! | ||||
|  */ | ||||
| public class ColorConfigPanel extends JPanel { | ||||
| 	 | ||||
| 	private final ColorConfig mColorConfig; | ||||
| 	 | ||||
| 	private JPanel mRgbTransformPanel; | ||||
| 	private JLabel mThresholdLabel; | ||||
| 	private JLabel mGammaLabel; | ||||
| @@ -41,9 +48,11 @@ public class ColorConfigPanel extends JPanel { | ||||
| 	private JLabel mValueAdjustLabel; | ||||
| 	private JSpinner mValueAdjustSpinner; | ||||
|  | ||||
| 	public ColorConfigPanel() { | ||||
| 	public ColorConfigPanel(ColorConfig pColorConfig) { | ||||
| 		super(); | ||||
| 		 | ||||
| 		mColorConfig = pColorConfig; | ||||
| 		 | ||||
| 		initialise(); | ||||
| 	} | ||||
| 	 | ||||
| @@ -75,35 +84,47 @@ public class ColorConfigPanel extends JPanel { | ||||
| 			 | ||||
| 			mRedTransformLabel = new JLabel("RED"); | ||||
| 			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); | ||||
| 			mRedGammaSpinner = new JSpinner(new SpinnerNumberModel()); | ||||
| 			mRedGammaSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mRedGamma, 0.0, 100.0, 0.1)); | ||||
| 			mRedThresholdSpinner.addChangeListener(mChangeListener); | ||||
| 			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); | ||||
| 			mRedWhitelevelSpinner = new JSpinner(new SpinnerNumberModel()); | ||||
| 			mRedWhitelevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mRedWhitelevel, 0.0, 1.0, 0.1)); | ||||
| 			mRedThresholdSpinner.addChangeListener(mChangeListener); | ||||
| 			mRgbTransformPanel.add(mRedWhitelevelSpinner); | ||||
| 			 | ||||
| 			mGreenTransformLabel = new JLabel("GREEN"); | ||||
| 			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); | ||||
| 			mGreenGammaSpinner = new JSpinner(new SpinnerNumberModel()); | ||||
| 			mGreenGammaSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mGreenGamma, 0.0, 100.0, 0.1)); | ||||
| 			mGreenGammaSpinner.addChangeListener(mChangeListener); | ||||
| 			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); | ||||
| 			mGreenWhitelevelSpinner = new JSpinner(new SpinnerNumberModel()); | ||||
| 			mGreenWhitelevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mGreenWhitelevel, 0.0, 1.0, 0.1)); | ||||
| 			mGreenWhitelevelSpinner.addChangeListener(mChangeListener); | ||||
| 			mRgbTransformPanel.add(mGreenWhitelevelSpinner); | ||||
|  | ||||
| 			mBlueTransformLabel = new JLabel("BLUE"); | ||||
| 			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); | ||||
| 			mBlueGammaSpinner = new JSpinner(new SpinnerNumberModel()); | ||||
| 			mBlueGammaSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mBlueGamma, 0.0, 100.0, 0.1)); | ||||
| 			mBlueGammaSpinner.addChangeListener(mChangeListener); | ||||
| 			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); | ||||
| 			mBlueWhitelevelSpinner = new JSpinner(new SpinnerNumberModel()); | ||||
| 			mBlueWhitelevelSpinner = new JSpinner(new SpinnerNumberModel(mColorConfig.mBlueWhitelevel, 0.0, 1.0, 0.1)); | ||||
| 			mBlueWhitelevelSpinner.addChangeListener(mChangeListener); | ||||
| 			mRgbTransformPanel.add(mBlueWhitelevelSpinner); | ||||
| 			 | ||||
| 			layout.setHorizontalGroup(layout.createSequentialGroup() | ||||
| @@ -177,13 +198,15 @@ public class ColorConfigPanel extends JPanel { | ||||
| 			mSaturationAdjustLabel = new JLabel("Saturation"); | ||||
| 			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); | ||||
| 			 | ||||
| 			mValueAdjustLabel = new JLabel("Value"); | ||||
| 			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); | ||||
|  | ||||
| 			layout.setHorizontalGroup(layout.createSequentialGroup() | ||||
| @@ -211,4 +234,26 @@ public class ColorConfigPanel extends JPanel { | ||||
| 		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.JPanel; | ||||
|  | ||||
| import org.hyperion.hypercon.ConfigurationFile; | ||||
| import org.hyperion.hypercon.LedFrameFactory; | ||||
| 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  | ||||
| @@ -24,7 +26,7 @@ import org.hyperion.hypercon.LedString; | ||||
| public class ConfigPanel extends JPanel { | ||||
|  | ||||
| 	/** The LED configuration information*/ | ||||
| 	private final LedString ledString = new LedString(); | ||||
| 	private final LedString ledString; | ||||
| 	 | ||||
| 	/** Action for write the Hyperion deamon configuration file */ | ||||
| 	private final Action mSaveConfigAction = new AbstractAction("Create Hyperion Configuration") { | ||||
| @@ -37,6 +39,14 @@ public class ConfigPanel extends JPanel { | ||||
|  | ||||
| 			try { | ||||
| 				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) { | ||||
| 				// TODO Auto-generated catch block | ||||
| 				e1.printStackTrace(); | ||||
| @@ -67,9 +77,11 @@ public class ConfigPanel extends JPanel { | ||||
| 	/** | ||||
| 	 * Constructs the configuration panel with a default initialised led-frame and configuration | ||||
| 	 */ | ||||
| 	public ConfigPanel() { | ||||
| 	public ConfigPanel(final LedString pLedString) { | ||||
| 		super(); | ||||
| 		 | ||||
| 		ledString = pLedString; | ||||
| 		 | ||||
| 		initialise(); | ||||
| 		 | ||||
| 		// Compute the individual leds for the current configuration | ||||
| @@ -121,7 +133,7 @@ public class ConfigPanel extends JPanel { | ||||
| 			mSpecificationPanel = new JPanel(); | ||||
| 			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")); | ||||
| 			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.ActionListener; | ||||
| import java.util.Observable; | ||||
| import java.util.Observer; | ||||
|  | ||||
| import javax.swing.GroupLayout; | ||||
| import javax.swing.JComboBox; | ||||
| @@ -16,7 +14,7 @@ import javax.swing.event.ChangeListener; | ||||
|  | ||||
| import org.hyperion.hypercon.spec.ImageProcessConfig; | ||||
|  | ||||
| public class ImageProcessPanel extends JPanel implements Observer { | ||||
| public class ImageProcessPanel extends JPanel { | ||||
| 	 | ||||
| 	private final ImageProcessConfig mProcessConfig; | ||||
| 	 | ||||
| @@ -42,43 +40,41 @@ public class ImageProcessPanel extends JPanel implements Observer { | ||||
| 		mProcessConfig = pProcessConfig; | ||||
| 		 | ||||
| 		initialise(); | ||||
| 		 | ||||
| 		update(mProcessConfig, null); | ||||
| 	} | ||||
| 	 | ||||
| 	private void initialise() { | ||||
| 		mHorizontalDepthLabel = new JLabel("Horizontal depth [%]:"); | ||||
| 		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); | ||||
| 		add(mHorizontalDepthSpinner); | ||||
|  | ||||
| 		mVerticalDepthLabel = new JLabel("Vertical depth [%]:"); | ||||
| 		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); | ||||
| 		add(mVerticalDepthSpinner); | ||||
|  | ||||
| 		mHorizontalGapLabel = new JLabel("Horizontal gap [%]:"); | ||||
| 		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); | ||||
| 		add(mHorizontalGapSpinner); | ||||
|  | ||||
| 		mVerticalGapLabel = new JLabel("Vertical gap [%]:"); | ||||
| 		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); | ||||
| 		add(mVerticalGapSpinner); | ||||
|  | ||||
| 		mOverlapLabel = new JLabel("Overlap [%]:"); | ||||
| 		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); | ||||
| 		add(mOverlapSpinner); | ||||
| 		 | ||||
| @@ -86,7 +82,7 @@ public class ImageProcessPanel extends JPanel implements Observer { | ||||
| 		add(mBlackborderDetectorLabel); | ||||
| 		 | ||||
| 		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.addActionListener(mActionListener); | ||||
| 		add(mBlackborderDetectorCombo); | ||||
| @@ -140,15 +136,7 @@ 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() { | ||||
| 		@Override | ||||
| 		public void actionPerformed(ActionEvent e) { | ||||
|   | ||||
| @@ -12,11 +12,14 @@ import javax.swing.SpinnerNumberModel; | ||||
| import javax.swing.event.ChangeEvent; | ||||
| import javax.swing.event.ChangeListener; | ||||
|  | ||||
| import org.hyperion.hypercon.spec.DeviceConfig; | ||||
| import org.hyperion.hypercon.spec.DeviceType; | ||||
| import org.hyperion.hypercon.spec.LedFrameConstruction; | ||||
| import org.hyperion.hypercon.spec.LedFrameConstruction.Direction; | ||||
|  | ||||
| public class LedFramePanel extends JPanel { | ||||
| 	 | ||||
| 	private final DeviceConfig mDeviceConfig; | ||||
| 	private final LedFrameConstruction mLedFrameSpec; | ||||
| 	 | ||||
| 	private JLabel mTypeLabel; | ||||
| @@ -41,9 +44,10 @@ public class LedFramePanel extends JPanel { | ||||
| 	private JLabel mOffsetLabel; | ||||
| 	private JSpinner mOffsetSpinner; | ||||
| 	 | ||||
| 	public LedFramePanel(LedFrameConstruction ledFrameSpec) { | ||||
| 	public LedFramePanel(DeviceConfig pDeviceConfig, LedFrameConstruction ledFrameSpec) { | ||||
| 		super(); | ||||
| 		 | ||||
| 		mDeviceConfig = pDeviceConfig; | ||||
| 		mLedFrameSpec = ledFrameSpec; | ||||
| 		 | ||||
| 		initialise(); | ||||
| @@ -53,24 +57,28 @@ public class LedFramePanel extends JPanel { | ||||
| 		mTypeLabel = new JLabel("LED Type:"); | ||||
| 		add(mTypeLabel); | ||||
| 		mTypeCombo = new JComboBox<>(DeviceType.values()); | ||||
| 		mTypeCombo.setSelectedItem(mDeviceConfig.mType); | ||||
| 		mTypeCombo.addActionListener(mActionListener); | ||||
| 		add(mTypeCombo); | ||||
| 		 | ||||
| 		mTopCornerLabel = new JLabel("Led in top corners"); | ||||
| 		add(mTopCornerLabel); | ||||
| 		mTopCornerCombo = new JComboBox<>(new Boolean[] {true, false}); | ||||
| 		mTopCornerCombo.setSelectedItem(mLedFrameSpec.topCorners); | ||||
| 		mTopCornerCombo.addActionListener(mActionListener); | ||||
| 		add(mTopCornerCombo); | ||||
| 		 | ||||
| 		mBottomCornerLabel = new JLabel("Led in bottom corners"); | ||||
| 		add(mBottomCornerLabel); | ||||
| 		mBottomCornerCombo = new JComboBox<>(new Boolean[] {true, false}); | ||||
| 		mBottomCornerCombo.setSelectedItem(mLedFrameSpec.bottomCorners); | ||||
| 		mBottomCornerCombo.addActionListener(mActionListener); | ||||
| 		add(mBottomCornerCombo); | ||||
| 		 | ||||
| 		mDirectionLabel = new JLabel("Direction"); | ||||
| 		add(mDirectionLabel); | ||||
| 		mDirectionCombo = new JComboBox<>(LedFrameConstruction.Direction.values()); | ||||
| 		mDirectionCombo.setSelectedItem(mLedFrameSpec.clockwiseDirection?Direction.clockwise:Direction.counter_clockwise); | ||||
| 		mDirectionCombo.addActionListener(mActionListener); | ||||
| 		add(mDirectionCombo); | ||||
|  | ||||
| @@ -151,10 +159,10 @@ public class LedFramePanel extends JPanel { | ||||
| 	} | ||||
| 	 | ||||
| 	void updateLedConstruction() { | ||||
| 		mLedFrameSpec.topLeftCorner  = (Boolean)mTopCornerCombo.getSelectedItem(); | ||||
| 		mLedFrameSpec.topRightCorner = (Boolean)mTopCornerCombo.getSelectedItem(); | ||||
| 		mLedFrameSpec.bottomLeftCorner  = (Boolean)mBottomCornerCombo.getSelectedItem(); | ||||
| 		mLedFrameSpec.bottomRightCorner = (Boolean)mBottomCornerCombo.getSelectedItem(); | ||||
| 		mDeviceConfig.mType = (DeviceType)mTypeCombo.getSelectedItem(); | ||||
| 		 | ||||
| 		mLedFrameSpec.topCorners    = (Boolean)mTopCornerCombo.getSelectedItem(); | ||||
| 		mLedFrameSpec.bottomCorners = (Boolean)mBottomCornerCombo.getSelectedItem(); | ||||
| 		 | ||||
| 		mLedFrameSpec.clockwiseDirection = ((LedFrameConstruction.Direction)mDirectionCombo.getSelectedItem()) == LedFrameConstruction.Direction.clockwise; | ||||
| 		mLedFrameSpec.firstLedOffset = (Integer)mOffsetSpinner.getValue(); | ||||
|   | ||||
| @@ -80,8 +80,9 @@ public class MiscConfigPanel extends JPanel { | ||||
| 		add(mBootSequenceLabel); | ||||
| 		 | ||||
| 		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.addActionListener(mActionListener); | ||||
| 		add(mBootSequenceCombo); | ||||
| 		 | ||||
| 		layout.setHorizontalGroup(layout.createSequentialGroup() | ||||
|   | ||||
| @@ -7,43 +7,43 @@ import java.util.Locale; | ||||
|  */ | ||||
| public class ColorConfig { | ||||
| 	/** The saturation gain (in HSV space) */ | ||||
| 	double mSaturationGain = 1.0; | ||||
| 	public double mSaturationGain = 1.0; | ||||
| 	/** The value gain (in HSV space) */ | ||||
| 	double mValueGain = 1.5; | ||||
| 	public double mValueGain = 1.5; | ||||
| 	 | ||||
| 	/** 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) */ | ||||
| 	double mRedGamma      = 2.0; | ||||
| 	public double mRedGamma      = 2.0; | ||||
| 	/** 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) */ | ||||
| 	double mRedWhitelevel = 0.8; | ||||
| 	public double mRedWhitelevel = 0.8; | ||||
| 	 | ||||
| 	/** 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) */ | ||||
| 	double mGreenGamma      = 2.0; | ||||
| 	public double mGreenGamma      = 2.0; | ||||
| 	/** 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) */ | ||||
| 	double mGreenWhitelevel = 1.0; | ||||
| 	public double mGreenWhitelevel = 1.0; | ||||
| 	 | ||||
| 	/** 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) */ | ||||
| 	double mBlueGamma      = 2.0; | ||||
| 	public double mBlueGamma      = 2.0; | ||||
| 	/** 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) */ | ||||
| 	double mBlueWhitelevel = 1.0; | ||||
| 	public double mBlueWhitelevel = 1.0; | ||||
| 	 | ||||
| 	/** The type of smoothing algorithm */ | ||||
| 	ColorSmoothingType mSmoothingType = ColorSmoothingType.none; | ||||
| 	public ColorSmoothingType mSmoothingType = ColorSmoothingType.none; | ||||
| 	/** The time constant for smoothing algorithm in milliseconds */ | ||||
| 	int mSmoothingTime = 200; | ||||
| 	public int mSmoothingTime_ms = 200; | ||||
| 	/** 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 | ||||
| @@ -138,8 +138,8 @@ public class ColorConfig { | ||||
| 		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(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_Hz)); | ||||
| 		 | ||||
| 		strBuf.append("\t\t}"); | ||||
| 		return strBuf.toString(); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package org.hyperion.hypercon.spec; | ||||
|  | ||||
| enum ColorSmoothingType { | ||||
| public enum ColorSmoothingType { | ||||
| 	/** No smoothing in the time domain */ | ||||
| 	none("None"), | ||||
| 	 | ||||
|   | ||||
| @@ -1,20 +1,21 @@ | ||||
| package org.hyperion.hypercon.spec; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * The device specific configuration | ||||
|  */ | ||||
| public class DeviceConfig { | ||||
|  | ||||
| 	/** The name of the device */ | ||||
| 	String mName     = "MyPi"; | ||||
| 	public String mName       = "MyPi"; | ||||
| 	/** The type specification of the device */ | ||||
| 	DeviceType mType = DeviceType.ws2801; | ||||
| 	public DeviceType mType   = DeviceType.ws2801; | ||||
| 	/** The device 'file' name */ | ||||
| 	String mOutput   = "/dev/spidev0.0"; | ||||
| 	public String mOutput     = "/dev/spidev0.0"; | ||||
| 	/** The baudrate of the device */ | ||||
| 	int mBaudrate    = 1000000; | ||||
| 	/** Flag indicating if the red and blue should be reversed */ | ||||
| 	boolean mBgrOutput = false; | ||||
| 	public int mBaudrate      = 1000000; | ||||
| 	/** Ordering of the rgb-color channels */ | ||||
| 	public RgbByteOrder mRgbByteOrder = RgbByteOrder.rbg; | ||||
| 	 | ||||
| 	/** | ||||
| 	 * 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///                  - '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/// * '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{\n"); | ||||
| @@ -40,7 +41,7 @@ public class DeviceConfig { | ||||
| 		strBuf.append("\t\t\"type\"       : \"").append(mType.name()).append("\",\n"); | ||||
| 		strBuf.append("\t\t\"output\"     : \"").append(mOutput).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}"); | ||||
| 		 | ||||
|   | ||||
| @@ -13,20 +13,20 @@ import org.hyperion.hypercon.LedFrameFactory; | ||||
| public class ImageProcessConfig extends Observable { | ||||
| 	 | ||||
| 	/** 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 */ | ||||
| 	private double mVerticalDepth   = 0.05; | ||||
| 	public double mVerticalDepth   = 0.05; | ||||
| 	 | ||||
| 	/** 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 */ | ||||
| 	private double mVerticalGap = 0.0; | ||||
| 	public double mVerticalGap = 0.0; | ||||
|  | ||||
| 	/** 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 */ | ||||
| 	private boolean mBlackBorderRemoval = true; | ||||
| 	public boolean mBlackBorderRemoval = true; | ||||
| 	 | ||||
| 	/** | ||||
| 	 * 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) */ | ||||
| 	public boolean clockwiseDirection = true; | ||||
| 	 | ||||
| 	/** True if the top left corner has a led else false */ | ||||
| 	public boolean topLeftCorner = true; | ||||
| 	/** True if the top right corner has a led else false */ | ||||
| 	public boolean topRightCorner = 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; | ||||
| 	/** True if the top corners have a led else false */ | ||||
| 	public boolean topCorners = true; | ||||
| 	/** True if the bottom corners have a led else false */ | ||||
| 	public boolean bottomCorners = true; | ||||
| 	 | ||||
| 	/** The number of leds between the top-left corner and the top-right corner of the screen  | ||||
| 		(excluding the corner leds) */ | ||||
| @@ -54,10 +50,8 @@ public class LedFrameConstruction extends Observable { | ||||
| 	 */ | ||||
| 	public int getLedCount() { | ||||
| 		int cornerLedCnt = 0; | ||||
| 		if (topLeftCorner)     ++cornerLedCnt; | ||||
| 		if (topRightCorner)    ++cornerLedCnt; | ||||
| 		if (bottomLeftCorner)  ++cornerLedCnt; | ||||
| 		if (bottomRightCorner) ++cornerLedCnt; | ||||
| 		if (topCorners)     cornerLedCnt+=2; | ||||
| 		if (bottomCorners)  cornerLedCnt+=2; | ||||
| 		 | ||||
| 		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); | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user