Initial Commit - Copy from Altus Metrum AltOS
This commit is contained in:
378
altosui/AltosConfigTDUI.java
Normal file
378
altosui/AltosConfigTDUI.java
Normal file
@@ -0,0 +1,378 @@
|
||||
/*
|
||||
* 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; 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
|
||||
* 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.event.*;
|
||||
import org.altusmetrum.altoslib_14.*;
|
||||
import org.altusmetrum.altosuilib_14.*;
|
||||
|
||||
public class AltosConfigTDUI
|
||||
extends AltosUIDialog
|
||||
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;
|
||||
JLabel rate_label;
|
||||
|
||||
public boolean dirty;
|
||||
|
||||
JFrame owner;
|
||||
JLabel product_value;
|
||||
JLabel version_value;
|
||||
JLabel serial_value;
|
||||
AltosUIFreqList radio_frequency_value;
|
||||
JLabel radio_calibration_value;
|
||||
AltosUIRateList rate_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 = getScrollablePane();
|
||||
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 AltosUIFreqList();
|
||||
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);
|
||||
|
||||
/* Telemetry Rate */
|
||||
c = new GridBagConstraints();
|
||||
c.gridx = 0; c.gridy = 7;
|
||||
c.gridwidth = 4;
|
||||
c.fill = GridBagConstraints.NONE;
|
||||
c.anchor = GridBagConstraints.LINE_START;
|
||||
c.insets = il;
|
||||
c.ipady = 5;
|
||||
rate_label = new JLabel("Telemetry Rate:");
|
||||
pane.add(rate_label, c);
|
||||
|
||||
c = new GridBagConstraints();
|
||||
c.gridx = 4; c.gridy = 7;
|
||||
c.gridwidth = 4;
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
c.weightx = 1;
|
||||
c.anchor = GridBagConstraints.LINE_START;
|
||||
c.insets = ir;
|
||||
c.ipady = 5;
|
||||
rate_value = new AltosUIRateList();
|
||||
pane.add(rate_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 int telemetry_rate() {
|
||||
return rate_value.getSelectedIndex();
|
||||
}
|
||||
|
||||
public void set_telemetry_rate(int rate) {
|
||||
rate_value.setSelectedIndex(rate);
|
||||
}
|
||||
|
||||
public void set_clean() {
|
||||
dirty = false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user