From 31d5670a9144b943ce9c8cb00deb5fb659af0b1c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 17 Jul 2009 17:06:18 -0700 Subject: [PATCH] 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 --- aoview/aoview.h | 1 + aoview/aoview_state.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/aoview/aoview.h b/aoview/aoview.h index 803bd4a5..b4d13159 100644 --- a/aoview/aoview.h +++ b/aoview/aoview.h @@ -122,6 +122,7 @@ struct aostate { double pad_lon_total; double pad_alt_total; int npad; + int prev_npad; double distance; double bearing; 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 -- 2.30.2