*
* 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_3;
+package org.altusmetrum.altoslib_11;
import java.io.*;
import java.util.concurrent.*;
public void printf(String format, Object ... arguments) {
String line = String.format(format, arguments);
- if (debug)
- pending_output.add(line);
+ if (debug) {
+ synchronized (pending_output) {
+ pending_output.add(line);
+ }
+ }
try {
print(line);
} catch (InterruptedException ie) {
return get_reply(5000);
}
-
+
public abstract boolean can_cancel_reply();
public abstract boolean show_reply_timeout();
public abstract void hide_reply_timeout();
public boolean reply_abort;
public int in_reply;
+ boolean cancel_enable = true;
+
+ public void set_cancel_enable(boolean e) {
+ cancel_enable = e;
+ }
boolean reply_timeout_shown = false;
private boolean check_reply_timeout() {
+ if (!cancel_enable)
+ return false;
if (!reply_timeout_shown)
reply_timeout_shown = show_reply_timeout();
return reply_abort;
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)
+ if (remote && can_cancel) {
timeout = 500;
+ switch (telemetry_rate) {
+ case AltosLib.ao_telemetry_rate_38400:
+ default:
+ timeout = 500;
+ break;
+ case AltosLib.ao_telemetry_rate_9600:
+ timeout = 2000;
+ break;
+ case AltosLib.ao_telemetry_rate_2400:
+ timeout = 8000;
+ break;
+ }
+ }
try {
++in_reply;
break;
}
}
-
+
} finally {
--in_reply;
}
public void add_bytes(byte[] bytes, int len) throws InterruptedException {
String line;
- try {
- line = new String(bytes, 0, len, "UTF-8");
- } catch (UnsupportedEncodingException ue) {
- line = "";
- for (int i = 0; i < len; i++)
- line = line + bytes[i];
- }
+ line = new String(bytes, 0, len, AltosLib.unicode_set);
if (debug)
System.out.printf("\t\t\t\t\t%s\n", line);
add_string(line);
binary_queue.put(dup);
}
- public void flush_output() {
- for (String s : pending_output)
- System.out.print(s);
- pending_output.clear();
+ public synchronized void flush_output() {
+ if (pending_output == null)
+ return;
+ synchronized (pending_output) {
+ for (String s : pending_output)
+ System.out.print(s);
+ pending_output.clear();
+ }
}
public void flush_input(int timeout) throws InterruptedException {
*/
public boolean monitor_mode = false;
public int telemetry = AltosLib.ao_telemetry_standard;
+ public int telemetry_rate = -1;
public double frequency;
public String callsign;
AltosConfigData config_data;
if (frequency == 0)
return;
if (has_frequency)
- set_radio_freq((int) Math.floor (frequency * 1000));
+ set_radio_freq((int) Math.floor (frequency * 1000 + 0.5));
else if (has_setting)
set_radio_setting(AltosConvert.radio_frequency_to_setting(frequency, cal));
else
flush_output();
}
- public void set_monitor(boolean monitor) {
+ public void set_telemetry_rate(int in_telemetry_rate) {
+ telemetry_rate = in_telemetry_rate;
+ if (monitor_mode)
+ printf("m 0\nc T %d\nm %x\n", telemetry_rate, telemetry_len());
+ else
+ printf("c T %d\n", telemetry_rate);
+ flush_output();
+ }
+
+ public synchronized void set_monitor(boolean monitor) {
monitor_mode = monitor;
if (monitor)
printf("m %x\n", telemetry_len());
flush_output();
}
+ public synchronized boolean get_monitor() {
+ return monitor_mode;
+ }
+
private void set_channel(int channel) {
if (monitor_mode)
printf("m 0\nc r %d\nm %x\n",
flush_output();
}
- public AltosConfigData config_data() throws InterruptedException, TimeoutException {
+ public AltosConfigData config_data() throws InterruptedException, TimeoutException {
synchronized(config_data_lock) {
- if (config_data == null)
+ if (config_data == null) {
+ printf("m 0\n");
config_data = new AltosConfigData(this);
+ if (monitor_mode)
+ set_monitor(true);
+ }
return config_data;
}
}
public void set_callsign(String callsign) {
this.callsign = callsign;
- printf ("c c %s\n", callsign);
- flush_output();
+ if (callsign != null) {
+ printf ("c c %s\n", callsign);
+ flush_output();
+ }
}
public boolean is_loader() throws InterruptedException {
if (debug)
System.out.printf("start remote %7.3f\n", frequency);
set_radio_frequency(frequency);
- set_callsign(AltosPreferences.callsign());
+ if (telemetry_rate < 0)
+ telemetry_rate = AltosPreferences.telemetry_rate(serial);
+ set_telemetry_rate(telemetry_rate);
+ if (callsign == null || callsign.equals(""))
+ callsign = AltosPreferences.callsign();
+ set_callsign(callsign);
printf("p\nE 0\n");
flush_input();
remote = true;
if (config_data.has_monitor_battery()) {
try {
- String[] items = adc();
- for (int i = 0; i < items.length;) {
- if (items[i].equals("batt")) {
- monitor_batt = Integer.parseInt(items[i+1]);
- i += 2;
- continue;
+ String[] items = adc();
+ for (int i = 0; i < items.length;) {
+ if (items[i].equals("batt")) {
+ monitor_batt = Integer.parseInt(items[i+1]);
+ i += 2;
+ continue;
+ }
+ i++;
}
- i++;
- }
} catch (TimeoutException te) {
}
}
if (monitor_batt == AltosLib.MISSING)
return AltosLib.MISSING;
- return 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);
+ }
+
+ return volts;
}
public AltosLink() {