altosui: Add Configure Ground Station dialog (trac #29)
authorKeith Packard <keithp@keithp.com>
Wed, 28 Mar 2012 07:37:52 +0000 (00:37 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 28 Mar 2012 07:42:19 +0000 (00:42 -0700)
Allows the user to configure the teledongle frequency without opening
up the flight monitor window, and also shows the teledongle fixed
values like radio calibration, serial number and software version.

Signed-off-by: Keith Packard <keithp@keithp.com>
altosui/AltosConfigTD.java [new file with mode: 0644]
altosui/AltosConfigTDUI.java [new file with mode: 0644]
altosui/AltosUI.java
altosui/Makefile.am

diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java
new file mode 100644 (file)
index 0000000..68f746b
--- /dev/null
@@ -0,0 +1,373 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package altosui;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import javax.swing.table.*;
+import java.io.*;
+import java.util.*;
+import java.text.*;
+import java.util.prefs.*;
+import java.util.concurrent.*;
+
+import libaltosJNI.*;
+
+public class AltosConfigTD implements ActionListener {
+
+       class int_ref {
+               int     value;
+
+               public int get() {
+                       return value;
+               }
+               public void set(int i) {
+                       value = i;
+               }
+               public int_ref(int i) {
+                       value = i;
+               }
+       }
+
+       class string_ref {
+               String  value;
+
+               public String get() {
+                       return value;
+               }
+               public void set(String i) {
+                       value = i;
+               }
+               public string_ref(String i) {
+                       value = i;
+               }
+       }
+
+       JFrame          owner;
+       AltosDevice     device;
+       AltosSerial     serial_line;
+       int_ref         serial;
+       int_ref         radio_channel;
+       int_ref         radio_calibration;
+       int_ref         radio_setting;
+       int_ref         radio_frequency;
+       string_ref      config_version;
+       string_ref      version;
+       string_ref      product;
+       AltosConfigTDUI config_ui;
+       boolean         serial_started;
+       boolean         made_visible;
+
+       boolean get_int(String line, String label, int_ref x) {
+               if (line.startsWith(label)) {
+                       try {
+                               String tail = line.substring(label.length()).trim();
+                               String[] tokens = tail.split("\\s+");
+                               if (tokens.length > 0) {
+                                       int     i = Integer.parseInt(tokens[0]);
+                                       x.set(i);
+                                       return true;
+                               }
+                       } catch (NumberFormatException ne) {
+                       }
+               }
+               return false;
+       }
+
+       boolean get_string(String line, String label, string_ref s) {
+               if (line.startsWith(label)) {
+                       String  quoted = line.substring(label.length()).trim();
+
+                       if (quoted.startsWith("\""))
+                               quoted = quoted.substring(1);
+                       if (quoted.endsWith("\""))
+                               quoted = quoted.substring(0,quoted.length()-1);
+                       s.set(quoted);
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
+       void start_serial() throws InterruptedException, TimeoutException {
+               serial_started = true;
+       }
+
+       void stop_serial() throws InterruptedException {
+               if (!serial_started)
+                       return;
+               serial_started = false;
+       }
+
+       void update_ui() {
+               config_ui.set_serial(serial.get());
+               config_ui.set_product(product.get());
+               config_ui.set_version(version.get());
+               config_ui.set_radio_frequency(frequency());
+               config_ui.set_radio_calibration(radio_calibration.get());
+               config_ui.set_clean();
+               if (!made_visible) {
+                       made_visible = true;
+                       config_ui.make_visible();
+               }
+       }
+
+       void process_line(String line) {
+               if (line == null) {
+                       abort();
+                       return;
+               }
+               if (line.equals("all finished")) {
+                       if (serial_line != null)
+                               update_ui();
+                       return;
+               }
+               get_string(line, "Config version", config_version);
+               get_int(line, "serial-number", serial);
+               get_int(line, "Radio channel:", radio_channel);
+               if (get_int(line, "Radio cal:", radio_calibration))
+                       System.out.printf("got radio cal %d\n", radio_calibration.get());
+               get_int(line, "Radio setting:", radio_setting);
+               get_string(line,"software-version", version);
+               get_string(line,"product", product);
+       }
+
+       final static int        serial_mode_read = 0;
+       final static int        serial_mode_save = 1;
+       final static int        serial_mode_reboot = 2;
+
+       class SerialData implements Runnable {
+               AltosConfigTD   config;
+               int             serial_mode;
+
+               void process_line(String line) {
+                       config.process_line(line);
+               }
+               void callback(String in_line) {
+                       final String line = in_line;
+                       Runnable r = new Runnable() {
+                                       public void run() {
+                                               process_line(line);
+                                       }
+                               };
+                       SwingUtilities.invokeLater(r);
+               }
+
+               void reset_data() {
+                       serial.set(0);
+                       radio_channel.set(0);
+                       radio_setting.set(0);
+                       radio_frequency.set(0);
+                       radio_calibration.set(1186611);
+                       config_version.set("0.0");
+                       version.set("unknown");
+                       product.set("unknown");
+               }
+
+               void get_data() {
+                       try {
+                               boolean been_there = false;
+                               config.start_serial();
+                               reset_data();
+
+                               for (;;) {
+                                       config.serial_line.printf("c s\nf\nl\nv\n");
+                                       for (;;) {
+                                               try {
+                                                       String line = config.serial_line.get_reply(5000);
+                                                       if (line == null)
+                                                               stop_serial();
+                                                       callback(line);
+                                                       if (line.startsWith("software-version"))
+                                                               break;
+                                               } catch (Exception e) {
+                                                       break;
+                                               }
+                                       }
+                                       System.out.printf("config_version %s\n", config_version.get());
+                                       if (been_there)
+                                               break;
+                                       if (!config_version.get().equals("0.0"))
+                                               break;
+                                       been_there = true;
+                                       config.serial_line.printf("C\n ");
+                                       config.serial_line.flush_input();
+                               }
+                       } catch (InterruptedException ie) {
+                       } catch (TimeoutException te) {
+                       } finally {
+                               try {
+                                       stop_serial();
+                               } catch (InterruptedException ie) {
+                               }
+                       }
+                       double  pref_frequency = AltosPreferences.frequency(serial.get());
+                       if (pref_frequency != 0)
+                               radio_frequency.set((int) Math.floor (pref_frequency * 1000 + 0.5));
+                       callback("all finished");
+               }
+
+               void save_data() {
+                       double frequency = frequency();
+                       if (frequency != 0)
+                               AltosPreferences.set_frequency(serial.get(),
+                                                              frequency);
+               }
+
+               public void run () {
+                       switch (serial_mode) {
+                       case serial_mode_save:
+                               save_data();
+                               /* fall through ... */
+                       case serial_mode_read:
+                               get_data();
+                               break;
+                       }
+               }
+
+               public SerialData(AltosConfigTD in_config, int in_serial_mode) {
+                       config = in_config;
+                       serial_mode = in_serial_mode;
+               }
+       }
+
+       void run_serial_thread(int serial_mode) {
+               SerialData      sd = new SerialData(this, serial_mode);
+               Thread          st = new Thread(sd);
+               st.start();
+       }
+
+       void init_ui () throws InterruptedException, TimeoutException {
+               config_ui = new AltosConfigTDUI(owner);
+               config_ui.addActionListener(this);
+               serial_line.set_frame(owner);
+               set_ui();
+       }
+
+       void abort() {
+               serial_line.close();
+               serial_line = null;
+               JOptionPane.showMessageDialog(owner,
+                                             String.format("Connection to \"%s\" failed",
+                                                           device.toShortString()),
+                                             "Connection Failed",
+                                             JOptionPane.ERROR_MESSAGE);
+               config_ui.setVisible(false);
+       }
+
+       void set_ui() throws InterruptedException, TimeoutException {
+               if (serial_line != null)
+                       run_serial_thread(serial_mode_read);
+               else
+                       update_ui();
+       }
+
+       double frequency() {
+               return AltosConvert.radio_to_frequency(radio_frequency.get(),
+                                                      radio_setting.get(),
+                                                      radio_calibration.get(),
+                                                      radio_channel.get());
+       }
+
+       void set_frequency(double freq) {
+               int     frequency = radio_frequency.get();
+               int     setting = radio_setting.get();
+
+               if (frequency > 0) {
+                       radio_frequency.set((int) Math.floor (freq * 1000 + 0.5));
+               } else if (setting > 0) {
+                       radio_setting.set(AltosConvert.radio_frequency_to_setting(freq,
+                                                                                 radio_calibration.get()));
+                       radio_channel.set(0);
+               } else {
+                       radio_channel.set(AltosConvert.radio_frequency_to_channel(freq));
+               }
+       }
+
+       void save_data() {
+
+               set_frequency(config_ui.radio_frequency());
+               run_serial_thread(serial_mode_save);
+       }
+
+       public void actionPerformed(ActionEvent e) {
+               String  cmd = e.getActionCommand();
+               try {
+                       if (cmd.equals("Save")) {
+                               save_data();
+                       } else if (cmd.equals("Reset")) {
+                               set_ui();
+                       } else if (cmd.equals("Reboot")) {
+                               if (serial_line != null)
+                                       run_serial_thread(serial_mode_reboot);
+                       } else if (cmd.equals("Close")) {
+                               if (serial_line != null)
+                                       serial_line.close();
+                       }
+               } catch (InterruptedException ie) {
+                       abort();
+               } catch (TimeoutException te) {
+                       abort();
+               }
+       }
+
+       public AltosConfigTD(JFrame given_owner) {
+               owner = given_owner;
+
+               serial = new int_ref(0);
+               radio_channel = new int_ref(0);
+               radio_setting = new int_ref(0);
+               radio_frequency = new int_ref(0);
+               radio_calibration = new int_ref(1186611);
+               config_version = new string_ref("0.0");
+               version = new string_ref("unknown");
+               product = new string_ref("unknown");
+
+               device = AltosDeviceDialog.show(owner, Altos.product_basestation);
+               if (device != null) {
+                       try {
+                               serial_line = new AltosSerial(device);
+                               try {
+                                       init_ui();
+                               } catch (InterruptedException ie) {
+                                       abort();
+                               } catch (TimeoutException te) {
+                                       abort();
+                               }
+                       } catch (FileNotFoundException ee) {
+                               JOptionPane.showMessageDialog(owner,
+                                                             ee.getMessage(),
+                                                             "Cannot open target device",
+                                                             JOptionPane.ERROR_MESSAGE);
+                       } catch (AltosSerialInUseException si) {
+                               JOptionPane.showMessageDialog(owner,
+                                                             String.format("Device \"%s\" already in use",
+                                                                           device.toShortString()),
+                                                             "Device in use",
+                                                             JOptionPane.ERROR_MESSAGE);
+                       } catch (IOException ee) {
+                               JOptionPane.showMessageDialog(owner,
+                                                             device.toShortString(),
+                                                             ee.getLocalizedMessage(),
+                                                             JOptionPane.ERROR_MESSAGE);
+                       }
+               }
+       }
+}
\ No newline at end of file
diff --git a/altosui/AltosConfigTDUI.java b/altosui/AltosConfigTDUI.java
new file mode 100644 (file)
index 0000000..9f6badc
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+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.LinkedBlockingQueue;
+
+import libaltosJNI.*;
+
+public class AltosConfigTDUI
+       extends AltosDialog
+       implements ActionListener, ItemListener, DocumentListener
+{
+
+       Container       pane;
+       Box             box;
+       JLabel          product_label;
+       JLabel          version_label;
+       JLabel          serial_label;
+       JLabel          frequency_label;
+       JLabel          radio_calibration_label;
+       JLabel          radio_frequency_label;
+
+       public boolean          dirty;
+
+       JFrame          owner;
+       JLabel          product_value;
+       JLabel          version_value;
+       JLabel          serial_value;
+       AltosFreqList   radio_frequency_value;
+       JLabel          radio_calibration_value;
+
+       JButton         save;
+       JButton         reset;
+       JButton         reboot;
+       JButton         close;
+
+       ActionListener  listener;
+
+
+       /* A window listener to catch closing events and tell the config code */
+       class ConfigListener extends WindowAdapter {
+               AltosConfigTDUI ui;
+
+               public ConfigListener(AltosConfigTDUI this_ui) {
+                       ui = this_ui;
+               }
+
+               public void windowClosing(WindowEvent e) {
+                       ui.actionPerformed(new ActionEvent(e.getSource(),
+                                                          ActionEvent.ACTION_PERFORMED,
+                                                          "Close"));
+               }
+       }
+
+       /* Build the UI using a grid bag */
+       public AltosConfigTDUI(JFrame in_owner) {
+               super (in_owner, "Configure TeleDongle", false);
+
+               owner = in_owner;
+               GridBagConstraints c;
+
+               Insets il = new Insets(4,4,4,4);
+               Insets ir = new Insets(4,4,4,4);
+
+               pane = getContentPane();
+               pane.setLayout(new GridBagLayout());
+
+               /* Product */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = 0;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               product_label = new JLabel("Product:");
+               pane.add(product_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = 0;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               product_value = new JLabel("");
+               pane.add(product_value, c);
+
+               /* Version */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = 1;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               version_label = new JLabel("Software version:");
+               pane.add(version_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = 1;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               version_value = new JLabel("");
+               pane.add(version_value, c);
+
+               /* Serial */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = 2;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               serial_label = new JLabel("Serial:");
+               pane.add(serial_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = 2;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               serial_value = new JLabel("");
+               pane.add(serial_value, c);
+
+               /* Frequency */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = 5;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               radio_frequency_label = new JLabel("Frequency:");
+               pane.add(radio_frequency_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = 5;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               radio_frequency_value = new AltosFreqList();
+               radio_frequency_value.addItemListener(this);
+               pane.add(radio_frequency_value, c);
+               radio_frequency_value.setToolTipText("Telemetry, RDF and packet frequency");
+
+               /* Radio Calibration */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = 6;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               radio_calibration_label = new JLabel("RF Calibration:");
+               pane.add(radio_calibration_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = 6;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               radio_calibration_value = new JLabel(String.format("%d", 1186611));
+               pane.add(radio_calibration_value, c);
+
+               /* Buttons */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = 12;
+               c.gridwidth = 2;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               save = new JButton("Save");
+               pane.add(save, c);
+               save.addActionListener(this);
+               save.setActionCommand("Save");
+
+               c = new GridBagConstraints();
+               c.gridx = 2; c.gridy = 12;
+               c.gridwidth = 2;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.CENTER;
+               c.insets = il;
+               reset = new JButton("Reset");
+               pane.add(reset, c);
+               reset.addActionListener(this);
+               reset.setActionCommand("Reset");
+
+               c = new GridBagConstraints();
+               c.gridx = 6; c.gridy = 12;
+               c.gridwidth = 2;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_END;
+               c.insets = il;
+               close = new JButton("Close");
+               pane.add(close, c);
+               close.addActionListener(this);
+               close.setActionCommand("Close");
+
+               addWindowListener(new ConfigListener(this));
+       }
+
+       /* Once the initial values are set, the config code will show the dialog */
+       public void make_visible() {
+               pack();
+               setLocationRelativeTo(owner);
+               setVisible(true);
+       }
+
+       /* If any values have been changed, confirm before closing */
+       public boolean check_dirty(String operation) {
+               if (dirty) {
+                       Object[] options = { String.format("%s anyway", operation), "Keep editing" };
+                       int i;
+                       i = JOptionPane.showOptionDialog(this,
+                                                        String.format("Configuration modified. %s anyway?", operation),
+                                                        "Configuration Modified",
+                                                        JOptionPane.DEFAULT_OPTION,
+                                                        JOptionPane.WARNING_MESSAGE,
+                                                        null, options, options[1]);
+                       if (i != 0)
+                               return false;
+               }
+               return true;
+       }
+
+       /* Listen for events from our buttons */
+       public void actionPerformed(ActionEvent e) {
+               String  cmd = e.getActionCommand();
+
+               if (cmd.equals("Close") || cmd.equals("Reboot"))
+                       if (!check_dirty(cmd))
+                               return;
+               listener.actionPerformed(e);
+               if (cmd.equals("Close") || cmd.equals("Reboot")) {
+                       setVisible(false);
+                       dispose();
+               }
+               dirty = false;
+       }
+
+       /* ItemListener interface method */
+       public void itemStateChanged(ItemEvent e) {
+               dirty = true;
+       }
+
+       /* DocumentListener interface methods */
+       public void changedUpdate(DocumentEvent e) {
+               dirty = true;
+       }
+
+       public void insertUpdate(DocumentEvent e) {
+               dirty = true;
+       }
+
+       public void removeUpdate(DocumentEvent e) {
+               dirty = true;
+       }
+
+       /* Let the config code hook on a listener */
+       public void addActionListener(ActionListener l) {
+               listener = l;
+       }
+
+       /* set and get all of the dialog values */
+       public void set_product(String product) {
+               radio_frequency_value.set_product(product);
+               product_value.setText(product);
+       }
+
+       public void set_version(String version) {
+               version_value.setText(version);
+       }
+
+       public void set_serial(int serial) {
+               radio_frequency_value.set_serial(serial);
+               serial_value.setText(String.format("%d", serial));
+       }
+
+       public void set_radio_frequency(double new_radio_frequency) {
+               int i;
+               for (i = 0; i < radio_frequency_value.getItemCount(); i++) {
+                       AltosFrequency  f = (AltosFrequency) radio_frequency_value.getItemAt(i);
+                       
+                       if (f.close(new_radio_frequency)) {
+                               radio_frequency_value.setSelectedIndex(i);
+                               return;
+                       }
+               }
+               for (i = 0; i < radio_frequency_value.getItemCount(); i++) {
+                       AltosFrequency  f = (AltosFrequency) radio_frequency_value.getItemAt(i);
+                       
+                       if (new_radio_frequency < f.frequency)
+                               break;
+               }
+               String  description = String.format("%s serial %s",
+                                                   product_value.getText(),
+                                                   serial_value.getText());
+               AltosFrequency  new_frequency = new AltosFrequency(new_radio_frequency, description);
+               AltosPreferences.add_common_frequency(new_frequency);
+               radio_frequency_value.insertItemAt(new_frequency, i);
+               radio_frequency_value.setSelectedIndex(i);
+       }
+
+       public double radio_frequency() {
+               return radio_frequency_value.frequency();
+       }
+
+       public void set_radio_calibration(int calibration) {
+               radio_calibration_value.setText(String.format("%d", calibration));
+       }
+
+       public void set_clean() {
+               dirty = false;
+       }
+}
index 89f66c0604521bf89e3de6c10d25586345bd2658..75a12ecef1b6d0f174e37281098ae49d76e7ebd6 100644 (file)
@@ -165,28 +165,29 @@ public class AltosUI extends AltosFrame {
                                }
                        });
                b.setToolTipText("Global AltosUI settings");
-               b = addButton(2, 1, "Flash Image");
+
+               b = addButton(2, 1, "Configure Ground Station");
                b.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
-                                       FlashImage();
+                                       ConfigureTeleDongle();
                                }
                        });
-               b.setToolTipText("Replace the firmware in any AltusMetrum product");
 
-               b = addButton(3, 1, "Fire Igniter");
+               b = addButton(3, 1, "Flash Image");
                b.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
-                                       FireIgniter();
+                                       FlashImage();
                                }
                        });
-               b.setToolTipText("Remote control of igniters for deployment testing");
-               b = addButton(4, 1, "Quit");
+               b.setToolTipText("Replace the firmware in any AltusMetrum product");
+
+               b = addButton(4, 1, "Fire Igniter");
                b.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
-                                       System.exit(0);
+                                       FireIgniter();
                                }
                        });
