import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.altoslib_2.*;
+import org.altusmetrum.altoslib_3.*;
import org.altusmetrum.altosuilib_1.*;
public class AltosConfigUI
implements ActionListener, ItemListener, DocumentListener, AltosConfigValues, AltosUnitsListener
{
- Container pane;
- JLabel product_label;
- JLabel version_label;
- JLabel serial_label;
- JLabel main_deploy_label;
- JLabel apogee_delay_label;
- JLabel apogee_lockout_label;
- JLabel frequency_label;
- JLabel radio_calibration_label;
- JLabel radio_frequency_label;
- JLabel radio_enable_label;
- JLabel aprs_interval_label;
- JLabel flight_log_max_label;
- JLabel ignite_mode_label;
- JLabel pad_orientation_label;
- JLabel callsign_label;
+ Container pane;
+ JLabel product_label;
+ JLabel version_label;
+ JLabel serial_label;
+ JLabel main_deploy_label;
+ JLabel apogee_delay_label;
+ JLabel apogee_lockout_label;
+ JLabel frequency_label;
+ JLabel radio_calibration_label;
+ JLabel radio_frequency_label;
+ JLabel radio_enable_label;
+ JLabel aprs_interval_label;
+ JLabel flight_log_max_label;
+ JLabel ignite_mode_label;
+ JLabel pad_orientation_label;
+ JLabel callsign_label;
+ JLabel beep_label;
public boolean dirty;
- JFrame owner;
- JLabel product_value;
- JLabel version_value;
- JLabel serial_value;
- JComboBox main_deploy_value;
- JComboBox apogee_delay_value;
- JComboBox apogee_lockout_value;
- AltosFreqList radio_frequency_value;
- JTextField radio_calibration_value;
- JRadioButton radio_enable_value;
- JComboBox aprs_interval_value;
- JComboBox flight_log_max_value;
- JComboBox ignite_mode_value;
- JComboBox pad_orientation_value;
- JTextField callsign_value;
-
- JButton pyro;
-
- JButton save;
- JButton reset;
- JButton reboot;
- JButton close;
-
- AltosPyro[] pyros;
-
- ActionListener listener;
-
- static String[] main_deploy_values_m = {
+ JFrame owner;
+ JLabel product_value;
+ JLabel version_value;
+ JLabel serial_value;
+ JComboBox<String> main_deploy_value;
+ JComboBox<String> apogee_delay_value;
+ JComboBox<String> apogee_lockout_value;
+ AltosFreqList radio_frequency_value;
+ JTextField radio_calibration_value;
+ JRadioButton radio_enable_value;
+ JComboBox<String> aprs_interval_value;
+ JComboBox<String> flight_log_max_value;
+ JComboBox<String> ignite_mode_value;
+ JComboBox<String> pad_orientation_value;
+ JTextField callsign_value;
+ JComboBox<String> beep_value;
+
+ JButton pyro;
+
+ JButton save;
+ JButton reset;
+ JButton reboot;
+ JButton close;
+
+ AltosPyro[] pyros;
+
+ ActionListener listener;
+
+ static String[] main_deploy_values_m = {
"100", "150", "200", "250", "300", "350",
"400", "450", "500"
};
- static String[] main_deploy_values_ft = {
+ static String[] main_deploy_values_ft = {
"250", "500", "750", "1000", "1250", "1500",
"1750", "2000"
};
- static String[] apogee_delay_values = {
+ static String[] apogee_delay_values = {
"0", "1", "2", "3", "4", "5"
};
- static String[] apogee_lockout_values = {
+ static String[] apogee_lockout_values = {
"0", "5", "10", "15", "20"
};
- static String[] flight_log_max_values = {
+ static String[] flight_log_max_values = {
"64", "128", "192", "256", "320",
"384", "448", "512", "576", "640",
"704", "768", "832", "896", "960",
};
- static String[] ignite_mode_values = {
+ static String[] ignite_mode_values = {
"Dual Deploy",
"Redundant Apogee",
"Redundant Main",
};
- static String[] aprs_interval_values = {
+ static String[] aprs_interval_values = {
"Disabled",
"2",
"5",
"10"
};
- static String[] pad_orientation_values = {
+ static String[] beep_values = {
+ "3750",
+ "4000",
+ "4250",
+ };
+
+ static String[] pad_orientation_values = {
"Antenna Up",
"Antenna Down",
};
}
}
+ boolean is_telemini_v1() {
+ String product = product_value.getText();
+ return product != null && product.startsWith("TeleMini-v1");
+ }
+
boolean is_telemini() {
String product = product_value.getText();
return product != null && product.startsWith("TeleMini");
}
+ boolean is_easymini() {
+ String product = product_value.getText();
+ return product != null && product.startsWith("EasyMini");
+ }
+
boolean is_telemetrum() {
String product = product_value.getText();
return product != null && product.startsWith("TeleMetrum");
if (flight_log_max_value.isEnabled())
flight_log_max_value.setToolTipText("Size reserved for each flight log (in kB)");
else {
- if (is_telemetrum())
- flight_log_max_value.setToolTipText("Cannot set max value with flight logs in memory");
- else if (is_telemini())
- flight_log_max_value.setToolTipText("TeleMini stores only one flight");
+ if (is_telemini_v1())
+ flight_log_max_value.setToolTipText("TeleMini-v1 stores only one flight");
else
- flight_log_max_value.setToolTipText("Cannot set max flight log value");
+ flight_log_max_value.setToolTipText("Cannot set max value with flight logs in memory");
}
}
else {
if (is_telemetrum())
pad_orientation_value.setToolTipText("Older TeleMetrum firmware must fly antenna forward");
- else if (is_telemini())
- pad_orientation_value.setToolTipText("TeleMini doesn't care how it is mounted");
+ else if (is_telemini() || is_easymini())
+ pad_orientation_value.setToolTipText("TeleMini and EasyMini don't care how they are mounted");
else
pad_orientation_value.setToolTipText("Can't select orientation");
}
}
+ void set_beep_tool_tip() {
+ if (beep_value.isEnabled())
+ beep_value.setToolTipText("What frequency the beeper will sound at");
+ else
+ beep_value.setToolTipText("Older firmware could not select beeper frequency");
+ }
+
/* Build the UI using a grid bag */
public AltosConfigUI(JFrame in_owner, boolean remote) {
super (in_owner, "Configure Flight Computer", false);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- main_deploy_value = new JComboBox(main_deploy_values());
+ main_deploy_value = new JComboBox<String>(main_deploy_values());
main_deploy_value.setEditable(true);
main_deploy_value.addItemListener(this);
pane.add(main_deploy_value, c);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- apogee_delay_value = new JComboBox(apogee_delay_values);
+ apogee_delay_value = new JComboBox<String>(apogee_delay_values);
apogee_delay_value.setEditable(true);
apogee_delay_value.addItemListener(this);
pane.add(apogee_delay_value, c);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- apogee_lockout_value = new JComboBox(apogee_lockout_values);
+ apogee_lockout_value = new JComboBox<String>(apogee_lockout_values);
apogee_lockout_value.setEditable(true);
apogee_lockout_value.addItemListener(this);
pane.add(apogee_lockout_value, c);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- aprs_interval_value = new JComboBox(aprs_interval_values);
+ aprs_interval_value = new JComboBox<String>(aprs_interval_values);
aprs_interval_value.setEditable(true);
aprs_interval_value.addItemListener(this);
pane.add(aprs_interval_value, c);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- flight_log_max_value = new JComboBox(flight_log_max_values);
+ flight_log_max_value = new JComboBox<String>(flight_log_max_values);
flight_log_max_value.setEditable(true);
flight_log_max_value.addItemListener(this);
pane.add(flight_log_max_value, c);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- ignite_mode_value = new JComboBox(ignite_mode_values);
+ ignite_mode_value = new JComboBox<String>(ignite_mode_values);
ignite_mode_value.setEditable(false);
ignite_mode_value.addItemListener(this);
pane.add(ignite_mode_value, c);
c.anchor = GridBagConstraints.LINE_START;
c.insets = ir;
c.ipady = 5;
- pad_orientation_value = new JComboBox(pad_orientation_values);
+ pad_orientation_value = new JComboBox<String>(pad_orientation_values);
pad_orientation_value.setEditable(false);
pad_orientation_value.addItemListener(this);
pane.add(pad_orientation_value, c);
set_pad_orientation_tool_tip();
row++;
+ /* Beeper */
+ c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = row;
+ c.gridwidth = 4;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ c.ipady = 5;
+ beep_label = new JLabel("Beeper Frequency:");
+ pane.add(beep_label, c);
+
+ c = new GridBagConstraints();
+ c.gridx = 4; c.gridy = row;
+ c.gridwidth = 4;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.weightx = 1;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = ir;
+ c.ipady = 5;
+ beep_value = new JComboBox<String>(beep_values);
+ beep_value.setEditable(true);
+ beep_value.addItemListener(this);
+ pane.add(beep_value, c);
+ set_beep_tool_tip();
+ row++;
+
/* Pyro channels */
c = new GridBagConstraints();
c.gridx = 4; c.gridy = row;
String get_main_deploy_label() {
return String.format("Main Deploy Altitude(%s):", AltosConvert.height.show_units());
}
-
+
String[] main_deploy_values() {
if (AltosConvert.imperial_units)
return main_deploy_values_ft;
else
return main_deploy_values_m;
}
-
+
void set_main_deploy_values() {
String[] v = main_deploy_values();
while (main_deploy_value.getItemCount() > 0)
main_deploy_value.addItem(v[i]);
main_deploy_value.setMaximumRowCount(v.length);
}
-
+
public void units_changed(boolean imperial_units) {
String v = main_deploy_value.getSelectedItem().toString();
main_deploy_label.setText(get_main_deploy_label());
}
public void set_flight_log_max(int new_flight_log_max) {
- flight_log_max_value.setEnabled(new_flight_log_max > 0);
flight_log_max_value.setSelectedItem(Integer.toString(new_flight_log_max));
set_flight_log_max_tool_tip();
}
return -1;
}
+ public void set_beep(int new_beep) {
+ int new_freq = (int) Math.floor (AltosConvert.beep_value_to_freq(new_beep) + 0.5);
+ for (int i = 0; i < beep_values.length; i++)
+ if (new_beep == AltosConvert.beep_freq_to_value(Integer.parseInt(beep_values[i]))) {
+ beep_value.setSelectedIndex(i);
+ set_beep_tool_tip();
+ return;
+ }
+ beep_value.setSelectedItem(String.format("%d", new_freq));
+ beep_value.setEnabled(new_beep >= 0);
+ set_beep_tool_tip();
+ }
+
+ public int beep() {
+ if (beep_value.isEnabled())
+ return AltosConvert.beep_freq_to_value(Integer.parseInt(beep_value.getSelectedItem().toString()));
+ else
+ return -1;
+ }
+
public void set_pyros(AltosPyro[] new_pyros) {
pyros = new_pyros;
pyro.setVisible(pyros != null);