*
* 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.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
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.*;
import java.util.concurrent.*;
-import org.altusmetrum.AltosLib.*;
+import org.altusmetrum.altoslib_14.*;
+import org.altusmetrum.altosuilib_14.*;
public class AltosIgniteUI
- extends AltosDialog
+ extends AltosUIDialog
implements ActionListener
{
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;
int time_remaining;
boolean timer_running;
+ int poll_remaining;
+
LinkedBlockingQueue<String> command_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;
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) {
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")) {
+ reply = String.format("npyro %d", ignite.npyro());
} 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() {
}
}
- public IgniteHandler(JFrame in_owner) {
+ public IgniteHandler(JFrame in_owner, AltosLink in_link) {
owner = in_owner;
+ link = in_link;
}
}
set_ignite_status();
} else if (reply.equals("fired")) {
fired();
+ } else if (reply.startsWith("npyro")) {
+ npyro = Integer.parseInt(reply.substring(6));
+ if (npyro == AltosLib.MISSING)
+ npyro = 0;
+ make_ui();
}
}
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();
}
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;
+ poll_remaining = 2;
+ if (!isVisible())
setVisible(true);
- }
}
void poll_ignite_status() {
+ if (poll_remaining > 0) {
+ --poll_remaining;
+ return;
+ }
if (!getting_status) {
getting_status = true;
send_command("get_status");
}
void close() {
- send_command("quit");
- timer.stop();
+ if (opened) {
+ send_command("quit");
+ }
+ if (timer != null)
+ timer.stop();
setVisible(false);
dispose();
}
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();
}
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()) {
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 */
private boolean open() {
command_queue = new LinkedBlockingQueue<String>();
- device = AltosDeviceDialog.show(owner, Altos.product_any);
+ 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;
}
- public AltosIgniteUI(JFrame in_owner) {
-
- owner = in_owner;
- apogee_status = AltosIgnite.Unknown;
- main_status = AltosIgnite.Unknown;
-
- if (!open())
- return;
+ private void make_ui() {
+ group = new ButtonGroup();
Container pane = getContentPane();
+
GridBagConstraints c = new GridBagConstraints();
Insets i = new Insets(4,4,4,4);
timer_running = false;
timer.restart();
- owner = in_owner;
-
pane.setLayout(new GridBagLayout());
c.fill = GridBagConstraints.NONE;
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);
+ igniters = new Igniter[2 + 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[0] = new Igniter(this, "Apogee", AltosIgnite.Apogee, y++);
+ igniters[1] = new Igniter(this, "Main", AltosIgnite.Main, y++);
- c.gridx = 1;
- c.gridy = 2;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.WEST;
- main_status_label = new JLabel();
- pane.add(main_status_label, c);
+ 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");
arm.setEnabled(false);
c.gridx = 1;
- c.gridy = 3;
+ c.gridy = y;
c.gridwidth = 1;
c.anchor = GridBagConstraints.CENTER;
fire = new JButton ("Fire");
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);
addWindowListener(new ConfigListener(this));
}
-}
\ No newline at end of file
+
+ public AltosIgniteUI(JFrame in_owner) {
+
+ owner = in_owner;
+
+ if (!open())
+ return;
+
+ send_command("get_npyro");
+ }
+}