altosui: Deal with serial port exceptions a bit better
authorKeith Packard <keithp@keithp.com>
Sun, 13 Nov 2011 02:10:18 +0000 (18:10 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 13 Nov 2011 02:10:18 +0000 (18:10 -0800)
This catches a few exceptions and tries to make sure the serial port
is closed afterwards.

Signed-off-by: Keith Packard <keithp@keithp.com>
altosui/AltosDebug.java
altosui/AltosFlashUI.java

index d18de80d09d36e0fe9d84f0652f79bbdbd533d5a..ce1cf5dda7c5508c9bfd50c85056beeacd3bf3f2 100644 (file)
@@ -163,7 +163,11 @@ public class AltosDebug extends AltosSerial {
                int i = 0;
                byte[] data = new byte[length];
                while (i < length) {
-                       String line = get_reply().trim();
+                       String line = get_reply();
+
+                       if (line == null)
+                               throw new IOException("Timeout in read_bytes");
+                       line = line.trim();
                        String tokens[] = line.split("\\s+");
                        for (int j = 0; j < tokens.length; j++) {
                                if (!Altos.ishex(tokens[j]) ||
@@ -172,7 +176,12 @@ public class AltosDebug extends AltosSerial {
                                                String.format
                                                ("Invalid read_bytes reply \"%s\"", line));
                                try {
-                                       data[i + j] = (byte) Integer.parseInt(tokens[j], 16);
+                                       if (i + j >= length)
+                                               throw new IOException(
+                                                       String.format
+                                                       ("Invalid read_bytes reply \"%s\"", line));
+                                       else
+                                               data[i + j] = (byte) Integer.parseInt(tokens[j], 16);
                                } catch (NumberFormatException ne) {
                                        throw new IOException(
                                                String.format
index 39151641e42bdbaa6bf1ef0bf93d269f8c1d9dfe..704ce35c9fca4227a830c60dd3a51525e0409ec8 100644 (file)
@@ -247,7 +247,7 @@ public class AltosFlashUI
                                        flash.set_romconfig(ui.rom_config);
                                        flash.flash();
                                }
-                       } catch (Exception ee) {
+                       } catch (InterruptedException ee) {
                                final Exception e = ee;
                                System.out.printf("exception %s\n", e.toString());
                                SwingUtilities.invokeLater(new Runnable() {
@@ -255,9 +255,26 @@ public class AltosFlashUI
                                                        ui.exception(e);
                                                }
                                        });
+                       } catch (IOException ee) {
+                               final Exception e = ee;
+                               System.out.printf("exception %s\n", e.toString());
+                               SwingUtilities.invokeLater(new Runnable() {
+                                               public void run() {
+                                                       ui.exception(e);
+                                               }
+                                       });
+                       } catch (AltosSerialInUseException ee) {
+                               final Exception e = ee;
+                               System.out.printf("exception %s\n", e.toString());
+                               SwingUtilities.invokeLater(new Runnable() {
+                                               public void run() {
+                                                       ui.exception(e);
+                                               }
+                                       });
+                       } finally {
+                               if (flash != null)
+                                       flash.close();
                        }
-                       if (flash != null)
-                               flash.close();
                }
 
                public flash_task(AltosFlashUI in_ui) {