summaryrefslogtreecommitdiff
path: root/micropeak
diff options
context:
space:
mode:
Diffstat (limited to 'micropeak')
-rw-r--r--micropeak/Makefile.am3
-rw-r--r--micropeak/MicroData.java15
-rw-r--r--micropeak/MicroDeviceDialog.java50
-rw-r--r--micropeak/MicroDownload.java139
-rw-r--r--micropeak/MicroGraph.java5
-rw-r--r--micropeak/MicroPeak.java81
-rw-r--r--micropeak/MicroSave.java102
-rw-r--r--micropeak/MicroSerial.java12
-rw-r--r--micropeak/MicroUSB.java19
9 files changed, 395 insertions, 31 deletions
diff --git a/micropeak/Makefile.am b/micropeak/Makefile.am
index e0de690c..a54b78a5 100644
--- a/micropeak/Makefile.am
+++ b/micropeak/Makefile.am
@@ -10,12 +10,15 @@ micropeakdir=$(datadir)/java
micropeak_JAVA= \
MicroPeak.java \
MicroData.java \
+ MicroDownload.java \
MicroFrame.java \
MicroGraph.java \
+ MicroSave.java \
MicroSerial.java \
MicroStats.java \
MicroStatsTable.java \
MicroFileChooser.java \
+ MicroDeviceDialog.java \
MicroUSB.java
JFREECHART_CLASS= \
diff --git a/micropeak/MicroData.java b/micropeak/MicroData.java
index ec9b83d8..8ccd5fd8 100644
--- a/micropeak/MicroData.java
+++ b/micropeak/MicroData.java
@@ -110,6 +110,7 @@ public class MicroData {
private double time_step;
private double ground_altitude;
private ArrayList<Integer> bytes;
+ String name;
class FileEndedException extends Exception {
@@ -310,12 +311,18 @@ public class MicroData {
public void save (OutputStream f) throws IOException {
for (int c : bytes)
f.write(c);
+ f.write('\n');
}
- public MicroData (InputStream f) throws IOException {
+ public void set_name(String name) {
+ this.name = name;
+ }
+
+ public MicroData (InputStream f, String name) throws IOException, InterruptedException {
+ this.name = name;
bytes = new ArrayList<Integer>();
if (!find_header(f))
- throw new IOException();
+ throw new IOException("No MicroPeak data header found");
try {
file_crc = 0xffff;
ground_pressure = get_32(f);
@@ -354,9 +361,9 @@ public class MicroData {
time_step = 0.192;
} catch (FileEndedException fe) {
- throw new IOException();
+ throw new IOException("File Ended Unexpectedly");
} catch (NonHexcharException ne) {
- throw new IOException();
+ throw new IOException("Non hexadecimal character found");
}
}
diff --git a/micropeak/MicroDeviceDialog.java b/micropeak/MicroDeviceDialog.java
new file mode 100644
index 00000000..7b8a630c
--- /dev/null
+++ b/micropeak/MicroDeviceDialog.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * 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.micropeak;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import org.altusmetrum.altosuilib.*;
+
+public class MicroDeviceDialog extends AltosDeviceDialog {
+
+ public AltosDevice[] devices() {
+ java.util.List<MicroUSB> list = MicroUSB.list();
+ int num_devices = list.size();
+ AltosDevice[] devices = new AltosDevice[num_devices];
+
+ for (int i = 0; i < num_devices; i++)
+ devices[i] = list.get(i);
+ return devices;
+ }
+
+ public MicroDeviceDialog (Frame in_frame, Component location) {
+ super(in_frame, location, 0);
+ }
+
+ public static AltosDevice show (Component frameComp) {
+ Frame frame = JOptionPane.getFrameForComponent(frameComp);
+ MicroDeviceDialog dialog;
+
+ dialog = new MicroDeviceDialog (frame, frameComp);
+ dialog.setVisible(true);
+ return dialog.getValue();
+ }
+}
diff --git a/micropeak/MicroDownload.java b/micropeak/MicroDownload.java
new file mode 100644
index 00000000..2e328b4a
--- /dev/null
+++ b/micropeak/MicroDownload.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * 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.micropeak;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import java.io.*;
+import java.util.concurrent.*;
+import java.util.*;
+import org.altusmetrum.AltosLib.*;
+import org.altusmetrum.altosuilib.*;
+
+public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener {
+ MicroPeak owner;
+ Container pane;
+ AltosDevice device;
+ JButton cancel;
+ MicroData data;
+ MicroSerial serial;
+
+ private void done_internal() {
+ setVisible(false);
+ if (data != null) {
+ owner = owner.SetData(data);
+ MicroSave save = new MicroSave(owner, data);
+ if (save.runDialog())
+ owner.SetName(data.name);
+ }
+ dispose();
+ }
+
+ public void done() {
+ Runnable r = new Runnable() {
+ public void run() {
+ try {
+ done_internal();
+ } catch (Exception ex) {
+ }
+ }
+ };
+ SwingUtilities.invokeLater(r);
+ }
+
+ public void run() {
+ try {
+ data = new MicroData(serial, device.toShortString());
+ serial.close();
+ } catch (FileNotFoundException fe) {
+ } catch (IOException ioe) {
+ } catch (InterruptedException ie) {
+ }
+ done();
+ }
+
+ Thread serial_thread;
+
+ public void start() {
+ try {
+ serial = new MicroSerial(device);
+ } catch (FileNotFoundException fe) {
+ return;
+ }
+ serial_thread = new Thread(this);
+ serial_thread.start();
+ }
+
+ public void actionPerformed(ActionEvent ae) {
+ System.out.printf ("command %s\n", ae.getActionCommand());
+ if (serial_thread != null) {
+ System.out.printf ("Interrupting serial_thread\n");
+ serial.close();
+ serial_thread.interrupt();
+ }
+ }
+
+ public MicroDownload(MicroPeak owner, AltosDevice device) {
+ super (owner, "Download MicroPeak Data", false);
+
+ GridBagConstraints c;
+ Insets il = new Insets(4,4,4,4);
+ Insets ir = new Insets(4,4,4,4);
+
+ this.owner = owner;
+ this.device = device;
+
+ pane = getContentPane();
+ pane.setLayout(new GridBagLayout());
+
+ c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = 0;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ JLabel device_label = new JLabel("Device:");
+ pane.add(device_label, c);
+
+ c = new GridBagConstraints();
+ c.gridx = 1; c.gridy = 0;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.weightx = 1;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = ir;
+ JLabel device_value = new JLabel(device.toString());
+ pane.add(device_value, c);
+
+ cancel = new JButton("Cancel");
+ c = new GridBagConstraints();
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.CENTER;
+ c.gridx = 0; c.gridy = 1;
+ c.gridwidth = GridBagConstraints.REMAINDER;
+ Insets ic = new Insets(4,4,4,4);
+ c.insets = ic;
+ pane.add(cancel, c);
+
+ cancel.addActionListener(this);
+
+ pack();
+ setLocationRelativeTo(owner);
+ setVisible(true);
+ this.start();
+ }
+}
diff --git a/micropeak/MicroGraph.java b/micropeak/MicroGraph.java
index 38f54fe0..b9b084f8 100644
--- a/micropeak/MicroGraph.java
+++ b/micropeak/MicroGraph.java
@@ -111,8 +111,13 @@ public class MicroGraph implements AltosUnitsListener {
}
}
+ public void setName (String name) {
+ chart.setTitle(name);
+ }
+
public void setData (MicroData data) {
this.data = data;
+ chart.setTitle(data.name);
resetData();
}
diff --git a/micropeak/MicroPeak.java b/micropeak/MicroPeak.java
index c69f7167..5e375057 100644
--- a/micropeak/MicroPeak.java
+++ b/micropeak/MicroPeak.java
@@ -34,13 +34,36 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
MicroData data;
Container container;
JTabbedPane pane;
+ static int number_of_windows;
- private void RunFile(InputStream input) {
+ MicroPeak SetData(MicroData data) {
+ MicroPeak mp = this;
+ if (this.data != null) {
+ mp = new MicroPeak();
+ return mp.SetData(data);
+ }
+ this.data = data;
+ graph.setData(data);
+ stats.setData(data);
+ setTitle(data.name);
+ return this;
+ }
+
+ void SetName(String name) {
+ graph.setName(name);
+ setTitle(name);
+ }
+
+ private void RunFile(InputStream input, String name) {
try {
- data = new MicroData(input);
- graph.setData(data);
- stats.setData(data);
+ MicroData data = new MicroData(input, name);
+ SetData(data);
} catch (IOException ioe) {
+ JOptionPane.showMessageDialog(this,
+ ioe.getMessage(),
+ "File Read Error",
+ JOptionPane.ERROR_MESSAGE);
+ } catch (InterruptedException ie) {
}
try {
input.close();
@@ -50,8 +73,12 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
private void OpenFile(File filename) {
try {
- RunFile (new FileInputStream(filename));
+ RunFile (new FileInputStream(filename), filename.getName());
} catch (FileNotFoundException fne) {
+ JOptionPane.showMessageDialog(this,
+ fne.getMessage(),
+ "Cannot open file",
+ JOptionPane.ERROR_MESSAGE);
}
}
@@ -60,30 +87,44 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
InputStream input = chooser.runDialog();
if (input != null)
- RunFile(input);
+ RunFile(input, chooser.filename);
}
private void Preferences() {
new AltosConfigureUI(this);
}
-
+
private void DownloadData() {
- java.util.List<MicroUSB> devices = MicroUSB.list();
- for (MicroUSB device : devices)
- System.out.printf("device %s\n", device.toString());
+ AltosDevice device = MicroDeviceDialog.show(this);
+
+ if (device != null)
+ new MicroDownload(this, device);
}
+ private void Save() {
+ if (data == null) {
+ JOptionPane.showMessageDialog(this,
+ "No data available",
+ "No data",
+ JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+ MicroSave save = new MicroSave (this, data);
+ if (save.runDialog())
+ SetName(data.name);
+ }
+
public void actionPerformed(ActionEvent ev) {
if ("Exit".equals(ev.getActionCommand()))
System.exit(0);
else if ("Open".equals(ev.getActionCommand()))
SelectFile();
- else if ("New".equals(ev.getActionCommand()))
- new MicroPeak();
else if ("Download".equals(ev.getActionCommand()))
DownloadData();
else if ("Preferences".equals(ev.getActionCommand()))
Preferences();
+ else if ("Save a Copy".equals(ev.getActionCommand()))
+ Save();
}
public void itemStateChanged(ItemEvent e) {
@@ -91,6 +132,8 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
public MicroPeak() {
+ ++number_of_windows;
+
AltosUIPreferences.set_component(this);
container = getContentPane();
@@ -104,10 +147,6 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
JMenu fileMenu = new JMenu("File");
menuBar.add(fileMenu);
- JMenuItem newAction = new JMenuItem("New");
- fileMenu.add(newAction);
- newAction.addActionListener(this);
-
JMenuItem openAction = new JMenuItem("Open");
fileMenu.add(openAction);
openAction.addActionListener(this);
@@ -116,6 +155,10 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
fileMenu.add(downloadAction);
downloadAction.addActionListener(this);
+ JMenuItem saveAction = new JMenuItem("Save a Copy");
+ fileMenu.add(saveAction);
+ saveAction.addActionListener(this);
+
JMenuItem preferencesAction = new JMenuItem("Preferences");
fileMenu.add(preferencesAction);
preferencesAction.addActionListener(this);
@@ -128,7 +171,11 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
- System.exit(0);
+ setVisible(false);
+ dispose();
+ --number_of_windows;
+ if (number_of_windows == 0)
+ System.exit(0);
}
});
diff --git a/micropeak/MicroSave.java b/micropeak/MicroSave.java
new file mode 100644
index 00000000..cb4b4221
--- /dev/null
+++ b/micropeak/MicroSave.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * 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.micropeak;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import java.io.*;
+import java.util.concurrent.*;
+import java.util.*;
+import org.altusmetrum.AltosLib.*;
+import org.altusmetrum.altosuilib.*;
+
+public class MicroSave extends JFileChooser {
+
+ JFrame frame;
+ MicroData data;
+
+ public boolean runDialog() {
+ int ret;
+
+ for (;;) {
+ ret = showSaveDialog(frame);
+ if (ret != APPROVE_OPTION)
+ return false;
+ File file;
+ String filename;
+ file = getSelectedFile();
+ if (file == null)
+ continue;
+ if (!file.getName().contains(".")) {
+ String fullname = file.getPath();
+ file = new File(fullname.concat(".mpd"));
+ }
+ filename = file.getName();
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ JOptionPane.showMessageDialog(frame,
+ String.format("\"%s\" is a directory",
+ filename),
+ "Directory",
+ JOptionPane.ERROR_MESSAGE);
+ continue;
+ }
+ int r = JOptionPane.showConfirmDialog(frame,
+ String.format("\"%s\" already exists. Overwrite?",
+ filename),
+ "Overwrite file?",
+ JOptionPane.YES_NO_OPTION);
+ if (r != JOptionPane.YES_OPTION)
+ continue;
+
+ if (!file.canWrite()) {
+ JOptionPane.showMessageDialog(frame,
+ String.format("\"%s\" is not writable",
+ filename),
+ "File not writable",
+ JOptionPane.ERROR_MESSAGE);
+ continue;
+ }
+ }
+ try {
+ FileOutputStream fos = new FileOutputStream(file);
+ data.save(fos);
+ fos.close();
+ data.set_name(filename);
+ return true;
+ } catch (FileNotFoundException fe) {
+ JOptionPane.showMessageDialog(frame,
+ fe.getMessage(),
+ "Cannot create file",
+ JOptionPane.ERROR_MESSAGE);
+ } catch (IOException ioe) {
+ }
+ }
+ }
+
+ public MicroSave(JFrame frame, MicroData data) {
+ this.frame = frame;
+ this.data = data;
+ setDialogTitle("Save MicroPeak Data File");
+ setFileFilter(new FileNameExtensionFilter("MicroPeak data file",
+ "mpd"));
+ setCurrentDirectory(AltosUIPreferences.logdir());
+ }
+}
diff --git a/micropeak/MicroSerial.java b/micropeak/MicroSerial.java
index a1a77a1d..15ef8582 100644
--- a/micropeak/MicroSerial.java
+++ b/micropeak/MicroSerial.java
@@ -27,6 +27,10 @@ public class MicroSerial extends InputStream {
public int read() {
int c = libaltos.altos_getchar(file, 0);
+ if (Thread.interrupted())
+ return -1;
+ if (c == -1)
+ return -1;
if (AltosUIPreferences.serial_debug)
System.out.printf("%c", c);
return c;
@@ -39,12 +43,12 @@ public class MicroSerial extends InputStream {
}
}
- public MicroSerial(MicroUSB usb) throws FileNotFoundException {
- file = usb.open();
+ public MicroSerial(AltosDevice device) throws FileNotFoundException {
+ file = device.open();
if (file == null) {
- final String message = usb.getErrorString();
+ final String message = device.getErrorString();
throw new FileNotFoundException(String.format("%s (%s)",
- usb.toShortString(),
+ device.toShortString(),
message));
}
}
diff --git a/micropeak/MicroUSB.java b/micropeak/MicroUSB.java
index d48610fe..244f7bc0 100644
--- a/micropeak/MicroUSB.java
+++ b/micropeak/MicroUSB.java
@@ -16,10 +16,12 @@
*/
package org.altusmetrum.micropeak;
+
import java.util.*;
import libaltosJNI.*;
+import org.altusmetrum.altosuilib.*;
-public class MicroUSB extends altos_device {
+public class MicroUSB extends altos_device implements AltosDevice {
static boolean initialized = false;
static boolean loaded_library = false;
@@ -48,16 +50,16 @@ public class MicroUSB extends altos_device {
String name = getName();
if (name == null)
name = "Altus Metrum";
- return String.format("%-20.20s %4d %s",
- name, getSerial(), getPath());
+ return String.format("%-20.20s %s",
+ name, getPath());
}
public String toShortString() {
String name = getName();
if (name == null)
name = "Altus Metrum";
- return String.format("%s %d %s",
- name, getSerial(), getPath());
+ return String.format("%s %s",
+ name, getPath());
}
@@ -75,11 +77,15 @@ public class MicroUSB extends altos_device {
private boolean isMicro() {
if (getVendor() != 0x0403)
return false;
- if (getProduct() != 0x6001)
+ if (getProduct() != 0x6015)
return false;
return true;
}
+ public boolean matchProduct(int product) {
+ return isMicro();
+ }
+
static java.util.List<MicroUSB> list() {
if (!load_library())
return null;
@@ -92,6 +98,7 @@ public class MicroUSB extends altos_device {
MicroUSB device = new MicroUSB();
if (libaltos.altos_list_next(list, device) == 0)
break;
+ System.out.printf("Device %s\n", device.toString());
if (device.isMicro())
device_list.add(device);
}