X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosuilib%2FAltosDisplayThread.java;h=eb77f0a94b5ae4e15b20295123d61b4875d193c1;hp=e88a891e22fb4e76e6f75268e1c64f75667989dc;hb=HEAD;hpb=0a6c76fc0525d6588a1d88127f0085f13a02f1af diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index e88a891e..eb77f0a9 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -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 @@ -15,13 +16,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_2; +package org.altusmetrum.altosuilib_14; import java.awt.*; import javax.swing.*; import java.io.*; import java.text.*; -import org.altusmetrum.altoslib_4.*; +import org.altusmetrum.altoslib_14.*; 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,19 +90,19 @@ 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) { - voice.speak("Height %s, bearing %s %d, elevation %d, range %s.\n", + voice.speak("Height %s, bearing %s %d, elevation %d, distance %s.\n", AltosConvert.height.say(state.height()), state.from_pad.bearing_words( AltosGreatCircle.BEARING_VOICE), (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) { + AltosConvert.distance.say(state.distance)); + } 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,24 +112,21 @@ 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"); else voice.speak("rocket may have crashed"); if (state.from_pad != null) - voice.speak("Bearing %d degrees, range %s.", + voice.speak("Bearing %d degrees, distance %s.", (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(); - } } } @@ -159,14 +159,11 @@ public class AltosDisplayThread extends Thread { report(false); } } catch (InterruptedException ie) { - try { - voice.drain(); - } catch (InterruptedException iie) { } } } 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 +178,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 +221,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);