* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_1;
+package org.altusmetrum.altoslib_3;
import java.io.*;
import java.util.concurrent.*;
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();
+ public abstract int getchar() throws InterruptedException;
+ public abstract void print(String data) throws InterruptedException;
+ public abstract void putchar(byte c);
+ public abstract void close() throws InterruptedException;
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 LinkedBlockingQueue<byte[]> binary_queue = new LinkedBlockingQueue<byte[]>();
- 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);
String line = String.format(format, arguments);
if (debug)
pending_output.add(line);
- print(line);
+ try {
+ print(line);
+ } catch (InterruptedException ie) {
+
+ }
}
public String get_reply_no_dialog(int timeout) throws InterruptedException, TimeoutException {
}
}
+ private int len_read = 0;
public void run () {
int c;
for (;;) {
c = getchar();
if (Thread.interrupted()) {
- if (debug)
- System.out.printf("INTERRUPTED\n");
break;
}
if (c == ERROR) {
if (debug)
System.out.printf("ERROR\n");
+ has_error = true;
add_telem (new AltosLine());
add_reply (new AltosLine());
break;
System.out.printf("TIMEOUT\n");
continue;
}
- if (c == '\r')
+ if (c == '\r' && len_read == 0)
continue;
synchronized(this) {
- if (c == '\n') {
+ if (c == '\n' && len_read == 0) {
if (line_count != 0) {
add_bytes(line_bytes, line_count);
line_count = 0;
}
line_bytes[line_count] = (byte) c;
line_count++;
+ if (len_read !=0 && line_count == len_read) {
+ add_binary(line_bytes, line_count);
+ line_count = 0;
+ len_read = 0;
+ }
}
}
}
}
}
+
public String get_reply(int timeout) throws InterruptedException {
boolean can_cancel = can_cancel_reply();
String reply = null;
return reply;
}
+ public byte[] get_binary_reply(int timeout, int len) throws InterruptedException {
+ boolean can_cancel = can_cancel_reply();
+ byte[] bytes = null;
+
+ synchronized(this) {
+ len_read = len;
+ }
+ try {
+ ++in_reply;
+
+ flush_output();
+
+ reply_abort = false;
+ reply_timeout_shown = false;
+ for (;;) {
+ bytes = binary_queue.poll(timeout, TimeUnit.MILLISECONDS);
+ if (bytes != null) {
+ cleanup_reply_timeout();
+ break;
+ }
+ if (!remote || !can_cancel || check_reply_timeout()) {
+ bytes = null;
+ break;
+ }
+ }
+
+ } finally {
+ --in_reply;
+ }
+ return bytes;
+ }
+
public void add_telem(AltosLine line) throws InterruptedException {
for (int e = 0; e < monitors.size(); e++) {
LinkedBlockingQueue<AltosLine> q = monitors.get(e);
try {
add_telem (new AltosLine());
add_reply (new AltosLine());
- } catch (InterruptedException e) {
+ } catch (InterruptedException ie) {
}
}
add_string(line);
}
+ public void add_binary(byte[] bytes, int len) throws InterruptedException {
+ byte[] dup = new byte[len];
+
+ if (debug)
+ System.out.printf ("\t\t\t\t\t%d:", len);
+ for(int i = 0; i < len; i++) {
+ dup[i] = bytes[i];
+ if (debug)
+ System.out.printf(" %02x", dup[i]);
+ }
+ if (debug)
+ System.out.printf("\n");
+
+ binary_queue.put(dup);
+ }
+
public void flush_output() {
for (String s : pending_output)
System.out.print(s);
public String callsign;
AltosConfigData config_data;
+ private Object config_data_lock = new Object();
+
private int telemetry_len() {
return AltosLib.telemetry_len(telemetry);
}
}
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) {
flush_output();
}
+ public boolean is_loader() throws InterruptedException {
+ boolean ret = false;
+ printf("v\n");
+ for (;;) {
+ String line = get_reply();
+
+ if (line == null)
+ return false;
+ if (line.startsWith("software-version"))
+ break;
+ if (line.startsWith("altos-loader"))
+ ret = true;
+ }
+ return ret;
+ }
+
+ public void to_loader() throws InterruptedException {
+ printf("X\n");
+ flush_output();
+ close();
+ Thread.sleep(1000);
+ }
+
public boolean remote;
public int serial;
public String name;
return config_data.has_monitor_battery();
}
- public double monitor_battery() {
- int monitor_batt = AltosRecord.MISSING;
+ public double monitor_battery() throws InterruptedException {
+ int monitor_batt = AltosLib.MISSING;
if (config_data.has_monitor_battery()) {
try {
}
i++;
}
- } catch (InterruptedException ie) {
} 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;
}
}