Bump java lib versions in preparation for 1.9.2
[fw/altos] / altoslib / AltosReplayReader.java
1 /*
2  * Copyright © 2010 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 package org.altusmetrum.altoslib_14;
20
21 import java.io.*;
22 import java.util.*;
23 import java.util.concurrent.*;
24
25 /*
26  * Open an existing telemetry file and replay it in realtime
27  */
28
29 class AltosReplay extends AltosDataListener implements Runnable {
30
31         AltosState      state;
32         AltosRecordSet  record_set;
33         double          last_time = AltosLib.MISSING;
34         Semaphore       semaphore = new Semaphore(1);
35         boolean         done = false;
36
37         public void set_time(double time) {
38                 if (time > -2) {
39                         if (last_time != AltosLib.MISSING) {
40                                 semaphore.release();
41                                 double  delay = Math.min(time - last_time,10);
42                                 if (delay > 0) {
43                                         try {
44                                                 Thread.sleep((int) (delay * 1000));
45                                         } catch (InterruptedException ie) {
46                                         }
47                                 }
48                         }
49                 }
50                 last_time = time;
51                 super.set_time(time);
52                 state.set_time(time);
53         }
54
55         public void set_state(int state) {
56                 super.set_state(state);
57                 this.state.set_state(state);
58         }
59
60         public void set_rssi(int rssi, int status) { state.set_rssi(rssi, status); }
61         public void set_received_time(long received_time) { }
62
63         public void set_acceleration(double accel) { state.set_acceleration(accel); }
64         public void set_pressure(double pa) { state.set_pressure(pa); }
65         public void set_thrust(double N) { state.set_thrust(N); }
66
67         public void set_kalman(double height, double speed, double accel) { state.set_kalman(height, speed, accel); }
68
69         public void set_temperature(double deg_c) { state.set_temperature(deg_c); }
70         public void set_battery_voltage(double volts) { state.set_battery_voltage(volts); }
71
72         public void set_apogee_voltage(double volts) { state.set_apogee_voltage(volts); }
73         public void set_main_voltage(double volts) { state.set_main_voltage(volts); }
74
75         public void set_gps(AltosGPS gps, boolean set_location, boolean set_sats) {
76                 super.set_gps(gps, set_location, set_sats);
77                 state.set_gps(gps, set_location, set_sats);
78         }
79
80         public void set_orient(double orient) { state.set_orient(orient); }
81         public void set_gyro(double roll, double pitch, double yaw) { state.set_gyro(roll, pitch, yaw); }
82         public void set_accel_ground(double along, double across, double through) { state.set_accel_ground(along, across, through); }
83         public void set_accel(double along, double across, double through) { state.set_accel(along, across, through); }
84         public void set_mag(double along, double across, double through) { state.set_mag(along, across, through); }
85         public void set_pyro_voltage(double volts) { state.set_pyro_voltage(volts); }
86         public void set_igniter_voltage(double[] voltage) { state.set_igniter_voltage(voltage); }
87         public void set_pyro_fired(int pyro_mask) { state.set_pyro_fired(pyro_mask); }
88         public void set_companion(AltosCompanion companion) { state.set_companion(companion); }
89
90         public void run () {
91                 /* Run the flight */
92                 record_set.capture_series(this);
93                 /* All done, signal that it's over */
94                 done = true;
95                 semaphore.release();
96         }
97
98         public AltosReplay(AltosRecordSet record_set) {
99                 super(record_set.cal_data());
100                 state = new AltosState(record_set.cal_data());
101                 this.record_set = record_set;
102                 try {
103                         semaphore.acquire();
104                 } catch (InterruptedException ie) {
105                 }
106         }
107 }
108
109 public class AltosReplayReader extends AltosFlightReader {
110         File            file;
111         AltosReplay     replay;
112         Thread          t;
113
114         public AltosCalData cal_data() {
115                 return replay.state.cal_data();
116         }
117
118         public AltosState read() {
119                 /* Wait for something to change */
120                 try {
121                         replay.semaphore.acquire();
122                 } catch (InterruptedException ie) {
123                 }
124
125                 /* When done, let the display know */
126                 if (replay.done)
127                         return null;
128
129                 /* Fake out the received time */
130                 replay.state.set_received_time(System.currentTimeMillis());
131                 return replay.state;
132         }
133
134         public void close (boolean interrupted) {
135         }
136
137         public File backing_file() { return file; }
138
139         public AltosReplayReader(AltosRecordSet record_set, File in_file) {
140                 file = in_file;
141                 name = file.getName();
142                 replay = new AltosReplay(record_set);
143                 t = new Thread(replay);
144                 t.start();
145         }
146 }