telegps: Add info table
[fw/altos] / altosui / AltosIdleMonitorUI.java
index 510579c5973c56ab05255c9630513c89eb618856..b5652df3cffb13d8909f3aa3141727a63f28d931 100644 (file)
@@ -20,16 +20,14 @@ package altosui;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.table.*;
+import javax.swing.event.*;
 import java.io.*;
-import java.util.*;
-import java.text.*;
-import java.util.prefs.*;
 import java.util.concurrent.*;
-import org.altusmetrum.AltosLib.*;
+import java.util.Arrays;
+import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altosuilib_2.*;
 
-public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay, AltosFontListener, AltosIdleMonitorListener {
+public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosFontListener, AltosIdleMonitorListener, DocumentListener {
        AltosDevice             device;
        JTabbedPane             pane;
        AltosPad                pad;
@@ -40,11 +38,11 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
        boolean                 remote;
 
        void stop_display() {
-               if (thread != null && thread.isAlive()) {
-                       thread.interrupt();
+               if (thread != null) {
                        try {
-                               thread.join();
-                       } catch (InterruptedException ie) {}
+                               thread.abort();
+                       } catch (InterruptedException ie) {
+                       }
                }
                thread = null;
        }
@@ -69,21 +67,21 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
 
        AltosFlightStatusUpdate status_update;
 
-       public void show(AltosState state, int crc_errors) {
+       public void show(AltosState state, AltosListenerState listener_state) {
                status_update.saved_state = state;
-               try {
-                       pad.show(state, crc_errors);
-                       flightStatus.show(state, crc_errors);
-                       flightInfo.show(state, crc_errors);
-               } catch (Exception e) {
-                       System.out.print("Show exception" + e);
-               }
+//             try {
+                       pad.show(state, listener_state);
+                       flightStatus.show(state, listener_state);
+                       flightInfo.show(state, listener_state);
+//             } catch (Exception e) {
+//                     System.out.print("Show exception " + e);
+//             }
        }
 
-       public void update(final AltosState state) {
+       public void update(final AltosState state, final AltosListenerState listener_state) {
                Runnable r = new Runnable() {
                                public void run() {
-                                       show(state, 0);
+                                       show(state, listener_state);
                                }
                        };
                SwingUtilities.invokeLater(r);
@@ -91,21 +89,97 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
 
        Container       bag;
        AltosFreqList   frequencies;
+       JTextField      callsign_value;
+
+       /* DocumentListener interface methods */
+       public void changedUpdate(DocumentEvent e) {
+               if (callsign_value != null) {
+                       String  callsign = callsign_value.getText();
+                       thread.set_callsign(callsign);
+                       AltosUIPreferences.set_callsign(callsign);
+               }
+       }
+
+       public void insertUpdate(DocumentEvent e) {
+               changedUpdate(e);
+       }
+
+       public void removeUpdate(DocumentEvent e) {
+               changedUpdate(e);
+       }
+
+       int row = 0;
+
+       public GridBagConstraints constraints (int x, int width, int fill) {
+               GridBagConstraints c = new GridBagConstraints();
+               Insets insets = new Insets(4, 4, 4, 4);
+
+               c.insets = insets;
+               c.fill = fill;
+               if (width == 3)
+                       c.anchor = GridBagConstraints.CENTER;
+               else if (x == 2)
+                       c.anchor = GridBagConstraints.EAST;
+               else
+                       c.anchor = GridBagConstraints.WEST;
+               c.gridx = x;
+               c.gridwidth = width;
+               c.gridy = row;
+               return c;
+       }
+
+       public GridBagConstraints constraints(int x, int width) {
+               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 = AltosDeviceDialog.show(in_owner, Altos.product_any);
+               device = AltosDeviceUIDialog.show(in_owner, Altos.product_any);
                remote = false;
                if (!device.matchProduct(Altos.product_altimeter))
                        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());
 
-               GridBagConstraints c = new GridBagConstraints();
-
                setTitle(String.format("AltOS %s", device.toShortString()));
 
                /* Stick frequency selector at top of table for telemetry monitoring */
@@ -120,23 +194,21 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
                                                                               frequency);
                                        }
                        });
-                       c.gridx = 0;
-                       c.gridy = 0;
-                       c.insets = new Insets(3, 3, 3, 3);
-                       c.anchor = GridBagConstraints.WEST;
-                       bag.add (frequencies, c);
+                       bag.add (frequencies, constraints(0, 1));
+                       bag.add (new JLabel("Callsign:"), constraints(1, 1));
+                       /* Add callsign configuration */
+                       callsign_value = new JTextField(AltosUIPreferences.callsign());
+                       callsign_value.getDocument().addDocumentListener(this);
+                       callsign_value.setToolTipText("Callsign sent in packet mode");
+                       bag.add(callsign_value, constraints(2, 1, GridBagConstraints.BOTH));
+                       row++;
                }
 
 
                /* Flight status is always visible */
                flightStatus = new AltosFlightStatus();
-               c.gridx = 0;
-               c.gridy = 1;
-               c.fill = GridBagConstraints.HORIZONTAL;
-               c.weightx = 1;
-               c.gridwidth = 2;
-               bag.add(flightStatus, c);
-               c.gridwidth = 1;
+               bag.add(flightStatus, constraints(0, 3, GridBagConstraints.HORIZONTAL));
+               row++;
 
                /* The rest of the window uses a tabbed pane to
                 * show one of the alternate data views
@@ -150,13 +222,7 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
                pane.add("Table", new JScrollPane(flightInfo));
 
                /* Make the tabbed pane use the rest of the window space */
-               c.gridx = 0;
-               c.gridy = 2;
-               c.fill = GridBagConstraints.BOTH;
-               c.weightx = 1;
-               c.weighty = 1;
-               c.gridwidth = 2;
-               bag.add(pane, c);
+               bag.add(pane, constraints(0, 3, GridBagConstraints.BOTH));
 
                setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 
@@ -165,7 +231,13 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
                addWindowListener(new WindowAdapter() {
                                @Override
                                public void windowClosing(WindowEvent e) {
-                                       disconnect();
+                                       try {
+                                               disconnect();
+                                       } catch (Exception ex) {
+                                               System.out.printf("Exception %s\n", ex.toString());
+                                               for (StackTraceElement e : ex.getStackTrace())
+                                                       System.out.printf("%s\n", e.toString());
+                                       }
                                        setVisible(false);
                                        dispose();
                                        AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
@@ -175,7 +247,7 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay
                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);