X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosIdleMonitorUI.java;h=b5652df3cffb13d8909f3aa3141727a63f28d931;hp=510579c5973c56ab05255c9630513c89eb618856;hb=71715337eb532a1fbe1a753240e7417d5223489f;hpb=fe009534ce6846b6db96cac8f6c2d53ba8010d91 diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java index 510579c5..b5652df3 100644 --- a/altosui/AltosIdleMonitorUI.java +++ b/altosui/AltosIdleMonitorUI.java @@ -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);