altoslib: Round frequency when configuring radio
[fw/altos] / altoslib / AltosLink.java
index ef40c8cb4cbcaebd5d6e98e21810bc65394e9cd5..0105398dbf8c718f6dca40b1a11087305ee42d01 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_5;
+package org.altusmetrum.altoslib_6;
 
 import java.io.*;
 import java.util.concurrent.*;
@@ -55,8 +55,11 @@ public abstract class AltosLink implements Runnable {
 
        public void printf(String format, Object ... arguments) {
                String  line = String.format(format, arguments);
-               if (debug)
-                       pending_output.add(line);
+               if (debug) {
+                       synchronized (pending_output) {
+                               pending_output.add(line);
+                       }
+               }
                try {
                        print(line);
                } catch (InterruptedException ie) {
@@ -163,8 +166,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;
 
@@ -273,10 +289,14 @@ public abstract class AltosLink implements Runnable {
                binary_queue.put(dup);
        }
 
-       public void flush_output() {
-               for (String s : pending_output)
-                       System.out.print(s);
-               pending_output.clear();
+       public synchronized void flush_output() {
+               if (pending_output == null)
+                       return;
+               synchronized (pending_output) {
+                       for (String s : pending_output)
+                               System.out.print(s);
+                       pending_output.clear();
+               }
        }
 
        public void flush_input(int timeout) throws InterruptedException {
@@ -305,6 +325,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;
@@ -333,7 +354,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
@@ -356,7 +377,16 @@ public abstract class AltosLink implements Runnable {
                flush_output();
        }
 
-       public void set_monitor(boolean monitor) {
+       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 synchronized void set_monitor(boolean monitor) {
                monitor_mode = monitor;
                if (monitor)
                        printf("m %x\n", telemetry_len());
@@ -365,6 +395,10 @@ public abstract class AltosLink implements Runnable {
                flush_output();
        }
 
+       public synchronized boolean get_monitor() {
+               return monitor_mode;
+       }
+
        private void set_channel(int channel) {
                if (monitor_mode)
                        printf("m 0\nc r %d\nm %x\n",
@@ -383,7 +417,7 @@ 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) {
                                printf("m 0\n");
@@ -397,8 +431,10 @@ public abstract class AltosLink implements Runnable {
 
        public void set_callsign(String callsign) {
                this.callsign = callsign;
-               printf ("c c %s\n", callsign);
-               flush_output();
+               if (callsign != null) {
+                       printf ("c c %s\n", callsign);
+                       flush_output();
+               }
        }
 
        public boolean is_loader() throws InterruptedException {
@@ -434,7 +470,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 == null || callsign.equals(""))
+                       callsign = AltosPreferences.callsign();
+               set_callsign(callsign);
                printf("p\nE 0\n");
                flush_input();
                remote = true;