altoslib: Create new abstraction underneath AltosState for recording values
[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         public  void set_temperature(double deg_c) {
140         }
141
142         public  void set_battery_voltage(double volts) {
143         }
144
145         public  void set_apogee_voltage(double volts) {
146         }
147
148         public  void set_main_voltage(double volts) {
149         }
150
151         AltosTimeSeries sats_in_view;
152         AltosTimeSeries sats_in_soln;
153         AltosTimeSeries gps_altitude;
154         AltosTimeSeries gps_ground_speed;
155         AltosTimeSeries gps_ascent_rate;
156         AltosTimeSeries gps_course;
157         AltosTimeSeries gps_speed;
158
159         public static final String sats_in_view_name = "Satellites in view";
160         public static final String sats_in_soln_name = "Satellites in solution";
161         public static final String gps_altitude_name = "GPS Altitude";
162
163         public void set_temp_gps() {
164                 if (sats_in_view == null) {
165                         sats_in_view = add_series("Satellites in view", null);
166                         sats_in_soln = add_series("Satellites in solution", null);
167                         gps_altitude = add_series("GPS Altitude", AltosConvert.height);
168                         gps_ground_speed = add_series("GPS Ground Speed", AltosConvert.speed);
169                         gps_ascent_rate = add_series("GPS Ascent Rate", AltosConvert.speed);
170                         gps_course = add_series("GPS Course", null);
171                         gps_speed = add_series("GPS Speed", null);
172                 }
173
174                 /* XXX capture GPS data */
175                 super.set_temp_gps();
176         }
177
178         public boolean gps_pending() {
179                 return temp_gps != null;
180         }
181
182         public AltosGPS make_temp_gps(boolean sats) {
183                 if (temp_gps == null) {
184                         temp_gps = new AltosGPS();
185                 }
186                 if (sats) {
187                         if (tick != temp_gps_sat_tick)
188                                 temp_gps.cc_gps_sat = null;
189                         temp_gps_sat_tick = tick;
190                 }
191                 return temp_gps;
192         }
193
194         public  void set_ground_pressure(double ground_pressure) {
195         }
196
197         public  void set_accel_ground(double along, double across, double through) {
198         }
199
200         public  void set_gyro_zero(double roll, double pitch, double yaw) {
201         }
202
203         public  void set_ms5607(int pres_val, int temp_val) {
204                 if (ms5607 != null) {
205                         ms5607.set(pres_val, temp_val);
206
207                         set_pressure(ms5607.pa);
208                         set_temperature(ms5607.cc / 100.0);
209                 }
210         }
211
212         public  void check_imu_wrap(AltosIMU imu) {
213         }
214
215         public  void set_imu(AltosIMU imu) {
216         }
217
218         public  void set_mag(AltosMag mag) {
219         }
220
221         public  void set_pyro_voltage(double volts) {
222         }
223
224         public  void set_ignitor_voltage(double[] voltage) {
225         }
226
227         public  void set_pyro_fired(int pyro_mask) {
228         }
229
230         public void init() {
231                 flight = AltosLib.MISSING;
232                 tick = AltosLib.MISSING;
233                 boost_tick = AltosLib.MISSING;
234                 temp_gps_sat_tick = AltosLib.MISSING;
235                 series = new ArrayList<AltosTimeSeries>();
236         }
237
238         public void copy(AltosFlightSeries old) {
239                 super.copy(old);
240         }
241
242         public AltosTimeSeries[] series() {
243                 return series.toArray(new AltosTimeSeries[0]);
244         }
245
246         public AltosFlightSeries() {
247                 init();
248         }
249 }