altoslib: Add tilt and pyro data to CSV export
[fw/altos] / altoslib / AltosIgnite.java
index ca9f419cedc3acb146e8af9fd30899de98de13d7..767c00fbaf1689d4f8c5399518656c6594496995 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
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_3;
+package org.altusmetrum.altoslib_12;
 
+import java.util.*;
 import java.io.*;
 import java.util.concurrent.*;
 
 public class AltosIgnite {
        AltosLink       link;
        boolean         remote;
+       boolean         close_on_exit;
        boolean         link_started;
+       boolean         have_npyro = false;
+       int             npyro;
+       AltosConfigData config_data;
 
-       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 +87,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 +99,38 @@ public class AltosIgnite {
                return Unknown;
        }
 
-       public int status(int igniter) throws InterruptedException, TimeoutException {
-               int status = Unknown;
+       private void get_npyro() throws InterruptedException, TimeoutException {
+               if (config_data == null)
+                       config_data = new AltosConfigData(link);
+               if (config_data != null && config_data.npyro != AltosLib.MISSING)
+                       npyro = config_data.npyro;
+               else
+                       npyro = 0;
+               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 +147,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 +168,13 @@ 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);
+                       link.flush_output();
                } catch (TimeoutException te) {
                } finally {
                        stop_link();
@@ -162,14 +183,18 @@ public class AltosIgnite {
 
        public void close() throws InterruptedException {
                stop_link();
-               link.close();
+               if (close_on_exit)
+                       link.close();
                link = null;
        }
 
-       public AltosIgnite(AltosLink in_link, boolean in_remote)
-               throws FileNotFoundException, TimeoutException, InterruptedException {
-
+       public AltosIgnite(AltosLink in_link, boolean in_remote, boolean in_close_on_exit) {
                link = in_link;
                remote = in_remote;
+               close_on_exit = in_close_on_exit;
+       }
+
+       public AltosIgnite(AltosLink in_link, boolean in_remote) {
+               this(in_link, in_remote, true);
        }
-}
\ No newline at end of file
+}