Merge remote-tracking branch 'origin/micropeak-logging'
[fw/altos] / altosui / AltosSerial.java
index 35704d40202519965462f6892b9668d99807dfb0..78d862d03645ccd7eae99eb1acfd1bbc17d19682 100644 (file)
 
 package altosui;
 
-import java.lang.*;
 import java.io.*;
-import java.util.concurrent.*;
 import java.util.*;
-import java.text.*;
 import java.awt.*;
-import java.awt.event.*;
 import javax.swing.*;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.table.*;
 import org.altusmetrum.AltosLib.*;
+import org.altusmetrum.altosuilib.*;
 
 import libaltosJNI.*;
 
@@ -41,7 +36,7 @@ import libaltosJNI.*;
  * threads.
  */
 
-public class AltosSerial extends AltosLink implements Runnable {
+public class AltosSerial extends AltosLink  {
 
        static java.util.List<String> devices_opened = Collections.synchronizedList(new LinkedList<String>());
 
@@ -53,52 +48,20 @@ public class AltosSerial extends AltosLink implements Runnable {
        int line_count;
        Frame frame;
 
-       public void run () {
-               int c;
-               byte[] line_bytes = null;
-               int line_count = 0;
-
-               try {
-                       for (;;) {
-                               c = libaltos.altos_getchar(altos, 0);
-                               if (Thread.interrupted())
-                                       break;
-                               if (c == libaltosConstants.LIBALTOS_ERROR) {
-                                       add_telem (new AltosLine());
-                                       add_reply (new AltosLine());
-                                       break;
-                               }
-                               if (c == libaltosConstants.LIBALTOS_TIMEOUT)
-                                       continue;
-                               if (c == '\r')
-                                       continue;
-                               synchronized(this) {
-                                       if (c == '\n') {
-                                               if (line_count != 0) {
-                                                       add_bytes(line_bytes, line_count);
-                                                       line_count = 0;
-                                               }
-                                       } else {
-                                               if (line_bytes == null) {
-                                                       line_bytes = new byte[256];
-                                               } else if (line_count == line_bytes.length) {
-                                                       byte[] new_line_bytes = new byte[line_count * 2];
-                                                       System.arraycopy(line_bytes, 0, new_line_bytes, 0, line_count);
-                                                       line_bytes = new_line_bytes;
-                                               }
-                                               line_bytes[line_count] = (byte) c;
-                                               line_count++;
-                                       }
-                               }
-                       }
-               } catch (InterruptedException e) {
-               }
+       public int getchar() {
+               if (altos == null)
+                       return ERROR;
+               return libaltos.altos_getchar(altos, 0);
        }
 
        public void flush_output() {
                super.flush_output();
                if (altos != null) {
-                       libaltos.altos_flush(altos);
+                       if (libaltos.altos_flush(altos) != 0) {
+                               libaltos.altos_close(altos);
+                               altos = null;
+                               abort_reply();
+                       }
                }
        }
 
@@ -193,7 +156,11 @@ public class AltosSerial extends AltosLink implements Runnable {
 
        private void putc(char c) {
                if (altos != null)
-                       libaltos.altos_putchar(altos, c);
+                       if (libaltos.altos_putchar(altos, c) != 0) {
+                               libaltos.altos_close(altos);
+                               altos = null;
+                               abort_reply();
+                       }
        }
 
        public void print(String data) {