altoslib: Support multiple telemetry rates
[fw/altos] / altoslib / AltosLink.java
index 8346d281f1e2a0be012f2b69fcef15fa302e04e8..eadab5dff6d3029b77c7e8b08e84c0444f6cba79 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_3;
+package org.altusmetrum.altoslib_5;
 
 import java.io.*;
 import java.util.concurrent.*;
@@ -76,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();
@@ -215,7 +215,7 @@ public abstract class AltosLink implements Runnable {
                                        break;
                                }
                        }
-                       
+
                } finally {
                        --in_reply;
                }
@@ -251,13 +251,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);
@@ -280,6 +274,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();
@@ -311,6 +307,7 @@ public abstract class AltosLink implements Runnable {
         */
        public boolean monitor_mode = false;
        public int telemetry = AltosLib.ao_telemetry_standard;
+       public int telemetry_rate = AltosLib.ao_telemetry_rate_38400;
        public double frequency;
        public String callsign;
        AltosConfigData config_data;
@@ -362,6 +359,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)
@@ -389,10 +395,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;
                }
        }