ao-tools/ao-cal-accel: Initialize byte count var 'l'
[fw/altos] / altosui / AltosConfigPyroUI.java
index 81d121119acce8c580343078132213a95f9a9bd5..c05b6e9197d8d1b66c4708094be327cd20cafb19 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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
 
 package altosui;
 
+import java.text.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altoslib_2.*;
-import org.altusmetrum.altosuilib_1.*;
+import org.altusmetrum.altoslib_13.*;
+import org.altusmetrum.altosuilib_13.*;
 
 public class AltosConfigPyroUI
        extends AltosUIDialog
-       implements ItemListener, DocumentListener, AltosUnitsListener
+       implements ItemListener, DocumentListener, AltosUnitsListener, ActionListener
 {
-       AltosConfigUI   owner;
+       AltosConfigFCUI owner;
        Container       pane;
 
        static Insets il = new Insets(4,4,4,4);
@@ -48,9 +50,9 @@ public class AltosConfigPyroUI
        class PyroItem implements ItemListener, DocumentListener, AltosUnitsListener
        {
                public int              flag;
-               public JRadioButton     enable;
+               public JCheckBox        enable;
                public JTextField       value;
-               public JComboBox        combo;
+               public JComboBox<String>        combo;
                AltosConfigPyroUI       ui;
                boolean                 setting;
 
@@ -63,22 +65,22 @@ public class AltosConfigPyroUI
 
                public void itemStateChanged(ItemEvent e) {
                        set_enable(enable.isSelected());
-                       if (!setting) 
+                       if (!setting)
                                ui.set_dirty();
                }
 
                public void changedUpdate(DocumentEvent e) {
-                       if (!setting) 
+                       if (!setting)
                                ui.set_dirty();
                }
 
                public void insertUpdate(DocumentEvent e) {
-                       if (!setting) 
+                       if (!setting)
                                ui.set_dirty();
                }
 
                public void removeUpdate(DocumentEvent e) {
-                       if (!setting) 
+                       if (!setting)
                                ui.set_dirty();
                }
 
@@ -87,9 +89,9 @@ public class AltosConfigPyroUI
 
                        if (units != null) {
                                try {
-                                       double v = units.parse(value.getText(), !imperial_units);
+                                       double v = units.parse_locale(value.getText(), !imperial_units);
                                        set(enabled(), v);
-                               } catch (NumberFormatException ne) {
+                               } catch (ParseException pe) {
                                        set(enabled(), 0.0);
                                }
                        }
@@ -104,12 +106,14 @@ public class AltosConfigPyroUI
                                double  unit_value = new_value;
                                AltosUnits units = AltosPyro.pyro_to_units(flag);
                                if (units != null)
-                                       unit_value = units.value(new_value);
-                               String  format = "%6.0f";
-                               if (scale >= 10)
-                                       format = "%6.1f";
-                               else if (scale >= 100)
+                                       unit_value = units.parse_value(new_value);
+                               String  format;
+                               if (scale >= 100)
                                        format = "%6.2f";
+                               else if (scale >= 10)
+                                       format = "%6.1f";
+                               else
+                                       format = "%6.0f";
                                value.setText(String.format(format, unit_value));
                        }
                        if (combo != null)
@@ -122,12 +126,16 @@ public class AltosConfigPyroUI
                        return enable.isSelected();
                }
 
