diff options
| author | Keith Packard <keithp@keithp.com> | 2009-11-03 00:40:38 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2009-11-03 00:40:38 -0800 | 
| commit | 1de322b960005c9a16051afa1881fadb00f4bcd6 (patch) | |
| tree | 7b60481ac08b3f4e0362efdecab5fcefe299cad2 | |
| parent | b529e5e8998702986909111a457f3ce9932e1ccf (diff) | |
Pass accel calibration over telemetry stream. Telemetry data format change.
This allows the ground station to convert the accelerometer sensor
values into acceleration and speed data. This requires a new telemetry
data structure, and so TeleMetrum and TeleDongle units must be updated
synchronously. ao-view will parse either telemetry stream, and the
serial format from TeleDongle now has a version number to allow for
future changes.
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | ao-tools/ao-view/aoview.h | 2 | ||||
| -rw-r--r-- | ao-tools/ao-view/aoview_monitor.c | 23 | ||||
| -rw-r--r-- | ao-tools/ao-view/aoview_state.c | 6 | ||||
| -rw-r--r-- | src/ao.h | 3 | ||||
| -rw-r--r-- | src/ao_monitor.c | 18 | ||||
| -rw-r--r-- | src/ao_telemetry.c | 2 | 
6 files changed, 42 insertions, 12 deletions
diff --git a/ao-tools/ao-view/aoview.h b/ao-tools/ao-view/aoview.h index c582159c..b6d5bcdf 100644 --- a/ao-tools/ao-view/aoview.h +++ b/ao-tools/ao-view/aoview.h @@ -104,6 +104,8 @@ struct aodata {  	int	flight_vel;  	int	flight_pres;  	int	ground_pres; +	int	accel_plus_g; +	int	accel_minus_g;  	struct aogps	gps;  	struct aogps_tracking	gps_tracking;  }; diff --git a/ao-tools/ao-view/aoview_monitor.c b/ao-tools/ao-view/aoview_monitor.c index 48e20320..6d57f556 100644 --- a/ao-tools/ao-view/aoview_monitor.c +++ b/ao-tools/ao-view/aoview_monitor.c @@ -77,7 +77,9 @@ gboolean  aoview_monitor_parse(const char *input_line)  {  	char *saveptr; -	char *words[PARSE_MAX_WORDS]; +	char *raw_words[PARSE_MAX_WORDS]; +	char **words; +	int version = 0;  	int nword;  	char line_buf[8192], *line;  	struct aodata	data; @@ -89,13 +91,19 @@ aoview_monitor_parse(const char *input_line)  	line_buf[sizeof(line_buf) - 1] = '\0';  	line = line_buf;  	for (nword = 0; nword < PARSE_MAX_WORDS; nword++) { -		words[nword] = strtok_r(line, " \t\n", &saveptr); +		raw_words[nword] = strtok_r(line, " \t\n", &saveptr);  		line = NULL; -		if (words[nword] == NULL) +		if (raw_words[nword] == NULL)  			break;  	}  	if (nword < 36)  		return FALSE; +	words = raw_words; +	if (strcmp(words[0], "VERSION") == 0) { +		aoview_parse_int(&version, words[1]); +		words += 2; +		nword -= 2; +	}  	if (strcmp(words[0], "CALL") != 0)  		return FALSE;  	aoview_parse_string(data.callsign, sizeof (data.callsign), words[1]); @@ -115,6 +123,15 @@ aoview_monitor_parse(const char *input_line)  	aoview_parse_int(&data.flight_vel, words[28]);  	aoview_parse_int(&data.flight_pres, words[30]);  	aoview_parse_int(&data.ground_pres, words[32]); +	if (version >= 1) { +		aoview_parse_int(&data.accel_plus_g, words[34]); +		aoview_parse_int(&data.accel_minus_g, words[36]); +		words += 4; +		nword -= 4; +	} else { +		data.accel_plus_g = data.ground_accel; +		data.accel_minus_g = data.ground_accel + 530; +	}  	aoview_parse_int(&data.gps.nsat, words[34]);  	if (strcmp (words[36], "unlocked") == 0) {  		data.gps.gps_connected = 1; diff --git a/ao-tools/ao-view/aoview_state.c b/ao-tools/ao-view/aoview_state.c index f75066dd..f8f01685 100644 --- a/ao-tools/ao-view/aoview_state.c +++ b/ao-tools/ao-view/aoview_state.c @@ -105,6 +105,7 @@ aoview_state_derive(struct aodata *data, struct aostate *state)  	double	new_height;  	double	height_change;  	double	time_change; +	double	accel_counts_per_mss;  	int	tick_count;  	state->report_time = aoview_time(); @@ -123,8 +124,9 @@ aoview_state_derive(struct aodata *data, struct aostate *state)  	state->height = new_height;  	if (time_change)  		state->baro_speed = (state->baro_speed * 3 + (height_change / time_change)) / 4.0; -	state->acceleration = (data->ground_accel - data->flight_accel) / 27.0; -	state->speed = data->flight_vel / 2700.0; +	accel_counts_per_mss = ((data->accel_minus_g - data->accel_plus_g) / 2.0) / 9.80665; +	state->acceleration = (data->ground_accel - data->flight_accel) / accel_counts_per_mss; +	state->speed = data->flight_vel / (accel_counts_per_mss * 100.0);  	state->temperature = ((data->temp / 32767.0 * 3.3) - 0.5) / 0.01;  	state->drogue_sense = data->drogue / 32767.0 * 15.0;  	state->main_sense = data->main / 32767.0 * 15.0; @@ -784,6 +784,7 @@ ao_gps_report_init(void);   */  #define AO_MAX_CALLSIGN		8 +#define AO_TELEMETRY_VERSION	1  struct ao_telemetry {  	uint8_t			addr; @@ -793,6 +794,8 @@ struct ao_telemetry {  	int32_t			flight_vel;  	int16_t			flight_pres;  	int16_t			ground_pres; +	int16_t			accel_plus_g; +	int16_t			accel_minus_g;  	struct ao_adc		adc;  	struct ao_gps_data	gps;  	char			callsign[AO_MAX_CALLSIGN]; diff --git a/src/ao_monitor.c b/src/ao_monitor.c index d0c1da34..cd0d693e 100644 --- a/src/ao_monitor.c +++ b/src/ao_monitor.c @@ -37,12 +37,14 @@ ao_monitor(void)  		if (state > ao_flight_invalid)  			state = ao_flight_invalid;  		if (recv.status & PKT_APPEND_STATUS_1_CRC_OK) { -			printf ("CALL %s SERIAL %3d RSSI %4d STATUS %02x STATE %7s ", -				callsign, -				recv.telemetry.addr, -				(int) recv.rssi - 74, recv.status, -				ao_state_names[state]); -			printf("%5u a: %5d p: %5d t: %5d v: %5d d: %5d m: %5d fa: %5d ga: %d fv: %7ld fp: %5d gp: %5d ", +			printf("VERSION %d CALL %s SERIAL %3d RSSI %4d STATUS %02x STATE %7s ", +			       AO_TELEMETRY_VERSION, +			       callsign, +			       recv.telemetry.addr, +			       (int) recv.rssi - 74, recv.status, +			       ao_state_names[state]); +			printf("%5u a: %5d p: %5d t: %5d v: %5d d: %5d m: %5d " +			       "fa: %5d ga: %d fv: %7ld fp: %5d gp: %5d a+: %5d a-: %5d ",  			       recv.telemetry.adc.tick,  			       recv.telemetry.adc.accel,  			       recv.telemetry.adc.pres, @@ -54,7 +56,9 @@ ao_monitor(void)  			       recv.telemetry.ground_accel,  			       recv.telemetry.flight_vel,  			       recv.telemetry.flight_pres, -			       recv.telemetry.ground_pres); +			       recv.telemetry.ground_pres, +			       recv.telemetry.accel_plus_g, +			       recv.telemetry.accel_minus_g);  			ao_gps_print(&recv.telemetry.gps);  			putchar(' ');  			ao_gps_tracking_print(&recv.telemetry.gps_tracking); diff --git a/src/ao_telemetry.c b/src/ao_telemetry.c index d52e589c..9c923984 100644 --- a/src/ao_telemetry.c +++ b/src/ao_telemetry.c @@ -32,6 +32,8 @@ ao_telemetry(void)  	ao_config_get();  	memcpy(telemetry.callsign, ao_config.callsign, AO_MAX_CALLSIGN);  	telemetry.addr = ao_serial_number; +	telemetry.accel_plus_g = ao_config.accel_plus_g; +	telemetry.accel_minus_g = ao_config.accel_minus_g;  	ao_rdf_time = ao_time();  	for (;;) {  		while (ao_telemetry_interval == 0)  | 
