*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_10;
+package org.altusmetrum.altoslib_14;
import java.io.*;
import java.util.concurrent.*;
public LinkedBlockingQueue<AltosLine> reply_queue = new LinkedBlockingQueue<AltosLine>();
public LinkedBlockingQueue<byte[]> binary_queue = new LinkedBlockingQueue<byte[]>();
+ private String match_string = null;
+
public synchronized void add_monitor(LinkedBlockingQueue<AltosLine> q) {
set_monitor(true);
monitors.add(q);
private int len_read = 0;
+ private boolean match_bytes(byte[] bytes, int byte_count, String match) {
+ if (byte_count < match.length())
+ return false;
+ String line = new String(bytes, 0, byte_count, AltosLib.unicode_set);
+ if (line == null)
+ return false;
+ return line.indexOf(match) >= 0;
+ }
+
public void run () {
int c;
byte[] line_bytes = null;
line_count = 0;
len_read = 0;
}
+ if (match_string != null && match_bytes(line_bytes, line_count, match_string)) {
+ match_string = null;
+ add_bytes(line_bytes, line_count);
+ line_count = 0;
+ }
}
}
}
}
}
+ public void set_match(String match) {
+ match_string = match;
+ }
public String get_reply(int timeout) throws InterruptedException {
boolean can_cancel = can_cancel_reply();
String reply = null;
- if (!can_cancel && remote)
- System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
+// if (!can_cancel && remote)
+// System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
if (remote && can_cancel) {
timeout = 500;
public void flush_input() throws InterruptedException {
- if (remote)
- flush_input(500);
- else
+ if (remote) {
+ int timeout = 500;
+ switch (telemetry_rate) {
+ case AltosLib.ao_telemetry_rate_38400:
+ default:
+ timeout = 500;
+ break;
+ case AltosLib.ao_telemetry_rate_9600:
+ timeout = 1000;
+ break;
+ case AltosLib.ao_telemetry_rate_2400:
+ timeout = 2000;
+ break;
+ }
+ flush_input(timeout);
+ } else
flush_input(100);
}
public int telemetry_rate = -1;
public double frequency;
public String callsign;
- AltosConfigData config_data;
+ private AltosConfigData config_data_local;
+ private AltosConfigData config_data_remote;
private Object config_data_lock = new Object();
int cal) {
if (debug)
System.out.printf("set_radio_frequency %7.3f (freq %b) (set %b) %d\n", frequency, has_frequency, has_setting, cal);
- if (frequency == 0)
+ if (frequency == 0 || frequency == AltosLib.MISSING)
return;
if (has_frequency)
set_radio_freq((int) Math.floor (frequency * 1000 + 0.5));
public void set_radio_frequency(double in_frequency) throws InterruptedException, TimeoutException {
frequency = in_frequency;
- config_data();
+ AltosConfigData config_data = config_data();
set_radio_frequency(frequency,
config_data.radio_frequency > 0,
config_data.radio_setting > 0,
public AltosConfigData config_data() throws InterruptedException, TimeoutException {
synchronized(config_data_lock) {
- if (config_data == null) {
- printf("m 0\n");
- config_data = new AltosConfigData(this);
- if (monitor_mode)
- set_monitor(true);
+ AltosConfigData config_data;
+
+ if (remote) {
+ if (config_data_remote == null) {
+ printf("m 0\n");
+ config_data_remote = new AltosConfigData(this);
+ if (monitor_mode)
+ set_monitor(true);
+ }
+ config_data = config_data_remote;
+ } else {
+ if (config_data_local == null) {
+ printf("m 0\n");
+ config_data_local = new AltosConfigData(this);
+ if (monitor_mode)
+ set_monitor(true);
+ }
+ config_data = config_data_local;
}
return config_data;
}
public String name;
public void start_remote() throws TimeoutException, InterruptedException {
- if (frequency == 0.0)
+ if (frequency == 0.0 || frequency == AltosLib.MISSING)
frequency = AltosPreferences.frequency(serial);
if (debug)
System.out.printf("start remote %7.3f\n", frequency);
if (debug)
System.out.printf("stop remote\n");
try {
+ flush_output();
flush_input();
} finally {
printf ("~\n");
}
public boolean has_monitor_battery() {
- return config_data.has_monitor_battery();
+ try {
+ return config_data().has_monitor_battery();
+ } catch (InterruptedException ie) {
+ return false;
+ } catch (TimeoutException te) {
+ return false;
+ }
}
public double monitor_battery() throws InterruptedException {
- int monitor_batt = AltosLib.MISSING;
+ double volts = AltosLib.MISSING;
- if (config_data.has_monitor_battery()) {
- try {
+ try {
+ AltosConfigData config_data = config_data();
+ int monitor_batt = AltosLib.MISSING;
+
+ if (config_data.has_monitor_battery()) {
String[] items = adc();
for (int i = 0; i < items.length;) {
if (items[i].equals("batt")) {
}
i++;
}
- } catch (TimeoutException te) {
}
- }
- if (monitor_batt == AltosLib.MISSING)
- return AltosLib.MISSING;
+ if (monitor_batt != AltosLib.MISSING) {
+ if (config_data.product.startsWith("TeleBT-v3") || config_data.product.startsWith("TeleBT-v4")) {
+ volts = AltosConvert.tele_bt_3_battery(monitor_batt);
+ } else {
+ volts = AltosConvert.cc_battery_to_voltage(monitor_batt);
+ }
+ }
- double volts = AltosLib.MISSING;
- if (config_data.product.startsWith("TeleBT-v3")) {
- volts = AltosConvert.tele_bt_3_battery(monitor_batt);
- } else {
- volts = AltosConvert.cc_battery_to_voltage(monitor_batt);
+ } catch (TimeoutException te) {
}
-
return volts;
}