X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosUI.java;h=82ec47465f90a30477bd434daafe270ca7631b24;hp=1eb038055af1c23e219d53c282c47dfc4e611c9c;hb=3fd320ea38f2945f5611a09a0e48d16db467d105;hpb=c8078d352a7f54a4a97d25af080155d3f875536a diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index 1eb03805..82ec4746 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.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 @@ -22,10 +23,10 @@ import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_5.*; -import org.altusmetrum.altosuilib_3.*; +import org.altusmetrum.altoslib_13.*; +import org.altusmetrum.altosuilib_13.*; -public class AltosUI extends AltosUIFrame { +public class AltosUI extends AltosUIFrame implements AltosEepromGrapher { public AltosVoice voice = new AltosVoice(); public static boolean load_library(Frame frame) { @@ -99,10 +100,25 @@ public class AltosUI extends AltosUIFrame { return b; } + /* OSXAdapter interfaces */ + public void macosx_file_handler(String path) { + process_graph(new File(path)); + } + + public void macosx_quit_handler() { + System.exit(0); + } + + public void macosx_preferences_handler() { + ConfigureAltosUI(); + } + public AltosUI() { load_library(null); + register_for_macosx_events(); + AltosUIPreferences.set_component(this); pane = getContentPane(); @@ -260,7 +276,7 @@ public class AltosUI extends AltosUIFrame { } void ConfigureTeleMetrum() { - new AltosConfig(AltosUI.this); + new AltosConfigFC(AltosUI.this); } void ConfigureTeleDongle() { @@ -294,10 +310,9 @@ public class AltosUI extends AltosUIFrame { AltosDataChooser chooser = new AltosDataChooser( AltosUI.this); - Iterable states = chooser.runDialog(); - if (states != null) { - AltosFlightReader reader = new AltosReplayReader(states.iterator(), - chooser.file()); + AltosRecordSet set = chooser.runDialog(); + if (set != null) { + AltosReplayReader reader = new AltosReplayReader(set, chooser.file()); new AltosFlightUI(voice, reader); } } @@ -305,8 +320,24 @@ public class AltosUI extends AltosUIFrame { /* Connect to TeleMetrum, either directly or through * a TeleDongle over the packet link */ + + public void graph_flights(AltosEepromList flights) { + for (AltosEepromLog flight : flights) { + if (flight.graph_selected && flight.file != null) { + process_graph(flight.file); + } + } + } + private void SaveFlightData() { - new AltosEepromManage(AltosUI.this, AltosLib.product_any); + new AltosEepromManage(this, this, AltosLib.product_any); + } + + private static AltosFlightSeries make_series(AltosRecordSet set) { + AltosFlightSeries series = new AltosFlightSeries(set.cal_data()); + set.capture_series(series); + series.finish(); + return series; } /* Load a flight log file and write out a CSV file containing @@ -316,10 +347,11 @@ public class AltosUI extends AltosUIFrame { private void ExportData() { AltosDataChooser chooser; chooser = new AltosDataChooser(this); - AltosStateIterable states = chooser.runDialog(); - if (states == null) + AltosRecordSet set = chooser.runDialog(); + if (set == null) return; - new AltosCSVUI(AltosUI.this, states, chooser.file()); + AltosFlightSeries series = make_series(set); + new AltosCSVUI(AltosUI.this, series, chooser.file()); } /* Load a flight log CSV file and display a pretty graph. @@ -328,11 +360,11 @@ public class AltosUI extends AltosUIFrame { private void GraphData() { AltosDataChooser chooser; chooser = new AltosDataChooser(this); - AltosStateIterable states = chooser.runDialog(); - if (states == null) + AltosRecordSet set = chooser.runDialog(); + if (set == null) return; try { - new AltosGraphUI(states, chooser.file()); + new AltosGraphUI(set, chooser.file()); } catch (InterruptedException ie) { } catch (IOException ie) { } @@ -349,21 +381,6 @@ public class AltosUI extends AltosUIFrame { } } - static AltosStateIterable open_logfile(File file) { - try { - FileInputStream in; - - in = new FileInputStream(file); - if (file.getName().endsWith("telem")) - return new AltosTelemetryFile(in); - else - return new AltosEepromFile(in); - } catch (FileNotFoundException fe) { - System.out.printf("%s\n", fe.getMessage()); - return null; - } - } - static AltosWriter open_csv(File file) { try { return new AltosCSV(file); @@ -382,17 +399,29 @@ public class AltosUI extends AltosUIFrame { } } + static AltosRecordSet record_set(File input) { + try { + return AltosLib.record_set(input); + } catch (IOException ie) { + String message = ie.getMessage(); + if (message == null) + message = String.format("%s (I/O error)", input.toString()); + System.err.printf("%s: %s\n", input.toString(), message); + } + return null; + } + static final int process_none = 0; static final int process_csv = 1; static final int process_kml = 2; static final int process_graph = 3; static final int process_replay = 4; static final int process_summary = 5; - static final int process_cat = 6; + static final int process_oneline = 6; static boolean process_csv(File input) { - AltosStateIterable states = open_logfile(input); - if (states == null) + AltosRecordSet set = record_set(input); + if (set == null) return false; File output = Altos.replace_extension(input,".csv"); @@ -404,15 +433,16 @@ public class AltosUI extends AltosUIFrame { AltosWriter writer = open_csv(output); if (writer == null) return false; - writer.write(states); + AltosFlightSeries series = make_series(set); + writer.write(series); writer.close(); } return true; } static boolean process_kml(File input) { - AltosStateIterable states = open_logfile(input); - if (states == null) + AltosRecordSet set = record_set(input); + if (set == null) return false; File output = Altos.replace_extension(input,".kml"); @@ -424,31 +454,19 @@ public class AltosUI extends AltosUIFrame { AltosWriter writer = open_kml(output); if (writer == null) return false; - writer.write(states); + AltosFlightSeries series = make_series(set); + series.finish(); + writer.write(series); writer.close(); return true; } } - static AltosStateIterable record_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); - } - static AltosReplayReader replay_file(File file) { - AltosStateIterable states = record_iterable(file); - if (states == null) + AltosRecordSet set = record_set(file); + if (set == null) return null; - return new AltosReplayReader(states.iterator(), file); + return new AltosReplayReader(set, file); } static boolean process_replay(File file) { @@ -456,16 +474,15 @@ public class AltosUI extends AltosUIFrame { if (reader == null) return false; AltosFlightUI flight_ui = new AltosFlightUI(new AltosVoice(), reader); - flight_ui.set_exit_on_close(); return true; } static boolean process_graph(File file) { - AltosStateIterable states = record_iterable(file); - if (states == null) + AltosRecordSet set = record_set(file); + if (set == null) return false; try { - new AltosGraphUI(states, file); + new AltosGraphUI(set, file); return true; } catch (InterruptedException ie) { } catch (IOException ie) { @@ -474,79 +491,81 @@ public class AltosUI extends AltosUIFrame { } static boolean process_summary(File file) { - AltosStateIterable states = record_iterable(file); - if (states == null) + AltosRecordSet set = record_set(file); + if (set == null) return false; - try { - AltosFlightStats stats = new AltosFlightStats(states); - if (stats.serial > 0) - System.out.printf("Serial: %5d\n", stats.serial); - if (stats.flight > 0) - System.out.printf("Flight: %5d\n", stats.flight); - if (stats.year > 0) - System.out.printf("Date: %04d-%02d-%02d\n", - stats.year, stats.month, stats.day); - if (stats.hour > 0) - System.out.printf("Time: %02d:%02d:%02d UTC\n", - stats.hour, stats.minute, stats.second); + System.out.printf("%s:\n", file.toString()); + AltosFlightSeries series = make_series(set); + AltosFlightStats stats = new AltosFlightStats(series); + if (stats.serial != AltosLib.MISSING) + System.out.printf("Serial: %5d\n", stats.serial); + if (stats.flight != AltosLib.MISSING) + System.out.printf("Flight: %5d\n", stats.flight); + if (stats.year != AltosLib.MISSING) + System.out.printf("Date: %04d-%02d-%02d\n", + stats.year, stats.month, stats.day); + if (stats.hour != AltosLib.MISSING) + System.out.printf("Time: %02d:%02d:%02d UTC\n", + stats.hour, stats.minute, stats.second); + if (stats.max_height != AltosLib.MISSING) System.out.printf("Max height: %6.0f m %6.0f ft\n", stats.max_height, AltosConvert.meters_to_feet(stats.max_height)); + if (stats.max_speed != AltosLib.MISSING) System.out.printf("Max speed: %6.0f m/s %6.0f ft/s %6.4f Mach\n", stats.max_speed, AltosConvert.meters_to_feet(stats.max_speed), AltosConvert.meters_to_mach(stats.max_speed)); - if (stats.max_acceleration != AltosLib.MISSING) { - System.out.printf("Max accel: %6.0f m/s² %6.0f ft/s² %6.2f g\n", - stats.max_acceleration, - AltosConvert.meters_to_feet(stats.max_acceleration), - AltosConvert.meters_to_g(stats.max_acceleration)); - } + if (stats.max_acceleration != AltosLib.MISSING) { + System.out.printf("Max accel: %6.0f m/s² %6.0f ft/s² %6.2f g\n", + stats.max_acceleration, + AltosConvert.meters_to_feet(stats.max_acceleration), + AltosConvert.meters_to_g(stats.max_acceleration)); + } + if (stats.state_speed[Altos.ao_flight_drogue] != AltosLib.MISSING) System.out.printf("Drogue rate: %6.0f m/s %6.0f ft/s\n", stats.state_speed[Altos.ao_flight_drogue], AltosConvert.meters_to_feet(stats.state_speed[Altos.ao_flight_drogue])); + if (stats.state_speed[Altos.ao_flight_main] != AltosLib.MISSING) System.out.printf("Main rate: %6.0f m/s %6.0f ft/s\n", stats.state_speed[Altos.ao_flight_main], AltosConvert.meters_to_feet(stats.state_speed[Altos.ao_flight_main])); + if (stats.landed_time != AltosLib.MISSING && + stats.boost_time != AltosLib.MISSING && + stats.landed_time > stats.boost_time) System.out.printf("Flight time: %6.0f s\n", - stats.state_end[Altos.ao_flight_main] - - stats.state_start[Altos.ao_flight_boost]); - return true; - } catch (InterruptedException ie) { - } catch (IOException ie) { - } - return false; + stats.landed_time - + stats.boost_time); + System.out.printf("\n"); + return true; } - static boolean process_cat(File file) { - try { - AltosStateIterable eef = record_iterable(file); - - System.out.printf ("process cat\n"); - for (AltosState state : eef) { - System.out.printf ("tick %d state %d height %g\n", - state.tick, state.state, state.height()); - if ((state.set & AltosState.set_gps) != 0) - System.out.printf ("time %g lat %g lon %g alt %g\n", - state.time_since_boost(), - state.gps.lat, - state.gps.lon, - state.gps.alt); - } - - } catch (Exception e) { - System.out.printf("Failed to open file '%s'\n", file); + static boolean process_oneline(File file) { + AltosRecordSet set = record_set(file); + if (set == null) return false; - } + System.out.printf("%s", file.toString()); + AltosFlightSeries series = make_series(set); + AltosFlightStats stats = new AltosFlightStats(series); + if (stats.max_height != AltosLib.MISSING) + System.out.printf(" height %6.0f m", stats.max_height); + if (stats.max_speed != AltosLib.MISSING) + System.out.printf(" speed %6.0f m/s", stats.max_speed); + if (stats.state_enter_speed[AltosLib.ao_flight_drogue] != AltosLib.MISSING) + System.out.printf(" drogue-deploy %6.0f m/s", stats.state_enter_speed[AltosLib.ao_flight_drogue]); + if (stats.max_acceleration != AltosLib.MISSING) + System.out.printf(" accel %6.0f m/s²", stats.max_acceleration); + System.out.printf("\n"); return true; } public static void help(int code) { System.out.printf("Usage: altosui [OPTION]... [FILE]...\n"); System.out.printf(" Options:\n"); - System.out.printf(" --fetchmaps \tpre-fetch maps for site map view\n"); System.out.printf(" --replay \t\trelive the glory of past flights \n"); System.out.printf(" --graph \t\tgraph a flight\n"); + System.out.printf(" --summary \t\tText summary of a flight\n"); + System.out.printf(" --oneline \t\tOne line summary of a flight\n"); System.out.printf(" --csv\tgenerate comma separated output for spreadsheets, etc\n"); System.out.printf(" --kml\tgenerate KML output for use with Google Earth\n"); System.exit(code); @@ -559,10 +578,11 @@ public class AltosUI extends AltosUIFrame { UIManager.setLookAndFeel(AltosUIPreferences.look_and_feel()); } catch (Exception e) { } + AltosUI altosui = null; + /* Handle batch-mode */ if (args.length == 0) { - AltosUI altosui = new AltosUI(); - + altosui = new AltosUI(); java.util.List devices = AltosUSBDevice.list(Altos.product_basestation); if (devices != null) for (AltosDevice device : devices) @@ -572,16 +592,7 @@ public class AltosUI extends AltosUIFrame { for (int i = 0; i < args.length; i++) { if (args[i].equals("--help")) help(0); - else if (args[i].equals("--fetchmaps")) { - if (args.length < i + 3) { - help(1); - } else { - double lat = Double.parseDouble(args[i+1]); - double lon = Double.parseDouble(args[i+2]); -// AltosSiteMap.prefetchMaps(lat, lon); - i += 2; - } - } else if (args[i].equals("--replay")) + else if (args[i].equals("--replay")) process = process_replay; else if (args[i].equals("--kml")) process = process_kml; @@ -591,14 +602,16 @@ public class AltosUI extends AltosUIFrame { process = process_graph; else if (args[i].equals("--summary")) process = process_summary; - else if (args[i].equals("--cat")) - process = process_cat; + else if (args[i].equals("--oneline")) + process = process_oneline; else if (args[i].startsWith("--")) help(1); else { File file = new File(args[i]); switch (process) { case process_none: + if (altosui == null) + altosui = new AltosUI(); case process_graph: if (!process_graph(file)) ++errors; @@ -619,9 +632,10 @@ public class AltosUI extends AltosUIFrame { if (!process_summary(file)) ++errors; break; - case process_cat: - if (!process_cat(file)) + case process_oneline: + if (!process_oneline(file)) ++errors; + break; } } }