diff options
| author | Keith Packard <keithp@keithp.com> | 2013-05-21 11:16:54 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2013-05-21 11:16:54 -0700 | 
| commit | fd5567882b732f8947b44b217552077c82a3d28e (patch) | |
| tree | 291a07d2c1f0586c238f29389abc881096e27c5f /src/core | |
| parent | fd55c1fe53adf5c50dcd3ce8296f80871cec73e9 (diff) | |
| parent | 57b4d82dee10b142b820aa306028a288a85214f6 (diff) | |
Merge branch 'lpc'
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ao.h | 7 | ||||
| -rw-r--r-- | src/core/ao_adc.h | 4 | ||||
| -rw-r--r-- | src/core/ao_data.c | 34 | ||||
| -rw-r--r-- | src/core/ao_data.h | 4 | ||||
| -rw-r--r-- | src/core/ao_flight.c | 2 | ||||
| -rw-r--r-- | src/core/ao_log.h | 38 | ||||
| -rw-r--r-- | src/core/ao_log_mini.c | 163 | ||||
| -rw-r--r-- | src/core/ao_log_tiny.c | 2 | ||||
| -rw-r--r-- | src/core/ao_usb.h | 3 | 
9 files changed, 251 insertions, 6 deletions
| diff --git a/src/core/ao.h b/src/core/ao.h index 71bfb6a1..7f344736 100644 --- a/src/core/ao.h +++ b/src/core/ao.h @@ -43,6 +43,12 @@  #define HAS_TASK	1  #endif +#ifndef AO_PORT_TYPE +#define AO_PORT_TYPE uint8_t +#endif + +typedef AO_PORT_TYPE ao_port_t; +  #if HAS_TASK  #include <ao_task.h>  #else @@ -68,6 +74,7 @@  #define AO_PANIC_SPI		13	/* SPI communication failure */  #define AO_PANIC_CRASH		14	/* Processor crashed */  #define AO_PANIC_BUFIO		15	/* Mis-using bufio API */ +#define AO_PANIC_EXTI		16	/* Mis-using exti API */  #define AO_PANIC_SELF_TEST_CC1120	0x40 | 1	/* Self test failure */  #define AO_PANIC_SELF_TEST_HMC5883	0x40 | 2	/* Self test failure */  #define AO_PANIC_SELF_TEST_MPU6000	0x40 | 3	/* Self test failure */ diff --git a/src/core/ao_adc.h b/src/core/ao_adc.h index 0dd87080..373db1c4 100644 --- a/src/core/ao_adc.h +++ b/src/core/ao_adc.h @@ -28,10 +28,6 @@ ao_adc_poll(void);  void  ao_adc_sleep(void); -/* Get a copy of the last complete sample set */ -void -ao_data_get(__xdata struct ao_data *packet); -  /* Initialize the A/D converter */  void  ao_adc_init(void); diff --git a/src/core/ao_data.c b/src/core/ao_data.c new file mode 100644 index 00000000..38d2f7ff --- /dev/null +++ b/src/core/ao_data.c @@ -0,0 +1,34 @@ +/* + * Copyright © 2012 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_data.h> + +volatile __xdata struct ao_data	ao_data_ring[AO_DATA_RING]; +volatile __data uint8_t		ao_data_head; +volatile __data uint8_t		ao_data_present; + +void +ao_data_get(__xdata struct ao_data *packet) +{ +#if HAS_FLIGHT +	uint8_t	i = ao_data_ring_prev(ao_sample_data); +#else +	uint8_t	i = ao_data_ring_prev(ao_data_head); +#endif +	memcpy(packet, (void *) &ao_data_ring[i], sizeof (struct ao_data)); +} diff --git a/src/core/ao_data.h b/src/core/ao_data.h index 7e2f85d8..b0f086f8 100644 --- a/src/core/ao_data.h +++ b/src/core/ao_data.h @@ -82,6 +82,10 @@ struct ao_data {  #define ao_data_ring_next(n)	(((n) + 1) & (AO_DATA_RING - 1))  #define ao_data_ring_prev(n)	(((n) - 1) & (AO_DATA_RING - 1)) +/* Get a copy of the last complete sample set */ +void +ao_data_get(__xdata struct ao_data *packet); +  extern volatile __xdata struct ao_data	ao_data_ring[AO_DATA_RING];  extern volatile __data uint8_t		ao_data_head;  extern volatile __data uint8_t		ao_data_present; diff --git a/src/core/ao_flight.c b/src/core/ao_flight.c index 9d9d4c6e..782e2274 100644 --- a/src/core/ao_flight.c +++ b/src/core/ao_flight.c @@ -124,7 +124,7 @@ ao_flight(void)  				ao_usb_disable();  #endif -#if !HAS_ACCEL +#if !HAS_ACCEL && PACKET_HAS_SLAVE  				/* Disable packet mode in pad state on TeleMini */  				ao_packet_slave_stop();  #endif diff --git a/src/core/ao_log.h b/src/core/ao_log.h index a68a40dd..95b37649 100644 --- a/src/core/ao_log.h +++ b/src/core/ao_log.h @@ -44,6 +44,7 @@ extern __pdata enum ao_flight_state ao_log_state;  #define AO_LOG_FORMAT_TELEMETRY		3	/* 32 byte ao_telemetry records */  #define AO_LOG_FORMAT_TELESCIENCE	4	/* 32 byte typed telescience records */  #define AO_LOG_FORMAT_TELEMEGA		5	/* 32 byte typed telemega records */ +#define AO_LOG_FORMAT_MINI		6	/* 16-byte MS5607 baro only */  #define AO_LOG_FORMAT_NONE		127	/* No log at all */  extern __code uint8_t ao_log_format; @@ -261,6 +262,40 @@ struct ao_log_mega {  	} u;  }; +struct ao_log_mini { +	char		type;				/* 0 */ +	uint8_t		csum;				/* 1 */ +	uint16_t	tick;				/* 2 */ +	union {						/* 4 */ +		/* AO_LOG_FLIGHT */ +		struct { +			uint16_t	flight;		/* 4 */ +			uint16_t	r6; +			uint32_t	ground_pres;	/* 8 */ +		} flight; +		/* AO_LOG_STATE */ +		struct { +			uint16_t	state;		/* 4 */ +			uint16_t	reason;		/* 6 */ +		} state; +		/* AO_LOG_SENSOR */ +		struct { +			uint8_t		pres[3];	/* 4 */ +			uint8_t		temp[3];	/* 7 */ +			int16_t		sense_a;	/* 10 */ +			int16_t		sense_m;	/* 12 */ +			int16_t		v_batt;		/* 14 */ +		} sensor;				/* 16 */ +	} u;						/* 16 */ +};							/* 16 */ + +static inline void +ao_log_pack24(uint8_t *dst, uint32_t value) { +	dst[0] = value; +	dst[1] = value >> 8; +	dst[2] = value >> 16; +} +  /* Write a record to the eeprom log */  uint8_t  ao_log_data(__xdata struct ao_log_record *log) __reentrant; @@ -268,6 +303,9 @@ ao_log_data(__xdata struct ao_log_record *log) __reentrant;  uint8_t  ao_log_mega(__xdata struct ao_log_mega *log) __reentrant; +uint8_t +ao_log_mini(__xdata struct ao_log_mini *log) __reentrant; +  void  ao_log_flush(void); diff --git a/src/core/ao_log_mini.c b/src/core/ao_log_mini.c new file mode 100644 index 00000000..1273b0e3 --- /dev/null +++ b/src/core/ao_log_mini.c @@ -0,0 +1,163 @@ +/* + * Copyright © 2012 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_log.h> +#include <ao_data.h> +#include <ao_flight.h> + +static __xdata uint8_t	ao_log_mutex; +static __xdata struct ao_log_mini log; + +__code uint8_t ao_log_format = AO_LOG_FORMAT_MINI; + +static uint8_t +ao_log_csum(__xdata uint8_t *b) __reentrant +{ +	uint8_t	sum = 0x5a; +	uint8_t	i; + +	for (i = 0; i < sizeof (struct ao_log_mini); i++) +		sum += *b++; +	return -sum; +} + +uint8_t +ao_log_mini(__xdata struct ao_log_mini *log) __reentrant +{ +	uint8_t wrote = 0; +	/* set checksum */ +	log->csum = 0; +	log->csum = ao_log_csum((__xdata uint8_t *) log); +	ao_mutex_get(&ao_log_mutex); { +		if (ao_log_current_pos >= ao_log_end_pos && ao_log_running) +			ao_log_stop(); +		if (ao_log_running) { +			wrote = 1; +			ao_storage_write(ao_log_current_pos, +					 log, +					 sizeof (struct ao_log_mini)); +			ao_log_current_pos += sizeof (struct ao_log_mini); +		} +	} ao_mutex_put(&ao_log_mutex); +	return wrote; +} + +static uint8_t +ao_log_dump_check_data(void) +{ +	if (ao_log_csum((uint8_t *) &log) != 0) +		return 0; +	return 1; +} + +static __data uint8_t	ao_log_data_pos; + +/* a hack to make sure that ao_log_minis fill the eeprom block in even units */ +typedef uint8_t check_log_size[1-(256 % sizeof(struct ao_log_mini))] ; + +#ifndef AO_SENSOR_INTERVAL_ASCENT +#define AO_SENSOR_INTERVAL_ASCENT	1 +#define AO_SENSOR_INTERVAL_DESCENT	10 +#endif + +void +ao_log(void) +{ +	__pdata uint16_t	next_sensor, next_other; +	uint8_t			i; + +	ao_storage_setup(); + +	ao_log_scan(); + +	while (!ao_log_running) +		ao_sleep(&ao_log_running); + +#if HAS_FLIGHT +	log.type = AO_LOG_FLIGHT; +	log.tick = ao_sample_tick; +	log.u.flight.flight = ao_flight_number; +	log.u.flight.ground_pres = ao_ground_pres; +	ao_log_mini(&log); +#endif + +	/* Write the whole contents of the ring to the log +	 * when starting up. +	 */ +	ao_log_data_pos = ao_data_ring_next(ao_data_head); +	next_other = next_sensor = ao_data_ring[ao_log_data_pos].tick; +	ao_log_state = ao_flight_startup; +	for (;;) { +		/* Write samples to EEPROM */ +		while (ao_log_data_pos != ao_data_head) { +			log.tick = ao_data_ring[ao_log_data_pos].tick; +			if ((int16_t) (log.tick - next_sensor) >= 0) { +				log.type = AO_LOG_SENSOR; +				ao_log_pack24(log.u.sensor.pres, +					      ao_data_ring[ao_log_data_pos].ms5607_raw.pres); +				ao_log_pack24(log.u.sensor.temp, +					      ao_data_ring[ao_log_data_pos].ms5607_raw.temp); +				log.u.sensor.sense_a = ao_data_ring[ao_log_data_pos].adc.sense_a; +				log.u.sensor.sense_m = ao_data_ring[ao_log_data_pos].adc.sense_m; +				log.u.sensor.v_batt = ao_data_ring[ao_log_data_pos].adc.v_batt; +				ao_log_mini(&log); +				if (ao_log_state <= ao_flight_coast) +					next_sensor = log.tick + AO_SENSOR_INTERVAL_ASCENT; +				else +					next_sensor = log.tick + AO_SENSOR_INTERVAL_DESCENT; +			} +			ao_log_data_pos = ao_data_ring_next(ao_log_data_pos); +		} +#if HAS_FLIGHT +		/* Write state change to EEPROM */ +		if (ao_flight_state != ao_log_state) { +			ao_log_state = ao_flight_state; +			log.type = AO_LOG_STATE; +			log.tick = ao_time(); +			log.u.state.state = ao_log_state; +			log.u.state.reason = 0; +			ao_log_mini(&log); + +			if (ao_log_state == ao_flight_landed) +				ao_log_stop(); +		} +#endif + +		ao_log_flush(); + +		/* Wait for a while */ +		ao_delay(AO_MS_TO_TICKS(100)); + +		/* Stop logging when told to */ +		while (!ao_log_running) +			ao_sleep(&ao_log_running); +	} +} + +uint16_t +ao_log_flight(uint8_t slot) +{ +	if (!ao_storage_read(ao_log_pos(slot), +			     &log, +			     sizeof (struct ao_log_mini))) +		return 0; + +	if (ao_log_dump_check_data() && log.type == AO_LOG_FLIGHT) +		return log.u.flight.flight; +	return 0; +} diff --git a/src/core/ao_log_tiny.c b/src/core/ao_log_tiny.c index 492658ea..67767dc9 100644 --- a/src/core/ao_log_tiny.c +++ b/src/core/ao_log_tiny.c @@ -105,7 +105,7 @@ ao_log(void)  		 */  		ao_sleep(DATA_TO_XDATA(&ao_sample_data));  		while (ao_log_data != ao_sample_data) { -			sum += ao_data_ring[ao_log_data].adc.pres; +			sum += ao_data_pres(&ao_data_ring[ao_log_data]);  			count++;  			ao_log_data = ao_data_ring_next(ao_log_data);  		} diff --git a/src/core/ao_usb.h b/src/core/ao_usb.h index 6bc77608..35e64e65 100644 --- a/src/core/ao_usb.h +++ b/src/core/ao_usb.h @@ -102,8 +102,11 @@ extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];  #define AO_USB_INT_EP		1  #define AO_USB_INT_SIZE		8 +#ifndef AO_USB_OUT_EP  #define AO_USB_OUT_EP		4  #define AO_USB_IN_EP		5 +#endif +  /*   * USB bulk packets can only come in 8, 16, 32 and 64   * byte sizes, so we'll use 64 for everything | 
