summaryrefslogtreecommitdiff
path: root/altoslib/AltosLink.java
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-07-16 15:35:11 -0700
committerKeith Packard <keithp@keithp.com>2012-07-16 15:35:11 -0700
commit52196975c447851f14619213c1de5101d334eebc (patch)
tree8a6809034944bb24314874568372e1926772d10e /altoslib/AltosLink.java
parent0edb5616a70fd480317acc99ec3c28c662aa8556 (diff)
altosui: Move serial datastream parser to altoslib
instead of having it in altosui Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib/AltosLink.java')
-rw-r--r--altoslib/AltosLink.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java
index 779c8496..d59e73ba 100644
--- a/altoslib/AltosLink.java
+++ b/altoslib/AltosLink.java
@@ -24,6 +24,11 @@ import java.util.*;
import java.text.*;
public abstract class AltosLink {
+
+ public final static int ERROR = -1;
+ public final static int TIMEOUT = -2;
+
+ public abstract int getchar();
public abstract void print(String data);
public abstract void close();
@@ -88,6 +93,48 @@ public abstract class AltosLink {
}
+ public void run () {
+ int c;
+ byte[] line_bytes = null;
+ int line_count = 0;
+
+ try {
+ for (;;) {
+ c = getchar();
+ if (Thread.interrupted())
+ break;
+ if (c == ERROR) {
+ add_telem (new AltosLine());
+ add_reply (new AltosLine());
+ break;
+ }
+ if (c == 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 String get_reply(int timeout) throws InterruptedException {
boolean can_cancel = can_cancel_reply();
String reply = null;