From 8950df02382f5f0aea5bac078fdf7134b98c43ed Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 19 Mar 2011 23:46:18 -0700 Subject: [PATCH] altos: Split out tiny telemetry from full telemetry The TeleMini and TeleNano boards do not have either GPS or accelermeters, and they also run the kalman filter which produces standard unit measurements for the flight height/speed/accel values. This makes the telemetry significantly different. ao_telemetry_tiny.c sends the required data. Note that TeleNano sends the same telemetry as telemini at this point; there are a couple of values which are not useful, but the overhead of sending them is small enough that the hassle of having three telemetry formats seemed excessive. Signed-off-by: Keith Packard --- src/Makefile.proto | 4 +- src/ao.h | 21 ++++++++++ src/ao_telemetry_tiny.c | 91 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 src/ao_telemetry_tiny.c diff --git a/src/Makefile.proto b/src/Makefile.proto index df514cfe..eabd17b9 100644 --- a/src/Makefile.proto +++ b/src/Makefile.proto @@ -176,7 +176,7 @@ TMINI_TASK_SRC = \ ao_log.c \ ao_log_tiny.c \ ao_report.c \ - ao_telemetry.c + ao_telemetry_tiny.c TMINI_MAIN_SRC = \ ao_telemini.c @@ -204,7 +204,7 @@ TNANO_TASK_SRC = \ ao_log.c \ ao_log_tiny.c \ ao_report.c \ - ao_telemetry.c + ao_telemetry_tiny.c TNANO_MAIN_SRC = \ ao_telemini.c diff --git a/src/ao.h b/src/ao.h index 075ec63a..0ba98dbd 100644 --- a/src/ao.h +++ b/src/ao.h @@ -925,6 +925,18 @@ struct ao_telemetry { struct ao_gps_tracking_data gps_tracking; }; +struct ao_telemetry_tiny { + uint16_t serial; + uint16_t flight; + uint8_t flight_state; + int16_t height; /* AGL in meters */ + int16_t speed; /* in m/s * 16 */ + int16_t accel; /* in m/s² * 16 */ + int16_t ground_pres; /* sensor units */ + struct ao_adc adc; /* raw ADC readings */ + char callsign[AO_MAX_CALLSIGN]; +}; + /* * ao_radio_recv tacks on rssi and status bytes */ @@ -934,6 +946,12 @@ struct ao_telemetry_recv { uint8_t status; }; +struct ao_telemetry_tiny_recv { + struct ao_telemetry_tiny telemetry_tiny; + int8_t rssi; + uint8_t status; +}; + /* Set delay between telemetry reports (0 to disable) */ #define AO_TELEMETRY_INTERVAL_PAD AO_MS_TO_TICKS(1000) @@ -949,6 +967,9 @@ ao_rdf_set(uint8_t rdf); void ao_telemetry_init(void); +void +ao_telemetry_tiny_init(void); + /* * ao_radio.c */ diff --git a/src/ao_telemetry_tiny.c b/src/ao_telemetry_tiny.c new file mode 100644 index 00000000..83ba7fc0 --- /dev/null +++ b/src/ao_telemetry_tiny.c @@ -0,0 +1,91 @@ +/* + * Copyright © 2009 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 + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" + +__xdata uint8_t ao_rdf = 0; +__xdata uint16_t ao_rdf_time; +__xdata uint16_t ao_telemetry_tiny_interval = 0; + +#define AO_RDF_INTERVAL_TICKS AO_SEC_TO_TICKS(5) +#define AO_RDF_LENGTH_MS 500 + +void +ao_telemetry_tiny(void) +{ + uint16_t time; + int16_t delay; + static __xdata struct ao_telemetry_tiny telemetry_tiny; + + ao_config_get(); + while (!ao_flight_number) + ao_sleep(&ao_flight_number); + memcpy(telemetry_tiny.callsign, ao_config.callsign, AO_MAX_CALLSIGN); + telemetry_tiny.serial = ao_serial_number; + telemetry_tiny.flight = ao_log_full() ? 0 : ao_flight_number; + for (;;) { + while (ao_telemetry_tiny_interval == 0) + ao_sleep(&ao_telemetry_tiny_interval); + time = ao_rdf_time = ao_time(); + while (ao_telemetry_tiny_interval) { + telemetry_tiny.flight_state = ao_flight_state; + telemetry_tiny.height = ao_k_height >> 16; + telemetry_tiny.speed = ao_k_speed >> 12; + telemetry_tiny.accel = ao_k_accel >> 12; + telemetry_tiny.ground_pres = ao_ground_pres; + ao_adc_get(&telemetry_tiny.adc); + ao_radio_send(&telemetry_tiny, sizeof (telemetry_tiny)); + if (ao_rdf && + (int16_t) (ao_time() - ao_rdf_time) >= 0) + { + ao_rdf_time = ao_time() + AO_RDF_INTERVAL_TICKS; + ao_radio_rdf(AO_RDF_LENGTH_MS); + } + time += ao_telemetry_tiny_interval; + delay = time - ao_time(); + if (delay > 0) + ao_delay(delay); + else + time = ao_time(); + } + } +} + +void +ao_telemetry_set_interval(uint16_t interval) +{ + ao_telemetry_tiny_interval = interval; + ao_wakeup(&ao_telemetry_tiny_interval); +} + +void +ao_rdf_set(uint8_t rdf) +{ + ao_rdf = rdf; + if (rdf == 0) + ao_radio_rdf_abort(); + else + ao_rdf_time = ao_time(); +} + +__xdata struct ao_task ao_telemetry_tiny_task; + +void +ao_telemetry_tiny_init() +{ + ao_add_task(&ao_telemetry_tiny_task, ao_telemetry_tiny, "telemetry_tiny"); +} -- 2.30.2