diff options
author | Keith Packard <keithp@keithp.com> | 2009-07-17 17:06:18 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2009-07-17 17:06:18 -0700 |
commit | 31d5670a9144b943ce9c8cb00deb5fb659af0b1c (patch) | |
tree | 10bd1549ad8cdec1609c61005e04af4af2813c68 /aoview/aoview_state.c | |
parent | bfe1e76c82738baaf65abbc58c3244a07ea8fefe (diff) |
Rolling average for pad location. Say 'GPS ready'.
Use a rolling average for the pad location, instead of just averaging all
positions. This filters out old (presumably less accurate) values eventually.
When enough GPS samples have been acquired, say 'GPS ready'.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'aoview/aoview_state.c')
-rw-r--r-- | aoview/aoview_state.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/aoview/aoview_state.c b/aoview/aoview_state.c index 8b43ec29..cf1594cd 100644 --- a/aoview/aoview_state.c +++ b/aoview/aoview_state.c @@ -110,6 +110,7 @@ aoview_state_derive(struct aodata *data, struct aostate *state) state->report_time = aoview_time(); state->prev_data = state->data; + state->prev_npad = state->npad; state->data = *data; tick_count = data->tick; if (tick_count < state->prev_data.tick) @@ -129,14 +130,20 @@ aoview_state_derive(struct aodata *data, struct aostate *state) state->main_sense = data->main / 32767.0 * 15.0; state->battery = data->batt / 32767.0 * 5.0; if (!strcmp(data->state, "pad")) { - if (data->locked && data->nsat > 4) { + if (data->locked && data->nsat >= 4) { state->npad++; state->pad_lat_total += data->lat; state->pad_lon_total += data->lon; state->pad_alt_total += data->alt; - state->pad_lat = state->pad_lat_total / state->npad; - state->pad_lon = state->pad_lon_total / state->npad; - state->pad_alt = state->pad_alt_total / state->npad; + if (state->npad > 1) { + state->pad_lat = (state->pad_lat * 31 + data->lat) / 32.0; + state->pad_lon = (state->pad_lon * 31 + data->lon) / 32.0; + state->pad_alt = (state->pad_alt * 31 + data->alt) / 32.0; + } else { + state->pad_lat = data->lat; + state->pad_lon = data->lon; + state->pad_alt = data->alt; + } } } state->ascent = FALSE; @@ -178,6 +185,8 @@ aoview_speak_state(struct aostate *state) aoview_voice_speak("max speed %d meters per second\n", (int) state->max_speed); } + if (state->prev_npad < MIN_PAD_SAMPLES && state->npad >= MIN_PAD_SAMPLES) + aoview_voice_speak("g p s ready\n"); } void |