diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ao.h | 73 | ||||
| -rw-r--r-- | src/core/ao_config.c | 3 | ||||
| -rw-r--r-- | src/core/ao_convert_pa.c | 18 | ||||
| -rw-r--r-- | src/core/ao_convert_pa_test.c | 10 | ||||
| -rw-r--r-- | src/core/ao_data.h | 22 | ||||
| -rw-r--r-- | src/core/ao_log.h | 17 | ||||
| -rw-r--r-- | src/core/ao_panic.c | 16 | ||||
| -rw-r--r-- | src/core/ao_task.h | 80 | 
8 files changed, 152 insertions, 87 deletions
| diff --git a/src/core/ao.h b/src/core/ao.h index 31ec4686..e559e876 100644 --- a/src/core/ao.h +++ b/src/core/ao.h @@ -39,64 +39,13 @@  #define CODE_TO_XDATA(a)	(a)  #endif -/* An AltOS task */ -struct ao_task { -	__xdata void *wchan;		/* current wait channel (NULL if running) */ -	uint16_t alarm;			/* abort ao_sleep time */ -	ao_arch_task_members		/* any architecture-specific fields */ -	uint8_t task_id;		/* unique id */ -	__code char *name;		/* task name */ -	uint8_t	stack[AO_STACK_SIZE];	/* saved stack */ -}; - -extern __xdata struct ao_task *__data ao_cur_task; - -#define AO_NUM_TASKS		16	/* maximum number of tasks */ -#define AO_NO_TASK		0	/* no task id */ - -/* - ao_task.c - */ - -/* Suspend the current task until wchan is awoken. - * returns: - *  0 on normal wake - *  1 on alarm - */ -uint8_t -ao_sleep(__xdata void *wchan); - -/* Wake all tasks sleeping on wchan */ -void -ao_wakeup(__xdata void *wchan); - -/* set an alarm to go off in 'delay' ticks */ -void -ao_alarm(uint16_t delay); - -/* Clear any pending alarm */ -void -ao_clear_alarm(void); - -/* Yield the processor to another task */ -void -ao_yield(void) ao_arch_naked_declare; - -/* Add a task to the run queue */ -void -ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant; - -/* Terminate the current task */ -void -ao_exit(void); - -/* Dump task info to console */ -void -ao_task_info(void); +#ifndef HAS_TASK +#define HAS_TASK	1 +#endif -/* Start the scheduler. This will not return */ -void -ao_start_scheduler(void); +#if HAS_TASK +#include <ao_task.h> +#endif  /*   * ao_panic.c @@ -136,7 +85,9 @@ ao_panic(uint8_t reason);  extern volatile __data AO_TICK_TYPE ao_tick_count;  /* Our timer runs at 100Hz */ +#ifndef AO_HERTZ  #define AO_HERTZ		100 +#endif  #define AO_MS_TO_TICKS(ms)	((ms) / (1000 / AO_HERTZ))  #define AO_SEC_TO_TICKS(s)	((s) * AO_HERTZ) @@ -168,11 +119,13 @@ ao_clock_init(void);   * ao_mutex.c   */ +#ifndef ao_mutex_get  void  ao_mutex_get(__xdata uint8_t *ao_mutex) __reentrant;  void  ao_mutex_put(__xdata uint8_t *ao_mutex) __reentrant; +#endif  /*   * ao_cmd.c @@ -319,11 +272,13 @@ ao_temp_to_dC(int16_t temp) __reentrant;   * Convert between pressure in Pa and altitude in meters   */ -int32_t +#include <ao_data.h> + +alt_t  ao_pa_to_altitude(int32_t pa);  int32_t -ao_altitude_to_pa(int32_t alt); +ao_altitude_to_pa(alt_t alt);  #if HAS_DBG  #include <ao_dbg.h> diff --git a/src/core/ao_config.c b/src/core/ao_config.c index ce855ad1..e8ff95b7 100644 --- a/src/core/ao_config.c +++ b/src/core/ao_config.c @@ -102,6 +102,7 @@ _ao_config_get(void)  		ao_xmemset(&ao_config.callsign, '\0', sizeof (ao_config.callsign));  		ao_xmemcpy(&ao_config.callsign, CODE_TO_XDATA(AO_CONFIG_DEFAULT_CALLSIGN),  		       sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1); +		ao_config._legacy_radio_channel = 0;  	}  	minor = ao_config.minor;  	if (minor != AO_CONFIG_MINOR) { @@ -131,7 +132,7 @@ _ao_config_get(void)  		if (minor < 9)  			ao_xmemset(&ao_config.aes_key, '\0', AO_AES_LEN);  		if (minor < 10) -			ao_config.frequency = 434550; +			ao_config.frequency = 434550 + ao_config._legacy_radio_channel * 100;  		if (minor < 11)  			ao_config.apogee_lockout = 0;  #if AO_PYRO_NUM diff --git a/src/core/ao_convert_pa.c b/src/core/ao_convert_pa.c index 0c93caea..55fe6e7d 100644 --- a/src/core/ao_convert_pa.c +++ b/src/core/ao_convert_pa.c @@ -19,14 +19,22 @@  #include "ao.h"  #endif -static const int32_t altitude_table[] = { +#ifndef AO_CONST_ATTRIB +#define AO_CONST_ATTRIB +#endif + +static const alt_t altitude_table[] AO_CONST_ATTRIB = {  #include "altitude-pa.h"  }; +#ifndef FETCH_ALT +#define FETCH_ALT(o)	altitude_table[o] +#endif +  #define ALT_SCALE	(1 << ALT_SHIFT)  #define ALT_MASK	(ALT_SCALE - 1) -int32_t +alt_t  ao_pa_to_altitude(int32_t pa)  {  	int16_t	o; @@ -40,11 +48,12 @@ ao_pa_to_altitude(int32_t pa)  	o = pa >> ALT_SHIFT;  	part = pa & ALT_MASK; -	low = (int32_t) altitude_table[o] * (ALT_SCALE - part); -	high = (int32_t) altitude_table[o+1] * part + (ALT_SCALE >> 1); +	low = (alt_t) FETCH_ALT(o) * (ALT_SCALE - part); +	high = (alt_t) FETCH_ALT(o+1) * part + (ALT_SCALE >> 1);  	return (low + high) >> ALT_SHIFT;  } +#ifdef AO_CONVERT_TEST  int32_t  ao_altitude_to_pa(int32_t alt)  { @@ -70,3 +79,4 @@ ao_altitude_to_pa(int32_t alt)  		pa = 0;  	return pa;  } +#endif diff --git a/src/core/ao_convert_pa_test.c b/src/core/ao_convert_pa_test.c index 972a4d4c..7d5b1922 100644 --- a/src/core/ao_convert_pa_test.c +++ b/src/core/ao_convert_pa_test.c @@ -17,15 +17,17 @@  #include <stdint.h>  #define AO_CONVERT_TEST +typedef int32_t alt_t;  #include "ao_host.h"  #include "ao_convert_pa.c"  #define STEP_P	1  #define STEP_A	1 -static inline i_abs(int i) { return i < 0 ? -i : i; } +static inline int i_abs(int i) { return i < 0 ? -i : i; } -main () +int +main (int argc, char **argv)  {  	int	i;  	int32_t p_to_a, p_to_a_to_p; @@ -49,9 +51,7 @@ main ()  //		printf ("pa %d alt %d pa %d\n",  //			i, p_to_a, p_to_a_to_p);  	} -	for (i = -1450; i < 74250 + STEP_A; i += STEP_A) { -		if (i > 74250) -			i = 74250; +	for (i = -1450; i < 40000 + STEP_A; i += STEP_A) {  		a_to_p = ao_altitude_to_pa(i);  		a_to_p_to_a = ao_pa_to_altitude(a_to_p);  		a_error = i_abs(a_to_p_to_a - i); diff --git a/src/core/ao_data.h b/src/core/ao_data.h index 30208dfb..6fdd19cb 100644 --- a/src/core/ao_data.h +++ b/src/core/ao_data.h @@ -52,6 +52,8 @@  #define AO_DATA_MMA655X 0  #endif +#ifdef AO_DATA_RING +  #define AO_DATA_ALL	(AO_DATA_ADC|AO_DATA_MS5607|AO_DATA_MPU6000|AO_DATA_HMC5883|AO_DATA_MMA655X)  struct ao_data { @@ -65,6 +67,9 @@ struct ao_data {  #endif  #if HAS_MPU6000  	struct ao_mpu6000_sample	mpu6000; +#if !HAS_MMA655X +	int16_t				z_accel; +#endif  #endif  #if HAS_HMC5883  	struct ao_hmc5883_sample	hmc5883; @@ -95,6 +100,8 @@ extern volatile __data uint8_t		ao_data_count;  		ao_sleep((void *) &ao_data_count);	\  	} while (0) +#endif /* AO_DATA_RING */ +  #if !HAS_BARO && HAS_MS5607  /* Either an MS5607 or an MS5611 hooked to a SPI port @@ -103,7 +110,12 @@ extern volatile __data uint8_t		ao_data_count;  #define HAS_BARO	1  typedef int32_t	pres_t; -typedef int32_t alt_t; + +#ifndef AO_ALT_TYPE +#define AO_ALT_TYPE	int32_t +#endif + +typedef AO_ALT_TYPE	alt_t;  #define ao_data_pres_cook(packet)	ao_ms5607_convert(&packet->ms5607_raw, &packet->ms5607_cooked) @@ -128,6 +140,10 @@ typedef int16_t alt_t;  #endif +#if !HAS_BARO +typedef int16_t alt_t; +#endif +  /*   * Need a few macros to pull data from the sensors:   * @@ -265,9 +281,9 @@ typedef int16_t accel_t;  typedef int16_t accel_t;  /* MPU6000 is hooked up so that positive y is positive acceleration */ -#define ao_data_accel(packet)			((packet)->mpu6000.accel_y) +#define ao_data_accel(packet)			((packet)->z_accel)  #define ao_data_accel_cook(packet)		(-(packet)->mpu6000.accel_y) -#define ao_data_set_accel(packet, accel)	((packet)->mpu6000.accel_y = (accel)) +#define ao_data_set_accel(packet, accel)	((packet)->z_accel = (accel))  #define ao_data_accel_invert(a)			(-(a))  #endif diff --git a/src/core/ao_log.h b/src/core/ao_log.h index 04abeb7e..eaaca444 100644 --- a/src/core/ao_log.h +++ b/src/core/ao_log.h @@ -138,17 +138,17 @@ ao_log_full(void);  #define AO_LOG_POS_NONE		(~0UL)  struct ao_log_record { -	char			type; -	uint8_t			csum; -	uint16_t		tick; +	char			type;				/* 0 */ +	uint8_t			csum;				/* 1 */ +	uint16_t		tick;				/* 2 */  	union {  		struct { -			int16_t		ground_accel; -			uint16_t	flight; +			int16_t		ground_accel;		/* 4 */ +			uint16_t	flight;			/* 6 */  		} flight;  		struct { -			int16_t		accel; -			int16_t		pres; +			int16_t		accel;			/* 4 */ +			int16_t		pres;			/* 6 */  		} sensor;  		struct {  			int16_t		temp; @@ -201,8 +201,7 @@ struct ao_log_mega {  			uint16_t	flight;		/* 4 */  			int16_t		ground_accel;	/* 6 */  			uint32_t	ground_pres;	/* 8 */ -			uint32_t	ground_temp;	/* 12 */ -		} flight;				/* 16 */ +		} flight;				/* 12 */  		struct {  			uint16_t	state;  			uint16_t	reason; diff --git a/src/core/ao_panic.c b/src/core/ao_panic.c index 52433044..3c0b471e 100644 --- a/src/core/ao_panic.c +++ b/src/core/ao_panic.c @@ -29,6 +29,10 @@  #define ao_led_off(x)  #endif +#ifndef AO_LED_PANIC +#define AO_LED_PANIC	AO_LED_RED +#endif +  static void  ao_panic_delay(uint8_t n)  { @@ -52,10 +56,10 @@ ao_panic(uint8_t reason)  	__critical for (;;) {  		ao_panic_delay(20);  		for (n = 0; n < 5; n++) { -			ao_led_on(AO_LED_RED); +			ao_led_on(AO_LED_PANIC);  			ao_beep(AO_BEEP_HIGH);  			ao_panic_delay(1); -			ao_led_off(AO_LED_RED); +			ao_led_off(AO_LED_PANIC);  			ao_beep(AO_BEEP_LOW);  			ao_panic_delay(1);  		} @@ -66,18 +70,18 @@ ao_panic(uint8_t reason)  #pragma disable_warning 126  #endif  		if (reason & 0x40) { -			ao_led_on(AO_LED_RED); +			ao_led_on(AO_LED_PANIC);  			ao_beep(AO_BEEP_HIGH);  			ao_panic_delay(40); -			ao_led_off(AO_LED_RED); +			ao_led_off(AO_LED_PANIC);  			ao_beep(AO_BEEP_OFF);  			ao_panic_delay(10);  		}  		for (n = 0; n < (reason & 0x3f); n++) { -			ao_led_on(AO_LED_RED); +			ao_led_on(AO_LED_PANIC);  			ao_beep(AO_BEEP_MID);  			ao_panic_delay(10); -			ao_led_off(AO_LED_RED); +			ao_led_off(AO_LED_PANIC);  			ao_beep(AO_BEEP_OFF);  			ao_panic_delay(10);  		} diff --git a/src/core/ao_task.h b/src/core/ao_task.h new file mode 100644 index 00000000..18edd866 --- /dev/null +++ b/src/core/ao_task.h @@ -0,0 +1,80 @@ +/* + * 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. + */ + +#ifndef _AO_TASK_H_ +#define _AO_TASK_H_ + +/* An AltOS task */ +struct ao_task { +	__xdata void *wchan;		/* current wait channel (NULL if running) */ +	uint16_t alarm;			/* abort ao_sleep time */ +	ao_arch_task_members		/* any architecture-specific fields */ +	uint8_t task_id;		/* unique id */ +	__code char *name;		/* task name */ +	uint8_t	stack[AO_STACK_SIZE];	/* saved stack */ +}; + +extern __xdata struct ao_task *__data ao_cur_task; + +#define AO_NUM_TASKS		16	/* maximum number of tasks */ +#define AO_NO_TASK		0	/* no task id */ + +/* + ao_task.c + */ + +/* Suspend the current task until wchan is awoken. + * returns: + *  0 on normal wake + *  1 on alarm + */ +uint8_t +ao_sleep(__xdata void *wchan); + +/* Wake all tasks sleeping on wchan */ +void +ao_wakeup(__xdata void *wchan); + +/* set an alarm to go off in 'delay' ticks */ +void +ao_alarm(uint16_t delay); + +/* Clear any pending alarm */ +void +ao_clear_alarm(void); + +/* Yield the processor to another task */ +void +ao_yield(void) ao_arch_naked_declare; + +/* Add a task to the run queue */ +void +ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant; + +/* Terminate the current task */ +void +ao_exit(void); + +/* Dump task info to console */ +void +ao_task_info(void); + +/* Start the scheduler. This will not return */ +void +ao_start_scheduler(void); + +#endif | 
