altosui: Open serial device at 'new' time. Prohibit duplicate opens.
[fw/altos] / ao-tools / altosui / AltosSerial.java
index d6848e57b6419c86ce8a32ff97e1399c5a4fc2a5..99a92fdba5153c69aa8569de3a21012220172a43 100644 (file)
@@ -23,16 +23,10 @@ package altosui;
 
 import java.lang.*;
 import java.io.*;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.LinkedList;
-import java.util.Iterator;
-import altosui.AltosSerialMonitor;
-import altosui.AltosLine;
-import libaltosJNI.libaltos;
-import libaltosJNI.altos_device;
-import libaltosJNI.SWIGTYPE_p_altos_file;
-import libaltosJNI.SWIGTYPE_p_altos_list;
-import libaltosJNI.libaltosConstants;
+import java.util.concurrent.*;
+import java.util.*;
+
+import libaltosJNI.*;
 
 /*
  * This class reads from the serial port and places each received
@@ -42,6 +36,9 @@ import libaltosJNI.libaltosConstants;
 
 public class AltosSerial implements Runnable {
 
+       static List<String> devices_opened = Collections.synchronizedList(new LinkedList<String>());
+
+       altos_device device;
        SWIGTYPE_p_altos_file altos;
        LinkedList<LinkedBlockingQueue<AltosLine>> monitors;
        LinkedBlockingQueue<AltosLine> reply_queue;
@@ -146,10 +143,6 @@ public class AltosSerial implements Runnable {
                        set_monitor(false);
        }
 
-       public boolean opened() {
-               return altos != null;
-       }
-
        public void close() {
                if (altos != null) {
                        libaltos.altos_close(altos);
@@ -166,6 +159,9 @@ public class AltosSerial implements Runnable {
                        libaltos.altos_free(altos);
                        altos = null;
                }
+               synchronized (devices_opened) {
+                       devices_opened.remove(device.getPath());
+               }
        }
 
        public void putc(char c) {
@@ -183,7 +179,12 @@ public class AltosSerial implements Runnable {
                print(String.format(format, arguments));
        }
 
-       public void open(altos_device device) throws FileNotFoundException {
+       private void open() throws FileNotFoundException, AltosSerialInUseException {
+               synchronized (devices_opened) {
+                       if (devices_opened.contains(device.getPath()))
+                               throw new AltosSerialInUseException(device);
+                       devices_opened.add(device.getPath());
+               }
                close();
                altos = libaltos.altos_open(device);
                if (altos == null)
@@ -225,12 +226,12 @@ public class AltosSerial implements Runnable {
                }
        }
 
-       public AltosSerial() {
-               altos = null;
-               input_thread = null;
+       public AltosSerial(altos_device in_device) throws FileNotFoundException, AltosSerialInUseException {
+               device = in_device;
                line = "";
                monitor_mode = false;
                monitors = new LinkedList<LinkedBlockingQueue<AltosLine>> ();
                reply_queue = new LinkedBlockingQueue<AltosLine> ();
+               open();
        }
 }