altoslib,altosuilib,altosui: Get stats and replay working again.
[fw/altos] / altosuilib / AltosDisplayThread.java
index e88a891e22fb4e76e6f75268e1c64f75667989dc..1edac8a9bf38242fba8dc26b5c6d2cd1cda6c6ed 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_11;
 
 import java.awt.*;
 import javax.swing.*;
 import java.io.*;
 import java.text.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_11.*;
 
 public class AltosDisplayThread extends Thread {
 
@@ -29,7 +30,9 @@ public class AltosDisplayThread extends Thread {
        IdleThread              idle_thread;
        AltosVoice              voice;
        AltosFlightReader       reader;
-       AltosState              old_state, state;
+       AltosState              state;
+       int                     old_state = AltosLib.ao_flight_invalid;
+       boolean                 old_gps_ready = false;
        AltosListenerState      listener_state;
        AltosFlightDisplay      display;
 
@@ -78,7 +81,7 @@ public class AltosDisplayThread extends Thread {
                                return;
 
                        /* reset the landing count once we hear about a new flight */
-                       if (state.state < AltosLib.ao_flight_drogue)
+                       if (state.state() < AltosLib.ao_flight_drogue)
                                reported_landing = 0;
 
                        /* Shut up once the rocket is on the ground */
@@ -87,8 +90,8 @@ public class AltosDisplayThread extends Thread {
                        }
 
                        /* If the rocket isn't on the pad, then report height */
-                       if (AltosLib.ao_flight_drogue <= state.state &&
-                           state.state < AltosLib.ao_flight_landed &&
+                       if (AltosLib.ao_flight_drogue <= state.state() &&
+                           state.state() < AltosLib.ao_flight_landed &&
                            state.from_pad != null &&
                            state.range >= 0)
                        {
@@ -99,7 +102,7 @@ public class AltosDisplayThread extends Thread {
                                            (int) (state.from_pad.bearing + 0.5),
                                            (int) (state.elevation + 0.5),
                                            AltosConvert.distance.say(state.range));
-                       } else if (state.state > AltosLib.ao_flight_pad) {
+                       } else if (state.state() > AltosLib.ao_flight_pad && state.height() != AltosLib.MISSING) {
                                voice.speak(AltosConvert.height.say_units(state.height()));
                        } else {
                                reported_landing = 0;
@@ -109,10 +112,11 @@ public class AltosDisplayThread extends Thread {
                         * either we've got a landed report or we haven't heard from it in
                         * a long time
                         */
-                       if (state.state >= AltosLib.ao_flight_drogue &&
+                       if (state.state() != AltosLib.ao_flight_stateless &&
+                           state.state() >= AltosLib.ao_flight_drogue &&
                            (last ||
                             System.currentTimeMillis() - state.received_time >= 15000 ||
-                            state.state == AltosLib.ao_flight_landed))
+                            state.state() == AltosLib.ao_flight_landed))
                        {
                                if (Math.abs(state.speed()) < 20 && state.height() < 100)
                                        voice.speak("rocket landed safely");
@@ -123,10 +127,6 @@ public class AltosDisplayThread extends Thread {
                                                    (int) (state.from_pad.bearing + 0.5),
                                                    AltosConvert.distance.say_units(state.from_pad.distance));
                                ++reported_landing;
-                               if (state.state != AltosLib.ao_flight_landed) {
-                                       state.state = AltosLib.ao_flight_landed;
-                                       show_safely();
-                               }
                        }
                }
 
@@ -166,7 +166,7 @@ public class AltosDisplayThread extends Thread {
                }
 
                public synchronized void notice(boolean spoken) {
-                       if (old_state != null && old_state.state != state.state) {
+                       if (old_state != state.state()) {
                                report_time = now();
                                this.notify();
                        } else if (spoken)
@@ -181,31 +181,35 @@ public class AltosDisplayThread extends Thread {
 
        synchronized boolean tell() {
                boolean ret = false;
-               if (old_state == null || old_state.state != state.state) {
-                       voice.speak(state.state_name());
-                       if ((old_state == null || old_state.state <= AltosLib.ao_flight_boost) &&
-                           state.state > AltosLib.ao_flight_boost) {
-                               voice.speak("max speed: %s.",
-                                           AltosConvert.speed.say_units(state.max_speed() + 0.5));
+               if (old_state != state.state()) {
+                       if (state.state() != AltosLib.ao_flight_stateless)
+                               voice.speak(state.state_name());
+                       if ((old_state == AltosLib.ao_flight_invalid || old_state <= AltosLib.ao_flight_boost) &&
+                           state.state() > AltosLib.ao_flight_boost) {
+                               if (state.max_speed() != AltosLib.MISSING)
+                                       voice.speak("max speed: %s.",
+                                                   AltosConvert.speed.say_units(state.max_speed() + 0.5));
                                ret = true;
-                       } else if ((old_state == null || old_state.state < AltosLib.ao_flight_drogue) &&
-                                  state.state >= AltosLib.ao_flight_drogue) {
-                               voice.speak("max height: %s.",
-                                           AltosConvert.height.say_units(state.max_height() + 0.5));
+                       } else if ((old_state == AltosLib.ao_flight_invalid || old_state < AltosLib.ao_flight_drogue) &&
+                                  state.state() >= AltosLib.ao_flight_drogue) {
+                               if (state.max_height() != AltosLib.MISSING)
+                                       voice.speak("max height: %s.",
+                                                   AltosConvert.height.say_units(state.max_height() + 0.5));
                                ret = true;
                        }
                }
-               if (old_state == null || old_state.gps_ready != state.gps_ready) {
+               if (old_gps_ready != state.gps_ready) {
                        if (state.gps_ready) {
                                voice.speak("GPS ready");
                                ret = true;
                        }
-                       else if (old_state != null) {
+                       else if (old_gps_ready) {
                                voice.speak("GPS lost");
                                ret = true;
                        }
                }
-               old_state = state;
+               old_state = state.state();
+               old_gps_ready = state.gps_ready;
                return ret;
        }
 
@@ -220,9 +224,10 @@ public class AltosDisplayThread extends Thread {
                        for (;;) {
                                try {
                                        state = reader.read();
-                                       if (state == null)
+                                       if (state == null) {
+                                               listener_state.running = false;
                                                break;
-                                       reader.update(state);
+                                       }
                                        show_safely();
                                        told = tell();
                                        idle_thread.notice(told);