altoslib: Lock access to AltosLink config_data
[fw/altos] / altoslib / AltosLink.java
index 159ebfe19c234b34b423a6619e56d18f7ca6f433..4823a986011c1ec80f443bfc16c6cc0e24458ce3 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_1;
+package org.altusmetrum.altoslib_2;
 
 import java.io.*;
 import java.util.concurrent.*;
@@ -32,17 +32,20 @@ public abstract class AltosLink implements Runnable {
 
        public static boolean debug = false;
        public static void set_debug(boolean in_debug) { debug = in_debug; }
+
+       public boolean has_error;
+
        LinkedList<String> pending_output = new LinkedList<String>();
 
        public LinkedList<LinkedBlockingQueue<AltosLine>> monitors = new LinkedList<LinkedBlockingQueue<AltosLine>> ();;
        public LinkedBlockingQueue<AltosLine> reply_queue = new LinkedBlockingQueue<AltosLine>();
 
-       public void add_monitor(LinkedBlockingQueue<AltosLine> q) {
+       public synchronized void add_monitor(LinkedBlockingQueue<AltosLine> q) {
                set_monitor(true);
                monitors.add(q);
        }
 
-       public void remove_monitor(LinkedBlockingQueue<AltosLine> q) {
+       public synchronized void remove_monitor(LinkedBlockingQueue<AltosLine> q) {
                monitors.remove(q);
                if (monitors.isEmpty())
                        set_monitor(false);
@@ -107,6 +110,7 @@ public abstract class AltosLink implements Runnable {
                                if (c == ERROR) {
                                        if (debug)
                                                System.out.printf("ERROR\n");
+                                       has_error = true;
                                        add_telem (new AltosLine());
                                        add_reply (new AltosLine());
                                        break;
@@ -252,6 +256,8 @@ public abstract class AltosLink implements Runnable {
        public String callsign;
        AltosConfigData config_data;
 
+       private Object config_data_lock = new Object();
+
        private int telemetry_len() {
                return AltosLib.telemetry_len(telemetry);
        }
@@ -325,9 +331,11 @@ public abstract class AltosLink implements Runnable {
        }
 
        public AltosConfigData config_data() throws InterruptedException, TimeoutException {
-               if (config_data == null)
-                       config_data = new AltosConfigData(this);
-               return config_data;
+               synchronized(config_data_lock) {
+                       if (config_data == null)
+                               config_data = new AltosConfigData(this);
+                       return config_data;
+               }
        }
 
        public void set_callsign(String callsign) {
@@ -399,7 +407,7 @@ public abstract class AltosLink implements Runnable {
        }
 
        public double monitor_battery() {
-               int monitor_batt = AltosRecord.MISSING;
+               int monitor_batt = AltosLib.MISSING;
 
                if (config_data.has_monitor_battery()) {
                        try {
@@ -416,12 +424,13 @@ public abstract class AltosLink implements Runnable {
                        } catch (TimeoutException te) {
                        }
                }
-               if (monitor_batt == AltosRecord.MISSING)
-                       return AltosRecord.MISSING;
+               if (monitor_batt == AltosLib.MISSING)
+                       return AltosLib.MISSING;
                return AltosConvert.cc_battery_to_voltage(monitor_batt);
        }
 
        public AltosLink() {
                callsign = "";
+               has_error = false;
        }
 }