summaryrefslogtreecommitdiff
path: root/ao-tools
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-11-03 00:40:38 -0800
committerKeith Packard <keithp@keithp.com>2009-11-03 00:40:38 -0800
commit1de322b960005c9a16051afa1881fadb00f4bcd6 (patch)
tree7b60481ac08b3f4e0362efdecab5fcefe299cad2 /ao-tools
parentb529e5e8998702986909111a457f3ce9932e1ccf (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>
Diffstat (limited to 'ao-tools')
-rw-r--r--ao-tools/ao-view/aoview.h2
-rw-r--r--ao-tools/ao-view/aoview_monitor.c23
-rw-r--r--ao-tools/ao-view/aoview_state.c6
3 files changed, 26 insertions, 5 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;