telegps: Add scan UI
[fw/altos] / altosui / AltosEepromManage.java
index b64ee52597b9bf643f242fd31fb8dc66bc8b00a8..aa43ab9ee3c4f740187bc3f391f387b14ec54f19 100644 (file)
 
 package altosui;
 
-import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import javax.swing.filechooser.FileNameExtensionFilter;
-import javax.swing.table.*;
 import java.io.*;
-import java.util.*;
-import java.text.*;
-import java.util.prefs.*;
 import java.util.concurrent.*;
-
-import libaltosJNI.*;
+import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altosuilib_2.*;
 
 public class AltosEepromManage implements ActionListener {
 
@@ -39,95 +33,201 @@ public class AltosEepromManage implements ActionListener {
        AltosEepromList         flights;
        AltosEepromDownload     download;
        AltosEepromDelete       delete;
-       boolean                 any_download;
-       boolean                 any_delete;
 
        public void finish() {
                if (serial_line != null) {
-                       serial_line.flush_output();
+                       try {
+                               serial_line.flush_input();
+                       } catch (InterruptedException ie) {
+                       }
                        serial_line.close();
                        serial_line = null;
                }
        }
 
+       private int countDeletedFlights() {
+               int count = 0;
+               for (AltosEepromLog flight : flights) {
+                       if (flight.selected)
+                               count++;
+               }
+               return count;
+       }
+
+       private String showDeletedFlights() {
+               String  result = "";
+
+               for (AltosEepromLog flight : flights) {
+                       if (flight.selected) {
+                               if (result.equals(""))
+                                       result = String.format("%d", flight.flight);
+                               else
+                                       result = String.format("%s, %d", result, flight.flight);
+                       }
+               }
+               return result;
+       }
+
+       public boolean download_done() {
+               AltosEepromSelect       select = new AltosEepromSelect(frame, flights, "Delete");
+
+               if (select.run()) {
+                       boolean any_selected = false;
+                       for (AltosEepromLog flight : flights)
+                               any_selected = any_selected || flight.selected;
+                       if (any_selected) {
+                               delete = new AltosEepromDelete(frame,
+                                                              serial_line,
+                                                              remote,
+                                                              flights);
+                               delete.addActionListener(this);
+                               /*
+                                * Start flight log delete
+                                */
+
+                               delete.start();
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        public void actionPerformed(ActionEvent e) {
                String  cmd = e.getActionCommand();
                boolean success = e.getID() != 0;
+               boolean running = false;
 
-               System.out.printf("Eeprom manager action %s %d\n", cmd, e.getID());
                if (cmd.equals("download")) {
+                       if (success)
+                               running = download_done();
+               } else if (cmd.equals("delete")) {
                        if (success) {
-                               System.out.printf("Download succeeded\n");
-                               if (any_delete)
-                                       delete.start();
-                               else
-                                       finish();
+                               JOptionPane.showMessageDialog(frame,
+                                                             String.format("%d flights erased: %s",
+                                                                           countDeletedFlights(),
+                                                                           showDeletedFlights()),
+                                                             serial_line.device.toShortString(),
+                                                             JOptionPane.INFORMATION_MESSAGE);
                        }
-               } else if (cmd.equals("delete")) {
-                       if (success)
-                               System.out.printf("Delete succeeded\n");
+               }
+               if (!running)
                        finish();
+       }
+
+       public void got_flights(AltosEepromList in_flights) {
+               boolean running = false;;
+
+               flights = in_flights;
+               try {
+                       if (flights.size() == 0) {
+                               JOptionPane.showMessageDialog(frame,
+                                                             String.format("No flights available on %d",
+                                                                           device.getSerial()),
+                                                             serial_line.device.toShortString(),
+                                                             JOptionPane.INFORMATION_MESSAGE);
+                       } else {
+                               AltosEepromSelect       select = new AltosEepromSelect(frame, flights, "Download");
+
+                               if (select.run()) {
+                                       boolean any_selected = false;
+                                       for (AltosEepromLog flight : flights)
+                                               any_selected = any_selected || flight.selected;
+                                       if (any_selected) {
+                                               AltosEepromMonitorUI monitor = new AltosEepromMonitorUI(frame);
+                                               monitor.addActionListener(this);
+                                               serial_line.set_frame(frame);
+                                               download = new AltosEepromDownload(monitor,
+                                                                                  serial_line,
+                                                                                  remote,
+                                                                                  flights);
+                                               /*
+                                                * Start flight log download
+                                                */
+
+                                               download.start();
+                                               running = true;
+                                       } else {
+                                               running = download_done();
+                                       }
+                               }
+                       }
+                       if (!running)
+                               finish();
+               } catch (Exception e) {
+                       got_exception(e);
+               }
+       }
+
+       public void got_exception(Exception e) {
+               if (e instanceof IOException) {
+                       IOException     ee = (IOException) e;
+                       JOptionPane.showMessageDialog(frame,
+                                                     device.toShortString(),
+                                                     ee.getLocalizedMessage(),
+                                                     JOptionPane.ERROR_MESSAGE);
+               } else if (e instanceof TimeoutException) {
+                       //TimeoutException te = (TimeoutException) e;
+                       JOptionPane.showMessageDialog(frame,
+                                                     String.format("Communications failed with \"%s\"",
+                                                                   device.toShortString()),
+                                                     "Cannot open target device",
+                                                     JOptionPane.ERROR_MESSAGE);
+               }
+               finish();
+       }
+
+       class EepromGetList implements Runnable {
+
+               AltosEepromManage       manage;
+
+               public void run () {
+                       Runnable r;
+                       try {
+                               flights = new AltosEepromList(serial_line, remote);
+                               r = new Runnable() {
+                                               public void run() {
+                                                       got_flights(flights);
+                                               }
+                                       };
+                       } catch (Exception e) {
+                               final Exception f_e = e;
+                               r = new Runnable() {
+                                               public void run() {
+                                                       got_exception(f_e);
+                                               }
+                                       };
+                       }
+                       SwingUtilities.invokeLater(r);
+               }
+
+               public EepromGetList(AltosEepromManage in_manage) {
+                       manage = in_manage;
                }
        }
 
        public AltosEepromManage(JFrame given_frame) {
 
+               //boolean       running = false;
+
                frame = given_frame;
-               device = AltosDeviceDialog.show(frame, AltosDevice.product_any);
+               device = AltosDeviceUIDialog.show(frame, Altos.product_any);
 
                remote = false;
-               any_download = false;
-               any_delete = false;
 
                if (device != null) {
                        try {
                                serial_line = new AltosSerial(device);
-                               if (!device.matchProduct(AltosDevice.product_telemetrum))
+                               if (device.matchProduct(Altos.product_basestation))
                                        remote = true;
 
-                               flights = new AltosEepromList(serial_line, remote);
-
-                               if (flights.size() == 0) {
-                               } else {
-                                       AltosEepromSelect       select = new AltosEepromSelect(frame, flights);
-
-                                       if (select.run()) {
-                                               for (AltosEepromLog flight : flights) {
-                                                       any_download = any_download || flight.download;
-                                                       any_delete = any_delete || flight.delete;
-                                               }
-                                               if (any_download) {
-                                                       download = new AltosEepromDownload(frame,
-                                                                                          serial_line,
-                                                                                          remote,
-                                                                                          flights);
-                                                       download.addActionListener(this);
-                                               }
-
-                                               if (any_delete) {
-                                                       delete = new AltosEepromDelete(frame,
-                                                                                      serial_line,
-                                                                                      remote,
-                                                                                      flights);
-                                                       delete.addActionListener(this);
-                                               }
-
-                                               /*
-                                                * Start flight log download
-                                                */
+                               serial_line.set_frame(frame);
 
-                                               if (any_download)
-                                                       download.start();
-                                               else if (any_delete)
-                                                       delete.start();
-                                               else
-                                                       finish();
-                                       }
-                               }
+                               EepromGetList   get_list = new EepromGetList(this);
+                               Thread          t = new Thread(get_list);
+                               t.start();
                        } catch (FileNotFoundException ee) {
                                JOptionPane.showMessageDialog(frame,
-                                                             String.format("Cannot open device \"%s\"",
-                                                                           device.toShortString()),
+                                                             ee.getMessage(),
                                                              "Cannot open target device",
                                                              JOptionPane.ERROR_MESSAGE);
                        } catch (AltosSerialInUseException si) {
@@ -136,21 +236,6 @@ public class AltosEepromManage implements ActionListener {
                                                                            device.toShortString()),
                                                              "Device in use",
                                                              JOptionPane.ERROR_MESSAGE);
-                       } catch (IOException ee) {
-                               JOptionPane.showMessageDialog(frame,
-                                                             device.toShortString(),
-                                                             ee.getLocalizedMessage(),
-                                                             JOptionPane.ERROR_MESSAGE);
-                               finish();
-                       } catch (TimeoutException te) {
-                               JOptionPane.showMessageDialog(frame,
-                                                             String.format("Communications failed with \"%s\"",
-                                                                           device.toShortString()),
-                                                             "Cannot open target device",
-                                                             JOptionPane.ERROR_MESSAGE);
-                               finish();
-                       } catch (InterruptedException ie) {
-                               finish();
                        }
                }
        }