Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / altoslib / AltosReplayReader.java
index fb8432e7e8049ed0132763d18a27c1520fcb8940..fab28cac3cddeec78dde18ef1a6020ae39d10365 100644 (file)
@@ -16,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_11;
+package org.altusmetrum.altoslib_12;
 
 import java.io.*;
 import java.util.*;
@@ -31,7 +31,7 @@ class AltosReplay extends AltosDataListener implements Runnable {
        AltosState      state;
        AltosRecordSet  record_set;
        double          last_time = AltosLib.MISSING;
-       Semaphore       semaphore = new Semaphore(1);;
+       Semaphore       semaphore = new Semaphore(1);
        boolean         done = false;
 
        public void set_time(double time) {
@@ -70,7 +70,7 @@ class AltosReplay extends AltosDataListener implements Runnable {
        public void set_apogee_voltage(double volts) { state.set_apogee_voltage(volts); }
        public void set_main_voltage(double volts) { state.set_main_voltage(volts); }
 
-       public void set_gps(AltosGPS gps) { state.set_gps(gps); }
+       public void set_gps(AltosGPS gps) { super.set_gps(gps); state.set_gps(gps); }
 
        public void set_orient(double orient) { state.set_orient(orient); }
        public void set_gyro(double roll, double pitch, double yaw) { state.set_gyro(roll, pitch, yaw); }
@@ -83,20 +83,8 @@ class AltosReplay extends AltosDataListener implements Runnable {
        public void set_companion(AltosCompanion companion) { state.set_companion(companion); }
 
        public void run () {
-               System.out.printf("ReplayReader running\n");
-               state = new AltosState(record_set.cal_data());
-
-               /* Tell the display that we're in pad mode */
-               state.set_state(AltosLib.ao_flight_pad);
-               semaphore.release();
-               try {
-                       Thread.sleep(100);
-               } catch (InterruptedException ie) {
-               }
-
                /* Run the flight */
                record_set.capture_series(this);
-
                /* All done, signal that it's over */
                done = true;
                semaphore.release();
@@ -104,31 +92,49 @@ class AltosReplay extends AltosDataListener implements Runnable {
 
        public AltosReplay(AltosRecordSet record_set) {
                super(record_set.cal_data());
+               state = new AltosState(record_set.cal_data());
+               this.record_set = record_set;
                try {
                        semaphore.acquire();
-               } catch (InterruptedException ie) { }
-               this.record_set = record_set;
-               Thread t = new Thread(this);
-               t.start();
+               } catch (InterruptedException ie) {
+               }
        }
 }
 
 public class AltosReplayReader extends AltosFlightReader {
        File            file;
        AltosReplay     replay;
+       Thread          t;
+       int             reads;
+
+       public AltosCalData cal_data() {
+               return replay.state.cal_data();
+       }
 
        public AltosState read() {
+               switch (reads) {
+               case 0:
+                       /* Tell the display that we're in pad mode */
+                       replay.state.set_state(AltosLib.ao_flight_pad);
+                       break;
+               case 1:
+                       t = new Thread(replay);
+                       t.start();
+                       /* fall through */
+               default:
+                       /* Wait for something to change */
+                       try {
+                               replay.semaphore.acquire();
+                       } catch (InterruptedException ie) {
+                       }
+                       break;
+               }
+               reads++;
 
                /* When done, let the display know */
                if (replay.done)
                        return null;
 
-               /* Wait for something to change */
-               try {
-                       replay.semaphore.acquire();
-               } catch (InterruptedException ie) {
-               }
-
                /* Fake out the received time */
                replay.state.set_received_time(System.currentTimeMillis());
                return replay.state;
@@ -137,12 +143,10 @@ public class AltosReplayReader extends AltosFlightReader {
        public void close (boolean interrupted) {
        }
 
-       public void update(AltosState state) throws InterruptedException {
-       }
-
        public File backing_file() { return file; }
 
        public AltosReplayReader(AltosRecordSet record_set, File in_file) {
+               reads = 0;
                file = in_file;
                name = file.getName();
                replay = new AltosReplay(record_set);