altosui: Flight data download GUI operations called only from main thread
authorKeith Packard <keithp@keithp.com>
Fri, 26 Nov 2010 00:23:18 +0000 (16:23 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 26 Nov 2010 00:30:19 +0000 (16:30 -0800)
Swing doesn't like UI functions being called from non-dispatch thread,
so fix up the eeprom download code to use SwingUtilities.invokeLater
to make sure this works right.

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

index 02fc36f298cfc6922710aaace084a6fa091e1eb0..e5ff766c1a62c6c048b70e2e6b8a48545854c9d6 100644 (file)
@@ -214,6 +214,27 @@ public class AltosEepromDownload implements Runnable {
                }
        }
 
+       private void show_error_internal(String message, String title) {
+               JOptionPane.showMessageDialog(frame,
+                                             message,
+                                             title,
+                                             JOptionPane.ERROR_MESSAGE);
+       }
+
+       private void show_error(String in_message, String in_title) {
+               final String message = in_message;
+               final String title = in_title;
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       try {
+                                               show_error_internal(message, title);
+                                       } catch (Exception ex) {
+                                       }
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
        public void run () {
                if (remote) {
                        serial_line.set_radio();
@@ -221,26 +242,16 @@ public class AltosEepromDownload implements Runnable {
                        serial_line.flush_input();
                }
 
-               monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
-               monitor.addActionListener(new ActionListener() {
-                               public void actionPerformed(ActionEvent e) {
-                                       eeprom_thread.interrupt();
-                               }
-                       });
                try {
                        CaptureLog();
                } catch (IOException ee) {
-                       JOptionPane.showMessageDialog(frame,
-                                                     device.toShortString(),
-                                                     ee.getLocalizedMessage(),
-                                                     JOptionPane.ERROR_MESSAGE);
+                       show_error (device.toShortString(),
+                                   ee.getLocalizedMessage());
                } catch (InterruptedException ie) {
                } catch (TimeoutException te) {
-                       JOptionPane.showMessageDialog(frame,
-                                                     String.format("Connection to \"%s\" failed",
-                                                                   device.toShortString()),
-                                                     "Connection Failed",
-                                                     JOptionPane.ERROR_MESSAGE);
+                       show_error (String.format("Connection to \"%s\" failed",
+                                                 device.toShortString()),
+                                   "Connection Failed");
                }
                if (remote)
                        serial_line.printf("~");
@@ -260,6 +271,14 @@ public class AltosEepromDownload implements Runnable {
                                serial_line = new AltosSerial(device);
                                if (!device.matchProduct(AltosDevice.product_telemetrum))
                                        remote = true;
+                               monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
+                               monitor.addActionListener(new ActionListener() {
+                                               public void actionPerformed(ActionEvent e) {
+                                                       if (eeprom_thread != null)
+                                                               eeprom_thread.interrupt();
+                                               }
+                                       });
+
                                eeprom_thread = new Thread(this);
                                eeprom_thread.start();
                        } catch (FileNotFoundException ee) {
index 7ff00eadb0c371051ae48050ca154c3bf39f824e..13a49a95b0299eb02ad5e8cc48684ff2dc7e5fb4 100644 (file)
@@ -141,7 +141,7 @@ public class AltosEepromMonitor extends JDialog {
                cancel.addActionListener(l);
        }
 
-       public void set_value(String state_name, int in_state, int in_block) {
+       private void set_value_internal(String state_name, int in_state, int in_block) {
                int block = in_block;
                int state = in_state;
 
@@ -157,20 +157,86 @@ public class AltosEepromMonitor extends JDialog {
                pbar.setValue(pos);
        }
 
-       public void set_serial(int serial) {
+       public void set_value(String in_state_name, int in_state, int in_block) {
+               final String state_name = in_state_name;
+               final int state = in_state;
+               final int block = in_block;
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       try {
+                                               set_value_internal(state_name, state, block);
+                                       } catch (Exception ex) {
+                                       }
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
+       private void set_serial_internal(int serial) {
                serial_value.setText(String.format("%d", serial));
        }
 
-       public void set_flight(int flight) {
+       public void set_serial(int in_serial) {
+               final int serial = in_serial;
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       try {
+                                               set_serial_internal(serial);
+                                       } catch (Exception ex) {
+                                       }
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
+       private void set_flight_internal(int flight) {
                flight_value.setText(String.format("%d", flight));
        }
 
-       public void set_file(String file) {
+       public void set_flight(int in_flight) {
+               final int flight = in_flight;
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       try {
+                                               set_flight_internal(flight);
+                                       } catch (Exception ex) {
+                                       }
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
+       private void set_file_internal(String file) {
                file_value.setText(String.format("%s", file));
        }
 
-       public void done() {
+       public void set_file(String in_file) {
+               final String file = in_file;
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       try {
+                                               set_file_internal(file);
+                                       } catch (Exception ex) {
+                                       }
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
+       private void done_internal() {
                setVisible(false);
                dispose();
        }
+
+       public void done() {
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       try {
+                                               done_internal();
+                                       } catch (Exception ex) {
+                                       }
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
 }