X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosIgniteUI.java;h=15a81e57e37a5fd604142123d776e378aed3c1f1;hp=14d4eebcbaf210013215e704ae3b7849613a2161;hb=5a51efd7f9b49ffadc91ccaf7a0d69566301c009;hpb=bf88c5f829ea5d32043431945e862a9f6c96740a diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index 14d4eebc..15a81e57 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -22,9 +22,10 @@ import java.awt.event.*; import javax.swing.*; import java.io.*; import java.text.*; +import java.util.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_1.*; -import org.altusmetrum.altosuilib_1.*; +import org.altusmetrum.altoslib_5.*; +import org.altusmetrum.altosuilib_3.*; public class AltosIgniteUI extends AltosUIDialog @@ -33,17 +34,14 @@ 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; + Boolean opened; - int apogee_status; - int main_status; + int npyro; final static int timeout = 1 * 1000; @@ -52,9 +50,68 @@ public class AltosIgniteUI LinkedBlockingQueue command_queue; + LinkedBlockingQueue 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; + AltosLink link; void send_exception(Exception e) { final Exception f_e = e; @@ -68,9 +125,7 @@ public class AltosIgniteUI public void run () { try { - AltosSerial serial = new AltosSerial(device); - serial.set_frame(owner); - ignite = new AltosIgnite(serial, + ignite = new AltosIgnite(link, !device.matchProduct(Altos.product_altimeter)); } catch (Exception e) { @@ -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 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() { @@ -114,8 +172,9 @@ public class AltosIgniteUI } } - public IgniteHandler(JFrame in_owner) { + public IgniteHandler(JFrame in_owner, AltosLink in_link) { owner = in_owner; + link = in_link; } } @@ -170,16 +229,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 +250,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 +287,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) { @@ -227,8 +308,10 @@ public class AltosIgniteUI } void close() { - send_command("quit"); - timer.stop(); + if (opened) { + send_command("quit"); + timer.stop(); + } setVisible(false); dispose(); } @@ -247,10 +330,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 +343,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 +362,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,13 +383,22 @@ public class AltosIgniteUI private boolean open() { command_queue = new LinkedBlockingQueue(); + reply_queue = new LinkedBlockingQueue(); + opened = false; device = AltosDeviceUIDialog.show(owner, Altos.product_any); if (device != null) { - IgniteHandler handler = new IgniteHandler(owner); + try { + AltosSerial serial = new AltosSerial(device); + serial.set_frame(owner); + IgniteHandler handler = new IgniteHandler(owner, serial); Thread t = new Thread(handler); t.start(); + opened = true; return true; + } catch (Exception ex) { + ignite_exception(ex); + } } return false; } @@ -318,13 +406,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 +432,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 +467,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,15 +476,17 @@ 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"); pane.add(close, c); close.addActionListener(this); close.setActionCommand("close"); - + pack(); setLocationRelativeTo(owner);