-               b.setToolTipText("Close all active windows and terminate AltosUI");
+               b.setToolTipText("Remote control of igniters for deployment testing");
                b = addButton(0, 2, "Scan Channels");
                b.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
@@ -216,6 +217,14 @@ public class AltosUI extends AltosFrame {
                                }
                        });
 
+               b = addButton(4, 2, "Quit");
+               b.addActionListener(new ActionListener() {
+                               public void actionPerformed(ActionEvent e) {
+                                       System.exit(0);
+                               }
+                       });
+               b.setToolTipText("Close all active windows and terminate AltosUI");
+
                setTitle("AltOS");
 
                pane.doLayout();
@@ -262,6 +271,10 @@ public class AltosUI extends AltosFrame {
                new AltosConfig(AltosUI.this);
        }
 
+       void ConfigureTeleDongle() {
+               new AltosConfigTD(AltosUI.this);
+       }
+
        void FlashImage() {
                AltosFlashUI.show(AltosUI.this);
        }
index f89340fb5daccc8e6df0474aef7b8c073f7f42b3..d436c6a04ecce80283227c6911be7d4b2df4393f 100644 (file)
@@ -26,6 +26,8 @@ altosui_JAVA = \
        AltosConfigFreqUI.java \
        AltosConfigUI.java \
        AltosConfigureUI.java \
+       AltosConfigTD.java \
+       AltosConfigTDUI.java \
        AltosConvert.java \
        AltosCRCException.java \
        AltosCSV.java \