diff options
| author | Bdale Garbee <bdale@gag.com> | 2012-12-28 22:30:26 -0700 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2012-12-28 22:30:26 -0700 | 
| commit | 59f355f5288b42b2e47743d06e41e55819a55f64 (patch) | |
| tree | 1ef54ec06088f86455173a9069b538655b965ffa /src/core/ao_sample.c | |
| parent | 099d2b0ea59d825bd69a3fbb5523b9cbb9430ce8 (diff) | |
| parent | b70ca5eaf1c3d60bd9adf6835e1247f4147ca9c8 (diff) | |
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Diffstat (limited to 'src/core/ao_sample.c')
| -rw-r--r-- | src/core/ao_sample.c | 97 | 
1 files changed, 96 insertions, 1 deletions
| diff --git a/src/core/ao_sample.c b/src/core/ao_sample.c index 985c0940..dec44f9f 100644 --- a/src/core/ao_sample.c +++ b/src/core/ao_sample.c @@ -37,6 +37,16 @@ __pdata alt_t		ao_sample_height;  #if HAS_ACCEL  __pdata accel_t		ao_sample_accel;  #endif +#if HAS_GYRO +__pdata accel_t		ao_sample_accel_along; +__pdata accel_t		ao_sample_accel_across; +__pdata accel_t		ao_sample_accel_through; +__pdata gyro_t		ao_sample_roll; +__pdata gyro_t		ao_sample_pitch; +__pdata gyro_t		ao_sample_yaw; +__pdata angle_t		ao_sample_angle; +__pdata angle_t		ao_sample_roll_angle; +#endif  __data uint8_t		ao_sample_data; @@ -53,6 +63,15 @@ __pdata accel_t		ao_accel_2g;		/* factory accel calibration */  __pdata int32_t		ao_accel_scale;		/* sensor to m/s² conversion */  #endif +#if HAS_GYRO +__pdata accel_t		ao_ground_accel_along; +__pdata accel_t		ao_ground_accel_across; +__pdata accel_t		ao_ground_accel_through; +__pdata gyro_t		ao_ground_pitch; +__pdata gyro_t		ao_ground_yaw; +__pdata gyro_t		ao_ground_roll; +#endif +  static __pdata uint8_t	ao_preflight;		/* in preflight mode */  static __pdata uint16_t	nsamples; @@ -60,6 +79,14 @@ __pdata int32_t ao_sample_pres_sum;  #if HAS_ACCEL  __pdata int32_t ao_sample_accel_sum;  #endif +#if HAS_GYRO +__pdata int32_t ao_sample_accel_along_sum; +__pdata int32_t ao_sample_accel_across_sum; +__pdata int32_t	ao_sample_accel_through_sum; +__pdata int32_t ao_sample_pitch_sum; +__pdata int32_t ao_sample_yaw_sum; +__pdata int32_t	ao_sample_roll_sum; +#endif  static void  ao_sample_preflight_add(void) @@ -68,6 +95,14 @@ ao_sample_preflight_add(void)  	ao_sample_accel_sum += ao_sample_accel;  #endif  	ao_sample_pres_sum += ao_sample_pres; +#if HAS_GYRO +	ao_sample_accel_along_sum += ao_sample_accel_along; +	ao_sample_accel_across_sum += ao_sample_accel_across; +	ao_sample_accel_through_sum += ao_sample_accel_through; +	ao_sample_pitch_sum += ao_sample_pitch; +	ao_sample_yaw_sum += ao_sample_yaw; +	ao_sample_roll_sum += ao_sample_roll; +#endif  	++nsamples;  } @@ -80,8 +115,23 @@ ao_sample_preflight_set(void)  #endif  	ao_ground_pres = ao_sample_pres_sum >> 9;  	ao_ground_height = pres_to_altitude(ao_ground_pres); -	nsamples = 0;  	ao_sample_pres_sum = 0; +#if HAS_GYRO +	ao_ground_accel_along = ao_sample_accel_along_sum >> 9; +	ao_ground_accel_across = ao_sample_accel_across_sum >> 9; +	ao_ground_accel_through = ao_sample_accel_through_sum >> 9; +	ao_ground_pitch = ao_sample_pitch_sum >> 9; +	ao_ground_yaw = ao_sample_yaw_sum >> 9; +	ao_ground_roll = ao_sample_roll_sum >> 9; +	ao_sample_accel_along_sum = 0; +	ao_sample_accel_across_sum = 0; +	ao_sample_accel_through_sum = 0; +	ao_sample_pitch_sum = 0; +	ao_sample_yaw_sum = 0; +	ao_sample_roll_sum = 0; +	ao_sample_angle = 0; +#endif	 +	nsamples = 0;  }  static void @@ -122,6 +172,25 @@ ao_sample_preflight_update(void)  		ao_sample_preflight_set();  } +#if 0 +#if HAS_GYRO +static int32_t	p_filt; +static int32_t	y_filt; + +static gyro_t inline ao_gyro(void) { +	gyro_t	p = ao_sample_pitch - ao_ground_pitch; +	gyro_t	y = ao_sample_yaw - ao_ground_yaw; + +	p_filt = p_filt - (p_filt >> 6) + p; +	y_filt = y_filt - (y_filt >> 6) + y; + +	p = p_filt >> 6; +	y = y_filt >> 6; +	return ao_sqrt(p*p + y*y); +} +#endif +#endif +  uint8_t  ao_sample(void)  { @@ -147,6 +216,14 @@ ao_sample(void)  			ao_sample_accel = ao_data_accel_invert(ao_sample_accel);  		ao_data_set_accel(ao_data, ao_sample_accel);  #endif +#if HAS_GYRO +		ao_sample_accel_along = ao_data_along(ao_data); +		ao_sample_accel_across = ao_data_across(ao_data); +		ao_sample_accel_through = ao_data_through(ao_data); +		ao_sample_pitch = ao_data_pitch(ao_data); +		ao_sample_yaw = ao_data_yaw(ao_data); +		ao_sample_roll = ao_data_roll(ao_data); +#endif  		if (ao_preflight)  			ao_sample_preflight(); @@ -154,6 +231,9 @@ ao_sample(void)  			if (ao_flight_state < ao_flight_boost)  				ao_sample_preflight_update();  			ao_kalman(); +#if HAS_GYRO +			/* do quaternion stuff here... */ +#endif  		}  		ao_sample_data = ao_data_ring_next(ao_sample_data);  	} @@ -171,6 +251,21 @@ ao_sample_init(void)  	ao_sample_accel_sum = 0;  	ao_sample_accel = 0;  #endif +#if HAS_GYRO +	ao_sample_accel_along_sum = 0; +	ao_sample_accel_across_sum = 0; +	ao_sample_accel_through_sum = 0; +	ao_sample_accel_along = 0; +	ao_sample_accel_across = 0; +	ao_sample_accel_through = 0; +	ao_sample_pitch_sum = 0; +	ao_sample_yaw_sum = 0; +	ao_sample_roll_sum = 0; +	ao_sample_pitch = 0; +	ao_sample_yaw = 0; +	ao_sample_roll = 0; +	ao_sample_angle = 0; +#endif  	ao_sample_data = ao_data_head;  	ao_preflight = TRUE;  } | 
