X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=micropeak%2FMicroPeak.java;h=eee5bc07a04b0bd4c6711fa0efd4f386c993a01b;hb=refs%2Fheads%2Fmaster;hp=82d926fb81ee67c5732ed5cfc87b38b0d70217f1;hpb=bf8e1b6eecb2bae12ffdbd730bd6ec12ccdaf23a;p=fw%2Faltos diff --git a/micropeak/MicroPeak.java b/micropeak/MicroPeak.java index 82d926fb..96fb33ba 100644 --- a/micropeak/MicroPeak.java +++ b/micropeak/MicroPeak.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 @@ -23,116 +24,369 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.AltosLib.*; +import org.altusmetrum.altoslib_14.*; +import org.altusmetrum.altosuilib_14.*; -public class MicroPeak extends JFrame implements ActionListener, ItemListener { +public class MicroPeak extends MicroFrame implements ActionListener, ItemListener, AltosFilterListener { File filename; - MicroGraph graph; + AltosGraph graph; + AltosUIEnable enable; + AltosFlightStatsTable statsTable; + MicroRaw raw; MicroData data; - Container pane; + Container container; + JTabbedPane pane; + JMenuBar menu_bar; + static int number_of_windows; + + /* File menu */ + final static String open_command = "open"; + final static String save_command = "save"; + final static String export_command = "export"; + final static String preferences_command = "preferences"; + final static String close_command = "close"; + final static String exit_command = "exit"; + + static final String[][] file_menu_entries = new String[][] { + { "Open", open_command }, + { "Save a Copy", save_command }, + { "Export Data", export_command }, + { "Preferences", preferences_command }, + { "Close", close_command }, + { "Exit", exit_command }, + }; + + /* Download menu */ + final static String download_command = "download"; + final static String download_label = "Download"; + + static final String[][] download_menu_entries = new String[][] { + { download_label, download_command } + }; + + MicroPeak SetData(MicroData data) { + MicroPeak mp = this; + if (this.data != null) { + mp = new MicroPeak(); + return mp.SetData(data); + } + this.data = data; + if (data.flight_series == null) + System.out.printf("no data in flight\n"); + if (data.flight_stats == null) + System.out.printf("no stats in flight\n"); + graph.set_data(data.flight_stats, data.flight_series); + statsTable.set_stats(data.flight_stats); + raw.setData(data); + setTitle(data.name); + return this; + } + + void SetName(String name) { + graph.setName(name); + setTitle(name); + } + + private static MicroData ReadFile(File filename) throws IOException, FileNotFoundException { + MicroData data = null; + FileInputStream fis = new FileInputStream(filename); + try { + data = new MicroData((InputStream) fis, filename.getName()); + AltosUIPreferences.set_last_logdir(filename); + } catch (MicroData.NonHexcharException nhe) { + data = null; + } catch (MicroData.FileEndedException nhe) { + data = null; + } catch (InterruptedException ie) { + data = null; + } finally { + fis.close(); + } + return data; + } private void OpenFile(File filename) { try { - FileInputStream input = new FileInputStream(filename); - try { - data = new MicroData(input); - graph = new MicroGraph(data); - pane.add(graph.panel); - } catch (IOException ioe) { - } - try { - input.close(); - } catch (IOException ioe) { - } + SetData(ReadFile(filename)); } catch (FileNotFoundException fne) { + JOptionPane.showMessageDialog(this, + fne.getMessage(), + "Cannot open file", + JOptionPane.ERROR_MESSAGE); + } catch (IOException ioe) { + JOptionPane.showMessageDialog(this, + ioe.getMessage(), + "File Read Error", + JOptionPane.ERROR_MESSAGE); } } private void SelectFile() { + MicroFileChooser chooser = new MicroFileChooser(this); + File file = chooser.runDialog(); + + if (file != null) + OpenFile(file); + } + + private void Preferences() { + new AltosUIConfigure(this); } private void DownloadData() { - java.util.List devices = MicroUSB.list(); - for (MicroUSB device : devices) - System.out.printf("device %s\n", device.toString()); + AltosDevice device = MicroDeviceDialog.show(this); + MicroSerial serial = null; + try { + serial = new MicroSerial(device); + } catch (FileNotFoundException fe) { + JOptionPane.showMessageDialog(this, + fe.getMessage(), + "Cannot open device", + JOptionPane.ERROR_MESSAGE); + return; + } + + new MicroDownload(this, device, serial); } - public void actionPerformed(ActionEvent ev) { - System.out.printf("action %s %s\n", ev.getActionCommand(), ev.paramString()); - if ("Exit".equals(ev.getActionCommand())) + private void no_data() { + JOptionPane.showMessageDialog(this, + "No data available", + "No data", + JOptionPane.INFORMATION_MESSAGE); + } + + private void Save() { + if (data == null) { + no_data(); + return; + } + MicroSave save = new MicroSave (this, data); + if (save.runDialog()) + SetName(data.name); + } + + private void Export() { + if (data == null) { + no_data(); + return; + } + MicroExport export = new MicroExport (this, data); + export.runDialog(); + } + + private static void CommandGraph(File file) { + MicroPeak m = new MicroPeak(); + m.OpenFile(file); + } + + private static void CommandExport(File file) { + try { + MicroData d = ReadFile(file); + if (d != null) { + File csv = new File(AltosLib.replace_extension(file.getPath(), ".csv")); + try { + System.out.printf ("Export \"%s\" to \"%s\"\n", file.getPath(), csv.getPath()); + MicroExport.export(csv, d); + } catch (FileNotFoundException fe) { + System.err.printf("Cannot create file \"%s\" (%s)\n", csv.getName(), fe.getMessage()); + } catch (IOException ie) { + System.err.printf("Cannot write file \"%s\" (%s)\n", csv.getName(), ie.getMessage()); + } + } + } catch (IOException ie) { + System.err.printf("Cannot read file \"%s\" (%s)\n", file.getName(), ie.getMessage()); + } + } + + private void Close() { + setVisible(false); + dispose(); + --number_of_windows; + if (number_of_windows == 0) System.exit(0); - else if ("Open".equals(ev.getActionCommand())) + } + + public void actionPerformed(ActionEvent ev) { + if (open_command.equals(ev.getActionCommand())) SelectFile(); - else if ("New".equals(ev.getActionCommand())) - new MicroPeak(); - else if ("Download".equals(ev.getActionCommand())) + else if (save_command.equals(ev.getActionCommand())) + Save(); + else if (export_command.equals(ev.getActionCommand())) + Export(); + else if (preferences_command.equals(ev.getActionCommand())) + Preferences(); + else if (close_command.equals(ev.getActionCommand())) + Close(); + else if (exit_command.equals(ev.getActionCommand())) + System.exit(0); + else if (download_command.equals(ev.getActionCommand())) DownloadData(); } public void itemStateChanged(ItemEvent e) { } - public MicroPeak(File filename) { + /* OSXAdapter interfaces */ + public void macosx_file_handler(String path) { + CommandGraph(new File(path)); + } - this.filename = filename; + public void macosx_quit_handler() { + System.exit(0); + } + + public void macosx_preferences_handler() { + Preferences(); + } - pane = getContentPane(); + public void filter_changed(double speed_filter, double accel_filter) { + data.flight_series.set_filter(speed_filter, accel_filter); + graph.filter_changed(); + data.flight_stats = new AltosFlightStats(data.flight_series); + statsTable.filter_changed(data.flight_stats); + } -// JLabel label = new JLabel ("Hello, World"); -// pane.add(label); + public double speed_filter() { + if (data != null && data.flight_series != null) + return data.flight_series.speed_filter_width; + return 4.0; + } - setSize(800, 500); + public double accel_filter() { + if (data != null && data.flight_series != null) + return data.flight_series.accel_filter_width; + return 1.0; + } - setTitle("MicroPeak"); + private void add_menu(JMenu menu, String label, String action) { + JMenuItem item = new JMenuItem(label); + menu.add(item); + item.addActionListener(this); + item.setActionCommand(action); + } - JMenuBar menuBar = new JMenuBar(); - setJMenuBar(menuBar); - JMenu fileMenu = new JMenu("File"); - menuBar.add(fileMenu); + private void make_menu(String label, String[][] items) { + JMenu menu = new JMenu(label); + for (int i = 0; i < items.length; i++) { + if (MAC_OS_X) { + if (items[i][1].equals("exit")) + continue; + if (items[i][1].equals("preferences")) + continue; + } + add_menu(menu, items[i][0], items[i][1]); + } + menu_bar.add(menu); + } + + public MicroPeak() { - JMenuItem newAction = new JMenuItem("New"); - fileMenu.add(newAction); - newAction.addActionListener(this); + ++number_of_windows; - JMenuItem openAction = new JMenuItem("Open"); - fileMenu.add(openAction); - openAction.addActionListener(this); + register_for_macosx_events(); + + AltosUIPreferences.set_component(this); + + container = getContentPane(); + pane = new JTabbedPane(); + + setTitle("MicroPeak"); - JMenuItem downloadAction = new JMenuItem("Download"); - fileMenu.add(downloadAction); - downloadAction.addActionListener(this); + menu_bar = new JMenuBar(); + setJMenuBar(menu_bar); - JMenuItem exitAction = new JMenuItem("Exit"); - fileMenu.add(exitAction); - exitAction.addActionListener(this); + make_menu("File", file_menu_entries); + + if (MAC_OS_X) { + make_menu(download_label, download_menu_entries); + } else { + JButton download_button = new JButton (download_label); + download_button.setActionCommand(download_command); + download_button.addActionListener(this); + menu_bar.add(download_button); + } setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - System.exit(0); + statsTable.tell_closing(); + raw.tell_closing(); + Close(); } }); - if (filename != null) - this.OpenFile(filename); + enable = new AltosUIEnable(this); + + graph = new AltosGraph(enable); + statsTable = new AltosFlightStatsTable(); + raw = new MicroRaw(); + pane.add(graph.panel, "Graph"); + pane.add(enable, "Configure Graph"); + pane.add(statsTable, "Statistics"); + JScrollPane scroll = new JScrollPane(raw); + pane.add(scroll, "Raw Data"); + pane.doLayout(); + pane.validate(); + container.add(pane); + container.doLayout(); + container.validate(); + doLayout(); + validate(); + Insets i = getInsets(); + Dimension ps = pane.getPreferredSize(); + ps.width += i.left + i.right; + ps.height += i.top + i.bottom; + setSize(ps); + pack(); setVisible(true); } - public MicroPeak() { - this(null); + public static void help(int code) { + System.out.printf("Usage: micropeak [OPTION] ... [FILE]...\n"); + System.out.printf(" Options:\n"); + System.out.printf(" --csv\tgenerate comma separated output for spreadsheets, etc\n"); + System.out.printf(" --graph\tgraph a flight\n"); + System.exit(code); } public static void main(final String[] args) { boolean opened = false; + boolean graphing = true; + + try { + UIManager.setLookAndFeel(AltosUIPreferences.look_and_feel()); + } catch (Exception e) { + } for (int i = 0; i < args.length; i++) { - new MicroPeak(new File(args[i])); - opened = true; + if (args[i].equals("--help")) + help(0); + else if (args[i].equals("--export")) + graphing = false; + else if (args[i].equals("--graph")) + graphing = true; + else if (args[i].startsWith("--")) + help(1); + else { + File file = new File(args[i]); + try { + if (graphing) + CommandGraph(file); + else + CommandExport(file); + opened = true; + } catch (Exception e) { + System.err.printf("Error processing \"%s\": %s %s\n", + file.getName(), e.toString(), e.getMessage()); + e.printStackTrace(); + } + } } if (!opened) new MicroPeak(); } -} \ No newline at end of file +}