add thrust as a graphable time series type
[fw/altos] / altoslib / AltosFlightSeries.java
1 /*
2  * Copyright © 2017 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
15 package org.altusmetrum.altoslib_11;
16
17 import java.util.*;
18
19 public class AltosFlightSeries extends AltosFlightListener {
20
21         int flight;
22
23         int tick;
24         int boost_tick;
25
26         AltosGPS temp_gps;
27         int temp_gps_sat_tick;
28
29         AltosMs5607 ms5607;
30
31         public ArrayList<AltosTimeSeries> series;
32
33         /* AltosEepromRecord */
34         public void set_boost_tick(int boost_tick) {
35                 if (boost_tick != AltosLib.MISSING)
36                         this.boost_tick = boost_tick;
37         }
38
39         public void set_tick(int tick) {
40                 if (tick != AltosLib.MISSING)
41                         this.tick = tick;
42         }
43
44         public double time() {
45                 if (tick == AltosLib.MISSING)
46                         return AltosLib.MISSING;
47                 return tick / 100.0;
48         }
49
50         public double boost_time() {
51                 if (boost_tick == AltosLib.MISSING)
52                         return AltosLib.MISSING;
53                 return boost_tick / 100.0;
54         }
55
56         public AltosTimeSeries make_series(String label, AltosUnits units) {
57                 return new AltosTimeSeries(label, units);
58         }
59
60         public AltosTimeSeries add_series(String label, AltosUnits units) {
61                 System.out.printf("add series %s\n", label);
62                 AltosTimeSeries s = make_series(label, units);
63                 series.add(s);
64                 return s;
65         }
66
67         /* AltosEepromRecordFull */
68
69         AltosTimeSeries state_series;
70
71         public static final String state_name = "State";
72
73         public void set_state(int state) {
74                 if (state_series == null)
75                         state_series = add_series(state_name, null);
76                 state_series.add(time(), state);
77         }
78
79         public void set_flight(int flight) {
80                 if (flight != AltosLib.MISSING)
81                         this.flight = flight;
82         }
83         public int flight() {
84                 return flight;
85         }
86
87         AltosTimeSeries accel_series;
88
89         double accel_plus_g, accel_minus_g;
90
91         public static final String accel_name = "Accel";
92
93         public  void set_accel(double accel) {
94                 if (accel_series == null)
95                         accel_series = add_series(accel_name, AltosConvert.accel);
96                 double counts_per_g = (accel_minus_g - accel_plus_g) / 2.0;
97                 double counts_per_mss = counts_per_g / 9.80665;
98                 double mss = (accel_plus_g - accel) / counts_per_mss;
99
100                 accel_series.add(time(), mss);
101         }
102
103
104         public  void set_accel_g(double accel_plus_g, double accel_minus_g) {
105                 this.accel_plus_g = accel_plus_g;
106                 this.accel_minus_g = accel_minus_g;
107         }
108
109         public void set_config_data(AltosConfigData config_data) {
110 //              if (config_data.callsign != null)
111 //                      set_callsign(config_data.callsign);
112                 if (config_data.accel_cal_plus != AltosLib.MISSING &&
113                     config_data.accel_cal_minus != AltosLib.MISSING)
114                         set_accel_g(config_data.accel_cal_plus, config_data.accel_cal_minus);
115 //              if (config_data.product != null)
116 //                      set_product(config_data.product);
117 //              if (config_data.log_format != AltosLib.MISSING)
118 //                      set_log_format(config_data.log_format);
119 //              if (config_data.serial != AltosLib.MISSING)
120 //                      set_serial(config_data.serial);
121                 AltosMs5607 ms5607 = new AltosMs5607(config_data);
122                 if (ms5607.valid_config())
123                         this.ms5607 = ms5607;
124         }
125
126         public  void set_ground_accel(double ground_accel) {
127         }
128
129         AltosTimeSeries pressure_series;
130
131         public static final String pressure_name = "Pressure";
132
133         public  void set_pressure(double pa) {
134                 if (pressure_series == null)
135                         pressure_series = add_series(pressure_name, AltosConvert.pressure);
136                 pressure_series.add(time(), pa);
137         }
138
139         AltosTimeSeries thrust_series;
140
141         public static final String thrust_name = "Thrust";
142
143         public  void set_thrust(double N) {
144                 if (thrust_series == null)
145                         thrust_series = add_series(thrust_name, AltosConvert.force);
146                 thrust_series.add(time(), N);
147         }
148
149         public  void set_temperature(double deg_c) {
150         }
151
152         public  void set_battery_voltage(double volts) {
153         }
154
155         public  void set_apogee_voltage(double volts) {
156         }
157
158         public  void set_main_voltage(double volts) {
159         }
160
161         AltosTimeSeries sats_in_view;
162         AltosTimeSeries sats_in_soln;
163         AltosTimeSeries gps_altitude;
164         AltosTimeSeries gps_ground_speed;
165         AltosTimeSeries gps_ascent_rate;
166         AltosTimeSeries gps_course;
167         AltosTimeSeries gps_speed;
168
169         public static final String sats_in_view_name = "Satellites in view";
170         public static final String sats_in_soln_name = "Satellites in solution";
171         public static final String gps_altitude_name = "GPS Altitude";
172
173         public void set_temp_gps() {
174                 if (sats_in_view == null) {
175                         sats_in_view = add_series("Satellites in view", null);
176                         sats_in_soln = add_series("Satellites in solution", null);
177                         gps_altitude = add_series("GPS Altitude", AltosConvert.height);
178                         gps_ground_speed = add_series("GPS Ground Speed", AltosConvert.speed);
179                         gps_ascent_rate = add_series("GPS Ascent Rate", AltosConvert.speed);
180                         gps_course = add_series("GPS Course", null);
181                         gps_speed = add_series("GPS Speed", null);
182                 }
183
184                 /* XXX capture GPS data */
185                 super.set_temp_gps();
186         }
187
188         public boolean gps_pending() {
189                 return temp_gps != null;
190         }
191
192         public AltosGPS make_temp_gps(boolean sats) {
193                 if (temp_gps == null) {
194                         temp_gps = new AltosGPS();
195                 }
196                 if (sats) {
197                         if (tick != temp_gps_sat_tick)
198                                 temp_gps.cc_gps_sat = null;
199                         temp_gps_sat_tick = tick;
200                 }
201                 return temp_gps;
202         }
203
204         public  void set_ground_pressure(double ground_pressure) {
205         }
206
207         public  void set_accel_ground(double along, double across, double through) {
208         }
209
210         public  void set_gyro_zero(double roll, double pitch, double yaw) {
211         }
212
213         public  void set_ms5607(int pres_val, int temp_val) {
214                 if (ms5607 != null) {
215                         ms5607.set(pres_val, temp_val);
216
217                         set_pressure(ms5607.pa);
218                         set_temperature(ms5607.cc / 100.0);
219                 }
220         }
221
222         public  void check_imu_wrap(AltosIMU imu) {
223         }
224
225         public  void set_imu(AltosIMU imu) {
226         }
227
228         public  void set_mag(AltosMag mag) {
229         }
230
231         public  void set_pyro_voltage(double volts) {
232         }
233
234         public  void set_ignitor_voltage(double[] voltage) {
235         }
236
237         public  void set_pyro_fired(int pyro_mask) {
238         }
239
240         public void init() {
241                 flight = AltosLib.MISSING;
242                 tick = AltosLib.MISSING;
243                 boost_tick = AltosLib.MISSING;
244                 temp_gps_sat_tick = AltosLib.MISSING;
245                 series = new ArrayList<AltosTimeSeries>();
246         }
247
248         public void copy(AltosFlightSeries old) {
249                 super.copy(old);
250         }
251
252         public AltosTimeSeries[] series() {
253                 return series.toArray(new AltosTimeSeries[0]);
254         }
255
256         public AltosFlightSeries() {
257                 init();
258         }
259 }