diff options
author | Bdale Garbee <bdale@gag.com> | 2014-02-20 13:23:52 -0700 |
---|---|---|
committer | Bdale Garbee <bdale@gag.com> | 2014-02-20 13:23:52 -0700 |
commit | 104b8bfc9b37fda175f2cb2a1e33601fbf6f48f6 (patch) | |
tree | 0b47c34e04f4db8bdd509699e9e5b72ed9d6c052 /src/core | |
parent | 403b95ee27782309b564855b85285c9f5f5c7068 (diff) | |
parent | 1edf7ef8026ac4ab698a7f99671e9348d18ffd0a (diff) |
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/ao_balloon.c | 136 | ||||
-rw-r--r-- | src/core/ao_log_metrum.c | 2 | ||||
-rw-r--r-- | src/core/ao_telemetry.c | 8 | ||||
-rw-r--r-- | src/core/ao_usb.h | 2 |
4 files changed, 148 insertions, 0 deletions
diff --git a/src/core/ao_balloon.c b/src/core/ao_balloon.c new file mode 100644 index 00000000..904a9c08 --- /dev/null +++ b/src/core/ao_balloon.c @@ -0,0 +1,136 @@ +/* + * Copyright © 2009 Keith Packard <keithp@keithp.com> + * + * 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. + */ + +#ifndef AO_FLIGHT_TEST +#include "ao.h" +#endif + +#ifndef HAS_ACCEL +#error Please define HAS_ACCEL +#endif + +#ifndef HAS_GPS +#error Please define HAS_GPS +#endif + +#ifndef HAS_USB +#error Please define HAS_USB +#endif + +#if HAS_SENSOR_ERRORS +/* Any sensor can set this to mark the flight computer as 'broken' */ +__xdata uint8_t ao_sensor_errors; +#endif + +__pdata uint16_t ao_motor_number; /* number of motors burned so far */ + +/* Main flight thread. */ + +__pdata enum ao_flight_state ao_flight_state; /* current flight state */ + +__pdata uint8_t ao_flight_force_idle; + +void +ao_flight(void) +{ + ao_sample_init(); + ao_flight_state = ao_flight_startup; + for (;;) { + + /* + * Process ADC samples, just looping + * until the sensors are calibrated. + */ + if (!ao_sample()) + continue; + + switch (ao_flight_state) { + case ao_flight_startup: + + /* Check to see what mode we should go to. + * - Invalid mode if accel cal appears to be out + * - pad mode if we're upright, + * - idle mode otherwise + */ + if (!ao_flight_force_idle) + { + /* Set pad mode - we can fly! */ + ao_flight_state = ao_flight_pad; +#if HAS_USB + /* Disable the USB controller in flight mode + * to save power + */ + if (!ao_usb_running) + ao_usb_disable(); +#endif + + /* Disable packet mode in pad state */ + ao_packet_slave_stop(); + + /* Turn on telemetry system */ + ao_rdf_set(1); + ao_telemetry_set_interval(AO_TELEMETRY_INTERVAL_BALLOON); + + /* signal successful initialization by turning off the LED */ + ao_led_off(AO_LED_RED); + } else { + /* Set idle mode */ + ao_flight_state = ao_flight_idle; + + /* signal successful initialization by turning off the LED */ + ao_led_off(AO_LED_RED); + } + /* wakeup threads due to state change */ + ao_wakeup(DATA_TO_XDATA(&ao_flight_state)); + + break; + case ao_flight_pad: + + /* pad to coast: + * + * barometer: > 20m vertical motion + */ + if (ao_height > AO_M_TO_HEIGHT(20)) + { + ao_flight_state = ao_flight_drogue; + + /* start logging data */ + ao_log_start(); + +#if HAS_GPS + /* Record current GPS position by waking up GPS log tasks */ + ao_gps_new = AO_GPS_NEW_DATA | AO_GPS_NEW_TRACKING; + ao_wakeup(&ao_gps_new); +#endif + + ao_wakeup(DATA_TO_XDATA(&ao_flight_state)); + } + break; + default: + break; + } + } +} + +static __xdata struct ao_task flight_task; + +void +ao_flight_init(void) +{ + ao_flight_state = ao_flight_startup; + ao_add_task(&flight_task, ao_flight, "flight"); +} diff --git a/src/core/ao_log_metrum.c b/src/core/ao_log_metrum.c index 91624d98..9b17adc2 100644 --- a/src/core/ao_log_metrum.c +++ b/src/core/ao_log_metrum.c @@ -116,7 +116,9 @@ ao_log(void) log.u.sensor.pres = ao_data_ring[ao_log_data_pos].ms5607_raw.pres; log.u.sensor.temp = ao_data_ring[ao_log_data_pos].ms5607_raw.temp; #endif +#if HAS_ACCEL log.u.sensor.accel = ao_data_accel(&ao_data_ring[ao_log_data_pos]); +#endif ao_log_metrum(&log); if (ao_log_state <= ao_flight_coast) next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT; diff --git a/src/core/ao_telemetry.c b/src/core/ao_telemetry.c index 5a00d825..a1c19185 100644 --- a/src/core/ao_telemetry.c +++ b/src/core/ao_telemetry.c @@ -187,7 +187,9 @@ ao_send_metrum_sensor(void) telemetry.generic.type = AO_TELEMETRY_METRUM_SENSOR; telemetry.metrum_sensor.state = ao_flight_state; +#if HAS_ACCEL telemetry.metrum_sensor.accel = ao_data_accel(packet); +#endif telemetry.metrum_sensor.pres = ao_data_pres(packet); telemetry.metrum_sensor.temp = ao_data_temp(packet); @@ -216,9 +218,15 @@ ao_send_metrum_data(void) telemetry.generic.type = AO_TELEMETRY_METRUM_DATA; telemetry.metrum_data.ground_pres = ao_ground_pres; +#if HAS_ACCEL telemetry.metrum_data.ground_accel = ao_ground_accel; telemetry.metrum_data.accel_plus_g = ao_config.accel_plus_g; telemetry.metrum_data.accel_minus_g = ao_config.accel_minus_g; +#else + telemetry.metrum_data.ground_accel = 1; + telemetry.metrum_data.accel_plus_g = 0; + telemetry.metrum_data.accel_minus_g = 2; +#endif ao_radio_send(&telemetry, sizeof (telemetry)); ao_telemetry_metrum_data_cur = ao_telemetry_metrum_data_max; diff --git a/src/core/ao_usb.h b/src/core/ao_usb.h index 35e64e65..1ce4f82f 100644 --- a/src/core/ao_usb.h +++ b/src/core/ao_usb.h @@ -137,4 +137,6 @@ struct ao_usb_line_coding { uint8_t data_bits; } ; +extern __pdata uint8_t ao_usb_running; + #endif /* _AO_USB_H_ */ |