2 * Copyright © 2009 Keith Packard <keithp@keithp.com>
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.
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.
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.
24 #include "cc-telemetry.h"
27 cc_fullname (char *dir, char *file);
30 cc_basename(char *file);
40 int serial; /* AltOS always uses simple integer serial numbers */
46 struct cc_usbdev **dev;
51 cc_usbdevs_free(struct cc_usbdevs *usbdevs);
54 cc_usbdevs_scan(int non_tty);
57 cc_usbdevs_find_by_arg(char *arg, char *default_product);
60 cc_set_log_dir(char *dir);
66 cc_make_filename(int serial, int flight, char *ext);
69 * For sequential data which are not evenly spaced
72 struct cc_timedataelt {
80 struct cc_timedataelt *data;
100 #define SIRF_SAT_STATE_ACQUIRED (1 << 0)
101 #define SIRF_SAT_STATE_CARRIER_PHASE_VALID (1 << 1)
102 #define SIRF_SAT_BIT_SYNC_COMPLETE (1 << 2)
103 #define SIRF_SAT_SUBFRAME_SYNC_COMPLETE (1 << 3)
104 #define SIRF_SAT_CARRIER_PULLIN_COMPLETE (1 << 4)
105 #define SIRF_SAT_CODE_LOCKED (1 << 5)
106 #define SIRF_SAT_ACQUISITION_FAILED (1 << 6)
107 #define SIRF_SAT_EPHEMERIS_AVAILABLE (1 << 7)
117 struct cc_gpssat sat[12];
123 struct cc_gpselt *data;
127 struct cc_gpssats *sats;
131 * For sequential data which are evenly spaced
133 struct cc_perioddata {
140 enum ao_flight_state {
141 ao_flight_startup = 0,
147 ao_flight_drogue = 6,
149 ao_flight_landed = 8,
150 ao_flight_invalid = 9
153 struct cc_flightraw {
158 int year, month, day;
159 struct cc_timedata accel;
160 struct cc_timedata pres;
161 struct cc_timedata temp;
162 struct cc_timedata volt;
163 struct cc_timedata main;
164 struct cc_timedata drogue;
165 struct cc_timedata state;
166 struct cc_gpsdata gps;
169 struct cc_flightraw *
170 cc_log_read(FILE *file);
173 cc_flightraw_free(struct cc_flightraw *raw);
175 struct cc_flightcooked {
179 struct cc_perioddata accel_accel;
180 struct cc_perioddata accel_speed;
181 struct cc_perioddata accel_pos;
182 struct cc_perioddata pres_pos;
183 struct cc_perioddata pres_speed;
184 struct cc_perioddata pres_accel;
185 struct cc_perioddata gps_lat;
186 struct cc_perioddata gps_lon;
187 struct cc_perioddata gps_alt;
189 /* unfiltered, but converted */
190 struct cc_timedata pres;
191 struct cc_timedata accel;
192 struct cc_timedata state;
196 * Telemetry data contents
213 struct cc_gps_time gps_time;
214 double lat; /* degrees (+N -S) */
215 double lon; /* degrees (+E -W) */
218 int gps_extended; /* has extra data */
219 double ground_speed; /* m/s */
220 int course; /* degrees */
221 double climb_rate; /* m/s */
222 double hdop; /* unitless? */
227 #define SIRF_SAT_STATE_ACQUIRED (1 << 0)
228 #define SIRF_SAT_STATE_CARRIER_PHASE_VALID (1 << 1)
229 #define SIRF_SAT_BIT_SYNC_COMPLETE (1 << 2)
230 #define SIRF_SAT_SUBFRAME_SYNC_COMPLETE (1 << 3)
231 #define SIRF_SAT_CARRIER_PULLIN_COMPLETE (1 << 4)
232 #define SIRF_SAT_CODE_LOCKED (1 << 5)
233 #define SIRF_SAT_ACQUISITION_FAILED (1 << 6)
234 #define SIRF_SAT_EPHEMERIS_AVAILABLE (1 << 7)
241 struct cc_gps_tracking {
243 struct cc_gps_sat sats[12];
267 struct cc_gps_tracking gps_tracking;
271 cc_telem_parse(const char *input_line, struct cc_telem *telem);
275 uint8_t is_config; /* 1 */
276 uint16_t tick; /* 2 */
280 uint16_t flight; /* 4 */
281 int16_t ground_accel; /* 6 */
282 uint32_t ground_pres; /* 8 */
291 uint32_t pres; /* 4 */
292 uint32_t temp; /* 8 */
293 int16_t accel_x; /* 12 */
294 int16_t accel_y; /* 14 */
295 int16_t accel_z; /* 16 */
296 int16_t gyro_x; /* 18 */
297 int16_t gyro_y; /* 20 */
298 int16_t gyro_z; /* 22 */
299 int16_t mag_x; /* 24 */
300 int16_t mag_y; /* 26 */
301 int16_t mag_z; /* 28 */
302 int16_t accel; /* 30 */
304 /* AO_LOG_TEMP_VOLT */
306 int16_t v_batt; /* 4 */
307 int16_t v_pbatt; /* 6 */
308 int16_t n_sense; /* 8 */
309 int16_t sense[10]; /* 10 */
310 uint16_t pyro; /* 30 */
312 /* AO_LOG_GPS_TIME */
314 int32_t latitude; /* 4 */
315 int32_t longitude; /* 8 */
316 int16_t altitude; /* 12 */
317 uint8_t hour; /* 14 */
318 uint8_t minute; /* 15 */
319 uint8_t second; /* 16 */
320 uint8_t flags; /* 17 */
321 uint8_t year; /* 18 */
322 uint8_t month; /* 19 */
323 uint8_t day; /* 20 */
324 uint8_t pad; /* 21 */
328 uint16_t channels; /* 4 */
350 struct ao_log_metrum {
352 uint8_t csum; /* 1 */
353 uint16_t tick; /* 2 */
357 uint16_t flight; /* 4 */
358 int16_t ground_accel; /* 6 */
359 uint32_t ground_pres; /* 8 */
360 uint32_t ground_temp; /* 12 */
364 uint16_t state; /* 4 */
365 uint16_t reason; /* 6 */
369 uint32_t pres; /* 4 */
370 uint32_t temp; /* 8 */
371 int16_t accel; /* 12 */
373 /* AO_LOG_TEMP_VOLT */
375 int16_t v_batt; /* 4 */
376 int16_t sense_a; /* 6 */
377 int16_t sense_m; /* 8 */
381 int32_t latitude; /* 4 */
382 int32_t longitude; /* 8 */
383 uint16_t altitude_low; /* 12 */
384 int16_t altitude_high; /* 14 */
386 /* AO_LOG_GPS_TIME */
388 uint8_t hour; /* 4 */
389 uint8_t minute; /* 5 */
390 uint8_t second; /* 6 */
391 uint8_t flags; /* 7 */
392 uint8_t year; /* 8 */
393 uint8_t month; /* 9 */
394 uint8_t day; /* 10 */
395 uint8_t pdop; /* 11 */
397 /* AO_LOG_GPS_SAT (up to three packets) */
399 uint8_t channels; /* 4 */
400 uint8_t more; /* 5 */
406 uint8_t raw[12]; /* 4 */
412 uint8_t csum; /* 1 */
413 uint16_t tick; /* 2 */
417 uint16_t flight; /* 4 */
419 uint32_t ground_pres; /* 8 */
423 uint16_t state; /* 4 */
424 uint16_t reason; /* 6 */
428 uint8_t pres[3]; /* 4 */
429 uint8_t temp[3]; /* 7 */
430 int16_t sense_a; /* 10 */
431 int16_t sense_m; /* 12 */
432 int16_t v_batt; /* 14 */
437 #define ao_log_pack24(dst,value) do { \
438 (dst)[0] = (value); \
439 (dst)[1] = (value) >> 8; \
440 (dst)[2] = (value) >> 16; \
445 uint8_t csum; /* 1 */
446 uint16_t tick; /* 2 */
450 uint16_t flight; /* 4 */
451 int16_t start_altitude; /* 6 */
452 int32_t start_latitude; /* 8 */
453 int32_t start_longitude; /* 12 */
455 /* AO_LOG_GPS_TIME */
457 int32_t latitude; /* 4 */
458 int32_t longitude; /* 8 */
459 uint16_t altitude_low; /* 12 */
460 uint8_t hour; /* 14 */
461 uint8_t minute; /* 15 */
462 uint8_t second; /* 16 */
463 uint8_t flags; /* 17 */
464 uint8_t year; /* 18 */
465 uint8_t month; /* 19 */
466 uint8_t day; /* 20 */
467 uint8_t course; /* 21 */
468 uint16_t ground_speed; /* 22 */
469 int16_t climb_rate; /* 24 */
470 uint8_t pdop; /* 26 */
471 uint8_t hdop; /* 27 */
472 uint8_t vdop; /* 28 */
473 uint8_t mode; /* 29 */
474 int16_t altitude_high; /* 30 */
478 uint16_t channels; /* 4 */
487 #define AO_CONFIG_CONFIG 1
488 #define AO_CONFIG_MAIN 2
489 #define AO_CONFIG_APOGEE 3
490 #define AO_CONFIG_LOCKOUT 4
491 #define AO_CONFIG_FREQUENCY 5
492 #define AO_CONFIG_RADIO_ENABLE 6
493 #define AO_CONFIG_ACCEL_CAL 7
494 #define AO_CONFIG_RADIO_CAL 8
495 #define AO_CONFIG_MAX_LOG 9
496 #define AO_CONFIG_IGNITE_MODE 10
497 #define AO_CONFIG_PAD_ORIENTATION 11
498 #define AO_CONFIG_SERIAL_NUMBER 12
499 #define AO_CONFIG_LOG_FORMAT 13
500 #define AO_CONFIG_MS5607_RESERVED 14
501 #define AO_CONFIG_MS5607_SENS 15
502 #define AO_CONFIG_MS5607_OFF 16
503 #define AO_CONFIG_MS5607_TCS 17
504 #define AO_CONFIG_MS5607_TCO 18
505 #define AO_CONFIG_MS5607_TREF 19
506 #define AO_CONFIG_MS5607_TEMPSENS 20
507 #define AO_CONFIG_MS5607_CRC 21
510 #define AO_LOG_FLIGHT 'F'
511 #define AO_LOG_SENSOR 'A'
512 #define AO_LOG_TEMP_VOLT 'T'
513 #define AO_LOG_DEPLOY 'D'
514 #define AO_LOG_STATE 'S'
515 #define AO_LOG_GPS_TIME 'G'
516 #define AO_LOG_GPS_LAT 'N'
517 #define AO_LOG_GPS_LON 'W'
518 #define AO_LOG_GPS_ALT 'H'
519 #define AO_LOG_GPS_SAT 'V'
520 #define AO_LOG_GPS_DATE 'Y'
521 #define AO_LOG_GPS_POS 'P'
523 #define AO_LOG_CONFIG 'c'
525 #define AO_GPS_NUM_SAT_MASK (0xf << 0)
526 #define AO_GPS_NUM_SAT_SHIFT (0)
528 #define AO_GPS_VALID (1 << 4)
529 #define AO_GPS_RUNNING (1 << 5)
530 #define AO_GPS_DATE_VALID (1 << 6)
531 #define AO_GPS_COURSE_VALID (1 << 7)
533 #define AO_LOG_FORMAT_UNKNOWN 0 /* unknown; altosui will have to guess */
534 #define AO_LOG_FORMAT_FULL 1 /* 8 byte typed log records */
535 #define AO_LOG_FORMAT_TINY 2 /* two byte state/baro records */
536 #define AO_LOG_FORMAT_TELEMETRY 3 /* 32 byte ao_telemetry records */
537 #define AO_LOG_FORMAT_TELESCIENCE 4 /* 32 byte typed telescience records */
538 #define AO_LOG_FORMAT_TELEMEGA 5 /* 32 byte typed telemega records */
539 #define AO_LOG_FORMAT_EASYMINI 6 /* 16-byte MS5607 baro only, 3.0V supply */
540 #define AO_LOG_FORMAT_TELEMETRUM 7 /* 16-byte typed telemetrum records */
541 #define AO_LOG_FORMAT_TELEMINI 8 /* 16-byte MS5607 baro only, 3.3V supply */
542 #define AO_LOG_FORMAT_TELEGPS 9 /* 32 byte telegps records */
543 #define AO_LOG_FORMAT_NONE 127 /* No log at all */
546 cc_mega_parse(const char *input_line, struct ao_log_mega *l);
553 /* Conversion functions */
555 cc_pressure_to_altitude(double pressure);
558 cc_altitude_to_pressure(double altitude);
561 cc_altitude_to_temperature(double altitude);
564 cc_barometer_to_pressure(double baro);
567 cc_barometer_to_altitude(double baro);
570 cc_accelerometer_to_acceleration(double accel, double ground_accel);
573 cc_thermometer_to_temperature(double thermo);
576 cc_battery_to_voltage(double battery);
579 cc_ignitor_to_voltage(double ignite);
582 cc_great_circle (double start_lat, double start_lon,
583 double end_lat, double end_lon,
584 double *dist, double *bearing);
587 cc_timedata_limits(struct cc_timedata *d, double min_time, double max_time, int *start, int *stop);
590 cc_timedata_min(struct cc_timedata *d, double min_time, double max_time);
593 cc_timedata_min_mag(struct cc_timedata *d, double min_time, double max_time);
596 cc_timedata_max(struct cc_timedata *d, double min_time, double max_time);
599 cc_timedata_max_mag(struct cc_timedata *d, double min_time, double max_time);
602 cc_timedata_average(struct cc_timedata *d, double min_time, double max_time);
605 cc_timedata_average_mag(struct cc_timedata *d, double min_time, double max_time);
608 cc_perioddata_limits(struct cc_perioddata *d, double min_time, double max_time, int *start, int *stop);
611 cc_perioddata_min(struct cc_perioddata *d, double min_time, double max_time);
614 cc_perioddata_min_mag(struct cc_perioddata *d, double min_time, double max_time);
617 cc_perioddata_max(struct cc_perioddata *d, double min_time, double max_time);
620 cc_perioddata_max_mag(struct cc_perioddata *d, double min_time, double max_time);
623 cc_perioddata_average(struct cc_perioddata *d, double min_time, double max_time);
626 cc_perioddata_average_mag(struct cc_perioddata *d, double min_time, double max_time);
629 cc_low_pass(double *data, int data_len, double omega_pass, double omega_stop, double error);
631 struct cc_perioddata *
632 cc_period_make(struct cc_timedata *td, double start_time, double stop_time);
634 struct cc_perioddata *
635 cc_period_low_pass(struct cc_perioddata *raw, double omega_pass, double omega_stop, double error);
638 cc_timedata_convert(struct cc_timedata *d, double (*f)(double v, double a), double a);
641 cc_timedata_integrate(struct cc_timedata *d, double min_time, double max_time);
643 struct cc_perioddata *
644 cc_perioddata_differentiate(struct cc_perioddata *i);
646 struct cc_flightcooked *
647 cc_flight_cook(struct cc_flightraw *raw);
650 cc_flightcooked_free(struct cc_flightcooked *cooked);