X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fao_telemetry.c;h=024ac6f8a4021a68f56de65c38f28366cd9751c3;hb=359681f23e2f71bc8f4975a4a76ae28c08ecab2e;hp=6556ce3215668e345c7e1512b389efec85160f9a;hpb=5ba75e95c98d3e441a58d6f75d328d579e1997fe;p=fw%2Faltos diff --git a/src/ao_telemetry.c b/src/ao_telemetry.c index 6556ce32..024ac6f8 100644 --- a/src/ao_telemetry.c +++ b/src/ao_telemetry.c @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Keith Packard + * Copyright © 2011 Keith Packard * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,6 +16,7 @@ */ #include "ao.h" +#include "ao_product.h" __xdata uint16_t ao_telemetry_interval = 0; __xdata uint8_t ao_rdf = 0; @@ -24,44 +25,85 @@ __xdata uint16_t ao_rdf_time; #define AO_RDF_INTERVAL_TICKS AO_SEC_TO_TICKS(5) #define AO_RDF_LENGTH_MS 500 +#if defined(TELEMETRUM_V_0_1) || defined(TELEMETRUM_V_0_2) || defined(TELEMETRUM_V_1_0) || defined(TELEMETRUM_V_1_1) +#define AO_TELEMETRY_SENSOR AO_TELEMETRY_SENSOR_TELEMETRUM +#endif + +#if defined(TELEMINI_V_0_1) +#define AO_TELEMETRY_SENSOR AO_TELEMETRY_SENSOR_TELEMINI +#endif + +#if defined(TELENANO_V_0_1) +#define AO_TELEMETRY_SENSOR AO_TELEMETRY_SENSOR_TELENANO +#endif + void ao_telemetry(void) { uint16_t time; int16_t delay; - static __xdata struct ao_telemetry telemetry; + static __xdata union ao_telemetry_all telemetry; + uint8_t sample; ao_config_get(); while (!ao_flight_number) ao_sleep(&ao_flight_number); - memcpy(telemetry.callsign, ao_config.callsign, AO_MAX_CALLSIGN); - telemetry.serial = ao_serial_number; - telemetry.flight = ao_log_full() ? 0 : ao_flight_number; - telemetry.accel_plus_g = ao_config.accel_plus_g; - telemetry.accel_minus_g = ao_config.accel_minus_g; + + telemetry.generic.serial = ao_serial_number; for (;;) { while (ao_telemetry_interval == 0) ao_sleep(&ao_telemetry_interval); time = ao_rdf_time = ao_time(); while (ao_telemetry_interval) { - telemetry.flight_state = ao_flight_state; + + /* Send sensor packet */ + sample = ao_sample_adc; + + telemetry.generic.tick = ao_adc_ring[sample].tick; + telemetry.generic.type = AO_TELEMETRY_SENSOR; + + telemetry.sensor.state = ao_flight_state; #if HAS_ACCEL - telemetry.flight_accel = ao_flight_accel; - telemetry.ground_accel = ao_ground_accel; - telemetry.flight_vel = ao_flight_vel; -#endif - telemetry.flight_pres = ao_flight_pres; - telemetry.ground_pres = ao_ground_pres; -#if HAS_ADC - ao_adc_get(&telemetry.adc); + telemetry.sensor.accel = ao_adc_ring[sample].accel; +#else + telemetry.sensor.accel = 0; #endif -#if HAS_GPS - ao_mutex_get(&ao_gps_mutex); - memcpy(&telemetry.gps, &ao_gps_data, sizeof (struct ao_gps_data)); - memcpy(&telemetry.gps_tracking, &ao_gps_tracking_data, sizeof (struct ao_gps_tracking_data)); - ao_mutex_put(&ao_gps_mutex); + telemetry.sensor.pres = ao_adc_ring[sample].pres; + telemetry.sensor.temp = ao_adc_ring[sample].temp; + telemetry.sensor.v_batt = ao_adc_ring[sample].v_batt; +#if HAS_IGNITE + telemetry.sensor.sense_d = ao_adc_ring[sample].sense_d; + telemetry.sensor.sense_m = ao_adc_ring[sample].sense_m; +#else + telemetry.sensor.sense_d = 0; + telemetry.sensor.sense_m = 0; #endif + + telemetry.sensor.acceleration = ao_accel; + telemetry.sensor.speed = ao_speed; + telemetry.sensor.height = ao_height; + + telemetry.sensor.ground_pres = ao_ground_pres; + telemetry.sensor.ground_accel = ao_ground_accel; + telemetry.sensor.accel_plus_g = ao_config.accel_plus_g; + telemetry.sensor.accel_minus_g = ao_config.accel_minus_g; + ao_radio_send(&telemetry, sizeof (telemetry)); + + telemetry.generic.type = AO_TELEMETRY_CONFIGURATION; + telemetry.configuration.device = AO_idProduct_NUMBER; + telemetry.configuration.flight = ao_flight_number; + telemetry.configuration.config_major = AO_CONFIG_MAJOR; + telemetry.configuration.config_minor = AO_CONFIG_MINOR; + telemetry.configuration.main_deploy = ao_config.main_deploy; + telemetry.configuration.flight_log_max = ao_config.flight_log_max; + memcpy (telemetry.configuration.callsign, + ao_config.callsign, + AO_MAX_CALLSIGN); + memcpy (telemetry.configuration.version, + ao_version, + AO_MAX_VERSION); + if (ao_rdf && (int16_t) (ao_time() - ao_rdf_time) >= 0) {