From c8078d352a7f54a4a97d25af080155d3f875536a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 16 Jun 2014 22:49:34 -0700 Subject: java: Bump java library versions for next release Prepare for future release by bumping java versions now Signed-off-by: Keith Packard --- altoslib/AltosFlightReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'altoslib/AltosFlightReader.java') diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index 2fcd556e..ac151396 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5; import java.text.*; import java.io.*; -- cgit v1.2.3 From 55e6558fa7cb23fb1363a86c83fbd6abf67ea324 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 2 Jul 2014 22:48:13 -0700 Subject: altoslib: Support multiple telemetry rates Altos now supports 2400 and 9600 baud in addition to the classic 38400 baud rate. Add support to altoslib for these as well Signed-off-by: Keith Packard --- altoslib/AltosConfigData.java | 9 +++++++ altoslib/AltosConfigValues.java | 4 ++++ altoslib/AltosFlightReader.java | 6 +++++ altoslib/AltosLib.java | 9 +++++++ altoslib/AltosLink.java | 14 ++++++++++- altoslib/AltosPreferences.java | 48 ++++++++++++++++++++++++++++++++++++++ altoslib/AltosTelemetryReader.java | 29 +++++++++++++++++++++++ 7 files changed, 118 insertions(+), 1 deletion(-) (limited to 'altoslib/AltosFlightReader.java') diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 3bf8ea43..847436cd 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -46,6 +46,7 @@ public class AltosConfigData implements Iterable { public String callsign; public int radio_enable; public int radio_calibration; + public int telemetry_rate; /* Old HAS_RADIO values */ public int radio_channel; public int radio_setting; @@ -235,6 +236,7 @@ public class AltosConfigData implements Iterable { radio_calibration = -1; radio_channel = -1; radio_setting = -1; + telemetry_rate = -1; accel_cal_plus = -1; accel_cal_minus = -1; @@ -292,6 +294,7 @@ public class AltosConfigData implements Iterable { try { callsign = get_string(line, "Callsign:"); } catch (Exception e) {} try { radio_enable = get_int(line, "Radio enable:"); } catch (Exception e) {} try { radio_calibration = get_int(line, "Radio cal:"); } catch (Exception e) {} + try { telemetry_rate = get_int(line, "Telemetry rate:"); } catch (Exception e) {} /* Old HAS_RADIO values */ try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {} @@ -440,6 +443,8 @@ public class AltosConfigData implements Iterable { callsign = source.callsign(); if (radio_calibration >= 0) radio_calibration = source.radio_calibration(); + if (telemetry_rate >= 0) + telemetry_rate = source.telemetry_rate(); /* HAS_ACCEL */ if (pad_orientation >= 0) @@ -484,6 +489,7 @@ public class AltosConfigData implements Iterable { dest.set_apogee_lockout(apogee_lockout); dest.set_radio_calibration(radio_calibration); dest.set_radio_frequency(frequency()); + dest.set_telemetry_rate(telemetry_rate); boolean max_enabled = true; if (log_space() == 0) @@ -554,6 +560,9 @@ public class AltosConfigData implements Iterable { if (radio_enable >= 0) link.printf("c e %d\n", radio_enable); + if (telemetry_rate >= 0) + link.printf("c T %d\n", telemetry_rate); + /* HAS_ACCEL */ /* UI doesn't support accel cal */ if (pad_orientation >= 0) diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index b0c49e98..987da53b 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -53,6 +53,10 @@ public interface AltosConfigValues { public abstract String callsign(); + public abstract void set_telemetry_rate(int new_telemetry_rate); + + public abstract int telemetry_rate() throws AltosConfigDataException; + public abstract void set_flight_log_max(int new_flight_log_max); public abstract void set_flight_log_max_enabled(boolean enable); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index ac151396..c0565e88 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -38,12 +38,18 @@ public class AltosFlightReader { public void set_telemetry(int telemetry) { } + public void set_telemetry_rate(int telemetry_rate) throws InterruptedException, TimeoutException { } + public void save_telemetry() { } + public void save_telemetry_rate() { } + public void update(AltosState state) throws InterruptedException { } public boolean supports_telemetry(int telemetry) { return false; } + public boolean supports_telemetry_rate(int telemetry_rate) { return false; } + public File backing_file() { return null; } public boolean has_monitor_battery() throws InterruptedException { return false; } diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index ec32fffc..c2ec0e3b 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -161,6 +161,15 @@ public class AltosLib { "Off", "Standard Telemetry", "TeleMetrum v0.9", "TeleMetrum v0.8" }; + public static final int ao_telemetry_rate_38400 = 0; + public static final int ao_telemetry_rate_9600 = 1; + public static final int ao_telemetry_rate_2400 = 2; + public static final int ao_telemetry_rate_max = 2; + + public static final Integer[] ao_telemetry_rate_values = { + 38400, 9600, 2400 + }; + public static final String launch_sites_url = "http://www.altusmetrum.org/AltOS/launch-sites.txt"; public static final int ao_telemetry_standard_len = 32; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index ef40c8cb..eadab5df 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -274,6 +274,8 @@ public abstract class AltosLink implements Runnable { } public void flush_output() { + if (pending_output == null) + return; for (String s : pending_output) System.out.print(s); pending_output.clear(); @@ -305,6 +307,7 @@ public abstract class AltosLink implements Runnable { */ public boolean monitor_mode = false; public int telemetry = AltosLib.ao_telemetry_standard; + public int telemetry_rate = AltosLib.ao_telemetry_rate_38400; public double frequency; public String callsign; AltosConfigData config_data; @@ -356,6 +359,15 @@ public abstract class AltosLink implements Runnable { flush_output(); } + 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 void set_monitor(boolean monitor) { monitor_mode = monitor; if (monitor) @@ -383,7 +395,7 @@ 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"); diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index 159951e4..72cfeb4b 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -35,6 +35,9 @@ public class AltosPreferences { /* telemetry format preference name */ public final static String telemetryPreferenceFormat = "TELEMETRY-%d"; + /* telemetry rate format preference name */ + public final static String telemetryRatePreferenceFormat = "RATE-%d"; + /* voice preference name */ public final static String voicePreference = "VOICE"; @@ -50,6 +53,9 @@ public class AltosPreferences { /* scanning telemetry preferences name */ public final static String scanningTelemetryPreference = "SCANNING-TELEMETRY"; + /* scanning telemetry rate preferences name */ + public final static String scanningTelemetryRatePreference = "SCANNING-RATE"; + /* Launcher serial preference name */ public final static String launcherSerialPreference = "LAUNCHER-SERIAL"; @@ -74,6 +80,9 @@ public class AltosPreferences { /* Telemetry (map serial to telemetry format) */ public static Hashtable telemetries; + /* Telemetry rate (map serial to telemetry format) */ + public static Hashtable telemetry_rates; + /* Voice preference */ public static boolean voice; @@ -86,6 +95,8 @@ public class AltosPreferences { /* Scanning telemetry */ public static int scanning_telemetry; + public static int scanning_telemetry_rate; + /* List of frequencies */ public final static String common_frequencies_node_name = "COMMON-FREQUENCIES"; public static AltosFrequency[] common_frequencies; @@ -159,12 +170,16 @@ public class AltosPreferences { telemetries = new Hashtable(); + telemetry_rates = new Hashtable(); + voice = backend.getBoolean(voicePreference, true); callsign = backend.getString(callsignPreference,"N0CALL"); scanning_telemetry = backend.getInt(scanningTelemetryPreference,(1 << AltosLib.ao_telemetry_standard)); + scanning_telemetry_rate = backend.getInt(scanningTelemetryRatePreference,(1 << AltosLib.ao_telemetry_rate_38400)); + launcher_serial = backend.getInt(launcherSerialPreference, 0); launcher_channel = backend.getInt(launcherChannelPreference, 0); @@ -266,6 +281,25 @@ public class AltosPreferences { } } + public static void set_telemetry_rate(int serial, int new_telemetry_rate) { + synchronized (backend) { + telemetry_rates.put(serial, new_telemetry_rate); + backend.putInt(String.format(telemetryRatePreferenceFormat, serial), new_telemetry_rate); + flush_preferences(); + } + } + + public static int telemetry_rate(int serial) { + synchronized (backend) { + if (telemetry_rates.containsKey(serial)) + return telemetry_rates.get(serial); + int telemetry_rate = backend.getInt(String.format(telemetryRatePreferenceFormat, serial), + AltosLib.ao_telemetry_rate_38400); + telemetry_rates.put(serial, telemetry_rate); + return telemetry_rate; + } + } + public static void set_scanning_telemetry(int new_scanning_telemetry) { synchronized (backend) { scanning_telemetry = new_scanning_telemetry; @@ -280,6 +314,20 @@ public class AltosPreferences { } } + public static void set_scanning_telemetry_rate(int new_scanning_telemetry_rate) { + synchronized (backend) { + scanning_telemetry_rate = new_scanning_telemetry_rate; + backend.putInt(scanningTelemetryRatePreference, scanning_telemetry_rate); + flush_preferences(); + } + } + + public static int scanning_telemetry_rate() { + synchronized(backend) { + return scanning_telemetry_rate; + } + } + public static void set_voice(boolean new_voice) { synchronized (backend) { voice = new_voice; diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index 589f57f2..5ed50134 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -26,6 +26,7 @@ public class AltosTelemetryReader extends AltosFlightReader { AltosLog log; double frequency; int telemetry; + int telemetry_rate; AltosState state = null; LinkedBlockingQueue telem; @@ -92,6 +93,23 @@ public class AltosTelemetryReader extends AltosFlightReader { } } + public boolean supports_telemetry_rate(int telemetry_rate) { + try { + /* Version 1.4.1.1 supports all rates, older versions don't */ + if (link.config_data().compare_version("1.4.1.1") >= 0) + return true; + + if (telemetry_rate == AltosLib.ao_telemetry_rate_38400) + return true; + else + return false; + } catch (InterruptedException ie) { + return false; + } catch (TimeoutException te) { + return true; + } + } + public void save_frequency() { AltosPreferences.set_frequency(link.serial, frequency); } @@ -105,6 +123,15 @@ public class AltosTelemetryReader extends AltosFlightReader { AltosPreferences.set_telemetry(link.serial, telemetry); } + public void set_telemetry_rate(int in_telemetry_rate) { + telemetry_rate = in_telemetry_rate; + link.set_telemetry_rate(telemetry_rate); + } + + public void save_telemetry_rate() { + AltosPreferences.set_telemetry_rate(link.serial, telemetry_rate); + } + public void set_monitor(boolean monitor) { link.set_monitor(monitor); } @@ -133,6 +160,8 @@ public class AltosTelemetryReader extends AltosFlightReader { set_frequency(frequency); telemetry = AltosPreferences.telemetry(link.serial); set_telemetry(telemetry); + telemetry_rate = AltosPreferences.telemetry_rate(link.serial); + set_telemetry_rate(telemetry_rate); link.add_monitor(telem); success = true; } finally { -- cgit v1.2.3 From 810f9a4f79b0480973d84595140d3f8948ce26d9 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 29 Aug 2014 15:22:43 -0500 Subject: altosdroid: start restoring from log data on startup Remember which flight was last being received and reload that file Signed-off-by: Keith Packard --- .../src/org/altusmetrum/AltosDroid/AltosDroid.java | 16 ++-- .../AltosDroid/AltosDroidPreferences.java | 89 +++++----------------- altoslib/AltosFlightReader.java | 8 +- altoslib/AltosLog.java | 1 + altoslib/AltosPreferences.java | 27 +++++++ altoslib/AltosReplayReader.java | 11 ++- altoslib/AltosStateIterable.java | 14 ++++ altoslib/AltosTelemetryReader.java | 31 +++++++- 8 files changed, 111 insertions(+), 86 deletions(-) (limited to 'altoslib/AltosFlightReader.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index c9c38d98..c94f36fd 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -101,9 +101,6 @@ public class AltosDroid extends FragmentActivity { private Messenger mService = null; final Messenger mMessenger = new Messenger(new IncomingHandler(this)); - // Preferences - private AltosDroidPreferences prefs = null; - // TeleBT Config data private AltosConfigData mConfigData = null; // Local Bluetooth adapter @@ -343,8 +340,7 @@ public class AltosDroid extends FragmentActivity { } // Initialise preferences - prefs = new AltosDroidPreferences(this); - AltosPreferences.init(prefs); + AltosDroidPreferences.init(this); // Set up the window layout requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); @@ -480,9 +476,7 @@ public class AltosDroid extends FragmentActivity { } } - private void connectDevice(Intent data) { - // Get the device MAC address - String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); + private void connectDevice(String address) { // Get the BLuetoothDevice object BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); // Attempt to connect to the device @@ -493,6 +487,12 @@ public class AltosDroid extends FragmentActivity { } } + private void connectDevice(Intent data) { + // Get the device MAC address + String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); + connectDevice(address); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java index 70d7def8..7c12c9a0 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java @@ -1,5 +1,5 @@ /* - * Copyright © 2012 Mike Beattie + * Copyright © 2014 Keith Packard * * 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 @@ -14,88 +14,35 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ - package org.altusmetrum.AltosDroid; -import java.io.File; -import java.util.Map; import android.content.Context; -import android.content.SharedPreferences; -import android.os.Environment; - import org.altusmetrum.altoslib_5.*; -public class AltosDroidPreferences implements AltosPreferencesBackend { - public final static String NAME = "org.altusmetrum.AltosDroid"; - private Context context = null; - private SharedPreferences prefs = null; - private SharedPreferences.Editor editor = null; +public class AltosDroidPreferences extends AltosPreferences { - public AltosDroidPreferences(Context in_context) { - this(in_context, NAME); - } + /* Active device preference name */ + final static String activeDevicePreference = "ACTIVE-DEVICE"; - public AltosDroidPreferences(Context in_context, String in_prefs) { - context = in_context; - prefs = context.getSharedPreferences(in_prefs, 0); - editor = prefs.edit(); - } + static String active_device_address; - public String[] keys() { - Map all = prefs.getAll(); - return (String[])all.keySet().toArray(); - } - - public AltosPreferencesBackend node(String key) { - return new AltosDroidPreferences(context, key); - } - - public boolean nodeExists(String key) { - return prefs.contains(key); - } - - public boolean getBoolean(String key, boolean def) { - return prefs.getBoolean(key, def); - } - - public double getDouble(String key, double def) { - Float f = Float.valueOf(prefs.getFloat(key, (float)def)); - return f.doubleValue(); - } - - public int getInt(String key, int def) { - return prefs.getInt(key, def); - } - - public String getString(String key, String def) { - return prefs.getString(key, def); - } - - public void putBoolean(String key, boolean value) { - editor.putBoolean(key, value); - } - - public void putDouble(String key, double value) { - editor.putFloat(key, (float)value); - } - - public void putInt(String key, int value) { - editor.putInt(key, value); - } - - public void putString(String key, String value) { - editor.putString(key, value); - } + public static void init(Context context) { + AltosPreferences.init(new AltosDroidPreferencesBackend(context)); - public void remove(String key) { - editor.remove(key); + active_device_address = backend.getGetString(activeDevicePreference, null); } - public void flush() { - editor.apply(); + public static void set_active_device(String address) { + synchronized(backend) { + active_device_address = address; + backend.putString(activeDevicePreference, active_device_address); + flush_preferences(); + } } - public File homeDirectory() { - return Environment.getExternalStorageDirectory(); + public static String active_device() { + synchronized(backend) { + return active_device_address; + } } } diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index c0565e88..be103838 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -21,16 +21,16 @@ import java.text.*; import java.io.*; import java.util.concurrent.*; -public class AltosFlightReader { +public abstract class AltosFlightReader { public String name; public int serial; - public void init() { } + public void init() {} - public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { return null; } + public abstract AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException; - public void close(boolean interrupted) { } + public abstract void close(boolean interrupted); public void set_frequency(double frequency) throws InterruptedException, TimeoutException { } diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java index 1cac6b52..28116e3d 100644 --- a/altoslib/AltosLog.java +++ b/altoslib/AltosLog.java @@ -72,6 +72,7 @@ public class AltosLog implements Runnable { } log_file.flush(); file = a; + AltosPreferences.set_logfile(link.serial, file); } return log_file != null; } diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index 72cfeb4b..0e91e4f4 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -38,6 +38,9 @@ public class AltosPreferences { /* telemetry rate format preference name */ public final static String telemetryRatePreferenceFormat = "RATE-%d"; + /* log file format preference name */ + public final static String logfilePreferenceFormat = "LOGFILE-%d"; + /* voice preference name */ public final static String voicePreference = "VOICE"; @@ -83,6 +86,9 @@ public class AltosPreferences { /* Telemetry rate (map serial to telemetry format) */ public static Hashtable telemetry_rates; + /* Log file (map serial to logfile name) */ + public static Hashtable logfiles; + /* Voice preference */ public static boolean voice; @@ -300,6 +306,27 @@ public class AltosPreferences { } } + public static void set_logfile(int serial, File new_logfile) { + synchronized(backend) { + logfiles.put(serial, new_logfile); + backend.putString(String.format(logfilePreferenceFormat, serial), new_logfile.getPath()); + flush_preferences(); + } + } + + public static File logfile(int serial) { + synchronized(backend) { + if (logfiles.containsKey(serial)) + return logfiles.get(serial); + String logfile_string = backend.getString(String.format(logfilePreferenceFormat, serial), null); + if (logfile_string == null) + return null; + File logfile = new File(logfile_string); + logfiles.put(serial, logfile); + return logfile; + } + } + public static void set_scanning_telemetry(int new_scanning_telemetry) { synchronized (backend) { scanning_telemetry = new_scanning_telemetry; diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index 15093af1..2864e02a 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -27,6 +27,7 @@ import java.util.*; public class AltosReplayReader extends AltosFlightReader { Iterator iterator; File file; + boolean real_time; public AltosState read() { if (iterator.hasNext()) @@ -39,16 +40,22 @@ public class AltosReplayReader extends AltosFlightReader { public void update(AltosState state) throws InterruptedException { /* Make it run in realtime after the rocket leaves the pad */ - if (state.state > AltosLib.ao_flight_pad && state.time_change > 0) + if (real_time && state.state > AltosLib.ao_flight_pad && state.time_change > 0) Thread.sleep((int) (Math.min(state.time_change,10) * 1000)); state.set_received_time(System.currentTimeMillis()); } public File backing_file() { return file; } - public AltosReplayReader(Iterator in_iterator, File in_file) { + public AltosReplayReader(Iterator in_iterator, File in_file, + boolean in_real_time) { iterator = in_iterator; file = in_file; + real_time = in_real_time; name = file.getName(); } + + public AltosReplayReader(Iterator in_iterator, File in_file) { + this(in_iterator, in_file, false); + } } diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java index f7cd424d..4154b71c 100644 --- a/altoslib/AltosStateIterable.java +++ b/altoslib/AltosStateIterable.java @@ -26,4 +26,18 @@ public abstract class AltosStateIterable implements Iterable { } public abstract void write(PrintStream out); + + public static AltosStateIterable iterable(File file) { + FileInputStream in; + try { + in = new FileInputStream(file); + } catch (Exception e) { + System.out.printf("Failed to open file '%s'\n", file); + return null; + } + if (file.getName().endsWith("telem")) + return new AltosTelemetryFile(in); + else + return new AltosEepromFile(in); + } } diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index 5ed50134..8803e19f 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -28,10 +28,17 @@ public class AltosTelemetryReader extends AltosFlightReader { int telemetry; int telemetry_rate; AltosState state = null; + AltosFlightReader stacked; LinkedBlockingQueue telem; public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { + if (stacked != null) { + state = stacked.read(); + if (state != null) + return state; + stacked = null; + } AltosLine l = telem.take(); if (l.line == null) throw new IOException("IO error"); @@ -53,6 +60,12 @@ public class AltosTelemetryReader extends AltosFlightReader { } public void close(boolean interrupted) { + + if (stacked != null) { + stacked.close(interrupted); + stacked = null; + } + link.remove_monitor(telem); log.close(); try { @@ -148,9 +161,10 @@ public class AltosTelemetryReader extends AltosFlightReader { return link.monitor_battery(); } - public AltosTelemetryReader (AltosLink in_link) + public AltosTelemetryReader (AltosLink in_link, AltosFlightReader in_stacked) throws IOException, InterruptedException, TimeoutException { link = in_link; + stacked = in_stacked; boolean success = false; try { log = new AltosLog(link); @@ -169,4 +183,19 @@ public class AltosTelemetryReader extends AltosFlightReader { close(true); } } + + private static AltosFlightReader existing_data(AltosLink link) { + File file = AltosPreferences.logfile(link.serial); + if (file != null) { + AltosStateIterable iterable = AltosStateIterable.iterable(file); + if (iterable != null) + return new AltosReplayReader(iterable.iterator(), file, false); + } + return null; + } + + public AltosTelemetryReader(AltosLink link) + throws IOException, InterruptedException, TimeoutException { + this(link, existing_data(link)); + } } -- cgit v1.2.3