summaryrefslogtreecommitdiff
path: root/altosui
diff options
context:
space:
mode:
Diffstat (limited to 'altosui')
-rw-r--r--altosui/Altos.java2
-rw-r--r--altosui/AltosAscent.java34
-rw-r--r--altosui/AltosBTKnown.java2
-rw-r--r--altosui/AltosCSV.java2
-rw-r--r--altosui/AltosCSVUI.java2
-rw-r--r--altosui/AltosCompanionInfo.java2
-rw-r--r--altosui/AltosConfig.java2
-rw-r--r--altosui/AltosConfigFreqUI.java2
-rw-r--r--altosui/AltosConfigPyroUI.java27
-rw-r--r--altosui/AltosConfigTD.java2
-rw-r--r--altosui/AltosConfigTDUI.java2
-rw-r--r--altosui/AltosConfigUI.java2
-rw-r--r--altosui/AltosDataChooser.java2
-rw-r--r--altosui/AltosDescent.java2
-rw-r--r--altosui/AltosDisplayThread.java2
-rw-r--r--altosui/AltosEepromDelete.java2
-rw-r--r--altosui/AltosEepromManage.java2
-rw-r--r--altosui/AltosEepromMonitorUI.java2
-rw-r--r--altosui/AltosEepromSelect.java2
-rw-r--r--altosui/AltosFlashUI.java2
-rw-r--r--altosui/AltosFlightDisplay.java2
-rw-r--r--altosui/AltosFlightStats.java14
-rw-r--r--altosui/AltosFlightStatsTable.java2
-rw-r--r--altosui/AltosFlightStatus.java2
-rw-r--r--altosui/AltosFlightStatusTableModel.java2
-rw-r--r--altosui/AltosFlightStatusUpdate.java2
-rw-r--r--altosui/AltosFlightUI.java2
-rw-r--r--altosui/AltosFreqList.java2
-rw-r--r--altosui/AltosGraph.java132
-rw-r--r--altosui/AltosGraphDataPoint.java64
-rw-r--r--altosui/AltosGraphDataSet.java2
-rw-r--r--altosui/AltosGraphUI.java2
-rw-r--r--altosui/AltosIdleMonitorUI.java42
-rw-r--r--altosui/AltosIgniteUI.java236
-rw-r--r--altosui/AltosInfoTable.java10
-rw-r--r--altosui/AltosKML.java2
-rw-r--r--altosui/AltosLanded.java2
-rw-r--r--altosui/AltosPad.java2
-rw-r--r--altosui/AltosRomconfigUI.java6
-rw-r--r--altosui/AltosScanUI.java2
-rw-r--r--altosui/AltosSerial.java2
-rw-r--r--altosui/AltosSiteMap.java6
-rw-r--r--altosui/AltosSiteMapCache.java15
-rw-r--r--altosui/AltosSiteMapPreload.java6
-rw-r--r--altosui/AltosSiteMapTile.java2
-rw-r--r--altosui/AltosUI.java9
-rw-r--r--altosui/AltosUIPreferencesBackend.java2
-rw-r--r--altosui/AltosWriter.java2
-rw-r--r--altosui/Makefile.am19
-rw-r--r--altosui/altos-windows.nsi.in1
50 files changed, 537 insertions, 154 deletions
diff --git a/altosui/Altos.java b/altosui/Altos.java
index 07280b4a..4b171fa7 100644
--- a/altosui/Altos.java
+++ b/altosui/Altos.java
@@ -20,7 +20,7 @@ package altosui;
import java.awt.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class Altos extends AltosUILib {
diff --git a/altosui/AltosAscent.java b/altosui/AltosAscent.java
index ba4fc614..3f74fdd1 100644
--- a/altosui/AltosAscent.java
+++ b/altosui/AltosAscent.java
@@ -19,7 +19,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosAscent extends JComponent implements AltosFlightDisplay {
GridBagLayout layout;
@@ -271,6 +271,17 @@ public class AltosAscent extends JComponent implements AltosFlightDisplay {
Accel accel;
+ class Orient extends AscentValueHold {
+ void show (AltosState state, AltosListenerState listener_state) {
+ show(AltosConvert.orient, state.orient());
+ }
+ public Orient (GridBagLayout layout, int y) {
+ super (layout, y, "Tilt Angle");
+ }
+ }
+
+ Orient orient;
+
String pos(double p, String pos, String neg) {
String h = pos;
if (p < 0) {
@@ -342,6 +353,7 @@ public class AltosAscent extends JComponent implements AltosFlightDisplay {
height.reset();
speed.reset();
accel.reset();
+ orient.reset();
}
public void set_font() {
@@ -354,6 +366,7 @@ public class AltosAscent extends JComponent implements AltosFlightDisplay {
height.set_font();
speed.set_font();
accel.set_font();
+ orient.set_font();
}
public void show(AltosState state, AltosListenerState listener_state) {
@@ -375,6 +388,7 @@ public class AltosAscent extends JComponent implements AltosFlightDisplay {
apogee.hide();
speed.show(state, listener_state);
accel.show(state, listener_state);
+ orient.show(state, listener_state);
}
public void labels(GridBagLayout layout, int y) {
@@ -410,13 +424,15 @@ public class AltosAscent extends JComponent implements AltosFlightDisplay {
* lon
* height
*/
- labels(layout, 0);
- height = new Height(layout, 1);
- speed = new Speed(layout, 2);
- accel = new Accel(layout, 3);
- lat = new Lat(layout, 4);
- lon = new Lon(layout, 5);
- apogee = new Apogee(layout, 6);
- main = new Main(layout, 7);
+ int y = 0;
+ labels(layout, y++);
+ height = new Height(layout, y++);
+ speed = new Speed(layout, y++);
+ accel = new Accel(layout, y++);
+ orient = new Orient(layout, y++);
+ lat = new Lat(layout, y++);
+ lon = new Lon(layout, y++);
+ apogee = new Apogee(layout, y++);
+ main = new Main(layout, y++);
}
}
diff --git a/altosui/AltosBTKnown.java b/altosui/AltosBTKnown.java
index a1652ec4..968d72d5 100644
--- a/altosui/AltosBTKnown.java
+++ b/altosui/AltosBTKnown.java
@@ -17,7 +17,7 @@
package altosui;
import java.util.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosBTKnown implements Iterable<AltosBTDevice> {
diff --git a/altosui/AltosCSV.java b/altosui/AltosCSV.java
index 7598eca0..13f29f07 100644
--- a/altosui/AltosCSV.java
+++ b/altosui/AltosCSV.java
@@ -19,7 +19,7 @@ package altosui;
import java.io.*;
import java.util.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosCSV implements AltosWriter {
File name;
diff --git a/altosui/AltosCSVUI.java b/altosui/AltosCSVUI.java
index c41ea74b..05cabcdf 100644
--- a/altosui/AltosCSVUI.java
+++ b/altosui/AltosCSVUI.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosCSVUI
diff --git a/altosui/AltosCompanionInfo.java b/altosui/AltosCompanionInfo.java
index 1f446700..4cc6c462 100644
--- a/altosui/AltosCompanionInfo.java
+++ b/altosui/AltosCompanionInfo.java
@@ -19,7 +19,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosCompanionInfo extends JTable {
private AltosFlightInfoTableModel model;
diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java
index 206cbee3..e1805fc1 100644
--- a/altosui/AltosConfig.java
+++ b/altosui/AltosConfig.java
@@ -22,7 +22,7 @@ import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
import java.text.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosConfig implements ActionListener {
diff --git a/altosui/AltosConfigFreqUI.java b/altosui/AltosConfigFreqUI.java
index 555af3b6..e9923a32 100644
--- a/altosui/AltosConfigFreqUI.java
+++ b/altosui/AltosConfigFreqUI.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
class AltosEditFreqUI extends AltosUIDialog implements ActionListener {
diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java
index 81d12111..47b2b662 100644
--- a/altosui/AltosConfigPyroUI.java
+++ b/altosui/AltosConfigPyroUI.java
@@ -21,12 +21,12 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosConfigPyroUI
extends AltosUIDialog
- implements ItemListener, DocumentListener, AltosUnitsListener
+ implements ItemListener, DocumentListener, AltosUnitsListener, ActionListener
{
AltosConfigUI owner;
Container pane;
@@ -48,7 +48,7 @@ public class AltosConfigPyroUI
class PyroItem implements ItemListener, DocumentListener, AltosUnitsListener
{
public int flag;
- public JRadioButton enable;
+ public JCheckBox enable;
public JTextField value;
public JComboBox combo;
AltosConfigPyroUI ui;
@@ -146,7 +146,7 @@ public class AltosConfigPyroUI
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.LINE_START;
c.insets = il;
- enable = new JRadioButton();
+ enable = new JCheckBox();
enable.addItemListener(this);
pane.add(enable, c);
@@ -309,6 +309,14 @@ public class AltosConfigPyroUI
}
}
+ /* Listen for events from our buttons */
+ public void actionPerformed(ActionEvent e) {
+ String cmd = e.getActionCommand();
+
+ if (cmd.equals("Close"))
+ setVisible(false);
+ }
+
public AltosConfigPyroUI(AltosConfigUI in_owner, AltosPyro[] pyros) {
super(in_owner, "Configure Pyro Channels", false);
@@ -353,6 +361,17 @@ public class AltosConfigPyroUI
columns[i] = new PyroColumn(this, i*2 + 1, 0, i);
columns[i].set(pyros[i]);
}
+
+ c = new GridBagConstraints();
+ c.gridx = pyros.length*2-1;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.gridwidth = 2;
+ c.gridy = 1000;
+ JButton close = new JButton("Close");
+ pane.add(close, c);
+ close.addActionListener(this);
+ close.setActionCommand("Close");
+
addWindowListener(new ConfigListener(this, owner));
AltosPreferences.register_units_listener(this);
}
diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java
index f879ff88..ad9ebbfa 100644
--- a/altosui/AltosConfigTD.java
+++ b/altosui/AltosConfigTD.java
@@ -21,7 +21,7 @@ import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosConfigTD implements ActionListener {
diff --git a/altosui/AltosConfigTDUI.java b/altosui/AltosConfigTDUI.java
index b5a6cd7c..3ce0d98c 100644
--- a/altosui/AltosConfigTDUI.java
+++ b/altosui/AltosConfigTDUI.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosConfigTDUI
diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java
index a7d95903..21ea50e6 100644
--- a/altosui/AltosConfigUI.java
+++ b/altosui/AltosConfigUI.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosConfigUI
diff --git a/altosui/AltosDataChooser.java b/altosui/AltosDataChooser.java
index c0d66682..a9344a01 100644
--- a/altosui/AltosDataChooser.java
+++ b/altosui/AltosDataChooser.java
@@ -20,7 +20,7 @@ package altosui;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosDataChooser extends JFileChooser {
diff --git a/altosui/AltosDescent.java b/altosui/AltosDescent.java
index e73d990c..d1379083 100644
--- a/altosui/AltosDescent.java
+++ b/altosui/AltosDescent.java
@@ -19,7 +19,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosDescent extends JComponent implements AltosFlightDisplay {
GridBagLayout layout;
diff --git a/altosui/AltosDisplayThread.java b/altosui/AltosDisplayThread.java
index 4b4cc3b9..2a33f996 100644
--- a/altosui/AltosDisplayThread.java
+++ b/altosui/AltosDisplayThread.java
@@ -21,7 +21,7 @@ import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.text.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosDisplayThread extends Thread {
diff --git a/altosui/AltosEepromDelete.java b/altosui/AltosEepromDelete.java
index 9984d1a2..b2d2e291 100644
--- a/altosui/AltosEepromDelete.java
+++ b/altosui/AltosEepromDelete.java
@@ -21,7 +21,7 @@ import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosEepromDelete implements Runnable {
AltosEepromList flights;
diff --git a/altosui/AltosEepromManage.java b/altosui/AltosEepromManage.java
index da0a9777..e3635571 100644
--- a/altosui/AltosEepromManage.java
+++ b/altosui/AltosEepromManage.java
@@ -21,7 +21,7 @@ import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosEepromManage implements ActionListener {
diff --git a/altosui/AltosEepromMonitorUI.java b/altosui/AltosEepromMonitorUI.java
index 6ad4ca5c..c2e925a2 100644
--- a/altosui/AltosEepromMonitorUI.java
+++ b/altosui/AltosEepromMonitorUI.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.altusmetrum.altosuilib_1.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMonitor {
JFrame owner;
diff --git a/altosui/AltosEepromSelect.java b/altosui/AltosEepromSelect.java
index 8f86eebf..b7cdbb72 100644
--- a/altosui/AltosEepromSelect.java
+++ b/altosui/AltosEepromSelect.java
@@ -21,7 +21,7 @@ import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
class AltosEepromItem implements ActionListener {
diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java
index 296ad8ef..5913e506 100644
--- a/altosui/AltosFlashUI.java
+++ b/altosui/AltosFlashUI.java
@@ -23,7 +23,7 @@ import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosFlashUI
diff --git a/altosui/AltosFlightDisplay.java b/altosui/AltosFlightDisplay.java
index 289ddd01..c1264259 100644
--- a/altosui/AltosFlightDisplay.java
+++ b/altosui/AltosFlightDisplay.java
@@ -17,7 +17,7 @@
package altosui;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public interface AltosFlightDisplay {
void reset();
diff --git a/altosui/AltosFlightStats.java b/altosui/AltosFlightStats.java
index 552210c3..bf5644c3 100644
--- a/altosui/AltosFlightStats.java
+++ b/altosui/AltosFlightStats.java
@@ -18,7 +18,7 @@
package altosui;
import java.io.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosFlightStats {
double max_height;
@@ -38,6 +38,9 @@ public class AltosFlightStats {
boolean has_gps;
boolean has_other_adc;
boolean has_rssi;
+ boolean has_imu;
+ boolean has_mag;
+ boolean has_orient;
double landed_time(AltosStateIterable states) {
AltosState state = null;
@@ -108,6 +111,9 @@ public class AltosFlightStats {
has_gps = false;
has_other_adc = false;
has_rssi = false;
+ has_imu = false;
+ has_mag = false;
+ has_orient = false;
for (AltosState state : states) {
if (serial == AltosLib.MISSING && state.serial != AltosLib.MISSING)
serial = state.serial;
@@ -157,6 +163,12 @@ public class AltosFlightStats {
lon = state.gps.lon;
has_gps = true;
}
+ if (state.imu != null)
+ has_imu = true;
+ if (state.mag != null)
+ has_mag = true;
+ if (state.orient() != AltosLib.MISSING)
+ has_orient = true;
}
for (int s = Altos.ao_flight_startup; s <= Altos.ao_flight_landed; s++) {
if (state_count[s] > 0) {
diff --git a/altosui/AltosFlightStatsTable.java b/altosui/AltosFlightStatsTable.java
index db875b3b..3e7e9fe1 100644
--- a/altosui/AltosFlightStatsTable.java
+++ b/altosui/AltosFlightStatsTable.java
@@ -19,7 +19,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosFlightStatsTable extends JComponent {
GridBagLayout layout;
diff --git a/altosui/AltosFlightStatus.java b/altosui/AltosFlightStatus.java
index 9d575e4c..c6d75420 100644
--- a/altosui/AltosFlightStatus.java
+++ b/altosui/AltosFlightStatus.java
@@ -19,7 +19,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosFlightStatus extends JComponent implements AltosFlightDisplay {
GridBagLayout layout;
diff --git a/altosui/AltosFlightStatusTableModel.java b/altosui/AltosFlightStatusTableModel.java
index 08154fda..e372d401 100644
--- a/altosui/AltosFlightStatusTableModel.java
+++ b/altosui/AltosFlightStatusTableModel.java
@@ -27,7 +27,7 @@ import java.util.*;
import java.text.*;
import java.util.prefs.*;
import java.util.concurrent.LinkedBlockingQueue;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosFlightStatusTableModel extends AbstractTableModel {
private String[] columnNames = {
diff --git a/altosui/AltosFlightStatusUpdate.java b/altosui/AltosFlightStatusUpdate.java
index 7821a777..93399a13 100644
--- a/altosui/AltosFlightStatusUpdate.java
+++ b/altosui/AltosFlightStatusUpdate.java
@@ -18,7 +18,7 @@
package altosui;
import java.awt.event.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosFlightStatusUpdate implements ActionListener {
diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java
index c151177e..e8cf7f08 100644
--- a/altosui/AltosFlightUI.java
+++ b/altosui/AltosFlightUI.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay, AltosFontListener {
diff --git a/altosui/AltosFreqList.java b/altosui/AltosFreqList.java
index 17a995d4..039b5f22 100644
--- a/altosui/AltosFreqList.java
+++ b/altosui/AltosFreqList.java
@@ -18,7 +18,7 @@
package altosui;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosFreqList extends JComboBox {
diff --git a/altosui/AltosGraph.java b/altosui/AltosGraph.java
index c505d2d8..42334e31 100644
--- a/altosui/AltosGraph.java
+++ b/altosui/AltosGraph.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
import org.jfree.ui.*;
@@ -127,6 +127,52 @@ class AltosDbm extends AltosUnits {
}
}
+class AltosGyroUnits extends AltosUnits {
+
+ public double value(double p, boolean imperial_units) {
+ return p;
+ }
+
+ public double inverse(double p, boolean imperial_units) {
+ return p;
+ }
+
+ public String show_units(boolean imperial_units) {
+ return "°/sec";
+ }
+
+ public String say_units(boolean imperial_units) {
+ return "degrees per second";
+ }
+
+ public int show_fraction(int width, boolean imperial_units) {
+ return 1;
+ }
+}
+
+class AltosMagUnits extends AltosUnits {
+
+ public double value(double p, boolean imperial_units) {
+ return p;
+ }
+
+ public double inverse(double p, boolean imperial_units) {
+ return p;
+ }
+
+ public String show_units(boolean imperial_units) {
+ return "Ga";
+ }
+
+ public String say_units(boolean imperial_units) {
+ return "gauss";
+ }
+
+ public int show_fraction(int width, boolean imperial_units) {
+ return 2;
+ }
+}
+
public class AltosGraph extends AltosUIGraph {
static final private Color height_color = new Color(194,31,31);
@@ -146,14 +192,28 @@ public class AltosGraph extends AltosUIGraph {
static final private Color temperature_color = new Color (31, 194, 194);
static final private Color dbm_color = new Color(31, 100, 100);
static final private Color state_color = new Color(0,0,0);
+ static final private Color accel_x_color = new Color(255, 0, 0);
+ static final private Color accel_y_color = new Color(0, 255, 0);
+ static final private Color accel_z_color = new Color(0, 0, 255);
+ static final private Color gyro_x_color = new Color(192, 0, 0);
+ static final private Color gyro_y_color = new Color(0, 192, 0);
+ static final private Color gyro_z_color = new Color(0, 0, 192);
+ static final private Color mag_x_color = new Color(128, 0, 0);
+ static final private Color mag_y_color = new Color(0, 128, 0);
+ static final private Color mag_z_color = new Color(0, 0, 128);
+ static final private Color orient_color = new Color(31, 31, 31);
static AltosVoltage voltage_units = new AltosVoltage();
static AltosPressure pressure_units = new AltosPressure();
static AltosNsat nsat_units = new AltosNsat();
static AltosDbm dbm_units = new AltosDbm();
+ static AltosGyroUnits gyro_units = new AltosGyroUnits();
+ static AltosOrient orient_units = new AltosOrient();
+ static AltosMagUnits mag_units = new AltosMagUnits();
AltosUIAxis height_axis, speed_axis, accel_axis, voltage_axis, temperature_axis, nsat_axis, dbm_axis;
AltosUIAxis distance_axis, pressure_axis;
+ AltosUIAxis gyro_axis, orient_axis, mag_axis;
public AltosGraph(AltosUIEnable enable, AltosFlightStats stats, AltosGraphDataSet dataSet) {
super(enable);
@@ -169,6 +229,10 @@ public class AltosGraph extends AltosUIGraph {
dbm_axis = newAxis("Signal Strength", dbm_units, dbm_color, 0);
distance_axis = newAxis("Distance", AltosConvert.distance, range_color);
+ gyro_axis = newAxis("Rotation Rate", gyro_units, gyro_z_color, 0);
+ orient_axis = newAxis("Tilt Angle", orient_units, orient_color, 0);
+ mag_axis = newAxis("Magnetic Field", mag_units, mag_x_color, 0);
+
addMarker("State", AltosGraphDataPoint.data_state, state_color);
addSeries("Height",
AltosGraphDataPoint.data_height,
@@ -260,6 +324,72 @@ public class AltosGraph extends AltosUIGraph {
voltage_axis);
}
+ if (stats.has_imu) {
+ addSeries("Acceleration X",
+ AltosGraphDataPoint.data_accel_x,
+ AltosConvert.accel,
+ accel_x_color,
+ false,
+ accel_axis);
+ addSeries("Acceleration Y",
+ AltosGraphDataPoint.data_accel_y,
+ AltosConvert.accel,
+ accel_y_color,
+ false,
+ accel_axis);
+ addSeries("Acceleration Z",
+ AltosGraphDataPoint.data_accel_z,
+ AltosConvert.accel,
+ accel_z_color,
+ false,
+ accel_axis);
+ addSeries("Rotation Rate X",
+ AltosGraphDataPoint.data_gyro_x,
+ gyro_units,
+ gyro_x_color,
+ false,
+ gyro_axis);
+ addSeries("Rotation Rate Y",
+ AltosGraphDataPoint.data_gyro_y,
+ gyro_units,
+ gyro_y_color,
+ false,
+ gyro_axis);
+ addSeries("Rotation Rate Z",
+ AltosGraphDataPoint.data_gyro_z,
+ gyro_units,
+ gyro_z_color,
+ false,
+ gyro_axis);
+ }
+ if (stats.has_mag) {
+ addSeries("Magnetometer X",
+ AltosGraphDataPoint.data_mag_x,
+ mag_units,
+ mag_x_color,
+ false,
+ mag_axis);
+ addSeries("Magnetometer Y",
+ AltosGraphDataPoint.data_mag_y,
+ mag_units,
+ mag_y_color,
+ false,
+ mag_axis);
+ addSeries("Magnetometer Z",
+ AltosGraphDataPoint.data_mag_z,
+ mag_units,
+ mag_z_color,
+ false,
+ mag_axis);
+ }
+ if (stats.has_orient)
+ addSeries("Tilt Angle",
+ AltosGraphDataPoint.data_orient,
+ orient_units,
+ orient_color,
+ false,
+ orient_axis);
+
setDataSet(dataSet);
}
} \ No newline at end of file
diff --git a/altosui/AltosGraphDataPoint.java b/altosui/AltosGraphDataPoint.java
index d8191f5d..61a1a227 100644
--- a/altosui/AltosGraphDataPoint.java
+++ b/altosui/AltosGraphDataPoint.java
@@ -18,7 +18,7 @@
package altosui;
import org.altusmetrum.altosuilib_1.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosGraphDataPoint implements AltosUIDataPoint {
@@ -40,6 +40,16 @@ public class AltosGraphDataPoint implements AltosUIDataPoint {
public static final int data_range = 13;
public static final int data_distance = 14;
public static final int data_pressure = 15;
+ public static final int data_accel_x = 16;
+ public static final int data_accel_y = 17;
+ public static final int data_accel_z = 18;
+ public static final int data_gyro_x = 19;
+ public static final int data_gyro_y = 20;
+ public static final int data_gyro_z = 21;
+ public static final int data_mag_x = 22;
+ public static final int data_mag_y = 23;
+ public static final int data_mag_z = 24;
+ public static final int data_orient = 25;
public double x() throws AltosUIDataMissing {
double time = state.time_since_boost();
@@ -99,6 +109,58 @@ public class AltosGraphDataPoint implements AltosUIDataPoint {
case data_pressure:
y = state.pressure();
break;
+
+ case data_accel_x:
+ case data_accel_y:
+ case data_accel_z:
+ case data_gyro_x:
+ case data_gyro_y:
+ case data_gyro_z:
+ AltosIMU imu = state.imu;
+ if (imu == null)
+ break;
+ switch (index) {
+ case data_accel_x:
+ y = imu.accel_x;
+ break;
+ case data_accel_y:
+ y = imu.accel_y;
+ break;
+ case data_accel_z:
+ y = imu.accel_z;
+ break;
+ case data_gyro_x:
+ y = imu.gyro_x;
+ break;
+ case data_gyro_y:
+ y = imu.gyro_y;
+ break;
+ case data_gyro_z:
+ y = imu.gyro_z;
+ break;
+ }
+ break;
+ case data_mag_x:
+ case data_mag_y:
+ case data_mag_z:
+ AltosMag mag = state.mag;
+ if (mag == null)
+ break;
+ switch (index) {
+ case data_mag_x:
+ y = mag.x;
+ break;
+ case data_mag_y:
+ y = mag.y;
+ break;
+ case data_mag_z:
+ y = mag.z;
+ break;
+ }
+ break;
+ case data_orient:
+ y = state.orient();
+ break;
}
if (y == AltosLib.MISSING)
throw new AltosUIDataMissing(index);
diff --git a/altosui/AltosGraphDataSet.java b/altosui/AltosGraphDataSet.java
index 4e6c46d1..d2773a3f 100644
--- a/altosui/AltosGraphDataSet.java
+++ b/altosui/AltosGraphDataSet.java
@@ -20,7 +20,7 @@ package altosui;
import java.lang.*;
import java.io.*;
import java.util.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
class AltosGraphIterator implements Iterator<AltosUIDataPoint> {
diff --git a/altosui/AltosGraphUI.java b/altosui/AltosGraphUI.java
index c42f7b5f..40d2f7f4 100644
--- a/altosui/AltosGraphUI.java
+++ b/altosui/AltosGraphUI.java
@@ -9,7 +9,7 @@ import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
import org.jfree.chart.ChartPanel;
diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java
index 6a79604e..7ca935b6 100644
--- a/altosui/AltosIdleMonitorUI.java
+++ b/altosui/AltosIdleMonitorUI.java
@@ -24,7 +24,7 @@ import javax.swing.event.*;
import java.io.*;
import java.util.concurrent.*;
import java.util.Arrays;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosFontListener, AltosIdleMonitorListener, DocumentListener {
@@ -132,8 +132,35 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
return constraints(x, width, GridBagConstraints.NONE);
}
+ void idle_exception(JFrame owner, Exception e) {
+ if (e instanceof FileNotFoundException) {
+ JOptionPane.showMessageDialog(owner,
+ ((FileNotFoundException) e).getMessage(),
+ "Cannot open target device",
+ JOptionPane.ERROR_MESSAGE);
+ } else if (e instanceof AltosSerialInUseException) {
+ JOptionPane.showMessageDialog(owner,
+ String.format("Device \"%s\" already in use",
+ device.toShortString()),
+ "Device in use",
+ JOptionPane.ERROR_MESSAGE);
+ } else if (e instanceof IOException) {
+ IOException ee = (IOException) e;
+ JOptionPane.showMessageDialog(owner,
+ device.toShortString(),
+ ee.getLocalizedMessage(),
+ JOptionPane.ERROR_MESSAGE);
+ } else {
+ JOptionPane.showMessageDialog(owner,
+ String.format("Connection to \"%s\" failed",
+ device.toShortString()),
+ "Connection Failed",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
public AltosIdleMonitorUI(JFrame in_owner)
- throws FileNotFoundException, AltosSerialInUseException, TimeoutException, InterruptedException {
+ throws FileNotFoundException, TimeoutException, InterruptedException {
device = AltosDeviceUIDialog.show(in_owner, Altos.product_any);
remote = false;
@@ -141,6 +168,15 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
remote = true;
serial = device.getSerial();
+
+ AltosLink link;
+ try {
+ link = new AltosSerial(device);
+ } catch (Exception ex) {
+ idle_exception(in_owner, ex);
+ return;
+ }
+
bag = getContentPane();
bag.setLayout(new GridBagLayout());
@@ -209,7 +245,7 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
pack();
setVisible(true);
- thread = new AltosIdleMonitor((AltosIdleMonitorListener) this, (AltosLink) new AltosSerial (device), (boolean) remote);
+ thread = new AltosIdleMonitor((AltosIdleMonitorListener) this, link, (boolean) remote);
status_update = new AltosFlightStatusUpdate(flightStatus);
diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java
index c8024aae..2e69249f 100644
--- a/altosui/AltosIgniteUI.java
+++ b/altosui/AltosIgniteUI.java
@@ -22,8 +22,9 @@ import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.text.*;
+import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosIgniteUI
@@ -33,17 +34,14 @@ public class AltosIgniteUI
AltosDevice device;
JFrame owner;
JLabel label;
- JRadioButton apogee;
- JLabel apogee_status_label;
- JRadioButton main;
- JLabel main_status_label;
JToggleButton arm;
JButton fire;
javax.swing.Timer timer;
JButton close;
+ ButtonGroup group;
+ Boolean opened;
- int apogee_status;
- int main_status;
+ int npyro;
final static int timeout = 1 * 1000;
@@ -52,9 +50,68 @@ public class AltosIgniteUI
LinkedBlockingQueue<String> command_queue;
+ LinkedBlockingQueue<String> reply_queue;
+
+ class Igniter {
+ JRadioButton button;
+ JLabel status_label;
+ String name;
+ int status;
+
+ void set_status (int status) {
+ this.status = status;
+ status_label.setText(String.format("\"%s\"", AltosIgnite.status_string(status)));
+ }
+
+ Igniter(AltosIgniteUI ui, String label, String name, int y) {
+ Container pane = getContentPane();
+ GridBagConstraints c = new GridBagConstraints();
+ Insets i = new Insets(4,4,4,4);
+
+ this.name = name;
+ this.status = AltosIgnite.Unknown;
+
+ c.gridx = 0;
+ c.gridy = y;
+ c.gridwidth = 1;
+ c.anchor = GridBagConstraints.WEST;
+ button = new JRadioButton (label);
+ pane.add(button, c);
+ button.addActionListener(ui);
+ button.setActionCommand(name);
+ group.add(button);
+
+ c.gridx = 1;
+ c.gridy = y;
+ c.gridwidth = 1;
+ c.anchor = GridBagConstraints.WEST;
+ status_label = new JLabel("plenty of text");
+ pane.add(status_label, c);
+
+ status = AltosIgnite.Unknown;
+ }
+ }
+
+ Igniter igniters[];
+
+ void set_status(String _name, int _status) {
+
+ final String name = _name;
+ final int status = _status;
+ Runnable r = new Runnable() {
+ public void run() {
+ for (int p = 0; p < igniters.length; p++)
+ if (name.equals(igniters[p].name))
+ igniters[p].set_status(status);
+ }
+ };
+ SwingUtilities.invokeLater(r);
+ }
+
class IgniteHandler implements Runnable {
AltosIgnite ignite;
JFrame owner;
+ AltosLink link;
void send_exception(Exception e) {
final Exception f_e = e;
@@ -68,9 +125,7 @@ public class AltosIgniteUI
public void run () {
try {
- AltosSerial serial = new AltosSerial(device);
- serial.set_frame(owner);
- ignite = new AltosIgnite(serial,
+ ignite = new AltosIgnite(link,
!device.matchProduct(Altos.product_altimeter));
} catch (Exception e) {
@@ -86,20 +141,23 @@ public class AltosIgniteUI
String reply = null;
if (command.equals("get_status")) {
- apogee_status = ignite.status(AltosIgnite.Apogee);
- main_status = ignite.status(AltosIgnite.Main);
+ HashMap<String,Integer> status_map = ignite.status();
+
+ for (int p = 0; p < igniters.length; p++) {
+ Integer i = status_map.get(igniters[p].name);
+ if (i != null)
+ set_status(igniters[p].name, i);
+ }
reply = "status";
- } else if (command.equals("main")) {
- ignite.fire(AltosIgnite.Main);
- reply = "fired";
- } else if (command.equals("apogee")) {
- ignite.fire(AltosIgnite.Apogee);
- reply = "fired";
+ } else if (command.equals("get_npyro")) {
+ put_reply(String.format("%d", ignite.npyro()));
+ continue;
} else if (command.equals("quit")) {
ignite.close();
break;
} else {
- throw new ParseException(String.format("invalid command %s", command), 0);
+ ignite.fire(command);
+ reply = "fired";
}
final String f_reply = reply;
r = new Runnable() {
@@ -114,8 +172,9 @@ public class AltosIgniteUI
}
}
- public IgniteHandler(JFrame in_owner) {
+ public IgniteHandler(JFrame in_owner, AltosLink in_link) {
owner = in_owner;
+ link = in_link;
}
}
@@ -170,16 +229,15 @@ public class AltosIgniteUI
void stop_timer() {
time_remaining = 0;
- arm.setSelected(false);
- arm.setEnabled(false);
fire.setEnabled(false);
timer_running = false;
+ arm.setSelected(false);
+ arm.setEnabled(false);
set_arm_text();
}
void cancel () {
- apogee.setSelected(false);
- main.setSelected(false);
+ group.clearSelection();
fire.setEnabled(false);
stop_timer();
}
@@ -192,13 +250,30 @@ public class AltosIgniteUI
}
}
+ void put_reply(String reply) {
+ try {
+ reply_queue.put(reply);
+ } catch (Exception ex) {
+ ignite_exception(ex);
+ }
+ }
+
+ String get_reply() {
+ String reply = "";
+ try {
+ reply = reply_queue.take();
+ } catch (Exception ex) {
+ ignite_exception(ex);
+ }
+ return reply;
+ }
+
boolean getting_status = false;
boolean visible = false;
+
void set_ignite_status() {
getting_status = false;
- apogee_status_label.setText(String.format("\"%s\"", AltosIgnite.status_string(apogee_status)));
- main_status_label.setText(String.format("\"%s\"", AltosIgnite.status_string(main_status)));
if (!visible) {
visible = true;
setVisible(true);
@@ -212,6 +287,12 @@ public class AltosIgniteUI
}
}
+ int get_npyro() {
+ send_command("get_npyro");
+ String reply = get_reply();
+ return Integer.parseInt(reply);
+ }
+
boolean firing = false;
void start_fire(String which) {
@@ -227,8 +308,10 @@ public class AltosIgniteUI
}
void close() {
- send_command("quit");
- timer.stop();
+ if (opened) {
+ send_command("quit");
+ timer.stop();
+ }
setVisible(false);
dispose();
}
@@ -247,10 +330,12 @@ public class AltosIgniteUI
void fire() {
if (arm.isEnabled() && arm.isSelected() && time_remaining > 0) {
String igniter = "none";
- if (apogee.isSelected() && !main.isSelected())
- igniter = "apogee";
- else if (main.isSelected() && !apogee.isSelected())
- igniter = "main";
+
+ for (int p = 0; p < igniters.length; p++)
+ if (igniters[p].button.isSelected()) {
+ igniter = igniters[p].name;
+ break;
+ }
send_command(igniter);
cancel();
}
@@ -258,18 +343,13 @@ public class AltosIgniteUI
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
- if (cmd.equals("apogee") || cmd.equals("main")) {
- stop_timer();
- }
- if (cmd.equals("apogee") && apogee.isSelected()) {
- main.setSelected(false);
- arm.setEnabled(true);
- }
- if (cmd.equals("main") && main.isSelected()) {
- apogee.setSelected(false);
- arm.setEnabled(true);
- }
+ for (int p = 0; p < igniters.length; p++)
+ if (cmd.equals(igniters[p].name)) {
+ stop_timer();
+ arm.setEnabled(true);
+ break;
+ }
if (cmd.equals("arm")) {
if (arm.isSelected()) {
@@ -282,9 +362,8 @@ public class AltosIgniteUI
fire();
if (cmd.equals("tick"))
tick_timer();
- if (cmd.equals("close")) {
+ if (cmd.equals("close"))
close();
- }
}
/* A window listener to catch closing events and tell the config code */
@@ -304,13 +383,22 @@ public class AltosIgniteUI
private boolean open() {
command_queue = new LinkedBlockingQueue<String>();
+ reply_queue = new LinkedBlockingQueue<String>();
+ opened = false;
device = AltosDeviceUIDialog.show(owner, Altos.product_any);
if (device != null) {
- IgniteHandler handler = new IgniteHandler(owner);
+ try {
+ AltosSerial serial = new AltosSerial(device);
+ serial.set_frame(owner);
+ IgniteHandler handler = new IgniteHandler(owner, serial);
Thread t = new Thread(handler);
t.start();
+ opened = true;
return true;
+ } catch (Exception ex) {
+ ignite_exception(ex);
+ }
}
return false;
}
@@ -318,13 +406,14 @@ public class AltosIgniteUI
public AltosIgniteUI(JFrame in_owner) {
owner = in_owner;
- apogee_status = AltosIgnite.Unknown;
- main_status = AltosIgnite.Unknown;
if (!open())
return;
+ group = new ButtonGroup();
+
Container pane = getContentPane();
+
GridBagConstraints c = new GridBagConstraints();
Insets i = new Insets(4,4,4,4);
@@ -343,47 +432,32 @@ public class AltosIgniteUI
c.weightx = 0;
c.weighty = 0;
+ int y = 0;
+
c.gridx = 0;
- c.gridy = 0;
+ c.gridy = y;
c.gridwidth = 2;
c.anchor = GridBagConstraints.CENTER;
label = new JLabel ("Fire Igniter");
pane.add(label, c);
- c.gridx = 0;
- c.gridy = 1;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.WEST;
- apogee = new JRadioButton ("Apogee");
- pane.add(apogee, c);
- apogee.addActionListener(this);
- apogee.setActionCommand("apogee");
+ y++;
- c.gridx = 1;
- c.gridy = 1;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.WEST;
- apogee_status_label = new JLabel();
- pane.add(apogee_status_label, c);
+ int npyro = get_npyro();
- c.gridx = 0;
- c.gridy = 2;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.WEST;
- main = new JRadioButton ("Main");
- pane.add(main, c);
- main.addActionListener(this);
- main.setActionCommand("main");
+ igniters = new Igniter[2 + npyro];
- c.gridx = 1;
- c.gridy = 2;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.WEST;
- main_status_label = new JLabel();
- pane.add(main_status_label, c);
+ igniters[0] = new Igniter(this, "Apogee", AltosIgnite.Apogee, y++);
+ igniters[1] = new Igniter(this, "Main", AltosIgnite.Main, y++);
+
+ for (int p = 0; p < npyro; p++) {
+ String name = String.format("%d", p);
+ String label = String.format("%c", 'A' + p);
+ igniters[2+p] = new Igniter(this, label, name, y++);
+ }
c.gridx = 0;
- c.gridy = 3;
+ c.gridy = y;
c.gridwidth = 1;
c.anchor = GridBagConstraints.CENTER;
arm = new JToggleButton ("Arm");
@@ -393,7 +467,7 @@ public class AltosIgniteUI
arm.setEnabled(false);
c.gridx = 1;
- c.gridy = 3;
+ c.gridy = y;
c.gridwidth = 1;
c.anchor = GridBagConstraints.CENTER;
fire = new JButton ("Fire");
@@ -402,8 +476,10 @@ public class AltosIgniteUI
fire.addActionListener(this);
fire.setActionCommand("fire");
+ y++;
+
c.gridx = 0;
- c.gridy = 4;
+ c.gridy = y;
c.gridwidth = 2;
c.anchor = GridBagConstraints.CENTER;
close = new JButton ("Close");
diff --git a/altosui/AltosInfoTable.java b/altosui/AltosInfoTable.java
index feafed21..158b61f0 100644
--- a/altosui/AltosInfoTable.java
+++ b/altosui/AltosInfoTable.java
@@ -20,7 +20,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosInfoTable extends JTable {
private AltosFlightInfoTableModel model;
@@ -46,9 +46,9 @@ public class AltosInfoTable extends JTable {
TableColumn column = getColumnModel().getColumn(i);
if ((i & 1) == 0)
- column.setPreferredWidth(text_width(" Satellites Visible "));
+ column.setPreferredWidth(text_width(" Satellites Visible"));
else
- column.setPreferredWidth(text_width(" 179°59.99999' "));
+ column.setPreferredWidth(text_width("W 179°59.99999' "));
}
}
@@ -125,6 +125,10 @@ public class AltosInfoTable extends JTable {
info_add_row(0, "Speed", "%8.1f m/s", state.speed());
if (state.max_speed() != AltosLib.MISSING)
info_add_row(0, "Max Speed", "%8.1f m/s", state.max_speed());
+ if (state.orient() != AltosLib.MISSING)
+ info_add_row(0, "Tilt", "%4.0f °", state.orient());
+ if (state.max_orient() != AltosLib.MISSING)
+ info_add_row(0, "Max Tilt", "%4.0f °", state.max_orient());
if (state.temperature != AltosLib.MISSING)
info_add_row(0, "Temperature", "%9.2f °C", state.temperature);
if (state.battery_voltage != AltosLib.MISSING)
diff --git a/altosui/AltosKML.java b/altosui/AltosKML.java
index fbb0ece4..ae1f8259 100644
--- a/altosui/AltosKML.java
+++ b/altosui/AltosKML.java
@@ -18,7 +18,7 @@
package altosui;
import java.io.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosKML implements AltosWriter {
diff --git a/altosui/AltosLanded.java b/altosui/AltosLanded.java
index cc2053e0..74177753 100644
--- a/altosui/AltosLanded.java
+++ b/altosui/AltosLanded.java
@@ -21,7 +21,7 @@ import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosLanded extends JComponent implements AltosFlightDisplay, ActionListener {
GridBagLayout layout;
diff --git a/altosui/AltosPad.java b/altosui/AltosPad.java
index 06a0f1ef..7baf0eb2 100644
--- a/altosui/AltosPad.java
+++ b/altosui/AltosPad.java
@@ -19,7 +19,7 @@ package altosui;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosPad extends JComponent implements AltosFlightDisplay {
GridBagLayout layout;
diff --git a/altosui/AltosRomconfigUI.java b/altosui/AltosRomconfigUI.java
index fa780125..89994679 100644
--- a/altosui/AltosRomconfigUI.java
+++ b/altosui/AltosRomconfigUI.java
@@ -20,7 +20,7 @@ package altosui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosRomconfigUI
@@ -69,7 +69,7 @@ public class AltosRomconfigUI
c.weightx = 1;
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
- serial_value = new JTextField("0");
+ serial_value = new JTextField("00000000");
pane.add(serial_value, c);
/* Radio calibration value */
@@ -91,7 +91,7 @@ public class AltosRomconfigUI
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- radio_calibration_value = new JTextField("0");
+ radio_calibration_value = new JTextField("00000000");
pane.add(radio_calibration_value, c);
/* Buttons */
diff --git a/altosui/AltosScanUI.java b/altosui/AltosScanUI.java
index a5ccb15a..e4a93362 100644
--- a/altosui/AltosScanUI.java
+++ b/altosui/AltosScanUI.java
@@ -25,7 +25,7 @@ import java.io.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
class AltosScanResult {
diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java
index 5e9322e5..2c5d2dfd 100644
--- a/altosui/AltosSerial.java
+++ b/altosui/AltosSerial.java
@@ -25,7 +25,7 @@ import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
import libaltosJNI.*;
diff --git a/altosui/AltosSiteMap.java b/altosui/AltosSiteMap.java
index 9491ce2b..105afade 100644
--- a/altosui/AltosSiteMap.java
+++ b/altosui/AltosSiteMap.java
@@ -23,7 +23,7 @@ import java.io.*;
import java.lang.Math;
import java.awt.geom.Point2D;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
@@ -182,7 +182,9 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
}
}
- public static void prefetchMaps(double lat, double lng, int w, int h) {
+ public static void prefetchMaps(double lat, double lng) {
+ int w = AltosSiteMapPreload.width;
+ int h = AltosSiteMapPreload.height;
AltosSiteMap asm = new AltosSiteMap(true);
asm.centre = asm.getBaseLocation(lat, lng);
diff --git a/altosui/AltosSiteMapCache.java b/altosui/AltosSiteMapCache.java
index 40c8ff6b..03dc3cf5 100644
--- a/altosui/AltosSiteMapCache.java
+++ b/altosui/AltosSiteMapCache.java
@@ -25,8 +25,13 @@ import java.net.URL;
import java.net.URLConnection;
public class AltosSiteMapCache extends JLabel {
+ static final long google_maps_ratelimit_ms = 1200;
+ // Google limits static map queries to 50 per minute per IP, so
+ // each query should take at least 1.2 seconds.
+
public static boolean fetchMap(File file, String url) {
URL u;
+ long startTime = System.nanoTime();
try {
u = new URL(url);
@@ -70,6 +75,16 @@ public class AltosSiteMapCache extends JLabel {
}
return false;
}
+
+ long duration_ms = (System.nanoTime() - startTime) / 1000000;
+ if (duration_ms < google_maps_ratelimit_ms) {
+ try {
+ Thread.sleep(google_maps_ratelimit_ms - duration_ms);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
return true;
}
diff --git a/altosui/AltosSiteMapPreload.java b/altosui/AltosSiteMapPreload.java
index fd648abc..66399557 100644
--- a/altosui/AltosSiteMapPreload.java
+++ b/altosui/AltosSiteMapPreload.java
@@ -213,7 +213,7 @@ public class AltosSiteMapPreload extends AltosUIDialog implements ActionListener
AltosMapPos lat;
AltosMapPos lon;
- final static int radius = 4;
+ final static int radius = 5;
final static int width = (radius * 2 + 1);
final static int height = (radius * 2 + 1);
@@ -326,7 +326,7 @@ public class AltosSiteMapPreload extends AltosUIDialog implements ActionListener
pane.setLayout(new GridBagLayout());
- map = new AltosSiteMap(4);
+ map = new AltosSiteMap(radius);
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.CENTER;
@@ -464,4 +464,4 @@ public class AltosSiteMapPreload extends AltosUIDialog implements ActionListener
setLocationRelativeTo(owner);
setVisible(true);
}
-} \ No newline at end of file
+}
diff --git a/altosui/AltosSiteMapTile.java b/altosui/AltosSiteMapTile.java
index 172e6397..7d5b65e1 100644
--- a/altosui/AltosSiteMapTile.java
+++ b/altosui/AltosSiteMapTile.java
@@ -22,7 +22,7 @@ import java.awt.image.*;
import javax.swing.*;
import java.awt.geom.Point2D;
import java.awt.geom.Line2D;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public class AltosSiteMapTile extends JLayeredPane {
JLabel mapLabel;
diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java
index 9dad8718..5d459947 100644
--- a/altosui/AltosUI.java
+++ b/altosui/AltosUI.java
@@ -22,7 +22,7 @@ import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosUI extends AltosUIFrame {
@@ -560,8 +560,9 @@ public class AltosUI extends AltosUIFrame {
AltosUI altosui = new AltosUI();
java.util.List<AltosDevice> devices = AltosUSBDevice.list(Altos.product_basestation);
- for (AltosDevice device : devices)
- altosui.telemetry_window(device);
+ if (devices != null)
+ for (AltosDevice device : devices)
+ altosui.telemetry_window(device);
} else {
int process = process_none;
for (int i = 0; i < args.length; i++) {
@@ -573,7 +574,7 @@ public class AltosUI extends AltosUIFrame {
} else {
double lat = Double.parseDouble(args[i+1]);
double lon = Double.parseDouble(args[i+2]);
- AltosSiteMap.prefetchMaps(lat, lon, 5, 5);
+ AltosSiteMap.prefetchMaps(lat, lon);
i += 2;
}
} else if (args[i].equals("--replay"))
diff --git a/altosui/AltosUIPreferencesBackend.java b/altosui/AltosUIPreferencesBackend.java
index fb5f8520..697d9902 100644
--- a/altosui/AltosUIPreferencesBackend.java
+++ b/altosui/AltosUIPreferencesBackend.java
@@ -19,7 +19,7 @@ package altosui;
import java.io.File;
import java.util.prefs.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import javax.swing.filechooser.FileSystemView;
public class AltosUIPreferencesBackend implements AltosPreferencesBackend {
diff --git a/altosui/AltosWriter.java b/altosui/AltosWriter.java
index d664d6e8..5ff44584 100644
--- a/altosui/AltosWriter.java
+++ b/altosui/AltosWriter.java
@@ -17,7 +17,7 @@
package altosui;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
public interface AltosWriter {
diff --git a/altosui/Makefile.am b/altosui/Makefile.am
index 71e96004..32a3df97 100644
--- a/altosui/Makefile.am
+++ b/altosui/Makefile.am
@@ -98,7 +98,8 @@ ALTOSUILIB_CLASS=\
altosuilib_$(ALTOSUILIB_VERSION).jar
LIBALTOS= \
- libaltos.so \
+ libaltos32.so \
+ libaltos64.so \
libaltos.dylib \
altos.dll
@@ -164,7 +165,7 @@ TEMPLATE_DOC=\
$(top_srcdir)/doc/telemetrum-outline.pdf \
$(top_srcdir)/doc/easymini-outline.pdf \
$(top_srcdir)/doc/telemega-outline.pdf \
- $(top_srcdir)/doc/easymini-outline.pdf
+ $(top_srcdir)/doc/telemini.pdf
DOC=$(ALTUSMETRUM_DOC) $(ALTOS_DOC) $(TELEMETRY_DOC) $(TEMPLATE_DOC)
@@ -175,7 +176,9 @@ WINDOWS_DIST=Altos-Windows-$(VERSION_DASH).exe
FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS)
-LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC)
+LINUX_LIBS=libaltos32.so libaltos64.so
+
+LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC)
LINUX_EXTRA=altosui-fat
MACOSX_INFO_PLIST=Info.plist
@@ -265,7 +268,11 @@ altosui-jdb: Makefile
echo 'exec jdb -classpath "classes:./*:../libaltos:$(FREETTS)/freetts.jar:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar" -Djava.library.path="../libaltos/.libs" altosui/AltosUI "$$@"' >> $@
chmod +x $@
-libaltos.so: build-libaltos
+libaltos32.so: build-libaltos
+ -rm -f "$@"
+ $(LN_S) ../libaltos/.libs/"$@" .
+
+libaltos64.so: build-libaltos
-rm -f "$@"
$(LN_S) ../libaltos/.libs/"$@" .
@@ -281,7 +288,9 @@ altos64.dll: ../libaltos/altos64.dll
-rm -f "$@"
$(LN_S) ../libaltos/"$@" .
-../libaltos/.libs/libaltos.so: build-libaltos
+../libaltos/.libs/libaltos64.so: ../libaltos/.libs/libaltos32.so
+
+../libaltos/.libs/libaltos32.so: build-libaltos
../libaltos/altos.dll: build-altos-dll
diff --git a/altosui/altos-windows.nsi.in b/altosui/altos-windows.nsi.in
index 779b0c12..3832e901 100644
--- a/altosui/altos-windows.nsi.in
+++ b/altosui/altos-windows.nsi.in
@@ -136,6 +136,7 @@ Section "Documentation"
File "../doc/telemetrum-outline.pdf"
File "../doc/telemega-outline.pdf"
File "../doc/easymini-outline.pdf"
+ File "../doc/telemini.pdf"
SectionEnd
Section "Uninstaller"