diff options
| author | Keith Packard <keithp@keithp.com> | 2013-12-21 08:56:00 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2013-12-21 08:56:00 -0800 | 
| commit | 081455dcba860f3e4df8cd66f3fe686b204034ad (patch) | |
| tree | 4734ccd23bc9d299df6e6e8b8b53d19253ada43c | |
| parent | 9cf9a67f937185c0c0bb5b2bae4f420755965799 (diff) | |
altosui: Extend Fire Igniter to additional channels
This lets the UI test fire other pyro channels on TeleMega
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altoslib/AltosIgnite.java | 59 | ||||
| -rw-r--r-- | altosui/AltosIgniteUI.java | 209 | 
2 files changed, 173 insertions, 95 deletions
diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java index ca9f419c..d3c21796 100644 --- a/altoslib/AltosIgnite.java +++ b/altoslib/AltosIgnite.java @@ -17,6 +17,7 @@  package org.altusmetrum.altoslib_3; +import java.util.*;  import java.io.*;  import java.util.concurrent.*; @@ -24,10 +25,12 @@ public class AltosIgnite {  	AltosLink	link;  	boolean		remote;  	boolean		link_started; +	boolean		have_npyro = false; +	int		npyro; -	public final static int	None = 0; -	public final static int	Apogee = 1; -	public final static int	Main = 2; +	public final static String	None = null; +	public final static String	Apogee = "drogue"; +	public final static String	Main = "main";  	public final static int	Unknown = 0;  	public final static int	Ready = 1; @@ -81,7 +84,7 @@ public class AltosIgnite {  	}  	*/ -	private int status(String status_name) { +	private int map_status(String status_name) {  		if (status_name.equals("unknown"))  			return Unknown;  		if (status_name.equals("ready")) @@ -93,13 +96,34 @@ public class AltosIgnite {  		return Unknown;  	} -	public int status(int igniter) throws InterruptedException, TimeoutException { -		int status = Unknown; +	private void get_npyro() throws InterruptedException, TimeoutException { +		AltosConfigData	config_data = link.config_data(); +		npyro = config_data.npyro; +		have_npyro = true; +	} + +	public int npyro() throws InterruptedException, TimeoutException { +		if (!have_npyro) { +			start_link(); +			get_npyro(); +			stop_link(); +		} +		return npyro; +	} + +	public HashMap<String,Integer> status() throws InterruptedException, TimeoutException { +		HashMap<String,Integer> status = new HashMap<String,Integer>(); +  		if (link == null)  			return status; -		//string_ref status_name = new string_ref();  		try {  			start_link(); +			get_npyro(); + +			String last_igniter = Main; +			if (npyro > 0) +				last_igniter = String.format("%d", npyro - 1); +  			link.printf("t\n");  			for (;;) {  				String line = link.get_reply(5000); @@ -116,14 +140,10 @@ public class AltosIgnite {  				if (!items[2].equals("Status:"))  					continue; -				if (items[1].equals("drogue")) { -					if (igniter == Apogee) -						status = status(items[3]); -				} else if (items[1].equals("main")) { -					if (igniter == Main) -						status = status(items[3]); +				status.put(items[1], map_status(items[3])); + +				if (items[1].equals(last_igniter))  					break; -				}  			}  		} finally {  			stop_link(); @@ -141,19 +161,12 @@ public class AltosIgnite {  		}  	} -	public void fire(int igniter) throws InterruptedException { +	public void fire(String igniter) throws InterruptedException {  		if (link == null)  			return;  		try {  			start_link(); -			switch (igniter) { -			case Main: -				link.printf("i DoIt main\n"); -				break; -			case Apogee: -				link.printf("i DoIt drogue\n"); -				break; -			} +			link.printf("i DoIt %s\n", igniter);  		} catch (TimeoutException te) {  		} finally {  			stop_link(); diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index efc87720..9d063702 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -22,6 +22,7 @@ import java.awt.event.*;  import javax.swing.*;  import java.io.*;  import java.text.*; +import java.util.*;  import java.util.concurrent.*;  import org.altusmetrum.altoslib_3.*;  import org.altusmetrum.altosuilib_1.*; @@ -33,17 +34,13 @@ public class AltosIgniteUI  	AltosDevice	device;  	JFrame		owner;  	JLabel		label; -	JRadioButton	apogee; -	JLabel		apogee_status_label; -	JRadioButton	main; -	JLabel		main_status_label;  	JToggleButton	arm;  	JButton		fire;  	javax.swing.Timer	timer;  	JButton		close; +	ButtonGroup	group; -	int		apogee_status; -	int		main_status; +	int		npyro;  	final static int	timeout = 1 * 1000; @@ -52,6 +49,64 @@ public class AltosIgniteUI  	LinkedBlockingQueue<String>	command_queue; +	LinkedBlockingQueue<String>	reply_queue; + +	class Igniter { +		JRadioButton	button; +		JLabel		status_label; +		String		name; +		int		status; + +		void set_status (int status) { +			this.status = status; +			status_label.setText(String.format("\"%s\"", AltosIgnite.status_string(status))); +		} + +		Igniter(AltosIgniteUI ui, String label, String name, int y) { +			Container		pane = getContentPane(); +			GridBagConstraints	c = new GridBagConstraints(); +			Insets			i = new Insets(4,4,4,4); + +			this.name = name; +			this.status = AltosIgnite.Unknown; + +			c.gridx = 0; +			c.gridy = y; +			c.gridwidth = 1; +			c.anchor = GridBagConstraints.WEST; +			button = new JRadioButton (label); +			pane.add(button, c); +			button.addActionListener(ui); +			button.setActionCommand(name); +			group.add(button); + +			c.gridx = 1; +			c.gridy = y; +			c.gridwidth = 1; +			c.anchor = GridBagConstraints.WEST; +			status_label = new JLabel("plenty of text"); +			pane.add(status_label, c); + +			status = AltosIgnite.Unknown; +		} +	} + +	Igniter	igniters[]; + +	void set_status(String _name, int _status) { + +		final String name = _name; +		final int status = _status; +		Runnable r = new Runnable() { +				public void run() { +					for (int p = 0; p < igniters.length; p++) +						if (name.equals(igniters[p].name)) +							igniters[p].set_status(status); +				} +			}; +		SwingUtilities.invokeLater(r); +	} +  	class IgniteHandler implements Runnable {  		AltosIgnite	ignite;  		JFrame		owner; @@ -86,20 +141,23 @@ public class AltosIgniteUI  					String		reply = null;  					if (command.equals("get_status")) { -						apogee_status = ignite.status(AltosIgnite.Apogee); -						main_status = ignite.status(AltosIgnite.Main); +						HashMap<String,Integer> status_map = ignite.status(); + +						for (int p = 0; p < igniters.length; p++) { +							Integer i = status_map.get(igniters[p].name); +							if (i != null) +								set_status(igniters[p].name, i); +						}  						reply = "status"; -					} else if (command.equals("main")) { -						ignite.fire(AltosIgnite.Main); -						reply = "fired"; -					} else if (command.equals("apogee")) { -						ignite.fire(AltosIgnite.Apogee); -						reply = "fired"; +					} else if (command.equals("get_npyro")) { +						put_reply(String.format("%d", ignite.npyro())); +						continue;  					} else if (command.equals("quit")) {  						ignite.close();  						break;  					} else { -						throw new ParseException(String.format("invalid command %s", command), 0); +						ignite.fire(command); +						reply = "fired";  					}  					final String f_reply = reply;  					r = new Runnable() { @@ -170,16 +228,15 @@ public class AltosIgniteUI  	void stop_timer() {  		time_remaining = 0; -		arm.setSelected(false); -		arm.setEnabled(false);  		fire.setEnabled(false);  		timer_running = false; +		arm.setSelected(false); +		arm.setEnabled(false);  		set_arm_text();  	}  	void cancel () { -		apogee.setSelected(false); -		main.setSelected(false); +		group.clearSelection();  		fire.setEnabled(false);  		stop_timer();  	} @@ -192,13 +249,30 @@ public class AltosIgniteUI  		}  	} +	void put_reply(String reply) { +		try { +			reply_queue.put(reply); +		} catch (Exception ex) { +			ignite_exception(ex); +		} +	} + +	String get_reply() { +		String reply = ""; +		try { +			reply = reply_queue.take(); +		} catch (Exception ex) { +			ignite_exception(ex); +		} +		return reply; +	} +  	boolean	getting_status = false;  	boolean	visible = false; +  	void set_ignite_status() {  		getting_status = false; -		apogee_status_label.setText(String.format("\"%s\"", AltosIgnite.status_string(apogee_status))); -		main_status_label.setText(String.format("\"%s\"", AltosIgnite.status_string(main_status)));  		if (!visible) {  			visible = true;  			setVisible(true); @@ -212,6 +286,12 @@ public class AltosIgniteUI  		}  	} +	int get_npyro() { +		send_command("get_npyro"); +		String reply = get_reply(); +		return Integer.parseInt(reply); +	} +  	boolean	firing = false;  	void start_fire(String which) { @@ -247,10 +327,12 @@ public class AltosIgniteUI  	void fire() {  		if (arm.isEnabled() && arm.isSelected() && time_remaining > 0) {  			String	igniter = "none"; -			if (apogee.isSelected() && !main.isSelected()) -				igniter = "apogee"; -			else if (main.isSelected() && !apogee.isSelected()) -				igniter = "main"; + +			for (int p = 0; p < igniters.length; p++) +				if (igniters[p].button.isSelected()) { +					igniter = igniters[p].name; +					break; +				}  			send_command(igniter);  			cancel();  		} @@ -258,18 +340,13 @@ public class AltosIgniteUI  	public void actionPerformed(ActionEvent e) {  		String cmd = e.getActionCommand(); -		if (cmd.equals("apogee") || cmd.equals("main")) { -			stop_timer(); -		} -		if (cmd.equals("apogee") && apogee.isSelected()) { -			main.setSelected(false); -			arm.setEnabled(true); -		} -		if (cmd.equals("main") && main.isSelected()) { -			apogee.setSelected(false); -			arm.setEnabled(true); -		} +		for (int p = 0; p < igniters.length; p++) +			if (cmd.equals(igniters[p].name)) { +				stop_timer(); +				arm.setEnabled(true); +				break; +			}  		if (cmd.equals("arm")) {  			if (arm.isSelected()) { @@ -282,9 +359,8 @@ public class AltosIgniteUI  			fire();  		if (cmd.equals("tick"))  			tick_timer(); -		if (cmd.equals("close")) { +		if (cmd.equals("close"))  			close(); -		}  	}  	/* A window listener to catch closing events and tell the config code */ @@ -304,6 +380,7 @@ public class AltosIgniteUI  	private boolean open() {  		command_queue = new LinkedBlockingQueue<String>(); +		reply_queue = new LinkedBlockingQueue<String>();  		device = AltosDeviceUIDialog.show(owner, Altos.product_any);  		if (device != null) { @@ -318,13 +395,14 @@ public class AltosIgniteUI  	public AltosIgniteUI(JFrame in_owner) {  		owner = in_owner; -		apogee_status = AltosIgnite.Unknown; -		main_status = AltosIgnite.Unknown;  		if (!open())  			return; +		group = new ButtonGroup(); +  		Container		pane = getContentPane(); +  		GridBagConstraints	c = new GridBagConstraints();  		Insets			i = new Insets(4,4,4,4); @@ -343,47 +421,32 @@ public class AltosIgniteUI  		c.weightx = 0;  		c.weighty = 0; +		int y = 0; +  		c.gridx = 0; -		c.gridy = 0; +		c.gridy = y;  		c.gridwidth = 2;  		c.anchor = GridBagConstraints.CENTER;  		label = new JLabel ("Fire Igniter");  		pane.add(label, c); -		c.gridx = 0; -		c.gridy = 1; -		c.gridwidth = 1; -		c.anchor = GridBagConstraints.WEST; -		apogee = new JRadioButton ("Apogee"); -		pane.add(apogee, c); -		apogee.addActionListener(this); -		apogee.setActionCommand("apogee"); +		y++; -		c.gridx = 1; -		c.gridy = 1; -		c.gridwidth = 1; -		c.anchor = GridBagConstraints.WEST; -		apogee_status_label = new JLabel(); -		pane.add(apogee_status_label, c); +		int npyro = get_npyro(); -		c.gridx = 0; -		c.gridy = 2; -		c.gridwidth = 1; -		c.anchor = GridBagConstraints.WEST; -		main = new JRadioButton ("Main"); -		pane.add(main, c); -		main.addActionListener(this); -		main.setActionCommand("main"); +		igniters = new Igniter[2 + npyro]; -		c.gridx = 1; -		c.gridy = 2; -		c.gridwidth = 1; -		c.anchor = GridBagConstraints.WEST; -		main_status_label = new JLabel(); -		pane.add(main_status_label, c); +		igniters[0] = new Igniter(this, "Apogee", AltosIgnite.Apogee, y++); +		igniters[1] = new Igniter(this, "Main", AltosIgnite.Main, y++); + +		for (int p = 0; p < npyro; p++) { +			String	name = String.format("%d", p); +			String	label = String.format("%c", 'A' + p); +			igniters[2+p] = new Igniter(this, label, name, y++); +		}  		c.gridx = 0; -		c.gridy = 3; +		c.gridy = y;  		c.gridwidth = 1;  		c.anchor = GridBagConstraints.CENTER;  		arm = new JToggleButton ("Arm"); @@ -393,7 +456,7 @@ public class AltosIgniteUI  		arm.setEnabled(false);  		c.gridx = 1; -		c.gridy = 3; +		c.gridy = y;  		c.gridwidth = 1;  		c.anchor = GridBagConstraints.CENTER;  		fire = new JButton ("Fire"); @@ -402,8 +465,10 @@ public class AltosIgniteUI  		fire.addActionListener(this);  		fire.setActionCommand("fire"); +		y++; +  		c.gridx = 0; -		c.gridy = 4; +		c.gridy = y;  		c.gridwidth = 2;  		c.anchor = GridBagConstraints.CENTER;  		close = new JButton ("Close");  | 