-               public double value() {
+               public double value() throws AltosConfigDataException {
                        if (value != null) {
                                AltosUnits units = AltosPyro.pyro_to_units(flag);
-                               if (units != null)
-                                       return units.parse(value.getText());
-                               return Double.parseDouble(value.getText());
+                               try {
+                                       if (units != null)
+                                               return units.parse_locale(value.getText());
+                                       return AltosParse.parse_double_locale(value.getText());
+                               } catch (ParseException e) {
+                                       throw new AltosConfigDataException("\"%s\": %s\n", value.getText(), e.getMessage());
+                               }
                        }
                        if (combo != null)
                                return combo.getSelectedIndex() + AltosLib.ao_flight_boost;
@@ -146,10 +154,10 @@ public class AltosConfigPyroUI
                        c.fill = GridBagConstraints.NONE;
                        c.anchor = GridBagConstraints.LINE_START;
                        c.insets = il;
-                       enable = new JRadioButton();
+                       enable = new JCheckBox();
                        enable.addItemListener(this);
                        pane.add(enable, c);
-                       
+
                        if ((flag & AltosPyro.pyro_no_value) == 0) {
                                c = new GridBagConstraints();
                                c.gridx = x+1; c.gridy = y;
@@ -159,7 +167,7 @@ public class AltosConfigPyroUI
                                c.insets = il;
                                if ((flag & AltosPyro.pyro_state_value) != 0) {
                                        make_state_names();
-                                       combo = new JComboBox(state_names);
+                                       combo = new JComboBox<String>(state_names);
                                        combo.addItemListener(this);
                                        pane.add(combo, c);
                                } else {
@@ -178,8 +186,17 @@ public class AltosConfigPyroUI
 
                public void set(AltosPyro pyro) {
                        int row = 0;
+                       if ((pyro.flags & AltosPyro.pyro_deprecate) != 0) {
+                               JOptionPane.showMessageDialog(owner,
+                                                             String.format("Pyro settings “Ascending” and “Descending” are deprecated.\n" +
+                                                                           "Clearing %s configuration.", AltosLib.igniter_name(pyro.channel)),
+                                                             "Deprecated Pyro Settings",
+                                                             JOptionPane.ERROR_MESSAGE);
+                               pyro.flags = 0;
+                               owner.set_dirty();
+                       }
                        for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
-                               if ((AltosPyro.pyro_all & flag) != 0) {
+                               if ((AltosPyro.pyro_all_useful & flag) != 0) {
                                        items[row].set((pyro.flags & flag) != 0,
                                                       pyro.get_value(flag));
                                        row++;
@@ -187,15 +204,21 @@ public class AltosConfigPyroUI
                        }
                }
 
-               public AltosPyro get() {
+               public AltosPyro get() throws AltosConfigDataException {
                        AltosPyro       p = new AltosPyro(channel);
 
                        int row = 0;
                        for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
-                               if ((AltosPyro.pyro_all & flag) != 0) {
+                               if ((AltosPyro.pyro_all_useful & flag) != 0) {
                                        if (items[row].enabled()) {
+                                               try {
                                                p.flags |= flag;
                                                p.set_value(flag, items[row].value());
+                                               } catch (AltosConfigDataException ae) {
+                                                       throw new AltosConfigDataException("%s, %s",
+                                                                                          AltosPyro.pyro_to_name(flag),
+                                                                                          ae.getMessage());
+                                               }
                                        }
                                        row++;
                                }
@@ -206,7 +229,7 @@ public class AltosConfigPyroUI
                public void units_changed(boolean imperial_units) {
                        int row = 0;
                        for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
-                               if ((AltosPyro.pyro_all & flag) != 0) {
+                               if ((AltosPyro.pyro_all_useful & flag) != 0) {
                                        items[row].units_changed(imperial_units);
                                        row++;
                                }
@@ -219,12 +242,12 @@ public class AltosConfigPyroUI
 
                        int     nrow = 0;
                        for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1)
-                               if ((flag & AltosPyro.pyro_all) != 0)
+                               if ((flag & AltosPyro.pyro_all_useful) != 0)
                                        nrow++;
 
                        items = new PyroItem[nrow];
                        int row = 0;
-                       
+
                        GridBagConstraints      c;
                        c = new GridBagConstraints();
                        c.gridx = x; c.gridy = y;
@@ -232,12 +255,12 @@ public class AltosConfigPyroUI
                        c.fill = GridBagConstraints.NONE;
                        c.anchor = GridBagConstraints.CENTER;
                        c.insets = il;
-                       label = new JLabel(String.format("Pyro Channel %d", channel));
+                       label = new JLabel(String.format("Pyro Channel %c", 'A' + channel));
                        pane.add(label, c);
                        y++;
 
                        for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1)
-                               if ((flag & AltosPyro.pyro_all) != 0) {
+                               if ((flag & AltosPyro.pyro_all_useful) != 0) {
                                        items[row] = new PyroItem(ui, flag, x, y + row);
                                        row++;
                                }
@@ -254,31 +277,67 @@ public class AltosConfigPyroUI
                }
        }
 
-       public AltosPyro[] get_pyros() {
+       public AltosPyro[] get_pyros() throws AltosConfigDataException {
                AltosPyro[]     pyros = new AltosPyro[columns.length];
-               for (int c = 0; c < columns.length; c++)
-                       pyros[c] = columns[c].get();
+               for (int c = 0; c < columns.length; c++) {
+                       try {
+                               pyros[c] = columns[c].get();
+                       } catch (AltosConfigDataException ae) {
+                               throw new AltosConfigDataException ("Channel %c, %s", c + 'A', ae.getMessage());
+                       }
+               }
                return pyros;
        }
 
+       JLabel                  pyro_firing_time_label;
+       JComboBox<String>       pyro_firing_time_value;
+
+       static String[]         pyro_firing_time_values = {
+               "0.050", "0.100", "0.250", "0.500", "1.0", "2.0"
+       };
+
+       boolean initializing;
+
+       public void set_pyro_firing_time(double new_pyro_firing_time) {
+               initializing = true;
+               pyro_firing_time_value.setSelectedItem(Double.toString(new_pyro_firing_time));
+               pyro_firing_time_value.setEnabled(new_pyro_firing_time >= 0);
+               initializing = false;
+       }
+
+       public double get_pyro_firing_time() throws AltosConfigDataException {
+               String  v = pyro_firing_time_value.getSelectedItem().toString();
+
+               try {
+                       return AltosParse.parse_double_locale(v);
+               } catch (ParseException e) {
+                       throw new AltosConfigDataException("Invalid pyro firing time \"%s\"", v);
+               }
+       }
+
        public void set_dirty() {
-               owner.set_dirty();
+               if (!initializing)
+                       owner.set_dirty();
        }
 
        public void itemStateChanged(ItemEvent e) {
-               owner.set_dirty();
+               if (!initializing)
+                       owner.set_dirty();
        }
 
        public void changedUpdate(DocumentEvent e) {
-               owner.set_dirty();
+               if (!initializing)
+                       owner.set_dirty();
        }
 
        public void insertUpdate(DocumentEvent e) {
-               owner.set_dirty();
+               if (!initializing)
+                       owner.set_dirty();
        }
 
        public void removeUpdate(DocumentEvent e) {
-               owner.set_dirty();
+               if (!initializing)
+                       owner.set_dirty();
        }
 
        public void units_changed(boolean imperial_units) {
@@ -286,10 +345,12 @@ public class AltosConfigPyroUI
                        columns[c].units_changed(imperial_units);
                int r = 0;
                for (int flag = 1; flag <= AltosPyro.pyro_all; flag <<= 1) {
-                       String n = AltosPyro.pyro_to_name(flag);
-                       if (n != null) {
-                               labels[r].setText(n);
-                               r++;
+                       if ((flag & AltosPyro.pyro_all_useful) != 0) {
+                               String n = AltosPyro.pyro_to_name(flag);
+                               if (n != null) {
+                                       labels[r].setText(n);
+                                       r++;
+                               }
                        }
                }
        }
@@ -297,9 +358,9 @@ public class AltosConfigPyroUI
        /* A window listener to catch closing events and tell the config code */
        class ConfigListener extends WindowAdapter {
                AltosConfigPyroUI       ui;
-               AltosConfigUI           owner;
+               AltosConfigFCUI         owner;
 
-               public ConfigListener(AltosConfigPyroUI this_ui, AltosConfigUI this_owner) {
+               public ConfigListener(AltosConfigPyroUI this_ui, AltosConfigFCUI this_owner) {
                        ui = this_ui;
                        owner = this_owner;
                }
@@ -309,7 +370,15 @@ public class AltosConfigPyroUI
                }
        }
 
-       public AltosConfigPyroUI(AltosConfigUI in_owner, AltosPyro[] pyros) {
+       /* Listen for events from our buttons */
+       public void actionPerformed(ActionEvent e) {
+               String  cmd = e.getActionCommand();
+
+               if (cmd.equals("Close"))
+                       setVisible(false);
+       }
+
+       public AltosConfigPyroUI(AltosConfigFCUI in_owner, AltosPyro[] pyros, double pyro_firing_time) {
 
                super(in_owner, "Configure Pyro Channels", false);
 
@@ -322,7 +391,7 @@ public class AltosConfigPyroUI
 
                int     nrow = 0;
                for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1)
-                       if ((flag & AltosPyro.pyro_all) != 0)
+                       if ((flag & AltosPyro.pyro_all_useful) != 0)
                                nrow++;
 
                labels = new JLabel[nrow];
@@ -332,18 +401,20 @@ public class AltosConfigPyroUI
                for (int flag = 1; flag <= AltosPyro.pyro_all; flag <<= 1) {
                        String  n;
 
-                       n = AltosPyro.pyro_to_name(flag);
-                       if (n != null) {
-                               c = new GridBagConstraints();
-                               c.gridx = 0; c.gridy = row;
-                               c.gridwidth = 1;
-                               c.fill = GridBagConstraints.NONE;
-                               c.anchor = GridBagConstraints.LINE_START;
-                               c.insets = il;
-                               JLabel label = new JLabel(n);
-                               pane.add(label, c);
-                               labels[row-1] = label;
-                               row++;
+                       if ((flag & AltosPyro.pyro_all_useful) != 0) {
+                               n = AltosPyro.pyro_to_name(flag);
+                               if (n != null) {
+                                       c = new GridBagConstraints();
+                                       c.gridx = 0; c.gridy = row;
+                                       c.gridwidth = 1;
+                                       c.fill = GridBagConstraints.NONE;
+                                       c.anchor = GridBagConstraints.LINE_START;
+                                       c.insets = il;
+                                       JLabel label = new JLabel(n);
+                                       pane.add(label, c);
+                                       labels[row-1] = label;
+                                       row++;
+                               }
                        }
                }
 
@@ -353,6 +424,43 @@ public class AltosConfigPyroUI
                        columns[i] = new PyroColumn(this, i*2 + 1, 0, i);
                        columns[i].set(pyros[i]);
                }
+
+               /* Pyro firing time */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = row;
+               c.gridwidth = 2;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               pyro_firing_time_label = new JLabel("Pyro Firing Time(s):");
+               pane.add(pyro_firing_time_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 2; c.gridy = row;
+               c.gridwidth = 7;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               pyro_firing_time_value = new JComboBox<String>(pyro_firing_time_values);
+               pyro_firing_time_value.setEditable(true);
+               pyro_firing_time_value.addItemListener(this);
+               set_pyro_firing_time(pyro_firing_time);
+               pane.add(pyro_firing_time_value, c);
+               pyro_firing_time_value.setToolTipText("Length of extra pyro channel firing pulse");
+
+               c = new GridBagConstraints();
+               c.gridx = pyros.length*2-1;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.gridwidth = 2;
+               c.gridy = 1000;
+               JButton close = new JButton("Close");
+               pane.add(close, c);
+               close.addActionListener(this);
+               close.setActionCommand("Close");
+
                addWindowListener(new ConfigListener(this, owner));
                AltosPreferences.register_units_listener(this);
        }