X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosui%2FAltosConfigFCUI.java;h=88f8b0808a92a59c68aab2cf982d43bac124949d;hb=d80c1317f596f73d192e6fbb33c3579d54802182;hp=c0c37254673188fad2026a90cba7d591a062a2b9;hpb=198a3d4d5f51de5c0f0413299582479cde4e177f;p=fw%2Faltos diff --git a/altosui/AltosConfigFCUI.java b/altosui/AltosConfigFCUI.java index c0c37254..88f8b080 100644 --- a/altosui/AltosConfigFCUI.java +++ b/altosui/AltosConfigFCUI.java @@ -23,8 +23,8 @@ import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.text.*; -import org.altusmetrum.altoslib_12.*; -import org.altusmetrum.altosuilib_12.*; +import org.altusmetrum.altoslib_14.*; +import org.altusmetrum.altosuilib_14.*; public class AltosConfigFCUI extends AltosUIDialog @@ -42,13 +42,18 @@ public class AltosConfigFCUI JLabel radio_calibration_label; JLabel radio_frequency_label; JLabel radio_enable_label; + JLabel radio_10mw_label; + JLabel report_feet_label; JLabel rate_label; JLabel aprs_interval_label; JLabel aprs_ssid_label; JLabel aprs_format_label; + JLabel aprs_offset_label; JLabel flight_log_max_label; JLabel ignite_mode_label; JLabel pad_orientation_label; + JLabel accel_plus_label; + JLabel accel_minus_label; JLabel callsign_label; JLabel beep_label; JLabel tracker_motion_label; @@ -66,19 +71,25 @@ public class AltosConfigFCUI AltosUIFreqList radio_frequency_value; JLabel radio_calibration_value; JRadioButton radio_enable_value; + JRadioButton radio_10mw_value; + JComboBox report_feet_value; AltosUIRateList rate_value; JComboBox aprs_interval_value; JComboBox aprs_ssid_value; JComboBox aprs_format_value; + JComboBox aprs_offset_value; JComboBox flight_log_max_value; JComboBox ignite_mode_value; JComboBox pad_orientation_value; + JTextField accel_plus_value; + JTextField accel_minus_value; JTextField callsign_value; JComboBox beep_value; JComboBox tracker_motion_value; JComboBox tracker_interval_value; JButton pyro; + JButton accel_cal; JButton save; JButton reset; @@ -90,6 +101,8 @@ public class AltosConfigFCUI ActionListener listener; + static final String title = "Configure Flight Computer"; + static String[] main_deploy_values_m = { "100", "150", "200", "250", "300", "350", "400", "450", "500" @@ -112,6 +125,7 @@ public class AltosConfigFCUI "Dual Deploy", "Redundant Apogee", "Redundant Main", + "Separation & Apogee", }; static String[] aprs_interval_values = { @@ -125,17 +139,31 @@ public class AltosConfigFCUI 0, 1, 2 ,3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + static Integer[] aprs_offset_values = { + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 + }; + static String[] beep_values = { + "2000", + "2100", + "2200", "3750", "4000", "4250", }; - static String[] pad_orientation_values = { + static String[] pad_orientation_values_radio = { "Antenna Up", "Antenna Down", }; + static String[] pad_orientation_values_no_radio = { + "Beeper Up", + "Beeper Down", + }; + + String[] pad_orientation_values; + static String[] tracker_motion_values_m = { "2", "5", @@ -157,6 +185,11 @@ public class AltosConfigFCUI "10" }; + static String[] report_feet_values = { + "Meters", + "Feet", + }; + /* A window listener to catch closing events and tell the config code */ class ConfigListener extends WindowAdapter { AltosConfigFCUI ui; @@ -192,6 +225,25 @@ public class AltosConfigFCUI return product != null && product.startsWith("TeleMetrum"); } + boolean is_telemega() { + String product = product_value.getText(); + return product != null && product.startsWith("TeleMega"); + } + + boolean is_easymega() { + String product = product_value.getText(); + return product != null && product.startsWith("EasyMega"); + } + + boolean is_easytimer() { + String product = product_value.getText(); + return product != null && product.startsWith("EasyTimer"); + } + + boolean has_radio() { + return is_telemega() || is_telemetrum() || is_telemini(); + } + void set_radio_enable_tool_tip() { if (radio_enable_value.isVisible()) radio_enable_value.setToolTipText("Enable/Disable telemetry and RDF transmissions"); @@ -231,6 +283,15 @@ public class AltosConfigFCUI aprs_format_value.setToolTipText("Hardware doesn't support APRS"); } + void set_aprs_offset_tool_tip() { + if (aprs_offset_value.isVisible()) + aprs_offset_value.setToolTipText("Set the APRS offset from top of minute"); + else if (aprs_offset_value.isVisible()) + aprs_offset_value.setToolTipText("Software version doesn't support setting the APRS offset"); + else + aprs_offset_value.setToolTipText("Hardware doesn't support APRS"); + } + void set_flight_log_max_tool_tip() { if (flight_log_max_value.isVisible()) flight_log_max_value.setToolTipText("Size reserved for each flight log (in kB)"); @@ -250,18 +311,46 @@ public class AltosConfigFCUI } void set_pad_orientation_tool_tip() { - if (pad_orientation_value.isVisible()) + if (pad_orientation_value.isVisible()) { pad_orientation_value.setToolTipText("How will the computer be mounted in the airframe"); - else { + } else { if (is_telemetrum()) pad_orientation_value.setToolTipText("Older TeleMetrum firmware must fly antenna forward"); else if (is_telemini() || is_easymini()) pad_orientation_value.setToolTipText("TeleMini and EasyMini don't care how they are mounted"); + else if (is_easytimer()) + pad_orientation_value.setToolTipText("EasyTimer can be mounted in any of six orientations"); else pad_orientation_value.setToolTipText("Can't select orientation"); } } + void set_pad_orientation_values() { + String [] new_values; + if (has_radio()) + new_values = pad_orientation_values_radio; + else + new_values = pad_orientation_values_no_radio; + if (new_values != pad_orientation_values) { + int id = pad_orientation_value.getSelectedIndex(); + pad_orientation_value.removeAllItems(); + pad_orientation_values = new_values; + for (int i = 0; i < new_values.length; i++) + pad_orientation_value.addItem(pad_orientation_values[i]); + pad_orientation_value.setSelectedIndex(id); + } + } + + void set_accel_tool_tips() { + if (accel_plus_value.isVisible()) { + accel_plus_value.setToolTipText("Pad acceleration value in flight orientation"); + accel_minus_value.setToolTipText("Upside-down acceleration value"); + } else { + accel_plus_value.setToolTipText("No accelerometer"); + accel_minus_value.setToolTipText("No accelerometer"); + } + } + void set_beep_tool_tip() { if (beep_value.isVisible()) beep_value.setToolTipText("What frequency the beeper will sound at"); @@ -269,9 +358,23 @@ public class AltosConfigFCUI beep_value.setToolTipText("Older firmware could not select beeper frequency"); } + void set_radio_10mw_tool_tip() { + if (radio_10mw_value.isVisible()) + radio_10mw_value.setToolTipText("Should transmitter power be limited to 10mW"); + else + radio_10mw_value.setToolTipText("Older firmware could not limit radio power"); + } + + void set_report_feet_tool_tip() { + if (report_feet_value.isVisible()) + report_feet_value.setToolTipText("Units used after landing to beep max height"); + else + report_feet_value.setToolTipText("Older firmware always beeps max height in meters"); + } + /* Build the UI using a grid bag */ public AltosConfigFCUI(JFrame in_owner, boolean remote) { - super (in_owner, "Configure Flight Computer", false); + super (in_owner, title, false); owner = in_owner; GridBagConstraints c; @@ -280,7 +383,8 @@ public class AltosConfigFCUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); + pane.setLayout(new GridBagLayout()); /* Product */ @@ -425,7 +529,7 @@ public class AltosConfigFCUI apogee_lockout_value.setEditable(true); apogee_lockout_value.addItemListener(this); pane.add(apogee_lockout_value, c); - apogee_lockout_value.setToolTipText("Time after boost while apogee detection is locked out"); + apogee_lockout_value.setToolTipText("Time after launch while apogee detection is locked out"); row++; /* Frequency */ @@ -501,6 +605,57 @@ public class AltosConfigFCUI set_radio_enable_tool_tip(); row++; + /* Radio 10mW limit */ + 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; + radio_10mw_label = new JLabel("Limit transmit to 10mW:"); + pane.add(radio_10mw_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; + radio_10mw_value = new JRadioButton("Limited"); + radio_10mw_value.addItemListener(this); + pane.add(radio_10mw_value, c); + set_radio_10mw_tool_tip(); + row++; + + /* Report feet */ + 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; + report_feet_label = new JLabel("Beep max height in:"); + pane.add(report_feet_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; + report_feet_value = new JComboBox(report_feet_values); + report_feet_value.setEditable(false); + report_feet_value.addItemListener(this); + pane.add(report_feet_value, c); + set_report_feet_tool_tip(); + row++; + /* Telemetry Rate */ c = new GridBagConstraints(); c.gridx = 0; c.gridy = row; @@ -606,6 +761,33 @@ public class AltosConfigFCUI set_aprs_format_tool_tip(); row++; + /* APRS offset */ + 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; + aprs_offset_label = new JLabel("APRS offset:"); + pane.add(aprs_offset_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; + aprs_offset_value = new JComboBox(aprs_offset_values); + aprs_offset_value.setEditable(false); + aprs_offset_value.addItemListener(this); + aprs_offset_value.setMaximumRowCount(aprs_offset_values.length); + pane.add(aprs_offset_value, c); + set_aprs_offset_tool_tip(); + row++; + /* Callsign */ c = new GridBagConstraints(); c.gridx = 0; c.gridy = row; @@ -702,6 +884,8 @@ public class AltosConfigFCUI c.anchor = GridBagConstraints.LINE_START; c.insets = ir; c.ipady = 5; + pad_orientation_values = pad_orientation_values_no_radio; + pad_orientation_value = new JComboBox(pad_orientation_values); pad_orientation_value.setEditable(false); pad_orientation_value.addItemListener(this); @@ -709,6 +893,57 @@ public class AltosConfigFCUI set_pad_orientation_tool_tip(); row++; + /* Accel plus */ + 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; + accel_plus_label = new JLabel("Accel Plus:"); + pane.add(accel_plus_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; + accel_plus_value = new JTextField(10); + accel_plus_value.setEditable(true); + accel_plus_value.getDocument().addDocumentListener(this); + pane.add(accel_plus_value, c); + row++; + + /* Accel minus */ + 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; + accel_minus_label = new JLabel("Accel Minus:"); + pane.add(accel_minus_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; + accel_minus_value = new JTextField(10); + accel_minus_value.setEditable(true); + accel_minus_value.getDocument().addDocumentListener(this); + pane.add(accel_minus_value, c); + row++; + set_accel_tool_tips(); + /* Beeper */ c = new GridBagConstraints(); c.gridx = 0; c.gridy = row; @@ -800,6 +1035,20 @@ public class AltosConfigFCUI pyro.setActionCommand("Pyro"); row++; + /* Accel cal */ + c = new GridBagConstraints(); + c.gridx = 5; c.gridy = row; + c.gridwidth = 5; + c.fill = GridBagConstraints.HORIZONTAL; + c.anchor = GridBagConstraints.LINE_START; + c.insets = il; + c.ipady = 5; + accel_cal = new JButton("Calibrate Accelerometer"); + pane.add(accel_cal, c); + accel_cal.addActionListener(this); + accel_cal.setActionCommand("Accel"); + row++; + /* Buttons */ c = new GridBagConstraints(); c.gridx = 0; c.gridy = row; @@ -873,13 +1122,15 @@ public class AltosConfigFCUI return true; } - void set_dirty() { + public void set_dirty() { dirty = true; + setTitle(title + " (modified)"); save.setEnabled(true); } public void set_clean() { dirty = false; + setTitle(title); save.setEnabled(false); } @@ -907,12 +1158,13 @@ public class AltosConfigFCUI if (cmd.equals("Close") || cmd.equals("Reboot")) if (!check_dirty(cmd)) return; + if (cmd.equals("Save")) + save.setEnabled(false); listener.actionPerformed(e); if (cmd.equals("Close") || cmd.equals("Reboot")) { setVisible(false); dispose(); } - set_clean(); } /* ItemListener interface method */ @@ -943,7 +1195,9 @@ public class AltosConfigFCUI radio_frequency_value.set_product(product); product_value.setText(product); set_pad_orientation_tool_tip(); + set_accel_tool_tips(); set_flight_log_max_tool_tip(); + set_pad_orientation_values(); } public void set_version(String version) { @@ -1147,16 +1401,18 @@ public class AltosConfigFCUI return AltosLib.MISSING; } - public void set_flight_log_max_limit(int new_flight_log_max_limit) { + public void set_flight_log_max_limit(int new_flight_log_max_limit, int new_storage_erase_unit) { flight_log_max_limit = new_flight_log_max_limit; if (new_flight_log_max_limit != AltosLib.MISSING) { flight_log_max_value.removeAllItems(); for (int i = 8; i >= 1; i--) { int size = flight_log_max_limit / i; + if (new_storage_erase_unit != 0) + size &= ~(new_storage_erase_unit - 1); flight_log_max_value.addItem(String.format("%d (%d flights)", size, i)); } } - if (flight_log_max != 0) + if (flight_log_max != 0 && flight_log_max != AltosLib.MISSING) set_flight_log_max(flight_log_max); } @@ -1196,6 +1452,7 @@ public class AltosConfigFCUI } pad_orientation_value.setVisible(new_pad_orientation != AltosLib.MISSING); pad_orientation_label.setVisible(new_pad_orientation != AltosLib.MISSING); + accel_cal.setVisible(new_pad_orientation != AltosLib.MISSING); set_pad_orientation_tool_tip(); } @@ -1207,6 +1464,31 @@ public class AltosConfigFCUI return AltosLib.MISSING; } + public void set_accel_cal(int accel_plus, int accel_minus) { + if (accel_plus != AltosLib.MISSING) { + accel_plus_value.setText(String.format("%d", accel_plus)); + accel_minus_value.setText(String.format("%d", accel_minus)); + } + accel_plus_value.setVisible(accel_plus != AltosLib.MISSING); + accel_plus_label.setVisible(accel_plus != AltosLib.MISSING); + accel_minus_value.setVisible(accel_minus != AltosLib.MISSING); + accel_minus_label.setVisible(accel_minus != AltosLib.MISSING); + + set_accel_tool_tips(); + } + + public int accel_cal_plus() { + if (accel_plus_value.isVisible()) + return Integer.parseInt(accel_plus_value.getText()); + return AltosLib.MISSING; + } + + public int accel_cal_minus() { + if (accel_minus_value.isVisible()) + return Integer.parseInt(accel_minus_value.getText()); + return AltosLib.MISSING; + } + public void set_beep(int new_beep) { if (new_beep != AltosLib.MISSING) { int new_freq = (int) Math.floor (AltosConvert.beep_value_to_freq(new_beep) + 0.5); @@ -1230,6 +1512,47 @@ public class AltosConfigFCUI return AltosLib.MISSING; } + public void set_radio_10mw(int new_radio_10mw) { + if (new_radio_10mw != AltosLib.MISSING) { + radio_10mw_value.setSelected(new_radio_10mw != 0); + } + radio_10mw_value.setVisible(new_radio_10mw != AltosLib.MISSING); + radio_10mw_label.setVisible(new_radio_10mw != AltosLib.MISSING); + set_radio_10mw_tool_tip(); + } + + public int radio_10mw() { + if (radio_10mw_value.isVisible()) + return radio_10mw_value.isSelected() ? 1 : 0; + else + return AltosLib.MISSING; + } + + public void set_report_feet(int new_report_feet) { + if (new_report_feet != AltosLib.MISSING) { + if (new_report_feet >= report_feet_values.length) + new_report_feet = 0; + if (new_report_feet < 0) { + report_feet_value.setEnabled(false); + new_report_feet = 0; + } else { + report_feet_value.setEnabled(true); + } + report_feet_value.setSelectedIndex(new_report_feet); + } + report_feet_value.setVisible(new_report_feet != AltosLib.MISSING); + report_feet_label.setVisible(new_report_feet != AltosLib.MISSING); + + set_report_feet_tool_tip(); + } + + public int report_feet() { + if (report_feet_value.isVisible()) + return report_feet_value.getSelectedIndex(); + else + return AltosLib.MISSING; + } + String[] tracker_motion_values() { if (AltosConvert.imperial_units) return tracker_motion_values_ft; @@ -1319,20 +1642,29 @@ public class AltosConfigFCUI return pyro_firing_time; } + private String aprs_interval_string(int interval) { + if (interval == 0) + return "Disabled"; + return Integer.toString(interval); + } + + private int aprs_interval_value(String interval) throws AltosConfigDataException { + if (interval.equalsIgnoreCase("Disabled")) + return 0; + return parse_int("aprs interval", interval, false); + } + public void set_aprs_interval(int new_aprs_interval) { if (new_aprs_interval != AltosLib.MISSING) - aprs_interval_value.setSelectedItem(Integer.toString(new_aprs_interval)); + aprs_interval_value.setSelectedItem(aprs_interval_string(new_aprs_interval)); aprs_interval_value.setVisible(new_aprs_interval != AltosLib.MISSING); aprs_interval_label.setVisible(new_aprs_interval != AltosLib.MISSING); set_aprs_interval_tool_tip(); } public int aprs_interval() throws AltosConfigDataException { - if (aprs_interval_value.isVisible()) { - String s = aprs_interval_value.getSelectedItem().toString(); - - return parse_int("aprs interval", s, false); - } + if (aprs_interval_value.isVisible()) + return aprs_interval_value(aprs_interval_value.getSelectedItem().toString()); return AltosLib.MISSING; } @@ -1365,4 +1697,20 @@ public class AltosConfigFCUI return aprs_format_value.getSelectedIndex(); return AltosLib.MISSING; } + + public void set_aprs_offset(int new_aprs_offset) { + if (new_aprs_offset != AltosLib.MISSING) + aprs_offset_value.setSelectedItem(new_aprs_offset); + aprs_offset_value.setVisible(new_aprs_offset != AltosLib.MISSING); + aprs_offset_label.setVisible(new_aprs_offset != AltosLib.MISSING); + set_aprs_offset_tool_tip(); + } + + public int aprs_offset() throws AltosConfigDataException { + if (aprs_offset_value.isVisible()) { + Integer i = (Integer) aprs_offset_value.getSelectedItem(); + return i; + } + return AltosLib.MISSING; + } }