altoslib: Increase timeouts when using low baud rate remote protocol
[fw/altos] / altoslib / AltosLink.java
index ba557a72581eef9adb5ecf2cd615075f897bec04..62bd82b93c2ae617c4d67a305696e99a32bd3ba7 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_2;
+package org.altusmetrum.altoslib_5;
 
 import java.io.*;
 import java.util.concurrent.*;
@@ -26,10 +26,10 @@ public abstract class AltosLink implements Runnable {
        public final static int ERROR = -1;
        public final static int TIMEOUT = -2;
 
-       public abstract int getchar();
-       public abstract void print(String data);
+       public abstract int getchar() throws InterruptedException;
+       public abstract void print(String data) throws InterruptedException;
        public abstract void putchar(byte c);
-       public abstract void close();
+       public abstract void close() throws InterruptedException;
 
        public static boolean debug = false;
        public static void set_debug(boolean in_debug) { debug = in_debug; }
@@ -57,7 +57,11 @@ public abstract class AltosLink implements Runnable {
                String  line = String.format(format, arguments);
                if (debug)
                        pending_output.add(line);
-               print(line);
+               try {
+                       print(line);
+               } catch (InterruptedException ie) {
+
+               }
        }
 
        public String get_reply_no_dialog(int timeout) throws InterruptedException, TimeoutException {
@@ -72,7 +76,7 @@ public abstract class AltosLink implements Runnable {
                return get_reply(5000);
        }
 
-               
+
        public abstract boolean can_cancel_reply();
        public abstract boolean show_reply_timeout();
        public abstract void hide_reply_timeout();
@@ -159,8 +163,21 @@ public abstract class AltosLink implements Runnable {
                if (!can_cancel && remote)
                        System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
 
-               if (remote && can_cancel)
+               if (remote && can_cancel) {
                        timeout = 500;
+                       switch (telemetry_rate) {
+                       case AltosLib.ao_telemetry_rate_38400:
+                       default:
+                               timeout = 500;
+                               break;
+                       case AltosLib.ao_telemetry_rate_9600:
+                               timeout = 2000;
+                               break;
+                       case AltosLib.ao_telemetry_rate_2400:
+                               timeout = 8000;
+                               break;
+                       }
+               }
                try {
                        ++in_reply;
 
@@ -211,7 +228,7 @@ public abstract class AltosLink implements Runnable {
                                        break;
                                }
                        }
-                       
+
                } finally {
                        --in_reply;
                }
@@ -233,7 +250,7 @@ public abstract class AltosLink implements Runnable {
                try {
                        add_telem (new AltosLine());
                        add_reply (new AltosLine());
-               } catch (InterruptedException e) {
+               } catch (InterruptedException ie) {
                }
        }
 
@@ -247,13 +264,7 @@ public abstract class AltosLink implements Runnable {
 
        public void add_bytes(byte[] bytes, int len) throws InterruptedException {
                String  line;
-               try {
-                       line = new String(bytes, 0, len, "UTF-8");
-               } catch (UnsupportedEncodingException ue) {
-                       line = "";
-                       for (int i = 0; i < len; i++)
-                               line = line + bytes[i];
-               }
+               line = new String(bytes, 0, len, AltosLib.unicode_set);
                if (debug)
                        System.out.printf("\t\t\t\t\t%s\n", line);
                add_string(line);
@@ -276,6 +287,8 @@ public abstract class AltosLink implements Runnable {
        }
 
        public void flush_output() {
+               if (pending_output == null)
+                       return;
                for (String s : pending_output)
                        System.out.print(s);
                pending_output.clear();
@@ -307,6 +320,7 @@ public abstract class AltosLink implements Runnable {
         */
        public boolean monitor_mode = false;
        public int telemetry = AltosLib.ao_telemetry_standard;
+       public int telemetry_rate = -1;
        public double frequency;
        public String callsign;
        AltosConfigData config_data;
@@ -358,6 +372,15 @@ public abstract class AltosLink implements Runnable {
                flush_output();
        }
 
+       public void set_telemetry_rate(int in_telemetry_rate) {
+               telemetry_rate = in_telemetry_rate;
+               if (monitor_mode)
+                       printf("m 0\nc T %d\nm %x\n", telemetry_rate, telemetry_len());
+               else
+                       printf("c T %d\n", telemetry_rate);
+               flush_output();
+       }
+
        public void set_monitor(boolean monitor) {
                monitor_mode = monitor;
                if (monitor)
@@ -385,10 +408,14 @@ public abstract class AltosLink implements Runnable {
                flush_output();
        }
 
-       public AltosConfigData config_data() throws InterruptedException, TimeoutException {
+       public AltosConfigData config_data() throws InterruptedException, TimeoutException {
                synchronized(config_data_lock) {
-                       if (config_data == null)
+                       if (config_data == null) {
+                               printf("m 0\n");
                                config_data = new AltosConfigData(this);
+                               if (monitor_mode)
+                                       set_monitor(true);
+                       }
                        return config_data;
                }
        }
@@ -399,33 +426,27 @@ public abstract class AltosLink implements Runnable {
                flush_output();
        }
 
-       public boolean is_loader() {
+       public boolean is_loader() throws InterruptedException {
                boolean ret = false;
                printf("v\n");
-               try {
-                       for (;;) {
-                               String line = get_reply();
-
-                               if (line == null)
-                                       return false;
-                               if (line.startsWith("software-version"))
-                                       break;
-                               if (line.startsWith("altos-loader"))
-                                       ret = true;
-                       }
-               } catch (InterruptedException ie) {
+               for (;;) {
+                       String line = get_reply();
+
+                       if (line == null)
+                               return false;
+                       if (line.startsWith("software-version"))
+                               break;
+                       if (line.startsWith("altos-loader"))
+                               ret = true;
                }
                return ret;
        }
 
-       public void to_loader() {
+       public void to_loader() throws InterruptedException {
                printf("X\n");
                flush_output();
                close();
-               try {
-                       Thread.sleep(1000);
-               } catch (InterruptedException ie) {
-               }
+               Thread.sleep(1000);
        }
 
        public boolean remote;
@@ -438,7 +459,12 @@ public abstract class AltosLink implements Runnable {
                if (debug)
                        System.out.printf("start remote %7.3f\n", frequency);
                set_radio_frequency(frequency);
-               set_callsign(AltosPreferences.callsign());
+               if (telemetry_rate < 0)
+                       telemetry_rate = AltosPreferences.telemetry_rate(serial);
+               set_telemetry_rate(telemetry_rate);
+               if (callsign.equals(""))
+                       callsign = AltosPreferences.callsign();
+               set_callsign(callsign);
                printf("p\nE 0\n");
                flush_input();
                remote = true;
@@ -490,7 +516,7 @@ public abstract class AltosLink implements Runnable {
                return config_data.has_monitor_battery();
        }
 
-       public double monitor_battery() {
+       public double monitor_battery() throws InterruptedException {
                int monitor_batt = AltosLib.MISSING;
 
                if (config_data.has_monitor_battery()) {
@@ -504,7 +530,6 @@ public abstract class AltosLink implements Runnable {
                                }
                                i++;
                        }
-                       } catch (InterruptedException ie) {
                        } catch (TimeoutException te) {
                        }
                }