altosui: Add elevation and range data to main display
[fw/altos] / ao-tools / altosui / AltosUI.java
index e3f613037dc61eab425d2a1becf9a0d735be0ce7..6a1814ff87034fad92f922779f925b2f10aa81e1 100644 (file)
@@ -44,6 +44,7 @@ import altosui.AltosChannelMenu;
 import altosui.AltosFlashUI;
 import altosui.AltosLogfileChooser;
 import altosui.AltosCSVUI;
+import altosui.AltosLine;
 
 import libaltosJNI.*;
 
@@ -74,6 +75,10 @@ public class AltosUI extends JFrame {
                String[] statusNames = { "Height (m)", "State", "RSSI (dBm)", "Speed (m/s)" };
                Object[][] statusData = { { "0", "pad", "-50", "0" } };
 
+               java.net.URL imgURL = AltosUI.class.getResource("/altus-metrum-16x16.jpg");
+               if (imgURL != null)
+                       setIconImage(new ImageIcon(imgURL).getImage());
+
                AltosPreferences.init(this);
 
                vbox = Box.createVerticalBox();
@@ -169,6 +174,8 @@ public class AltosUI extends JFrame {
        }
 
        public void show(AltosState state, int crc_errors) {
+               if (state == null)
+                       return;
                flightStatusModel.set(state);
 
                info_reset();
@@ -224,11 +231,19 @@ public class AltosUI extends JFrame {
 
                        if (state.npad > 0) {
                                if (state.from_pad != null) {
-                                       info_add_row(1, "Distance from pad", "%6.0f m", state.from_pad.distance);
-                                       info_add_row(1, "Direction from pad", "%6.0f°", state.from_pad.bearing);
+                                       info_add_row(1, "Distance from pad", "%6d m",
+                                                    (int) (state.from_pad.distance + 0.5));
+                                       info_add_row(1, "Direction from pad", "%6d°",
+                                                    (int) (state.from_pad.bearing + 0.5));
+                                       info_add_row(1, "Elevation from pad", "%6d°",
+                                                    (int) (state.elevation + 0.5));
+                                       info_add_row(1, "Range from pad", "%6d m",
+                                                    (int) (state.range + 0.5));
                                } else {
                                        info_add_row(1, "Distance from pad", "unknown");
                                        info_add_row(1, "Direction from pad", "unknown");
+                                       info_add_row(1, "Elevation from pad", "unknown");
+                                       info_add_row(1, "Range from pad", "unknown");
                                }
                                info_add_deg(1, "Pad latitude", state.pad_lat, 'N', 'S');
                                info_add_deg(1, "Pad longitude", state.pad_lon, 'E', 'W');
@@ -367,7 +382,7 @@ public class AltosUI extends JFrame {
 
                void init() { }
 
-               AltosRecord read() throws InterruptedException, ParseException, AltosCRCException { return null; }
+               AltosRecord read() throws InterruptedException, ParseException, AltosCRCException, IOException { return null; }
 
                void close() { }
 
@@ -403,6 +418,11 @@ public class AltosUI extends JFrame {
                                        }
                                }
                        } catch (InterruptedException ee) {
+                       } catch (IOException ie) {
+                               JOptionPane.showMessageDialog(AltosUI.this,
+                                                             String.format("Error reading from \"%s\"", name),
+                                                             "Telemetry Read Error",
+                                                             JOptionPane.ERROR_MESSAGE);
                        } finally {
                                close();
                                idle_thread.interrupt();
@@ -417,10 +437,13 @@ public class AltosUI extends JFrame {
 
        class DeviceThread extends DisplayThread {
                AltosSerial     serial;
-               LinkedBlockingQueue<String> telem;
+               LinkedBlockingQueue<AltosLine> telem;
 
-               AltosRecord read() throws InterruptedException, ParseException, AltosCRCException {
-                       return new AltosTelemetry(telem.take());
+               AltosRecord read() throws InterruptedException, ParseException, AltosCRCException, IOException {
+                       AltosLine l = telem.take();
+                       if (l.line == null)
+                               throw new IOException("IO error");
+                       return new AltosTelemetry(l.line);
                }
 
                void close() {
@@ -428,11 +451,11 @@ public class AltosUI extends JFrame {
                        serial.remove_monitor(telem);
                }
 
-               public DeviceThread(AltosSerial s) {
+               public DeviceThread(AltosSerial s, String in_name) {
                        serial = s;
-                       telem = new LinkedBlockingQueue<String>();
+                       telem = new LinkedBlockingQueue<AltosLine>();
                        serial.add_monitor(telem);
-                       name = "telemetry";
+                       name = in_name;
                }
        }
 
@@ -441,8 +464,9 @@ public class AltosUI extends JFrame {
 
                if (device != null) {
                        try {
+                               stop_display();
                                serial_line.open(device);
-                               DeviceThread thread = new DeviceThread(serial_line);
+                               DeviceThread thread = new DeviceThread(serial_line, device.getPath());
                                serial_line.set_channel(AltosPreferences.channel());
                                serial_line.set_callsign(AltosPreferences.callsign());
                                run_display(thread);
@@ -536,8 +560,12 @@ public class AltosUI extends JFrame {
        Thread          display_thread;
 
        private void stop_display() {
-               if (display_thread != null && display_thread.isAlive())
+               if (display_thread != null && display_thread.isAlive()) {
                        display_thread.interrupt();
+                       try {
+                               display_thread.join();
+                       } catch (InterruptedException ie) {}
+               }
                display_thread = null;
        }