altoslib,altosuilib: Bump library version numbers
[fw/altos] / micropeak / MicroPeak.java
index f2f09a10df27c96370ca58585c25c1e8934e33af..607bf20c678607f2f5621a230338ea5c000ed04d 100644 (file)
@@ -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,14 +24,16 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.AltosLib.*;
-import org.altusmetrum.altosuilib.*;
+import org.altusmetrum.altoslib_12.*;
+import org.altusmetrum.altosuilib_12.*;
 
 public class MicroPeak extends MicroFrame implements ActionListener, ItemListener {
 
        File            filename;
-       MicroGraph      graph;
-       MicroStatsTable stats;
+       AltosGraph      graph;
+       AltosUIEnable   enable;
+       AltosFlightStatsTable   statsTable;
+       MicroRaw        raw;
        MicroData       data;
        Container       container;
        JTabbedPane     pane;
@@ -43,8 +46,13 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                        return mp.SetData(data);
                }
                this.data = data;
-               graph.setData(data);
-               stats.setData(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;
        }
@@ -54,40 +62,46 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                setTitle(name);
        }
 
-       private void RunFile(InputStream input, String name) {
+       private static MicroData ReadFile(File filename) throws IOException, FileNotFoundException {
+               MicroData       data = null;
+               FileInputStream fis = new FileInputStream(filename);
                try {
-                       MicroData data = new MicroData(input, name);
-                       SetData(data);
-               } catch (IOException ioe) {
-                       JOptionPane.showMessageDialog(this,
-                                                     ioe.getMessage(),
-                                                     "File Read Error",
-                                                     JOptionPane.ERROR_MESSAGE);
+                       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();
                }
-               try {
-                       input.close();
-               } catch (IOException ioe) {
-               }
+               return data;
        }
 
        private void OpenFile(File filename) {
                try {
-                       RunFile (new FileInputStream(filename), filename.getName());
+                       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);
-               InputStream             input = chooser.runDialog();
+               File                    file = chooser.runDialog();
 
-               if (input != null)
-                       RunFile(input, chooser.filename);
+               if (file != null)
+                       OpenFile(file);
        }
 
        private void Preferences() {
@@ -96,7 +110,7 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
 
        private void DownloadData() {
                AltosDevice     device = MicroDeviceDialog.show(this);
-               
+
                if (device != null)
                        new MicroDownload(this, device);
        }
@@ -107,6 +121,7 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                                                      "No data",
                                                      JOptionPane.INFORMATION_MESSAGE);
        }
+
        private void Save() {
                if (data == null) {
                        no_data();
@@ -116,7 +131,7 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                if (save.runDialog())
                        SetName(data.name);
        }
-       
+
        private void Export() {
                if (data == null) {
                        no_data();
@@ -126,6 +141,30 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                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();
@@ -154,10 +193,25 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
        public void itemStateChanged(ItemEvent e) {
        }
 
+       /* OSXAdapter interfaces */
+       public void macosx_file_handler(String path) {
+               CommandGraph(new File(path));
+       }
+
+       public void macosx_quit_handler() {
+               System.exit(0);
+       }
+
+       public void macosx_preferences_handler() {
+               Preferences();
+       }
+
        public MicroPeak() {
 
                ++number_of_windows;
 
+               register_for_macosx_events();
+
                AltosUIPreferences.set_component(this);
 
                container = getContentPane();
@@ -199,18 +253,29 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                fileMenu.add(exitAction);
                exitAction.addActionListener(this);
 
+               JButton downloadButton = new JButton ("Download");
+               downloadButton.addActionListener(this);
+               menuBar.add(downloadButton);
+
                setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosing(WindowEvent e) {
+                               statsTable.tell_closing();
                                Close();
                        }
                });
 
-               graph = new MicroGraph();
-               stats = new MicroStatsTable();
+               enable = new AltosUIEnable();
+
+               graph = new AltosGraph(enable);
+               statsTable = new AltosFlightStatsTable();
+               raw = new MicroRaw();
                pane.add(graph.panel, "Graph");
-               pane.add(stats, "Statistics");
+               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);
@@ -224,12 +289,20 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                ps.height += i.top + i.bottom;
 //             setPreferredSize(ps);
                setSize(ps);
-               setLocationByPlatform(true);
                setVisible(true);
        }
 
+       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());
@@ -237,11 +310,30 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
                }
 
                for (int i = 0; i < args.length; i++) {
-                       MicroPeak m = new MicroPeak();
-                       m.OpenFile(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
+}