summaryrefslogtreecommitdiff
path: root/ao-tools/altosui/AltosSerial.java
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2010-11-13 16:07:04 -0800
committerKeith Packard <keithp@keithp.com>2010-11-13 16:07:04 -0800
commitdcfa56498d1b65a213b8aba9cbd6c4806532383c (patch)
tree196742b9dea168b18f6fbadaa54573a15fefd2b3 /ao-tools/altosui/AltosSerial.java
parent8463ffcaca6bcd31e645aba71c171f548dce96d8 (diff)
altosui: Open serial device at 'new' time. Prohibit duplicate opens.
With the per-serial UI, there's never a reason to create a serial device without opening it right away. This eliminates the bug caused by not opening the serial device for telemetry reception. Serial devices can now be opened only once; this eliminates errors when trying to reflash or configure devices while receiving telemetry. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools/altosui/AltosSerial.java')
-rw-r--r--ao-tools/altosui/AltosSerial.java28
1 files changed, 17 insertions, 11 deletions
diff --git a/ao-tools/altosui/AltosSerial.java b/ao-tools/altosui/AltosSerial.java
index 6787e0c8..99a92fdb 100644
--- a/ao-tools/altosui/AltosSerial.java
+++ b/ao-tools/altosui/AltosSerial.java
@@ -23,9 +23,8 @@ package altosui;
import java.lang.*;
import java.io.*;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.LinkedList;
-import java.util.Iterator;
+import java.util.concurrent.*;
+import java.util.*;
import libaltosJNI.*;
@@ -37,6 +36,9 @@ import libaltosJNI.*;
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;
@@ -141,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);
@@ -161,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) {
@@ -178,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)
@@ -220,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();
}
}