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_8.*;
+import org.altusmetrum.altosuilib_8.*;
-public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay, AltosFontListener, AltosIdleMonitorListener {
+public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener {
AltosDevice device;
JTabbedPane pane;
AltosPad pad;
AltosInfoTable flightInfo;
AltosFlightStatus flightStatus;
+ AltosIgnitor ignitor;
AltosIdleMonitor thread;
+ AltosUIMapNew sitemap;
int serial;
boolean remote;
+ boolean has_ignitor;
+ boolean has_map;
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;
}
flightInfo.clear();
}
- public void set_font() {
- pad.set_font();
- flightInfo.set_font();
+ public void font_size_changed(int font_size) {
+ pad.font_size_changed(font_size);
+ flightInfo.font_size_changed(font_size);
}
- public void font_size_changed(int font_size) {
- set_font();
+ public void units_changed(boolean imperial_units) {
+ pad.units_changed(imperial_units);
+ flightInfo.units_changed(imperial_units);
}
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);
+ if (ignitor.should_show(state)) {
+ if (!has_ignitor) {
+ pane.add("Ignitor", ignitor);
+ has_ignitor = true;
+ }
+ } else {
+ if (has_ignitor) {
+ pane.remove(ignitor);
+ has_ignitor = false;
+ }
}
+ if (state.gps != null && state.gps.connected) {
+ if (!has_map) {
+ pane.add("Site Map", sitemap);
+ has_map = true;
+ }
+ } else {
+ if (has_map) {
+ pane.remove(sitemap);
+ has_map = false;
+ }
+ }
+
+// try {
+ pad.show(state, listener_state);
+ flightStatus.show(state, listener_state);
+ flightInfo.show(state, listener_state);
+ if (has_ignitor)
+ ignitor.show(state, listener_state);
+ if (has_map)
+ sitemap.show(state, listener_state);
+// } catch (Exception e) {
+// System.out.print("Show exception " + e);
+// }
+ }
+
+ public void update(final AltosState state, final AltosListenerState listener_state) {
+ Runnable r = new Runnable() {
+ public void run() {
+ show(state, listener_state);
+ }
+ };
+ SwingUtilities.invokeLater(r);
}
- public void update(final AltosState state) {
+ public void failed() {
Runnable r = new Runnable() {
public void run() {
- show(state, 0);
+ close();
}
};
SwingUtilities.invokeLater(r);
}
Container bag;
- AltosFreqList frequencies;
+ AltosUIFreqList frequencies;
+ JTextField callsign_value;
+
+ /* DocumentListener interface methods */
+ public void changedUpdate(DocumentEvent e) {
+ if (callsign_value != null) {
+ String callsign = callsign_value.getText();
+ System.out.printf("callsign set to %s\n", callsign);
+ thread.set_callsign(callsign);
+ AltosUIPreferences.set_callsign(callsign);
+ }
+ }
+
+ public void insertUpdate(DocumentEvent e) {
+ changedUpdate(e);
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ changedUpdate(e);
+ }
+
+ 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);
+ }
+ }
+
+ private void close() {
+ try {
+ disconnect();
+ } catch (Exception ex) {
+ System.out.printf("Exception %s\n", ex.toString());
+ for (StackTraceElement el : ex.getStackTrace())
+ System.out.printf("%s\n", el.toString());
+ }
+ setVisible(false);
+ dispose();
+ AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
+ }
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();
+
+ AltosSerial link;
+ try {
+ link = new AltosSerial(device);
+ } catch (Exception ex) {
+ idle_exception(in_owner, ex);
+ return;
+ }
+ link.set_frame(this);
+
+ /* We let the user set the freq/callsign, so don't bother with the cancel dialog */
+ link.set_cancel_enable(false);
+
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 */
if (remote && serial >= 0) {
+ set_inset(3);
+
// Frequency menu
- frequencies = new AltosFreqList(AltosUIPreferences.frequency(serial));
+ frequencies = new AltosUIFreqList(AltosUIPreferences.frequency(serial));
frequencies.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
double frequency = frequencies.frequency();
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.HORIZONTAL));
+ next_row();
}
+ set_inset(0);
/* 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, 4, GridBagConstraints.HORIZONTAL));
+
+ next_row();
/* The rest of the window uses a tabbed pane to
* show one of the alternate data views
flightInfo = new AltosInfoTable();
pane.add("Table", new JScrollPane(flightInfo));
+ ignitor = new AltosIgnitor();
+
+ sitemap = new AltosUIMapNew();
+
/* 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, 4, GridBagConstraints.BOTH));
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
- disconnect();
- setVisible(false);
- dispose();
- AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
+ close();
}
});
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);