altosui: Pop up 'Connecting' dialog during Monitor Idle
authorKeith Packard <keithp@keithp.com>
Fri, 31 Oct 2014 04:59:45 +0000 (21:59 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 31 Oct 2014 04:59:45 +0000 (21:59 -0700)
This was a bit harder than expected as I had to wire up a way to shut
down the whole monitor idle window when you clicked on the cancel button.

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosIdleMonitor.java
altoslib/AltosIdleMonitorListener.java
altoslib/AltosLib.java
altoslib/AltosLink.java
altosui/AltosIdleMonitorUI.java

index 85bcff10d295e3a7920ba511b29b72727858123b..57c77c47649b697695c701bf52fa4c6fd5ceb444 100644 (file)
@@ -35,20 +35,6 @@ public class AltosIdleMonitor extends Thread {
        AltosConfigData         config_data;
        AltosGPS                gps;
 
-       int AltosRSSI() throws TimeoutException, InterruptedException {
-               link.printf("s\n");
-               String line = link.get_reply_no_dialog(5000);
-               if (line == null)
-                       throw new TimeoutException();
-               String[] items = line.split("\\s+");
-               if (items.length < 2)
-                       return 0;
-               if (!items[0].equals("RSSI:"))
-                       return 0;
-               int rssi = Integer.parseInt(items[1]);
-               return rssi;
-       }
-
        void start_link() throws InterruptedException, TimeoutException {
                if (remote) {
                        link.set_radio_frequency(frequency);
@@ -58,26 +44,30 @@ public class AltosIdleMonitor extends Thread {
                        link.flush_input();
        }
 
-       void stop_link() throws InterruptedException, TimeoutException {
+       boolean stop_link() throws InterruptedException, TimeoutException {
                if (remote)
                        link.stop_remote();
+               return link.reply_abort;
        }
 
-       void update_state(AltosState state) throws InterruptedException, TimeoutException {
+       boolean update_state(AltosState state) throws InterruptedException, TimeoutException {
                boolean         worked = false;
+               boolean         aborted = false;
 
                try {
                        start_link();
                        fetch.update_state(state);
-                       worked = true;
+                       if (!link.has_error && !link.reply_abort)
+                               worked = true;
                } finally {
-                       stop_link();
+                       aborted = stop_link();
                        if (worked) {
                                if (remote)
                                        state.set_rssi(link.rssi(), 0);
                                listener_state.battery = link.monitor_battery();
                        }
                }
+               return aborted;
        }
 
        public void set_frequency(double in_frequency) {
@@ -102,13 +92,17 @@ public class AltosIdleMonitor extends Thread {
        public void run() {
                AltosState state = new AltosState();
                try {
-                       while (!link.has_error) {
+                       for (;;) {
                                try {
                                        link.config_data();
                                        update_state(state);
                                        listener.update(state, listener_state);
                                } catch (TimeoutException te) {
                                }
+                               if (link.has_error || link.reply_abort) {
+                                       listener.failed();
+                                       break;
+                               }
                                Thread.sleep(1000);
                        }
                } catch (InterruptedException ie) {
index 4382430c667634acb9995078e0d5ec009e7cdee5..364847637c8e05ecf3524b4e5ad7f19910d695ef 100644 (file)
@@ -19,4 +19,5 @@ package org.altusmetrum.altoslib_5;
 
 public interface AltosIdleMonitorListener {
        public void update(AltosState state, AltosListenerState listener_state);
-}
\ No newline at end of file
+       public void failed();
+}
index 0edc0b43537588c7a17c6c7a63b4a84f98385f66..be69519b0e1d930fab525a8a738a5df2403083e8 100644 (file)
@@ -188,6 +188,7 @@ public class AltosLib {
        };
 
        public static final String launch_sites_url = "http://www.altusmetrum.org/AltOS/launch-sites.txt";
+//     public static final String launch_sites_url = "file:///home/keithp/misc/text/altusmetrum/AltOS/launch-sites.txt";
 
        public static final int ao_telemetry_standard_len = 32;
        public static final int ao_telemetry_0_9_len = 95;
index c0031cadbf059ce3ea38c6e102901dac1be79e9d..639d2ac784a4f63642a5310ec1aef91658a38b36 100644 (file)
@@ -427,8 +427,10 @@ public abstract class AltosLink implements Runnable {
 
        public void set_callsign(String callsign) {
                this.callsign = callsign;
-               printf ("c c %s\n", callsign);
-               flush_output();
+               if (callsign != null) {
+                       printf ("c c %s\n", callsign);
+                       flush_output();
+               }
        }
 
        public boolean is_loader() throws InterruptedException {
@@ -467,7 +469,7 @@ public abstract class AltosLink implements Runnable {
                if (telemetry_rate < 0)
                        telemetry_rate = AltosPreferences.telemetry_rate(serial);
                set_telemetry_rate(telemetry_rate);
-               if (callsign.equals(""))
+               if (callsign == null || callsign.equals(""))
                        callsign = AltosPreferences.callsign();
                set_callsign(callsign);
                printf("p\nE 0\n");
index 67b7a9897717a2aea529ae383916babb946ffdda..0230ff2f767959a2c73301e4c5d2ae21748a26e4 100644 (file)
@@ -102,6 +102,15 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                SwingUtilities.invokeLater(r);
        }
 
+       public void failed() {
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       close();
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
        Container       bag;
        AltosUIFreqList frequencies;
        JTextField      callsign_value;
@@ -174,6 +183,19 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                }
        }
 
+       private void close() {
+               try {
+                       disconnect();
+               } catch (Exception ex) {
+                       System.out.printf("Exception %s\n", ex.toString());
+                       for (StackTraceElement el : ex.getStackTrace())
+                               System.out.printf("%s\n", el.toString());
+               }
+               setVisible(false);
+               dispose();
+               AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
+       }
+
        public AltosIdleMonitorUI(JFrame in_owner)
                throws FileNotFoundException, TimeoutException, InterruptedException {
 
@@ -184,9 +206,10 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
 
                serial = device.getSerial();
 
-               AltosLink link;
+               AltosSerial link;
                try {
                        link = new AltosSerial(device);
+                       link.set_frame(this);
                } catch (Exception ex) {
                        idle_exception(in_owner, ex);
                        return;
@@ -248,16 +271,7 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                addWindowListener(new WindowAdapter() {
                                @Override
                                public void windowClosing(WindowEvent e) {
-                                       try {
-                                               disconnect();
-                                       } catch (Exception ex) {
-                                               System.out.printf("Exception %s\n", ex.toString());
-                                               for (StackTraceElement el : ex.getStackTrace())
-                                                       System.out.printf("%s\n", el.toString());
-                                       }
-                                       setVisible(false);
-                                       dispose();
-                                       AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
+                                       close();
                                }
                        });