From ace5f42b5567cff07a61b622171ac364ea8c165d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 2 Jun 2014 22:07:39 -0700 Subject: [PATCH] altosui: Display error message when parsing pyro channel values fails 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 --- altoslib/AltosConfigData.java | 2 +- altoslib/AltosConfigValues.java | 2 +- altoslib/Makefile.am | 1 + altosui/AltosConfig.java | 14 ++++++++++---- altosui/AltosConfigPyroUI.java | 31 +++++++++++++++++++++++-------- altosui/AltosConfigUI.java | 2 +- 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 83c184cd..2f36e215 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -403,7 +403,7 @@ public class AltosConfigData implements Iterable { return 1024; } - public void get_values(AltosConfigValues source) { + public void get_values(AltosConfigValues source) throws AltosConfigDataException { /* HAS_FLIGHT */ if (main_deploy >= 0) diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index 37af2ed5..6ca1f5c6 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -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(); diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index bff09704..0f1d7a47 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -28,6 +28,7 @@ altoslib_JAVA = \ AltosLib.java \ AltosCompanion.java \ AltosConfigData.java \ + AltosConfigDataException.java \ AltosConfigValues.java \ AltosConvert.java \ AltosCRCException.java \ diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java index 3128114f..2cf69525 100644 --- a/altosui/AltosConfig.java +++ b/altosui/AltosConfig.java @@ -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 +} diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java index 6cbac316..7a298a3c 100644 --- a/altosui/AltosConfigPyroUI.java +++ b/altosui/AltosConfigPyroUI.java @@ -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; } diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java index 2a9d727d..bcb3e12c 100644 --- a/altosui/AltosConfigUI.java +++ b/altosui/AltosConfigUI.java @@ -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; -- 2.30.2