diff options
| author | Keith Packard <keithp@keithp.com> | 2010-08-22 23:05:20 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2010-08-22 23:05:20 -0700 | 
| commit | 953bc3438b10b21f3d65d292356c4ab2de23cddd (patch) | |
| tree | 734b5d31700e93f462e19e0076df1f0956d5a581 /ao-tools | |
| parent | e1463d8e265dfd42c824d90088cd2a51b4cf8131 (diff) | |
altosui: Add TeleMetrum configuration
This presents a dialog with all of the user-settable options in the
TeleMetrum set for editing. Combo boxes are used for everything except
the callsign.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools')
| -rw-r--r-- | ao-tools/altosui/AltosChannelMenu.java | 70 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosConfig.java | 264 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosConfigUI.java | 423 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosUI.java | 33 | ||||
| -rw-r--r-- | ao-tools/altosui/Makefile | 5 | 
5 files changed, 779 insertions, 16 deletions
| diff --git a/ao-tools/altosui/AltosChannelMenu.java b/ao-tools/altosui/AltosChannelMenu.java new file mode 100644 index 00000000..504c13c6 --- /dev/null +++ b/ao-tools/altosui/AltosChannelMenu.java @@ -0,0 +1,70 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package altosui; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.*; +import java.io.*; +import java.util.*; +import java.text.*; +import java.util.prefs.*; +import java.util.concurrent.LinkedBlockingQueue; + +public class AltosChannelMenu extends JMenu implements ActionListener { +	ButtonGroup			group; +	int				channel; +	LinkedList<ActionListener>	listeners; + +	public void addActionListener(ActionListener l) { +		listeners.add(l); +	} + +	public void actionPerformed(ActionEvent e) { +		channel = Integer.parseInt(e.getActionCommand()); + +		ListIterator<ActionListener>	i = listeners.listIterator(); + +		ActionEvent newe = new ActionEvent(this, channel, e.getActionCommand()); +		while (i.hasNext()) { +			ActionListener	listener = i.next(); +			listener.actionPerformed(newe); +		} +	} + +	public AltosChannelMenu(int current_channel) { +		super("Channel", true); +		group = new ButtonGroup(); + +		channel = current_channel; + +		listeners = new LinkedList<ActionListener>(); +		for (int c = 0; c <= 9; c++) { +			JRadioButtonMenuItem radioitem = new JRadioButtonMenuItem(String.format("Channel %1d (%7.3fMHz)", c, +												434.550 + c * 0.1), +							     c == channel); +			radioitem.setActionCommand(String.format("%d", c)); +			radioitem.addActionListener(this); +			add(radioitem); +			group.add(radioitem); +		} +	} + +} diff --git a/ao-tools/altosui/AltosConfig.java b/ao-tools/altosui/AltosConfig.java new file mode 100644 index 00000000..ac73e7c5 --- /dev/null +++ b/ao-tools/altosui/AltosConfig.java @@ -0,0 +1,264 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package altosui; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.*; +import java.io.*; +import java.util.*; +import java.text.*; +import java.util.prefs.*; +import java.util.concurrent.LinkedBlockingQueue; + +import altosui.Altos; +import altosui.AltosSerial; +import altosui.AltosSerialMonitor; +import altosui.AltosRecord; +import altosui.AltosTelemetry; +import altosui.AltosState; +import altosui.AltosDeviceDialog; +import altosui.AltosPreferences; +import altosui.AltosLog; +import altosui.AltosVoice; +import altosui.AltosFlightStatusTableModel; +import altosui.AltosFlightInfoTableModel; +import altosui.AltosConfigUI; + +import libaltosJNI.*; + +public class AltosConfig implements Runnable, ActionListener { + +	class int_ref { +		int	value; + +		public int get() { +			return value; +		} +		public void set(int i) { +			value = i; +		} +		public int_ref(int i) { +			value = i; +		} +	} + +	class string_ref { +		String	value; + +		public String get() { +			return value; +		} +		public void set(String i) { +			value = i; +		} +		public string_ref(String i) { +			value = i; +		} +	} + +	JFrame		owner; +	AltosDevice	device; +	AltosSerial	serial_line; +	boolean		remote; +	Thread		config_thread; +	int_ref		serial; +	int_ref		main_deploy; +	int_ref		apogee_delay; +	int_ref		radio_channel; +	string_ref	version; +	string_ref	product; +	string_ref	callsign; +	AltosConfigUI	config_ui; + + +	boolean get_int(String line, String label, int_ref x) { +		if (line.startsWith(label)) { +			try { +				String tail = line.substring(label.length()).trim(); +				String[] tokens = tail.split("\\s+"); +				if (tokens.length > 0) { +					int	i = Integer.parseInt(tokens[0]); +					x.set(i); +					return true; +				} +			} catch (NumberFormatException ne) { +			} +		} +		return false; +	} + +	boolean get_string(String line, String label, string_ref s) { +		if (line.startsWith(label)) { +			String	quoted = line.substring(label.length()).trim(); + +			if (quoted.startsWith("\"")) +				quoted = quoted.substring(1); +			if (quoted.endsWith("\"")) +				quoted = quoted.substring(0,quoted.length()-1); +			s.set(quoted); +			return true; +		} else { +			return false; +		} +	} + +	void start_serial() throws InterruptedException { +		if (remote) { +			serial_line.printf("m 0\n"); +			serial_line.set_channel(AltosPreferences.channel()); +			serial_line.set_callsign(AltosPreferences.callsign()); +			serial_line.printf("p\n"); +		} +	} + +	void stop_serial() throws InterruptedException { +		if (remote) { +			serial_line.printf("~\n"); +			serial_line.flush(); +		} +	} + +	void get_data() throws InterruptedException { +		try { +			start_serial(); +			serial_line.printf("c s\nv\n"); +			for (;;) { +				String line = serial_line.get_reply(); +				get_int(line, "serial-number", serial); +				get_int(line, "Main deploy:", main_deploy); +				get_int(line, "Apogee delay:", apogee_delay); +				get_int(line, "Radio channel:", radio_channel); +				get_string(line, "Callsign:", callsign); +				get_string(line,"software-version", version); +				get_string(line,"product", product); + +				/* signals the end of the version info */ +				if (line.startsWith("software-version")) +					break; +			} +		} finally { +			stop_serial(); +		} +	} + +	void init_ui () { +		config_ui = new AltosConfigUI(owner); +		config_ui.addActionListener(this); +		set_ui(); +	} + +	void set_ui() { +		try { +			if (serial_line != null) +				get_data(); +			config_ui.set_serial(serial.get()); +			config_ui.set_product(product.get()); +			config_ui.set_version(version.get()); +			config_ui.set_main_deploy(main_deploy.get()); +			config_ui.set_apogee_delay(apogee_delay.get()); +			config_ui.set_radio_channel(radio_channel.get()); +			config_ui.set_callsign(callsign.get()); +			config_ui.set_clean(); +		} catch (InterruptedException ie) { +		} +	} + +	void run_dialog() { +	} + +	void save_data() { +		main_deploy.set(config_ui.main_deploy()); +		apogee_delay.set(config_ui.apogee_delay()); +		radio_channel.set(config_ui.radio_channel()); +		callsign.set(config_ui.callsign()); +		try { +			start_serial(); +			serial_line.printf("c m %d\n", main_deploy.get()); +			serial_line.printf("c d %d\n", apogee_delay.get()); +			serial_line.printf("c r %d\n", radio_channel.get()); +			serial_line.printf("c c %s\n", callsign.get()); +			serial_line.printf("c w\n"); +		} catch (InterruptedException ie) { +		} finally { +			try { +				stop_serial(); +			} catch (InterruptedException ie) { +			} +		} +	} + +	public void actionPerformed(ActionEvent e) { +		String	cmd = e.getActionCommand(); +		if (cmd.equals("save")) { +			save_data(); +			set_ui(); +		} else if (cmd.equals("reset")) { +			set_ui(); +		} else if (cmd.equals("close")) { +			if (serial_line != null) +				serial_line.close(); +		} +	} + +	public void run () { +		try { +			init_ui(); +			config_ui.make_visible(); +//		} catch (InterruptedException ie) { +		} finally { +		} +	} + +	public AltosConfig(JFrame given_owner) { +		owner = given_owner; + +		serial = new int_ref(0); +		main_deploy = new int_ref(250); +		apogee_delay = new int_ref(0); +		radio_channel = new int_ref(0); +		callsign = new string_ref("N0CALL"); +		version = new string_ref("unknown"); +		product = new string_ref("unknown"); + +		device = AltosDeviceDialog.show(owner, AltosDevice.Any); +		serial_line = new AltosSerial(); +		if (device != null) { +			try { +				serial_line.open(device); +				if (!device.matchProduct(AltosDevice.TeleMetrum)) +					remote = true; +				config_thread = new Thread(this); +				config_thread.start(); +			} catch (FileNotFoundException ee) { +				JOptionPane.showMessageDialog(owner, +							      String.format("Cannot open device \"%s\"", +									    device.getPath()), +							      "Cannot open target device", +							      JOptionPane.ERROR_MESSAGE); +			} catch (IOException ee) { +				JOptionPane.showMessageDialog(owner, +							      device.getPath(), +							      ee.getLocalizedMessage(), +							      JOptionPane.ERROR_MESSAGE); +			} +		} +	} +}
\ No newline at end of file diff --git a/ao-tools/altosui/AltosConfigUI.java b/ao-tools/altosui/AltosConfigUI.java new file mode 100644 index 00000000..1d8c579a --- /dev/null +++ b/ao-tools/altosui/AltosConfigUI.java @@ -0,0 +1,423 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package altosui; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.*; +import javax.swing.event.*; +import java.io.*; +import java.util.*; +import java.text.*; +import java.util.prefs.*; +import java.util.concurrent.LinkedBlockingQueue; + +import altosui.Altos; +import altosui.AltosSerial; +import altosui.AltosSerialMonitor; +import altosui.AltosRecord; +import altosui.AltosTelemetry; +import altosui.AltosState; +import altosui.AltosDeviceDialog; +import altosui.AltosPreferences; +import altosui.AltosLog; +import altosui.AltosVoice; +import altosui.AltosFlightStatusTableModel; +import altosui.AltosFlightInfoTableModel; + +import libaltosJNI.*; + +public class AltosConfigUI extends JDialog implements ActionListener, ItemListener, DocumentListener { + +	Container	pane; +	Box		box; +	JLabel		product_label; +	JLabel		version_label; +	JLabel		serial_label; +	JLabel		main_deploy_label; +	JLabel		apogee_delay_label; +	JLabel		radio_channel_label; +	JLabel		callsign_label; + +	public boolean		dirty; + +	JFrame		owner; +	JLabel		product_value; +	JLabel		version_value; +	JLabel		serial_value; +	JComboBox	main_deploy_value; +	JComboBox	apogee_delay_value; +	JComboBox	radio_channel_value; +	JTextField	callsign_value; + +	JButton		save; +	JButton		reset; +	JButton		close; + +	ActionListener	listener; + +	static String[] main_deploy_values = { +		"100", "150", "200", "250", "300", "350", +		"400", "450", "500" +	}; + +	static String[] apogee_delay_values = { +		"0", "1", "2", "3", "4", "5" +	}; + +	static String[] radio_channel_values = new String[10]; +		{ +			for (int i = 0; i <= 9; i++) +				radio_channel_values[i] = String.format("Channel %1d (%7.3fMHz)", +									i, 434.550 + i * 0.1); +		} + +	/* A window listener to catch closing events and tell the config code */ +	class ConfigListener extends WindowAdapter { +		AltosConfigUI	ui; + +		public ConfigListener(AltosConfigUI this_ui) { +			ui = this_ui; +		} + +		public void windowClosing(WindowEvent e) { +			ui.actionPerformed(new ActionEvent(e.getSource(), +							   ActionEvent.ACTION_PERFORMED, +							   "close")); +		} +	} + +	/* Build the UI using a grid bag */ +	public AltosConfigUI(JFrame in_owner) { +		super (in_owner, "Configure TeleMetrum", false); + +		owner = in_owner; +		GridBagConstraints c; + +		Insets il = new Insets(4,4,4,4); +		Insets ir = new Insets(4,4,4,4); + +		pane = getContentPane(); +		pane.setLayout(new GridBagLayout()); + +		/* Product */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 0; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		product_label = new JLabel("Product:"); +		pane.add(product_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 0; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		product_value = new JLabel(""); +		pane.add(product_value, c); + +		/* Version */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 1; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		version_label = new JLabel("Software version:"); +		pane.add(version_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 1; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		version_value = new JLabel(""); +		pane.add(version_value, c); + +		/* Serial */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 2; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		serial_label = new JLabel("Serial:"); +		pane.add(serial_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 2; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		serial_value = new JLabel(""); +		pane.add(serial_value, c); + +		/* Main deploy */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 3; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 3; +		main_deploy_label = new JLabel("Main Deploy Altitude(m):"); +		pane.add(main_deploy_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 3; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		main_deploy_value = new JComboBox(main_deploy_values); +		main_deploy_value.setEditable(true); +		main_deploy_value.addItemListener(this); +		pane.add(main_deploy_value, c); + +		/* Apogee delay */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 4; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		apogee_delay_label = new JLabel("Apogee Delay(s):"); +		pane.add(apogee_delay_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 4; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		apogee_delay_value = new JComboBox(apogee_delay_values); +		apogee_delay_value.setEditable(true); +		apogee_delay_value.addItemListener(this); +		pane.add(apogee_delay_value, c); + +		/* Radio channel */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 5; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		radio_channel_label = new JLabel("Radio Channel:"); +		pane.add(radio_channel_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 5; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		radio_channel_value = new JComboBox(radio_channel_values); +		radio_channel_value.setEditable(false); +		radio_channel_value.addItemListener(this); +		pane.add(radio_channel_value, c); + +		/* Callsign */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 6; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		c.ipady = 5; +		callsign_label = new JLabel("Callsign:"); +		pane.add(callsign_label, c); + +		c = new GridBagConstraints(); +		c.gridx = 3; c.gridy = 6; +		c.gridwidth = 3; +		c.fill = GridBagConstraints.HORIZONTAL; +		c.weightx = 1; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = ir; +		c.ipady = 5; +		callsign_value = new JTextField("N0CALL"); +		callsign_value.getDocument().addDocumentListener(this); +		pane.add(callsign_value, c); + +		/* Buttons */ +		c = new GridBagConstraints(); +		c.gridx = 0; c.gridy = 7; +		c.gridwidth = 2; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_START; +		c.insets = il; +		save = new JButton("Save"); +		pane.add(save, c); +		save.addActionListener(this); +		save.setActionCommand("save"); + +		c = new GridBagConstraints(); +		c.gridx = 2; c.gridy = 7; +		c.gridwidth = 2; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.CENTER; +		c.insets = il; +		reset = new JButton("Reset"); +		pane.add(reset, c); +		reset.addActionListener(this); +		reset.setActionCommand("reset"); + +		c = new GridBagConstraints(); +		c.gridx = 4; c.gridy = 7; +		c.gridwidth = 2; +		c.fill = GridBagConstraints.NONE; +		c.anchor = GridBagConstraints.LINE_END; +		c.insets = il; +		close = new JButton("Close"); +		pane.add(close, c); +		close.addActionListener(this); +		close.setActionCommand("close"); + +		addWindowListener(new ConfigListener(this)); +	} + +	/* Once the initial values are set, the config code will show the dialog */ +	public void make_visible() { +		pack(); +		setLocationRelativeTo(owner); +		setVisible(true); +	} + +	/* If any values have been changed, confirm before closing */ +	public boolean check_dirty() { +		if (dirty) { +			Object[] options = { "Close anyway", "Keep editing" }; +			int i; +			i = JOptionPane.showOptionDialog(this, +							 "Configuration modified, close anyway?", +							 "Configuration Modified", +							 JOptionPane.DEFAULT_OPTION, +							 JOptionPane.WARNING_MESSAGE, +							 null, options, options[1]); +			if (i != 0) +				return false; +		} +		return true; +	} + +	/* Listen for events from our buttons */ +	public void actionPerformed(ActionEvent e) { +		String	cmd = e.getActionCommand(); + +		if (cmd.equals("close")) +			if (!check_dirty()) +				return; +		listener.actionPerformed(e); +		if (cmd.equals("close")) { +			setVisible(false); +			dispose(); +		} +		dirty = false; +	} + +	/* ItemListener interface method */ +	public void itemStateChanged(ItemEvent e) { +		dirty = true; +	} + +	/* DocumentListener interface methods */ +	public void changedUpdate(DocumentEvent e) { +		dirty = true; +	} + +	public void insertUpdate(DocumentEvent e) { +		dirty = true; +	} + +	public void removeUpdate(DocumentEvent e) { +		dirty = true; +	} + +	/* Let the config code hook on a listener */ +	public void addActionListener(ActionListener l) { +		listener = l; +	} + +	/* set and get all of the dialog values */ +	public void set_product(String product) { +		product_value.setText(product); +	} + +	public void set_version(String version) { +		version_value.setText(version); +	} + +	public void set_serial(int serial) { +		serial_value.setText(String.format("%d", serial)); +	} + +	public void set_main_deploy(int new_main_deploy) { +		main_deploy_value.setSelectedItem(Integer.toString(new_main_deploy)); +	} + +	public int main_deploy() { +		return Integer.parseInt(main_deploy_value.getSelectedItem().toString()); +	} + +	public void set_apogee_delay(int new_apogee_delay) { +		apogee_delay_value.setSelectedItem(Integer.toString(new_apogee_delay)); +	} + +	public int apogee_delay() { +		return Integer.parseInt(apogee_delay_value.getSelectedItem().toString()); +	} + +	public void set_radio_channel(int new_radio_channel) { +		radio_channel_value.setSelectedIndex(new_radio_channel); +	} + +	public int radio_channel() { +		return radio_channel_value.getSelectedIndex(); +	} + +	public void set_callsign(String new_callsign) { +		callsign_value.setText(new_callsign); +	} + +	public String callsign() { +		return callsign_value.getText(); +	} + +	public void set_clean() { +		dirty = false; +	} + + }
\ No newline at end of file diff --git a/ao-tools/altosui/AltosUI.java b/ao-tools/altosui/AltosUI.java index 33ce274a..49d1f11a 100644 --- a/ao-tools/altosui/AltosUI.java +++ b/ao-tools/altosui/AltosUI.java @@ -40,6 +40,7 @@ import altosui.AltosLog;  import altosui.AltosVoice;  import altosui.AltosFlightStatusTableModel;  import altosui.AltosFlightInfoTableModel; +import altosui.AltosChannelMenu;  import libaltosJNI.*; @@ -453,6 +454,9 @@ public class AltosUI extends JFrame {  		}  	} +	void ConfigureTeleMetrum() { +		new AltosConfig(AltosUI.this); +	}  	/*  	 * Open an existing telemetry file and replay it in realtime  	 */ @@ -628,6 +632,15 @@ public class AltosUI extends JFrame {  				});  			menu.add(item); + +			item = new JMenuItem("Configure TeleMetrum device",KeyEvent.VK_T); +			item.addActionListener(new ActionListener() { +					public void actionPerformed(ActionEvent e) { +						ConfigureTeleMetrum(); +					} +				}); + +			menu.add(item);  		}  		// Log menu  		{ @@ -680,26 +693,16 @@ public class AltosUI extends JFrame {  		// Channel menu  		{ -			menu = new JMenu("Channel", true); -			menu.setMnemonic(KeyEvent.VK_C); -			menubar.add(menu); -			ButtonGroup group = new ButtonGroup(); - -			for (int c = 0; c <= 9; c++) { -				radioitem = new JRadioButtonMenuItem(String.format("Channel %1d (%7.3fMHz)", c, -										   434.550 + c * 0.1), -								     c == AltosPreferences.channel()); -				radioitem.setActionCommand(String.format("%d", c)); -				radioitem.addActionListener(new ActionListener() { +			menu = new AltosChannelMenu(AltosPreferences.channel()); +			menu.addActionListener(new ActionListener() {  						public void actionPerformed(ActionEvent e) {  							int new_channel = Integer.parseInt(e.getActionCommand());  							AltosPreferences.set_channel(new_channel);  							serial_line.set_channel(new_channel);  						} -					}); -				menu.add(radioitem); -				group.add(radioitem); -			} +				}); +			menu.setMnemonic(KeyEvent.VK_C); +			menubar.add(menu);  		}  		this.setJMenuBar(menubar); diff --git a/ao-tools/altosui/Makefile b/ao-tools/altosui/Makefile index 8c9e9642..541b89e3 100644 --- a/ao-tools/altosui/Makefile +++ b/ao-tools/altosui/Makefile @@ -3,6 +3,9 @@  CLASSPATH=classes:./*  CLASSFILES=\  	Altos.class \ +	AltosChannelMenu.class \ +	AltosConfig.class \ +	AltosConfigUI.class \  	AltosConvert.class \  	AltosCSV.class \  	AltosEepromDownload.class \ @@ -39,7 +42,7 @@ FREETTSJAR= \  	en_us.jar \  	freetts.jar -JAVAFLAGS=-Xlint:unchecked +JAVAFLAGS=-Xlint:unchecked -Xlint:deprecation  OS:=$(shell uname) | 
