summaryrefslogtreecommitdiff
path: root/altosui
diff options
context:
space:
mode:
authorBdale Garbee <bdale@gag.com>2012-10-23 09:38:36 -0600
committerBdale Garbee <bdale@gag.com>2012-10-23 09:38:36 -0600
commit055f3232decc07e064d596469b81cf9869411c2d (patch)
treecc5ebf8283ca00cbe1344f6ed808feaf7e9575ad /altosui
parent8ca58e20208495ce63b8256a8ffa43932867e8d5 (diff)
parent9e60fa214ad2c48fbe8f7e5c437681aa35d249fa (diff)
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Diffstat (limited to 'altosui')
-rw-r--r--altosui/AltosAscent.java2
-rw-r--r--altosui/AltosCSV.java8
-rw-r--r--altosui/AltosConfig.java34
-rw-r--r--altosui/AltosConfigPyroUI.java288
-rw-r--r--altosui/AltosConfigUI.java68
-rw-r--r--altosui/AltosDataChooser.java6
-rw-r--r--altosui/AltosDataPoint.java5
-rw-r--r--altosui/AltosDataPointReader.java47
-rw-r--r--altosui/AltosDescent.java2
-rw-r--r--altosui/AltosDialog.java6
-rw-r--r--altosui/AltosDisplayThread.java2
-rw-r--r--altosui/AltosEepromDownload.java2
-rw-r--r--altosui/AltosFlightStats.java10
-rw-r--r--altosui/AltosGraphUI.java7
-rw-r--r--altosui/AltosInfoTable.java4
-rw-r--r--altosui/AltosKML.java2
-rw-r--r--altosui/AltosLanded.java5
-rw-r--r--altosui/Makefile.am1
18 files changed, 435 insertions, 64 deletions
diff --git a/altosui/AltosAscent.java b/altosui/AltosAscent.java
index 007c74ec..a05c4404 100644
--- a/altosui/AltosAscent.java
+++ b/altosui/AltosAscent.java
@@ -251,7 +251,7 @@ public class AltosAscent extends JComponent implements AltosFlightDisplay {
class Speed extends AscentValueHold {
void show (AltosState state, int crc_errors) {
- double speed = state.speed;
+ double speed = state.accel_speed;
if (!state.ascent)
speed = state.baro_speed;
show(AltosConvert.speed, speed);
diff --git a/altosui/AltosCSV.java b/altosui/AltosCSV.java
index f8cc1ed6..1c929a7c 100644
--- a/altosui/AltosCSV.java
+++ b/altosui/AltosCSV.java
@@ -128,10 +128,10 @@ public class AltosCSV implements AltosWriter {
void write_basic(AltosRecord record) {
out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f,%5.2f",
record.acceleration(),
- record.raw_pressure(),
- record.raw_altitude(),
- record.raw_height(),
- record.accel_speed(),
+ record.pressure(),
+ record.altitude(),
+ record.height(),
+ state.accel_speed,
state.baro_speed,
record.temperature(),
record.battery_voltage(),
diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java
index 44e5a3fa..44c6239a 100644
--- a/altosui/AltosConfig.java
+++ b/altosui/AltosConfig.java
@@ -22,6 +22,7 @@ import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
import org.altusmetrum.AltosLib.*;
+import java.text.*;
public class AltosConfig implements ActionListener {
@@ -78,6 +79,8 @@ public class AltosConfig implements ActionListener {
string_ref version;
string_ref product;
string_ref callsign;
+ int_ref npyro;
+ AltosPyro[] pyros;
AltosConfigUI config_ui;
boolean serial_started;
boolean made_visible;
@@ -162,6 +165,8 @@ public class AltosConfig implements ActionListener {
config_ui.set_ignite_mode(ignite_mode.get());
config_ui.set_pad_orientation(pad_orientation.get());
config_ui.set_callsign(callsign.get());
+ config_ui.set_pyros(pyros);
+ config_ui.set_has_pyro(npyro.get() > 0);
config_ui.set_clean();
if (!made_visible) {
made_visible = true;
@@ -169,6 +174,8 @@ public class AltosConfig implements ActionListener {
}
}
+ int pyro;
+
void process_line(String line) {
if (line == null) {
abort();
@@ -179,6 +186,18 @@ public class AltosConfig implements ActionListener {
update_ui();
return;
}
+ if (pyro < npyro.get()) {
+ if (pyros == null)
+ pyros = new AltosPyro[npyro.get()];
+
+ try {
+ pyros[pyro] = new AltosPyro(pyro, line);
+ } catch (ParseException e) {
+ System.out.printf ("pyro parse failed %s\n", line);
+ }
+ ++pyro;
+ return;
+ }
get_int(line, "serial-number", serial);
get_int(line, "log-format", log_format);
get_int(line, "Main deploy:", main_deploy);
@@ -200,6 +219,7 @@ public class AltosConfig implements ActionListener {
get_string(line, "Callsign:", callsign);
get_string(line,"software-version", version);
get_string(line,"product", product);
+ get_int(line, "Pyro-count:", npyro);
}
final static int serial_mode_read = 0;
@@ -243,6 +263,8 @@ public class AltosConfig implements ActionListener {
callsign.set("N0CALL");
version.set("unknown");
product.set("unknown");
+ pyro = 0;
+ npyro.set(0);
}
void get_data() {
@@ -304,6 +326,12 @@ public class AltosConfig implements ActionListener {
serial_line.printf("c i %d\n", ignite_mode.get());
if (pad_orientation.get() >= 0)
serial_line.printf("c o %d\n", pad_orientation.get());
+ if (pyros.length > 0) {
+ for (int p = 0; p < pyros.length; p++) {
+ serial_line.printf("c P %s\n",
+ pyros[p].toString());
+ }
+ }
serial_line.printf("c w\n");
} catch (InterruptedException ie) {
} catch (TimeoutException te) {
@@ -431,6 +459,9 @@ public class AltosConfig implements ActionListener {
if (pad_orientation.get() >= 0)
pad_orientation.set(config_ui.pad_orientation());
callsign.set(config_ui.callsign());
+ if (npyro.get() > 0) {
+ pyros = config_ui.pyros();
+ }
run_serial_thread(serial_mode_save);
}
@@ -477,13 +508,14 @@ public class AltosConfig implements ActionListener {
callsign = new string_ref("N0CALL");
version = new string_ref("unknown");
product = new string_ref("unknown");
+ npyro = new int_ref(0);
device = AltosDeviceDialog.show(owner, Altos.product_any);
if (device != null) {
try {
serial_line = new AltosSerial(device);
try {
- if (!device.matchProduct(Altos.product_altimeter))
+ if (device.matchProduct(Altos.product_basestation))
remote = true;
init_ui();
} catch (InterruptedException ie) {
diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java
new file mode 100644
index 00000000..17adb15f
--- /dev/null
+++ b/altosui/AltosConfigPyroUI.java
@@ -0,0 +1,288 @@
+/*
+ * 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 altosui;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import org.altusmetrum.AltosLib.*;
+
+public class AltosConfigPyroUI
+ extends AltosDialog
+ implements ItemListener, DocumentListener
+{
+ AltosConfigUI owner;
+ Container pane;
+
+ static Insets il = new Insets(4,4,4,4);
+ static Insets ir = new Insets(4,4,4,4);
+
+ static String[] state_names;
+
+ static void make_state_names() {
+ if (state_names == null) {
+
+ state_names = new String[AltosLib.ao_flight_landed - AltosLib.ao_flight_boost + 1];
+ for (int state = AltosLib.ao_flight_boost; state <= AltosLib.ao_flight_landed; state++)
+ state_names[state - AltosLib.ao_flight_boost] = AltosLib.state_name_capital(state);
+ }
+ }
+
+ class PyroItem implements ItemListener, DocumentListener
+ {
+ public int flag;
+ public JRadioButton enable;
+ public JTextField value;
+ public JComboBox combo;
+ AltosConfigPyroUI ui;
+
+ public void set_enable(boolean enable) {
+ if (value != null)
+ value.setEnabled(enable);
+ if (combo != null)
+ combo.setEnabled(enable);
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ set_enable(enable.isSelected());
+ ui.set_dirty();
+ }
+
+ public void changedUpdate(DocumentEvent e) {
+ ui.set_dirty();
+ }
+
+ public void insertUpdate(DocumentEvent e) {
+ ui.set_dirty();
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ ui.set_dirty();
+ }
+
+ public void set(boolean new_enable, double new_value) {
+ enable.setSelected(new_enable);
+ set_enable(new_enable);
+ if (value != null) {
+ double scale = AltosPyro.pyro_to_scale(flag);
+ String format = "%6.0f";
+ if (scale >= 10)
+ format = "%6.1f";
+ else if (scale >= 100)
+ format = "%6.2f";
+ value.setText(String.format(format, new_value));
+ }
+ if (combo != null)
+ if (new_value >= AltosLib.ao_flight_boost && new_value <= AltosLib.ao_flight_landed)
+ combo.setSelectedIndex((int) new_value - AltosLib.ao_flight_boost);
+ }
+
+ public boolean enabled() {
+ return enable.isSelected();
+ }
+
+ public double value() {
+ if (value != null)
+ return Double.parseDouble(value.getText());
+ if (combo != null)
+ return combo.getSelectedIndex() + AltosLib.ao_flight_boost;
+ return 0;
+ }
+
+ public PyroItem(AltosConfigPyroUI in_ui, int in_flag, int x, int y) {
+
+ ui = in_ui;
+ flag = in_flag;
+
+ GridBagConstraints c;
+ c = new GridBagConstraints();
+ c.gridx = x; c.gridy = y;
+ c.gridwidth = 1;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ enable = new JRadioButton();
+ enable.addItemListener(this);
+ pane.add(enable, c);
+
+ if ((flag & AltosPyro.pyro_no_value) == 0) {
+ c = new GridBagConstraints();
+ c.gridx = x+1; c.gridy = y;
+ c.gridwidth = 1;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ if ((flag & AltosPyro.pyro_state_value) != 0) {
+ make_state_names();
+ combo = new JComboBox(state_names);
+ combo.addItemListener(this);
+ pane.add(combo, c);
+ } else {
+ value = new JTextField(10);
+ value.getDocument().addDocumentListener(this);
+ pane.add(value, c);
+ }
+ }
+ }
+ }
+
+ class PyroColumn {
+ public PyroItem[] items;
+ public JLabel label;
+ int channel;
+
+ public void set(AltosPyro pyro) {
+ int row = 0;
+ for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
+ if ((AltosPyro.pyro_all & flag) != 0) {
+ items[row].set((pyro.flags & flag) != 0,
+ pyro.get_value(flag));
+ row++;
+ }
+ }
+ }
+
+ public AltosPyro get() {
+ AltosPyro p = new AltosPyro(channel);
+
+ int row = 0;
+ for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
+ if ((AltosPyro.pyro_all & flag) != 0) {
+ if (items[row].enabled()) {
+ System.out.printf ("Flag %x enabled\n", flag);
+ p.flags |= flag;
+ p.set_value(flag, items[row].value());
+ }
+ row++;
+ }
+ }
+ System.out.printf ("Pyro %x %s\n", p.flags, p.toString());
+ return p;
+ }
+
+ public PyroColumn(AltosConfigPyroUI ui, int x, int y, int in_channel) {
+
+ channel = in_channel;
+
+ int nrow = 0;
+ for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1)
+ if ((flag & AltosPyro.pyro_all) != 0)
+ nrow++;
+
+ items = new PyroItem[nrow];
+ int row = 0;
+
+ GridBagConstraints c;
+ c = new GridBagConstraints();
+ c.gridx = x; c.gridy = y;
+ c.gridwidth = 2;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.CENTER;
+ c.insets = il;
+ label = new JLabel(String.format("Pyro Channel %d", channel));
+ pane.add(label, c);
+ y++;
+
+ for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1)
+ if ((flag & AltosPyro.pyro_all) != 0) {
+ items[row] = new PyroItem(ui, flag, x, y + row);
+ row++;
+ }
+ }
+ }
+
+ PyroColumn[] columns;
+
+ public void set_pyros(AltosPyro[] pyros) {
+ for (int i = 0; i < pyros.length; i++) {
+ if (pyros[i].channel < columns.length)
+ columns[pyros[i].channel].set(pyros[i]);
+ }
+ }
+
+ public AltosPyro[] get_pyros() {
+ AltosPyro[] pyros = new AltosPyro[columns.length];
+ for (int c = 0; c < columns.length; c++)
+ pyros[c] = columns[c].get();
+ return pyros;
+ }
+
+ public void set_dirty() {
+ owner.set_dirty();
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ owner.set_dirty();
+ }
+
+ public void changedUpdate(DocumentEvent e) {
+ owner.set_dirty();
+ }
+
+ public void insertUpdate(DocumentEvent e) {
+ owner.set_dirty();
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ owner.set_dirty();
+ }
+
+ public AltosConfigPyroUI(AltosConfigUI in_owner, AltosPyro[] pyros) {
+
+ super(in_owner, "Configure Pyro Channels", false);
+
+ owner = in_owner;
+
+ GridBagConstraints c;
+
+ pane = getContentPane();
+ pane.setLayout(new GridBagLayout());
+
+ int row = 1;
+
+ for (int flag = 1; flag <= AltosPyro.pyro_all; flag <<= 1) {
+ String n;
+
+ n = AltosPyro.pyro_to_name(flag);
+ if (n != null) {
+ c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = row;
+ c.gridwidth = 1;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ JLabel label = new JLabel(n);
+ pane.add(label, c);
+ row++;
+ }
+ }
+
+ columns = new PyroColumn[pyros.length];
+
+ for (int i = 0; i < pyros.length; i++) {
+ columns[i] = new PyroColumn(this, i*2 + 1, 0, i);
+ columns[i].set(pyros[i]);
+ }
+ }
+
+ public void make_visible() {
+ pack();
+ setVisible(true);
+ }
+}
diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java
index dd34a9cf..feac053b 100644
--- a/altosui/AltosConfigUI.java
+++ b/altosui/AltosConfigUI.java
@@ -29,7 +29,6 @@ public class AltosConfigUI
{
Container pane;
- Box box;
JLabel product_label;
JLabel version_label;
JLabel serial_label;
@@ -62,11 +61,15 @@ public class AltosConfigUI
JComboBox pad_orientation_value;
JTextField callsign_value;
+ JButton pyro;
+
JButton save;
JButton reset;
JButton reboot;
JButton close;
+ AltosPyro[] pyros;
+
ActionListener listener;
static String[] main_deploy_values = {
@@ -510,6 +513,20 @@ public class AltosConfigUI
set_pad_orientation_tool_tip();
row++;
+ /* Pyro channels */
+ c = new GridBagConstraints();
+ c.gridx = 4; c.gridy = row;
+ c.gridwidth = 4;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ c.ipady = 5;
+ pyro = new JButton("Configure Pyro Channels");
+ pane.add(pyro, c);
+ pyro.addActionListener(this);
+ pyro.setActionCommand("Pyro");
+ row++;
+
/* Buttons */
c = new GridBagConstraints();
c.gridx = 0; c.gridy = row;
@@ -582,10 +599,30 @@ public class AltosConfigUI
return true;
}
+ void set_dirty() {
+ dirty = true;
+ save.setEnabled(true);
+ }
+
+ public void set_clean() {
+ dirty = false;
+ save.setEnabled(false);
+ }
+
+ AltosConfigPyroUI pyro_ui;
+
/* Listen for events from our buttons */
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
+ if (cmd.equals("Pyro")) {
+ if (pyro_ui == null && pyros != null) {
+ pyro_ui = new AltosConfigPyroUI(this, pyros);
+ pyro_ui.make_visible();
+ }
+ return;
+ }
+
if (cmd.equals("Close") || cmd.equals("Reboot"))
if (!check_dirty(cmd))
return;
@@ -594,25 +631,25 @@ public class AltosConfigUI
setVisible(false);
dispose();
}
- dirty = false;
+ set_clean();
}
/* ItemListener interface method */
public void itemStateChanged(ItemEvent e) {
- dirty = true;
+ set_dirty();
}
/* DocumentListener interface methods */
public void changedUpdate(DocumentEvent e) {
- dirty = true;
+ set_dirty();
}
public void insertUpdate(DocumentEvent e) {
- dirty = true;
+ set_dirty();
}
public void removeUpdate(DocumentEvent e) {
- dirty = true;
+ set_dirty();
}
/* Let the config code hook on a listener */
@@ -725,8 +762,7 @@ public class AltosConfigUI
}
public void set_flight_log_max(int new_flight_log_max) {
- if (new_flight_log_max == 0)
- flight_log_max_value.setEnabled(false);
+ flight_log_max_value.setEnabled(new_flight_log_max > 0);
flight_log_max_value.setSelectedItem(Integer.toString(new_flight_log_max));
set_flight_log_max_tool_tip();
}
@@ -793,7 +829,19 @@ public class AltosConfigUI
return -1;
}
- public void set_clean() {
- dirty = false;
+ public void set_has_pyro(boolean has_pyro) {
+ pyro.setEnabled(has_pyro);
+ }
+
+ public void set_pyros(AltosPyro[] new_pyros) {
+ pyros = new_pyros;
+ if (pyro_ui != null)
+ pyro_ui.set_pyros(pyros);
+ }
+
+ public AltosPyro[] pyros() {
+ if (pyro_ui != null)
+ pyros = pyro_ui.get_pyros();
+ return pyros;
}
}
diff --git a/altosui/AltosDataChooser.java b/altosui/AltosDataChooser.java
index 4d2f321e..a8a2ca49 100644
--- a/altosui/AltosDataChooser.java
+++ b/altosui/AltosDataChooser.java
@@ -70,6 +70,12 @@ public class AltosDataChooser extends JFileChooser {
public AltosDataChooser(JFrame in_frame) {
frame = in_frame;
setDialogTitle("Select Flight Record File");
+ setFileFilter(new FileNameExtensionFilter("TeleMetrum eeprom file",
+ "eeprom"));
+ setFileFilter(new FileNameExtensionFilter("Telemetry file",
+ "telem"));
+ setFileFilter(new FileNameExtensionFilter("MegaMetrum eeprom file",
+ "mega"));
setFileFilter(new FileNameExtensionFilter("Flight data file",
"telem", "eeprom", "mega"));
setCurrentDirectory(AltosUIPreferences.logdir());
diff --git a/altosui/AltosDataPoint.java b/altosui/AltosDataPoint.java
index 5e077320..4956e9f3 100644
--- a/altosui/AltosDataPoint.java
+++ b/altosui/AltosDataPoint.java
@@ -16,11 +16,8 @@ interface AltosDataPoint {
String state_name();
double acceleration();
- double pressure();
- double altitude();
double height();
- double accel_speed();
- double baro_speed();
+ double speed();
double temperature();
double battery_voltage();
double drogue_voltage();
diff --git a/altosui/AltosDataPointReader.java b/altosui/AltosDataPointReader.java
index 2316cf97..88df081f 100644
--- a/altosui/AltosDataPointReader.java
+++ b/altosui/AltosDataPointReader.java
@@ -12,7 +12,6 @@ import org.altusmetrum.AltosLib.*;
class AltosDataPointReader implements Iterable<AltosDataPoint> {
Iterator<AltosRecord> iter;
AltosState state;
- AltosRecord record;
boolean has_gps;
boolean has_accel;
boolean has_ignite;
@@ -22,7 +21,7 @@ class AltosDataPointReader implements Iterable<AltosDataPoint> {
public AltosDataPointReader(AltosRecordIterable reader) {
this.iter = reader.iterator();
this.state = null;
- has_accel = reader.has_accel();
+ has_accel = true;
has_gps = reader.has_gps();
has_ignite = reader.has_ignite();
}
@@ -30,35 +29,31 @@ class AltosDataPointReader implements Iterable<AltosDataPoint> {
private void read_next_record()
throws NoSuchElementException
{
- record = iter.next();
- state = new AltosState(record, state);
+ state = new AltosState(iter.next(), state);
}
private AltosDataPoint current_dp() {
- assert this.record != null;
+ assert this.state != null;
return new AltosDataPoint() {
- public int version() { return record.version; }
- public int serial() { return record.serial; }
- public int flight() { return record.flight; }
- public String callsign() { return record.callsign; }
- public double time() { return record.time; }
- public double rssi() { return record.rssi; }
+ public int version() { return state.data.version; }
+ public int serial() { return state.data.serial; }
+ public int flight() { return state.data.flight; }
+ public String callsign() { return state.data.callsign; }
+ public double time() { return state.data.time; }
+ public double rssi() { return state.data.rssi; }
- public int state() { return record.state; }
- public String state_name() { return record.state(); }
+ public int state() { return state.state; }
+ public String state_name() { return state.data.state(); }
- public double acceleration() { return record.acceleration(); }
- public double pressure() { return record.raw_pressure(); }
- public double altitude() { return record.raw_altitude(); }
- public double height() { return record.raw_height(); }
- public double accel_speed() { return record.accel_speed(); }
- public double baro_speed() { return state.baro_speed; }
- public double temperature() { return record.temperature(); }
- public double battery_voltage() { return record.battery_voltage(); }
- public double drogue_voltage() { return record.drogue_voltage(); }
- public double main_voltage() { return record.main_voltage(); }
- public boolean has_accel() { return has_accel; }
+ public double acceleration() { return state.acceleration; }
+ public double height() { return state.height; }
+ public double speed() { return state.speed(); }
+ public double temperature() { return state.temperature; }
+ public double battery_voltage() { return state.battery; }
+ public double drogue_voltage() { return state.drogue_sense; }
+ public double main_voltage() { return state.main_sense; }
+ public boolean has_accel() { return true; } // return state.acceleration != AltosRecord.MISSING; }
};
}
@@ -68,14 +63,14 @@ class AltosDataPointReader implements Iterable<AltosDataPoint> {
throw new UnsupportedOperationException();
}
public boolean hasNext() {
- if (record != null && record.state == Altos.ao_flight_landed)
+ if (state != null && state.state == Altos.ao_flight_landed)
return false;
return iter.hasNext();
}
public AltosDataPoint next() {
do {
read_next_record();
- } while (record.time < -1.0 && hasNext());
+ } while (state.data.time < -1.0 && hasNext());
return current_dp();
}
};
diff --git a/altosui/AltosDescent.java b/altosui/AltosDescent.java
index a71cdc10..2ea7cbfa 100644
--- a/altosui/AltosDescent.java
+++ b/altosui/AltosDescent.java
@@ -256,7 +256,7 @@ public class AltosDescent extends JComponent implements AltosFlightDisplay {
class Speed extends DescentValue {
void show (AltosState state, int crc_errors) {
- double speed = state.speed;
+ double speed = state.accel_speed;
if (!state.ascent)
speed = state.baro_speed;
show(AltosConvert.speed, speed);
diff --git a/altosui/AltosDialog.java b/altosui/AltosDialog.java
index eac371aa..c2a9d6e6 100644
--- a/altosui/AltosDialog.java
+++ b/altosui/AltosDialog.java
@@ -45,6 +45,12 @@ public class AltosDialog extends JDialog implements AltosUIListener {
addWindowListener(new AltosDialogListener());
}
+ public AltosDialog(Dialog dialog, String label, boolean modal) {
+ super(dialog, label, modal);
+ AltosUIPreferences.register_ui_listener(this);
+ addWindowListener(new AltosDialogListener());
+ }
+
public AltosDialog(Frame frame, boolean modal) {
super(frame, modal);
AltosUIPreferences.register_ui_listener(this);
diff --git a/altosui/AltosDisplayThread.java b/altosui/AltosDisplayThread.java
index f7a1d03e..1ba70c7e 100644
--- a/altosui/AltosDisplayThread.java
+++ b/altosui/AltosDisplayThread.java
@@ -197,7 +197,7 @@ public class AltosDisplayThread extends Thread {
if ((old_state == null || old_state.state <= Altos.ao_flight_boost) &&
state.state > Altos.ao_flight_boost) {
voice.speak("max speed: %s.",
- AltosConvert.speed.say_units(state.max_speed + 0.5));
+ AltosConvert.speed.say_units(state.max_accel_speed + 0.5));
ret = true;
} else if ((old_state == null || old_state.state < Altos.ao_flight_drogue) &&
state.state >= Altos.ao_flight_drogue) {
diff --git a/altosui/AltosEepromDownload.java b/altosui/AltosEepromDownload.java
index a5e99749..21b46740 100644
--- a/altosui/AltosEepromDownload.java
+++ b/altosui/AltosEepromDownload.java
@@ -283,7 +283,7 @@ public class AltosEepromDownload implements Runnable {
if (r.cmd == Altos.AO_LOG_GPS_TIME) {
year = 2000 + r.data8(14);
month = r.data8(15);
- day = r.data8(14);
+ day = r.data8(16);
want_file = true;
}
diff --git a/altosui/AltosFlightStats.java b/altosui/AltosFlightStats.java
index e48cb608..1653ca57 100644
--- a/altosui/AltosFlightStats.java
+++ b/altosui/AltosFlightStats.java
@@ -24,7 +24,7 @@ public class AltosFlightStats {
double max_height;
double max_speed;
double max_acceleration;
- double[] state_speed = new double[Altos.ao_flight_invalid + 1];
+ double[] state_accel_speed = new double[Altos.ao_flight_invalid + 1];
double[] state_baro_speed = new double[Altos.ao_flight_invalid + 1];
double[] state_accel = new double[Altos.ao_flight_invalid + 1];
int[] state_count = new int[Altos.ao_flight_invalid + 1];
@@ -123,7 +123,7 @@ public class AltosFlightStats {
}
}
state_accel[state.state] += state.acceleration;
- state_speed[state.state] += state.speed;
+ state_accel_speed[state.state] += state.accel_speed;
state_baro_speed[state.state] += state.baro_speed;
state_count[state.state]++;
if (state_start[state.state] == 0.0)
@@ -131,8 +131,8 @@ public class AltosFlightStats {
if (state_end[state.state] < state.time)
state_end[state.state] = state.time;
max_height = state.max_height;
- if (state.max_speed != 0)
- max_speed = state.max_speed;
+ if (state.max_accel_speed != 0)
+ max_speed = state.max_accel_speed;
else
max_speed = state.max_baro_speed;
max_acceleration = state.max_acceleration;
@@ -140,7 +140,7 @@ public class AltosFlightStats {
}
for (int s = Altos.ao_flight_startup; s <= Altos.ao_flight_landed; s++) {
if (state_count[s] > 0) {
- state_speed[s] /= state_count[s];
+ state_accel_speed[s] /= state_count[s];
state_baro_speed[s] /= state_count[s];
state_accel[s] /= state_count[s];
}
diff --git a/altosui/AltosGraphUI.java b/altosui/AltosGraphUI.java
index cb8e3d20..f59f70ba 100644
--- a/altosui/AltosGraphUI.java
+++ b/altosui/AltosGraphUI.java
@@ -40,12 +40,7 @@ public class AltosGraphUI extends AltosFrame
AltosGraphTime.Element speed =
new AltosGraphTime.TimeSeries(String.format("Speed (%s)", AltosConvert.speed.show_units()), "Vertical Speed", green) {
public void gotTimeData(double time, AltosDataPoint d) {
- double speed;
- if (d.state() < Altos.ao_flight_drogue && d.has_accel()) {
- speed = d.accel_speed();
- } else {
- speed = d.baro_speed();
- }
+ double speed = d.speed();
if (speed != AltosRecord.MISSING)
series.add(time, AltosConvert.speed.value(speed));
}
diff --git a/altosui/AltosInfoTable.java b/altosui/AltosInfoTable.java
index 86e02ab1..11d1b0c1 100644
--- a/altosui/AltosInfoTable.java
+++ b/altosui/AltosInfoTable.java
@@ -114,8 +114,8 @@ public class AltosInfoTable extends JTable {
info_add_row(0, "Max height", "%6.0f m", state.max_height);
info_add_row(0, "Acceleration", "%8.1f m/s²", state.acceleration);
info_add_row(0, "Max acceleration", "%8.1f m/s²", state.max_acceleration);
- info_add_row(0, "Speed", "%8.1f m/s", state.ascent ? state.speed : state.baro_speed);
- info_add_row(0, "Max Speed", "%8.1f m/s", state.max_speed);
+ info_add_row(0, "Speed", "%8.1f m/s", state.speed());
+ info_add_row(0, "Max Speed", "%8.1f m/s", state.max_accel_speed);
info_add_row(0, "Temperature", "%9.2f °C", state.temperature);
info_add_row(0, "Battery", "%9.2f V", state.battery);
if (state.drogue_sense != AltosRecord.MISSING)
diff --git a/altosui/AltosKML.java b/altosui/AltosKML.java
index 57339b19..281638bf 100644
--- a/altosui/AltosKML.java
+++ b/altosui/AltosKML.java
@@ -109,7 +109,7 @@ public class AltosKML implements AltosWriter {
AltosGPS gps = record.gps;
out.printf(kml_coord_fmt,
gps.lon, gps.lat,
- record.filtered_altitude(), (double) gps.alt,
+ record.altitude(), (double) gps.alt,
record.time, gps.nsat);
}
diff --git a/altosui/AltosLanded.java b/altosui/AltosLanded.java
index 57c2d476..5e073f7d 100644
--- a/altosui/AltosLanded.java
+++ b/altosui/AltosLanded.java
@@ -173,7 +173,7 @@ public class AltosLanded extends JComponent implements AltosFlightDisplay, Actio
class Speed extends LandedValue {
void show (AltosState state, int crc_errors) {
- show(AltosConvert.speed, state.max_speed);
+ show(AltosConvert.speed, state.max_speed());
}
public Speed (GridBagLayout layout, int y) {
super (layout, y, "Maximum Speed");
@@ -250,6 +250,9 @@ public class AltosLanded extends JComponent implements AltosFlightDisplay, Actio
} else if (filename.endsWith("telem")) {
FileInputStream in = new FileInputStream(file);
records = new AltosTelemetryIterable(in);
+ } else if (filename.endsWith("mega")) {
+ FileInputStream in = new FileInputStream(file);
+ records = new AltosEepromMegaIterable(in);
} else {
throw new FileNotFoundException(filename);
}
diff --git a/altosui/Makefile.am b/altosui/Makefile.am
index de7a86c0..306a396e 100644
--- a/altosui/Makefile.am
+++ b/altosui/Makefile.am
@@ -24,6 +24,7 @@ altosui_JAVA = \
AltosConfig.java \
AltosConfigFreqUI.java \
AltosConfigUI.java \
+ AltosConfigPyroUI.java \
AltosConfigureUI.java \
AltosConfigTD.java \
AltosConfigTDUI.java \