summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-07-17 17:06:18 -0700
committerKeith Packard <keithp@keithp.com>2009-07-17 17:06:18 -0700
commit31d5670a9144b943ce9c8cb00deb5fb659af0b1c (patch)
tree10bd1549ad8cdec1609c61005e04af4af2813c68
parentbfe1e76c82738baaf65abbc58c3244a07ea8fefe (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>
-rw-r--r--aoview/aoview.h1
-rw-r--r--aoview/aoview_state.c17
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