Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / altosdroid / src / org / altusmetrum / AltosDroid / AltosVoice.java
index 147405f6affd58fb23091181844dda6ec3373044..969992d3026c20f4fa1d94793353dd03457d6956 100644 (file)
@@ -45,7 +45,7 @@ public class AltosVoice {
 
        }
 
-       public void speak(String s) {
+       public synchronized void speak(String s) {
                if (!tts_enabled) return;
                tts.speak(s, TextToSpeech.QUEUE_ADD, null);
        }
@@ -58,7 +58,7 @@ public class AltosVoice {
                }
        }
 
-       public void tell(AltosState state) {
+       public void tell(AltosState state, AltosGreatCircle from_receiver) {
                if (!tts_enabled) return;
 
                boolean spoke = false;
@@ -68,12 +68,14 @@ public class AltosVoice {
                        if ((old_state == null || old_state.state <= AltosLib.ao_flight_boost) &&
                            state.state > AltosLib.ao_flight_boost) {
                                if (state.max_speed() != AltosLib.MISSING)
-                                       speak(String.format("max speed: %d meters per second.", (int) (state.max_speed() + 0.5)));
+                                       speak(String.format("Max speed: %s.",
+                                                           AltosConvert.speed.say_units(state.max_speed())));
                                spoke = true;
                        } else if ((old_state == null || old_state.state < AltosLib.ao_flight_drogue) &&
                                   state.state >= AltosLib.ao_flight_drogue) {
                                if (state.max_height() != AltosLib.MISSING)
-                                       speak(String.format("max height: %d meters.", (int) (state.max_height() + 0.5)));
+                                       speak(String.format("Max height: %s.",
+                                                           AltosConvert.height.say_units(state.max_height())));
                                spoke = true;
                        }
                }
@@ -87,13 +89,15 @@ public class AltosVoice {
                        }
                }
                old_state = state;
-               idle_thread.notice(state, spoke);
+               if (idle_thread != null)
+                       idle_thread.notice(state, from_receiver, spoke);
        }
 
 
        class IdleThread extends Thread {
                boolean            started;
                private AltosState state;
+               private AltosGreatCircle from_receiver;
                int                reported_landing;
                int                report_interval;
                long               report_time;
@@ -111,22 +115,30 @@ public class AltosVoice {
                                return;
                        }
 
-                       /* If the rocket isn't on the pad, then report height */
-                       if (((AltosLib.ao_flight_drogue <= state.state &&
+                       /* If the rocket isn't on the pad, then report location */
+                       if ((AltosLib.ao_flight_drogue <= state.state &&
                              state.state < AltosLib.ao_flight_landed) ||
-                            state.state == AltosLib.ao_flight_stateless) &&
-                           state.range >= 0)
+                            state.state == AltosLib.ao_flight_stateless)
                        {
-                               speak(String.format("Height %d, bearing %s %d, elevation %d, range %d.\n",
-                                                   (int) (state.height() + 0.5),
-                                       state.from_pad.bearing_words(
-                                             AltosGreatCircle.BEARING_VOICE),
-                                                   (int) (state.from_pad.bearing + 0.5),
-                                                   (int) (state.elevation + 0.5),
-                                                   (int) (state.range + 0.5)));
+                               AltosGreatCircle        position;
+
+                               if (from_receiver != null)
+                                       position = from_receiver;
+                               else
+                                       position = state.from_pad;
+
+                               if (position != null) {
+                                       speak(String.format("Height %s, bearing %s %d, elevation %d, range %s.\n",
+                                                           AltosConvert.height.say_units(state.height()),
+                                                           position.bearing_words(
+                                                                   AltosGreatCircle.BEARING_VOICE),
+                                                           (int) (position.bearing + 0.5),
+                                                           (int) (position.elevation + 0.5),
+                                                           AltosConvert.distance.say_units(position.range)));
+                               }
                        } else if (state.state > AltosLib.ao_flight_pad) {
                                if (state.height() != AltosLib.MISSING)
-                                       speak(String.format("%d meters", (int) (state.height() + 0.5)));
+                                       speak(AltosConvert.height.say_units(state.height()));
                        } else {
                                reported_landing = 0;
                        }
@@ -145,9 +157,9 @@ public class AltosVoice {
                                else
                                        speak("rocket may have crashed");
                                if (state.from_pad != null)
-                                       speak(String.format("Bearing %d degrees, range %d meters.",
+                                       speak(String.format("Bearing %d degrees, range %s.",
                                                            (int) (state.from_pad.bearing + 0.5),
-                                                           (int) (state.from_pad.distance + 0.5)));
+                                                           AltosConvert.distance.say_units(state.from_pad.distance)));
                                ++reported_landing;
                        }
                }
@@ -178,9 +190,10 @@ public class AltosVoice {
                        }
                }
 
-               public synchronized void notice(AltosState new_state, boolean spoken) {
+               public synchronized void notice(AltosState new_state, AltosGreatCircle new_from_receiver, boolean spoken) {
                        AltosState old_state = state;
                        state = new_state;
+                       from_receiver = new_from_receiver;
                        if (!started && state.state > AltosLib.ao_flight_pad) {
                                started = true;
                                start();