altos/telefireone-v2.0: Remove build of ao_product.h from Makefile
[fw/altos] / altoslib / AltosLink.java
index 95acfc44cd6a49bcf6400e517d43cc406ca199a3..44202c0c80eb0b6ebe1a53d4d46cadd78d3b7a2d 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
@@ -15,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_5;
+package org.altusmetrum.altoslib_13;
 
 import java.io.*;
 import java.util.concurrent.*;
@@ -42,6 +43,8 @@ public abstract class AltosLink implements Runnable {
        public LinkedBlockingQueue<AltosLine> reply_queue = new LinkedBlockingQueue<AltosLine>();
        public LinkedBlockingQueue<byte[]> binary_queue = new LinkedBlockingQueue<byte[]>();
 
+       private String match_string = null;
+
        public synchronized void add_monitor(LinkedBlockingQueue<AltosLine> q) {
                set_monitor(true);
                monitors.add(q);
@@ -86,10 +89,17 @@ public abstract class AltosLink implements Runnable {
 
        public boolean  reply_abort;
        public int      in_reply;
+       boolean cancel_enable = true;
+
+       public void set_cancel_enable(boolean e) {
+               cancel_enable = e;
+       }
 
        boolean         reply_timeout_shown = false;
 
        private boolean check_reply_timeout() {
+               if (!cancel_enable)
+                       return false;
                if (!reply_timeout_shown)
                        reply_timeout_shown = show_reply_timeout();
                return reply_abort;
@@ -104,6 +114,15 @@ public abstract class AltosLink implements Runnable {
 
        private int     len_read = 0;
 
+       private boolean match_bytes(byte[] bytes, int byte_count, String match) {
+               if (byte_count < match.length())
+                       return false;
+               String  line = new String(bytes, 0, byte_count, AltosLib.unicode_set);
+               if (line == null)
+                       return false;
+               return line.indexOf(match) >= 0;
+       }
+
        public void run () {
                int c;
                byte[] line_bytes = null;
@@ -151,6 +170,11 @@ public abstract class AltosLink implements Runnable {
                                                        line_count = 0;
                                                        len_read = 0;
                                                }
+                                               if (match_string != null && match_bytes(line_bytes, line_count, match_string)) {
+                                                       match_string = null;
+                                                       add_bytes(line_bytes, line_count);
+                                                       line_count = 0;
+                                               }
                                        }
                                }
                        }
@@ -158,13 +182,16 @@ public abstract class AltosLink implements Runnable {
                }
        }
 
+       public void set_match(String match) {
+               match_string = match;
+       }
 
        public String get_reply(int timeout) throws InterruptedException {
                boolean can_cancel = can_cancel_reply();
                String  reply = null;
 
-               if (!can_cancel && remote)
-                       System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
+//             if (!can_cancel && remote)
+//                     System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
 
                if (remote && can_cancel) {
                        timeout = 500;
@@ -312,9 +339,22 @@ public abstract class AltosLink implements Runnable {
 
 
        public void flush_input() throws InterruptedException {
-               if (remote)
-                       flush_input(500);
-               else
+               if (remote) {
+                       int timeout = 500;
+                       switch (telemetry_rate) {
+                       case AltosLib.ao_telemetry_rate_38400:
+                       default:
+                               timeout = 500;
+                               break;
+                       case AltosLib.ao_telemetry_rate_9600:
+                               timeout = 1000;
+                               break;
+                       case AltosLib.ao_telemetry_rate_2400:
+                               timeout = 2000;
+                               break;
+                       }
+                       flush_input(timeout);
+               } else
                        flush_input(100);
        }
 
@@ -328,7 +368,8 @@ public abstract class AltosLink implements Runnable {
        public int telemetry_rate = -1;
        public double frequency;
        public String callsign;
-       AltosConfigData config_data;
+       private AltosConfigData config_data_local;
+       private AltosConfigData config_data_remote;
 
        private Object config_data_lock = new Object();
 
@@ -354,7 +395,7 @@ public abstract class AltosLink implements Runnable {
                if (frequency == 0)
                        return;
                if (has_frequency)
-                       set_radio_freq((int) Math.floor (frequency * 1000));
+                       set_radio_freq((int) Math.floor (frequency * 1000 + 0.5));
                else if (has_setting)
                        set_radio_setting(AltosConvert.radio_frequency_to_setting(frequency, cal));
                else
@@ -363,7 +404,7 @@ public abstract class AltosLink implements Runnable {
 
        public void set_radio_frequency(double in_frequency) throws InterruptedException, TimeoutException {
                frequency = in_frequency;
-               config_data();
+               AltosConfigData config_data = config_data();
                set_radio_frequency(frequency,
                                    config_data.radio_frequency > 0,
                                    config_data.radio_setting > 0,
@@ -419,11 +460,24 @@ public abstract class AltosLink implements Runnable {
 
        public AltosConfigData config_data() throws InterruptedException, TimeoutException {
                synchronized(config_data_lock) {
-                       if (config_data == null) {
-                               printf("m 0\n");
-                               config_data = new AltosConfigData(this);
-                               if (monitor_mode)
-                                       set_monitor(true);
+                       AltosConfigData config_data;
+
+                       if (remote) {
+                               if (config_data_remote == null) {
+                                       printf("m 0\n");
+                                       config_data_remote = new AltosConfigData(this);
+                                       if (monitor_mode)
+                                               set_monitor(true);
+                               }
+                               config_data = config_data_remote;
+                       } else {
+                               if (config_data_local == null) {
+                                       printf("m 0\n");
+                                       config_data_local = new AltosConfigData(this);
+                                       if (monitor_mode)
+                                               set_monitor(true);
+                               }
+                               config_data = config_data_local;
                        }
                        return config_data;
                }
@@ -524,29 +578,44 @@ public abstract class AltosLink implements Runnable {
        }
 
        public boolean has_monitor_battery() {
-               return config_data.has_monitor_battery();
+               try {
+                       return config_data().has_monitor_battery();
+               } catch (InterruptedException ie) {
+                       return false;
+               } catch (TimeoutException te) {
+                       return false;
+               }
        }
 
        public double monitor_battery() throws InterruptedException {
-               int monitor_batt = AltosLib.MISSING;
-
-               if (config_data.has_monitor_battery()) {
-                       try {
-                       String[] items = adc();
-                       for (int i = 0; i < items.length;) {
-                               if (items[i].equals("batt")) {
-                                       monitor_batt = Integer.parseInt(items[i+1]);
-                                       i += 2;
-                                       continue;
+               double  volts = AltosLib.MISSING;
+
+               try {
+                       AltosConfigData config_data = config_data();
+                       int monitor_batt = AltosLib.MISSING;
+
+                       if (config_data.has_monitor_battery()) {
+                               String[] items = adc();
+                               for (int i = 0; i < items.length;) {
+                                       if (items[i].equals("batt")) {
+                                               monitor_batt = Integer.parseInt(items[i+1]);
+                                               i += 2;
+                                               continue;
+                                       }
+                                       i++;
                                }
-                               i++;
                        }
-                       } catch (TimeoutException te) {
+                       if (monitor_batt != AltosLib.MISSING) {
+                               if (config_data.product.startsWith("TeleBT-v3") || config_data.product.startsWith("TeleBT-v4")) {
+                                       volts = AltosConvert.tele_bt_3_battery(monitor_batt);
+                               } else {
+                                       volts = AltosConvert.cc_battery_to_voltage(monitor_batt);
+                               }
                        }
+
+               } catch (TimeoutException te) {
                }
-               if (monitor_batt == AltosLib.MISSING)
-                       return AltosLib.MISSING;
-               return AltosConvert.cc_battery_to_voltage(monitor_batt);
+               return volts;
        }
 
        public AltosLink() {