*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
import java.io.*;
import java.util.concurrent.*;
import java.util.Arrays;
-import org.altusmetrum.altoslib_5.*;
-import org.altusmetrum.altosuilib_3.*;
+import org.altusmetrum.altoslib_14.*;
+import org.altusmetrum.altosuilib_14.*;
public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener {
AltosDevice device;
AltosPad pad;
AltosInfoTable flightInfo;
AltosFlightStatus flightStatus;
- AltosIgnitor ignitor;
+ AltosIgnitor igniter;
AltosIdleMonitor thread;
+ AltosUIMap sitemap;
int serial;
boolean remote;
- boolean has_ignitor;
+ boolean has_igniter;
+ boolean has_map;
void stop_display() {
if (thread != null) {
public void show(AltosState state, AltosListenerState listener_state) {
status_update.saved_state = state;
- if (ignitor.should_show(state)) {
- if (!has_ignitor) {
- pane.add("Ignitor", ignitor);
- has_ignitor = true;
+ if (igniter.should_show(state)) {
+ if (!has_igniter) {
+ pane.add("Ignitor", igniter);
+ has_igniter = true;
}
} else {
- if (has_ignitor) {
- pane.remove(ignitor);
- has_ignitor = false;
+ if (has_igniter) {
+ pane.remove(igniter);
+ has_igniter = 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);
- ignitor.show(state, listener_state);
+ if (has_igniter)
+ igniter.show(state, listener_state);
+ if (has_map)
+ sitemap.show(state, listener_state);
// } catch (Exception e) {
// System.out.print("Show exception " + e);
// }
SwingUtilities.invokeLater(r);
}
+ public void failed() {
+ Runnable r = new Runnable() {
+ public void run() {
+ close();
+ }
+ };
+ SwingUtilities.invokeLater(r);
+ }
+
+ public void error(final String reason) {
+ Runnable r = new Runnable() {
+ public void run() {
+ disconnect();
+ JOptionPane.showMessageDialog(AltosIdleMonitorUI.this,
+ reason,
+ "Error fetching data",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ };
+ SwingUtilities.invokeLater(r);
+ }
+
Container bag;
AltosUIFreqList frequencies;
JTextField callsign_value;
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);
}
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,
}
}
+ 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, TimeoutException, InterruptedException {
device = AltosDeviceUIDialog.show(in_owner, Altos.product_any);
remote = false;
- if (!device.matchProduct(Altos.product_altimeter))
+ if (device.matchProduct(Altos.product_basestation))
remote = true;
serial = device.getSerial();
- AltosLink link;
+ AltosSerial link;
try {
link = new AltosSerial(device);
} catch (Exception ex) {
idle_exception(in_owner, ex);
return;
}
+ link.set_frame(this);
- bag = getContentPane();
+ /* We let the user set the freq/callsign, so don't bother with the cancel dialog */
+ link.set_cancel_enable(false);
+
+ bag = getScrollablePane();
bag.setLayout(new GridBagLayout());
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 AltosUIFreqList(AltosUIPreferences.frequency(serial));
frequencies.addActionListener(new ActionListener() {
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++;
+ bag.add(callsign_value, constraints(2, 1, GridBagConstraints.HORIZONTAL));
+ next_row();
}
+ set_inset(0);
/* Flight status is always visible */
flightStatus = new AltosFlightStatus();
- bag.add(flightStatus, constraints(0, 3, GridBagConstraints.HORIZONTAL));
- row++;
+ 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();
+ igniter = new AltosIgnitor();
+
+ sitemap = new AltosUIMap();
/* Make the tabbed pane use the rest of the window space */
- bag.add(pane, constraints(0, 3, GridBagConstraints.BOTH));
+ bag.add(pane, constraints(0, 4, GridBagConstraints.BOTH));
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
- 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);
+ close();
}
});
pack();
setVisible(true);
- thread = new AltosIdleMonitor((AltosIdleMonitorListener) this, link, (boolean) remote);
+ thread = new AltosIdleMonitor(this, link, (boolean) remote);
+
+ thread.set_frequency(AltosUIPreferences.frequency(serial));
status_update = new AltosFlightStatusUpdate(flightStatus);