ao-tools/ao-cal-accel: Initialize byte count var 'l'
[fw/altos] / altosui / AltosIgniteUI.java
index 9d063702a3c1112b458e63801cbe45059774a69b..406b51cf2f1ef25edd7f3a2342745471ab98f802 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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
@@ -24,8 +25,8 @@ import java.io.*;
 import java.text.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_3.*;
-import org.altusmetrum.altosuilib_1.*;
+import org.altusmetrum.altoslib_13.*;
+import org.altusmetrum.altosuilib_13.*;
 
 public class AltosIgniteUI
        extends AltosUIDialog
@@ -39,6 +40,7 @@ public class AltosIgniteUI
        javax.swing.Timer       timer;
        JButton         close;
        ButtonGroup     group;
+       Boolean         opened;
 
        int             npyro;
 
@@ -47,9 +49,9 @@ public class AltosIgniteUI
        int             time_remaining;
        boolean         timer_running;
 
-       LinkedBlockingQueue<String>     command_queue;
+       int             poll_remaining;
 
-       LinkedBlockingQueue<String>     reply_queue;
+       LinkedBlockingQueue<String>     command_queue;
 
        class Igniter {
                JRadioButton    button;
@@ -110,6 +112,7 @@ public class AltosIgniteUI
        class IgniteHandler implements Runnable {
                AltosIgnite     ignite;
                JFrame          owner;
+               AltosLink       link;
 
                void send_exception(Exception e) {
                        final Exception f_e = e;
@@ -123,9 +126,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) {
@@ -150,8 +151,7 @@ public class AltosIgniteUI
                                                }
                                                reply = "status";
                                        } else if (command.equals("get_npyro")) {
-                                               put_reply(String.format("%d", ignite.npyro()));
-                                               continue;
+                                               reply = String.format("npyro %d", ignite.npyro());
                                        } else if (command.equals("quit")) {
                                                ignite.close();
                                                break;
@@ -172,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;
                }
        }
 
@@ -210,6 +211,11 @@ public class AltosIgniteUI
                        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();
                }
        }
 
@@ -249,49 +255,26 @@ 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;
-               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");
                }
        }
 
-       int get_npyro() {
-               send_command("get_npyro");
-               String reply = get_reply();
-               return Integer.parseInt(reply);
-       }
-
        boolean firing = false;
 
        void start_fire(String which) {
@@ -307,8 +290,11 @@ public class AltosIgniteUI
        }
 
        void close() {
-               send_command("quit");
-               timer.stop();
+               if (opened) {
+                       send_command("quit");
+               }
+               if (timer != null)
+                       timer.stop();
                setVisible(false);
                dispose();
        }
@@ -380,25 +366,26 @@ public class AltosIgniteUI
 
        private boolean open() {
                command_queue = new LinkedBlockingQueue<String>();
-               reply_queue = new LinkedBlockingQueue<String>();
 
+               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;
-
-               if (!open())
-                       return;
-
+       private void make_ui() {
                group = new ButtonGroup();
 
                Container               pane = getContentPane();
@@ -411,8 +398,6 @@ public class AltosIgniteUI
                timer_running = false;
                timer.restart();
 
-               owner = in_owner;
-
                pane.setLayout(new GridBagLayout());
 
                c.fill = GridBagConstraints.NONE;
@@ -432,8 +417,6 @@ public class AltosIgniteUI
 
                y++;
 
-               int npyro = get_npyro();
-
                igniters = new Igniter[2 + npyro];
 
                igniters[0] = new Igniter(this, "Apogee", AltosIgnite.Apogee, y++);
@@ -475,10 +458,20 @@ public class AltosIgniteUI
                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");
+       }
+}