altosui: Display error message when parsing pyro channel values fails
authorKeith Packard <keithp@keithp.com>
Tue, 3 Jun 2014 05:07:39 +0000 (22:07 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 3 Jun 2014 05:07:39 +0000 (22:07 -0700)
Build an exception handling chain to get numeric parse errors
propagated all the way back to the original 'save' command and up into
a dialog window, including the pyro channel, field and value that were
in error.

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosConfigData.java
altoslib/AltosConfigValues.java
altoslib/Makefile.am
altosui/AltosConfig.java
altosui/AltosConfigPyroUI.java
altosui/AltosConfigUI.java

index 83c184cdd8299590a386b3c3b2599c926f5e552f..2f36e215a36cbac3367382db5c263c3402ce6161 100644 (file)
@@ -403,7 +403,7 @@ public class AltosConfigData implements Iterable<String> {
                return 1024;
        }
 
-       public void get_values(AltosConfigValues source) {
+       public void get_values(AltosConfigValues source) throws AltosConfigDataException {
 
                /* HAS_FLIGHT */
                if (main_deploy >= 0)
index 37af2ed5ee108bac8aad3c054ff54f218e88ca04..6ca1f5c6d66591de3e836962b8edfef73339aaa4 100644 (file)
@@ -71,7 +71,7 @@ public interface AltosConfigValues {
 
        public abstract void set_pyros(AltosPyro[] new_pyros);
 
-       public abstract AltosPyro[] pyros();
+       public abstract AltosPyro[] pyros() throws AltosConfigDataException;
 
        public abstract int aprs_interval();
 
index bff09704ae2279ce14111788129b398b1f12de94..0f1d7a47f4e81c6fdea471020d1dd2d2c129214f 100644 (file)
@@ -28,6 +28,7 @@ altoslib_JAVA = \
        AltosLib.java \
        AltosCompanion.java \
        AltosConfigData.java \
+       AltosConfigDataException.java \
        AltosConfigValues.java \
        AltosConvert.java \
        AltosCRCException.java \
index 3128114f265bf4a7d19eff45fc36134c44b03b67..2cf69525fea1e468d5ab40a502b224d9c64530bd 100644 (file)
@@ -242,9 +242,15 @@ public class AltosConfig implements ActionListener {
 
                /* Pull data out of the UI and stuff back into our local data record */
 
-               data.get_values(config_ui);
-
-               run_serial_thread(serial_mode_save);
+               try {
+                       data.get_values(config_ui);
+                       run_serial_thread(serial_mode_save);
+               } catch (AltosConfigDataException ae) {
+                       JOptionPane.showMessageDialog(owner,
+                                                     ae.getMessage(),
+                                                     "Configuration Data Error",
+                                                     JOptionPane.ERROR_MESSAGE);
+               }
        }
 
        public void actionPerformed(ActionEvent e) {
@@ -298,4 +304,4 @@ public class AltosConfig implements ActionListener {
                        }
                }
        }
-}
\ No newline at end of file
+}
index 6cbac31677e243a009b419c4ffaad79467649a4d..7a298a3ca679a6f26df6abc46816d4efcb3b00c6 100644 (file)
@@ -124,12 +124,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(value.getText());
+                                       return Double.parseDouble(value.getText());
+                               } catch (NumberFormatException e) {
+                                       throw new AltosConfigDataException("\"%s\": %s\n", value.getText(), e.getMessage());
+                               }
                        }
                        if (combo != null)
                                return combo.getSelectedIndex() + AltosLib.ao_flight_boost;
@@ -189,15 +193,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 (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++;
                                }
@@ -256,10 +266,15 @@ 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;
        }
 
index 2a9d727d7fdfb9158d36cc675d85aafd45069c6e..bcb3e12c5df2da4b1ac1ee4b5fffdb61b96ee90a 100644 (file)
@@ -1147,7 +1147,7 @@ public class AltosConfigUI
                        pyro_ui.set_pyros(pyros);
        }
 
-       public AltosPyro[] pyros() {
+       public AltosPyro[] pyros() throws AltosConfigDataException {
                if (pyro_ui != null)
                        pyros = pyro_ui.get_pyros();
                return pyros;