X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosLink.java;h=44202c0c80eb0b6ebe1a53d4d46cadd78d3b7a2d;hp=ef40c8cb4cbcaebd5d6e98e21810bc65394e9cd5;hb=eaf2ee0f498b519d64e1664a2b8c66c52ac1497c;hpb=d6e64790287d684cb9b70c67fa270825932cc020 diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index ef40c8cb..44202c0c 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -3,7 +3,8 @@ * * 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 @@ -15,7 +16,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_5; +package org.altusmetrum.altoslib_13; import java.io.*; import java.util.concurrent.*; @@ -42,6 +43,8 @@ public abstract class AltosLink implements Runnable { public LinkedBlockingQueue reply_queue = new LinkedBlockingQueue(); public LinkedBlockingQueue binary_queue = new LinkedBlockingQueue(); + private String match_string = null; + public synchronized void add_monitor(LinkedBlockingQueue q) { set_monitor(true); monitors.add(q); @@ -55,8 +58,11 @@ public abstract class AltosLink implements Runnable { 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) { @@ -83,10 +89,17 @@ public abstract class AltosLink implements Runnable { 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; @@ -101,6 +114,15 @@ public abstract class AltosLink implements Runnable { 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; @@ -148,6 +170,11 @@ public abstract class AltosLink implements Runnable { 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; + } } } } @@ -155,16 +182,32 @@ public abstract class AltosLink implements Runnable { } } + 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) + 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; @@ -273,10 +316,14 @@ public abstract class AltosLink implements Runnable { 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 { @@ -292,9 +339,22 @@ public abstract class AltosLink implements Runnable { 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); } @@ -305,9 +365,11 @@ public abstract class AltosLink implements Runnable { */ 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; + private AltosConfigData config_data_local; + private AltosConfigData config_data_remote; private Object config_data_lock = new Object(); @@ -333,7 +395,7 @@ public abstract class AltosLink implements Runnable { 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 @@ -342,7 +404,7 @@ public abstract class AltosLink implements Runnable { 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, @@ -356,7 +418,16 @@ public abstract class AltosLink implements Runnable { 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()); @@ -365,6 +436,10 @@ public abstract class AltosLink implements Runnable { 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", @@ -383,13 +458,26 @@ public abstract class AltosLink implements Runnable { flush_output(); } - public AltosConfigData config_data() throws InterruptedException, TimeoutException { + 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; } @@ -397,8 +485,10 @@ public abstract class AltosLink implements Runnable { 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 { @@ -434,7 +524,12 @@ public abstract class AltosLink implements Runnable { 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; @@ -483,29 +578,44 @@ public abstract class AltosLink implements Runnable { } 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; - - 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; + double volts = AltosLib.MISSING; + + 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")) { + monitor_batt = Integer.parseInt(items[i+1]); + i += 2; + continue; + } + i++; } - i++; } - } catch (TimeoutException te) { + 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); + } } + + } catch (TimeoutException te) { } - if (monitor_batt == AltosLib.MISSING) - return AltosLib.MISSING; - return AltosConvert.cc_battery_to_voltage(monitor_batt); + return volts; } public AltosLink() {