diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/ao_log_big.c | 2 | ||||
| -rw-r--r-- | src/core/ao_telemetry.c | 2 | ||||
| -rw-r--r-- | src/teleballoon-v1.1/.gitignore | 2 | ||||
| -rw-r--r-- | src/teleballoon-v1.1/Makefile | 122 | ||||
| -rw-r--r-- | src/teleballoon-v1.1/ao_balloon.c | 155 | ||||
| -rw-r--r-- | src/teleballoon-v1.1/ao_pins.h | 220 | ||||
| -rw-r--r-- | src/teleballoon-v1.1/ao_teleballoon.c | 77 | 
7 files changed, 579 insertions, 1 deletions
| diff --git a/src/core/ao_log_big.c b/src/core/ao_log_big.c index 74d94c4b..43b3aa0c 100644 --- a/src/core/ao_log_big.c +++ b/src/core/ao_log_big.c @@ -65,9 +65,11 @@ static __data uint8_t	ao_log_adc_pos;  /* a hack to make sure that ao_log_records fill the eeprom block in even units */  typedef uint8_t check_log_size[1-(256 % sizeof(struct ao_log_record))] ; +#ifndef AO_SENSOR_INTERVAL_ASCENT  #define AO_SENSOR_INTERVAL_ASCENT	1  #define AO_SENSOR_INTERVAL_DESCENT	10  #define AO_OTHER_INTERVAL		32 +#endif  void  ao_log(void) diff --git a/src/core/ao_telemetry.c b/src/core/ao_telemetry.c index d909bea5..e66598d1 100644 --- a/src/core/ao_telemetry.c +++ b/src/core/ao_telemetry.c @@ -35,7 +35,7 @@ static __pdata 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) +#if defined(TELEMETRUM_V_0_1) || defined(TELEMETRUM_V_0_2) || defined(TELEMETRUM_V_1_0) || defined(TELEMETRUM_V_1_1) || defined(TELEBALLOON_V_1_1)  #define AO_TELEMETRY_SENSOR	AO_TELEMETRY_SENSOR_TELEMETRUM  #endif diff --git a/src/teleballoon-v1.1/.gitignore b/src/teleballoon-v1.1/.gitignore new file mode 100644 index 00000000..21b236c0 --- /dev/null +++ b/src/teleballoon-v1.1/.gitignore @@ -0,0 +1,2 @@ +teleballoon-* +ao_product.h diff --git a/src/teleballoon-v1.1/Makefile b/src/teleballoon-v1.1/Makefile new file mode 100644 index 00000000..89471cf4 --- /dev/null +++ b/src/teleballoon-v1.1/Makefile @@ -0,0 +1,122 @@ +# +# TeleBalloon build file +# +# The various telemetrum versions differ only +# in which flash and GPS drivers are included, +# so the per-board makefiles simply define +# TM_VER, TM_DEF, TM_INC and TM_SRC and include +# this file + +TELEBALLOON_VER=1.1 +TELEBALLOON_DEF=1_1 + +TELEBALLOON_INC = + +TELEBALLOON_SRC = \ +	ao_companion.c \ +	ao_gps_skytraq.c \ +	ao_m25.c + +vpath %.c ..:../core:../cc1111:../drivers:../product:. +vpath %.h ..:../core:../cc1111:../drivers:../product:. +vpath ao-make-product.5c ../util + +ifndef VERSION +include ../Version +endif + +INC = \ +	ao.h \ +	ao_pins.h \ +	cc1111.h \ +	altitude.h \ +	ao_kalman.h \ +	ao_product.h \ +	$(TELEBALLOON_INC) + +CORE_SRC = \ +	ao_cmd.c \ +	ao_config.c \ +	ao_convert.c \ +	ao_gps_report.c \ +	ao_mutex.c \ +	ao_panic.c \ +	ao_stdio.c \ +	ao_storage.c \ +	ao_task.c \ +	ao_balloon.c \ +	ao_sample.c \ +	ao_kalman.c \ +	ao_log.c \ +	ao_log_big.c \ +	ao_report.c \ +	ao_telemetry.c + +CC1111_SRC = \ +	ao_adc.c \ +	ao_beep.c \ +	ao_dbg.c \ +	ao_dma.c \ +	ao_led.c \ +	ao_packet.c \ +	ao_packet_slave.c \ +	ao_radio.c \ +	ao_romconfig.c \ +	ao_serial.c \ +	ao_string.c \ +	ao_spi.c \ +	ao_timer.c \ +	ao_usb.c \ +	_bp.c + +DRIVER_SRC = \ +	$(TELEBALLOON_SRC) + +PRODUCT_SRC = \ +	ao_teleballoon.c + +SRC = \ +	$(CORE_SRC) \ +	$(CC1111_SRC) \ +	$(DRIVER_SRC) \ +	$(PRODUCT_SRC) + +PROG = teleballoon-v$(TELEBALLOON_VER)-$(VERSION).ihx +PRODUCT=TeleBalloon-v$(TELEBALLOON_VER) +PRODUCT_DEF=-DTELEBALLOON_V_$(TELEBALLOON_DEF) +IDPRODUCT=0x000b + +include ../cc1111/Makefile.cc1111 + +NICKLE=nickle +CHECK_STACK=sh ../util/check-stack + +V=0 +# The user has explicitly enabled quiet compilation. +ifeq ($(V),0) +quiet = @printf "  $1 $2 $@\n"; $($1) +endif +# Otherwise, print the full command line. +quiet ?= $($1) + +all: ../$(PROG) + +../$(PROG): $(REL) Makefile +	$(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(REL) && cp $(PROG) $(PMAP) .. +	$(call quiet,CHECK_STACK) ../cc1111/ao_arch.h $(PMEM) + +ao_product.h: ao-make-product.5c ../Version +	$(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ + +distclean:	clean + +clean: +	rm -f $(ADB) $(ASM) $(LNK) $(LST) $(REL) $(RST) $(SYM) +	rm -f $(PROG) $(PCDB) $(PLNK) $(PMAP) $(PMEM) $(PAOM) +	rm -f ao_product.h +	rm -f ../$(PROG) ../$(PMAP) + +install: + +uninstall: + diff --git a/src/teleballoon-v1.1/ao_balloon.c b/src/teleballoon-v1.1/ao_balloon.c new file mode 100644 index 00000000..08a3ae1e --- /dev/null +++ b/src/teleballoon-v1.1/ao_balloon.c @@ -0,0 +1,155 @@ +/* + * 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 + +/* 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 HAS_ACCEL +			if (ao_config.accel_plus_g == 0 || +			    ao_config.accel_minus_g == 0 || +			    ao_ground_accel < ao_config.accel_plus_g - ACCEL_NOSE_UP || +			    ao_ground_accel > ao_config.accel_minus_g + ACCEL_NOSE_UP) +			{ +				/* Detected an accel value outside -1.5g to 1.5g +				 * (or uncalibrated values), so we go into invalid mode +				 */ +				ao_flight_state = ao_flight_invalid; + +				/* Turn on packet system in invalid mode on TeleMetrum */ +				ao_packet_slave_start(); +			} else +#endif +				if (!ao_flight_force_idle +#if HAS_ACCEL +				    && ao_ground_accel < ao_config.accel_plus_g + ACCEL_NOSE_UP +#endif +					) + 			{ +				/* 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 +				 */ +				ao_usb_disable(); +#endif + +#if !HAS_ACCEL +				/* Disable packet mode in pad state on TeleMini */ +				ao_packet_slave_stop(); +#endif + +				/* 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; +  +#if HAS_ACCEL +				/* Turn on packet system in idle mode on TeleMetrum */ +				ao_packet_slave_start(); +#endif + +				/* 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_wakeup(&ao_gps_data); +				ao_wakeup(&ao_gps_tracking_data); +#endif + +				ao_wakeup(DATA_TO_XDATA(&ao_flight_state)); +			} +			break; +		case ao_flight_drogue: +			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/teleballoon-v1.1/ao_pins.h b/src/teleballoon-v1.1/ao_pins.h new file mode 100644 index 00000000..a96c6f2b --- /dev/null +++ b/src/teleballoon-v1.1/ao_pins.h @@ -0,0 +1,220 @@ +/* + * Copyright © 2010 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_PINS_H_ +#define _AO_PINS_H_ + +#if defined(TELEBALLOON_V_1_1) + +	#define AO_SENSOR_INTERVAL_ASCENT	AO_MS_TO_TICKS(1000) +	#define AO_SENSOR_INTERVAL_DESCENT	AO_MS_TO_TICKS(1000) +	#define AO_OTHER_INTERVAL		AO_MS_TO_TICKS(1000) +	#define AO_TELEMETRY_INTERVAL_BALLOON	AO_MS_TO_TICKS(1000) + +	#define HAS_FLIGHT		1 +	#define HAS_USB			1 +	#define HAS_BEEP		1 +	#define HAS_GPS			1 +	#define HAS_SERIAL_1		1 +	#define USE_SERIAL_STDIN	0 +	#define HAS_ADC			1 +	#define HAS_EEPROM		1 +	#define HAS_LOG			1 +	#define USE_INTERNAL_FLASH	0 +	#define HAS_DBG			1 +	#define DBG_ON_P1 		1 +	#define DBG_ON_P0 		0 +	#define IGNITE_ON_P2		1 +	#define IGNITE_ON_P0		0 +	#define PACKET_HAS_MASTER	0 +	#define PACKET_HAS_SLAVE	1 + +	#define HAS_COMPANION		1 +	#define COMPANION_CS_ON_P1	1 +	#define COMPANION_CS_MASK	0x4	/* CS1 is P1_2 */ +	#define COMPANION_CS		P1_2 + +	#define AO_LED_RED		1 +	#define LEDS_AVAILABLE		(AO_LED_RED) +	#define HAS_EXTERNAL_TEMP	0 +	#define HAS_ACCEL_REF		1 +	#define SPI_CS_ON_P1		1 +	#define SPI_CS_ON_P0		0 +	#define M25_CS_MASK		0x02	/* CS0 is P1_1 */ +	#define M25_MAX_CHIPS		1 +	#define HAS_ACCEL		1 +	#define HAS_IGNITE		0 +	#define HAS_MONITOR		0 +#endif + +#if DBG_ON_P1 + +	#define DBG_CLOCK	(1 << 4)	/* mi0 */ +	#define DBG_DATA	(1 << 5)	/* mo0 */ +	#define DBG_RESET_N	(1 << 3)	/* c0 */ + +	#define DBG_CLOCK_PIN	(P1_4) +	#define DBG_DATA_PIN	(P1_5) +	#define DBG_RESET_N_PIN	(P1_3) + +	#define DBG_PORT_NUM	1 +	#define DBG_PORT	P1 +	#define DBG_PORT_SEL	P1SEL +	#define DBG_PORT_INP	P1INP +	#define DBG_PORT_DIR	P1DIR + +#endif /* DBG_ON_P1 */ + +#if DBG_ON_P0 + +	#define DBG_CLOCK	(1 << 3) +	#define DBG_DATA	(1 << 4) +	#define DBG_RESET_N	(1 << 5) + +	#define DBG_CLOCK_PIN	(P0_3) +	#define DBG_DATA_PIN	(P0_4) +	#define DBG_RESET_N_PIN	(P0_5) + +	#define DBG_PORT_NUM	0 +	#define DBG_PORT	P0 +	#define DBG_PORT_SEL	P0SEL +	#define DBG_PORT_INP	P0INP +	#define DBG_PORT_DIR	P0DIR + +#endif /* DBG_ON_P0 */ + +#if COMPANION_CS_ON_P1 +	#define COMPANION_CS_PORT	P1 +	#define COMPANION_CS_SEL	P1SEL +	#define COMPANION_CS_DIR	P1DIR +#endif + +#if SPI_CS_ON_P1 +	#define SPI_CS_PORT	P1 +	#define SPI_CS_SEL	P1SEL +	#define SPI_CS_DIR	P1DIR +#endif + +#if SPI_CS_ON_P0 +	#define SPI_CS_PORT	P0 +	#define SPI_CS_SEL	P0SEL +	#define SPI_CS_DIR	P0DIR +#endif + +#ifndef IGNITE_ON_P2 +#error Please define IGNITE_ON_P2 +#endif + +#ifndef IGNITE_ON_P0 +#error Please define IGNITE_ON_P0 +#endif + +#ifndef HAS_SERIAL_1 +#error Please define HAS_SERIAL_1 +#endif + +#ifndef USE_SERIAL_STDIN +#error Please define USE_SERIAL_STDIN +#endif + +#ifndef HAS_ADC +#error Please define HAS_ADC +#endif + +#ifndef HAS_EEPROM +#error Please define HAS_EEPROM +#endif + +#ifndef HAS_LOG +#error Please define HAS_LOG +#endif + +#if HAS_EEPROM +#ifndef USE_INTERNAL_FLASH +#error Please define USE_INTERNAL_FLASH +#endif +#endif + +#ifndef HAS_DBG +#error Please define HAS_DBG +#endif + +#ifndef HAS_IGNITE +#error Please define HAS_IGNITE +#endif + +#if HAS_IGNITE +#define HAS_IGNITE_REPORT 1 +#endif + +#ifndef PACKET_HAS_MASTER +#error Please define PACKET_HAS_MASTER +#endif + +#ifndef PACKET_HAS_SLAVE +#error Please define PACKET_HAS_SLAVE +#endif + +#ifndef HAS_MONITOR +#error Please define HAS_MONITOR +#endif + +#if HAS_MONITOR +#ifndef HAS_RSSI +#error Please define HAS_RSSI +#endif +#endif + +#ifndef HAS_ADC +#error Please define HAS_ADC +#endif + +#if HAS_ADC + +#if HAS_ACCEL +#ifndef HAS_ACCEL_REF +#error Please define HAS_ACCEL_REF +#endif +#else +#define HAS_ACCEL_REF 0 +#endif + +#endif /* HAS_ADC */ + +#if IGNITE_ON_P2 +#define AO_IGNITER_DROGUE	P2_3 +#define AO_IGNITER_MAIN		P2_4 +#define AO_IGNITER_DIR		P2DIR +#define AO_IGNITER_DROGUE_BIT	(1 << 3) +#define AO_IGNITER_MAIN_BIT	(1 << 4) +#endif + +#if IGNITE_ON_P0 +#define AO_IGNITER_DROGUE	P0_5 +#define AO_IGNITER_MAIN		P0_4 +#define AO_IGNITER_DIR		P0DIR +#define AO_IGNITER_DROGUE_BIT	(1 << 5) +#define AO_IGNITER_MAIN_BIT	(1 << 4) +#endif + +/* test these values with real igniters */ +#define AO_IGNITER_OPEN		1000 +#define AO_IGNITER_CLOSED	7000 +#define AO_IGNITER_FIRE_TIME	AO_MS_TO_TICKS(50) +#define AO_IGNITER_CHARGE_TIME	AO_MS_TO_TICKS(2000) + +#endif /* _AO_PINS_H_ */ diff --git a/src/teleballoon-v1.1/ao_teleballoon.c b/src/teleballoon-v1.1/ao_teleballoon.c new file mode 100644 index 00000000..a48e21d2 --- /dev/null +++ b/src/teleballoon-v1.1/ao_teleballoon.c @@ -0,0 +1,77 @@ +/* + * 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. + */ + +#include "ao.h" +#include "ao_pins.h" + +void +ao_ignite_set_pins(void) +{ +	AO_IGNITER_DROGUE = 0; +	AO_IGNITER_MAIN = 0; +	AO_IGNITER_DIR |= AO_IGNITER_DROGUE_BIT | AO_IGNITER_MAIN_BIT; +} + +void +main(void) +{ +	/* +	 * Reduce the transient on the ignite pins at startup by +	 * pulling the pins low as soon as possible at power up +	 */ +	ao_ignite_set_pins(); + +	ao_clock_init(); + +	/* Turn on the red LED until the system is stable */ +	ao_led_init(LEDS_AVAILABLE); +	ao_led_on(AO_LED_RED); + +	/* A hack -- look at the SPI clock pin, if it's sitting at +	 *  ground, then we force the computer to idle mode instead of +	 *  flight mode +	 */ +	if (P1_3 == 0) { +		ao_flight_force_idle = 1; +		while (P1_3 == 0) +			; +	} +	ao_timer_init(); +	ao_adc_init(); +	ao_beep_init(); +	ao_cmd_init(); +	ao_spi_init(); +	ao_storage_init(); +	ao_flight_init(); +	ao_log_init(); +	ao_report_init(); +	ao_usb_init(); +	ao_serial_init(); +	ao_gps_init(); +	ao_gps_report_init(); +	ao_telemetry_init(); +	ao_radio_init(); +	ao_packet_slave_init(FALSE); +#if HAS_DBG +	ao_dbg_init(); +#endif +#if HAS_COMPANION +	ao_companion_init(); +#endif +	ao_config_init(); +	ao_start_scheduler(); +} | 
