summaryrefslogtreecommitdiff
path: root/aoview
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-05-17 23:36:21 -0700
committerKeith Packard <keithp@keithp.com>2009-05-17 23:36:21 -0700
commit91b07410122d0eaaf292cdb31c200925d45eaf2c (patch)
tree7a5662b499d09855e9cece8d2de379e3556a0156 /aoview
parent71d1689759829f1bc8550f1a4d8c9f2dc90b2ab4 (diff)
Transmit computed ground pressure and acceleration values0.4
These are the last two values relevant to figuring out the state of the flight computer, and as they are computed by averaging 10 seconds of 100Hz sample data, they're a lot more accurate than anything the receiver could do on its own. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'aoview')
-rw-r--r--aoview/aoview.h2
-rw-r--r--aoview/aoview_monitor.c20
-rw-r--r--aoview/aoview_state.c62
3 files changed, 33 insertions, 51 deletions
diff --git a/aoview/aoview.h b/aoview/aoview.h
index 44412bec..4abbde88 100644
--- a/aoview/aoview.h
+++ b/aoview/aoview.h
@@ -59,8 +59,10 @@ struct aostate {
int drogue;
int main;
int flight_accel;
+ int ground_accel;
int flight_vel;
int flight_pres;
+ int ground_pres;
int nsat;
int locked;
struct {
diff --git a/aoview/aoview_monitor.c b/aoview/aoview_monitor.c
index b0189c60..7a04c82f 100644
--- a/aoview/aoview_monitor.c
+++ b/aoview/aoview_monitor.c
@@ -82,7 +82,7 @@ aoview_monitor_parse(char *line)
if (words[nword] == NULL)
break;
}
- if (nword < 32)
+ if (nword < 36)
return;
if (strcmp(words[0], "CALL") != 0)
return;
@@ -101,15 +101,17 @@ aoview_monitor_parse(char *line)
aoview_parse_int(&state.drogue, words[20]);
aoview_parse_int(&state.main, words[22]);
aoview_parse_int(&state.flight_accel, words[24]);
- aoview_parse_int(&state.flight_vel, words[26]);
- aoview_parse_int(&state.flight_pres, words[28]);
- aoview_parse_int(&state.nsat, words[30]);
- if (strcmp (words[32], "unlocked") != 0 && nword >= 35) {
+ aoview_parse_int(&state.ground_accel, words[26]);
+ aoview_parse_int(&state.flight_vel, words[28]);
+ aoview_parse_int(&state.flight_pres, words[30]);
+ aoview_parse_int(&state.ground_pres, words[32]);
+ aoview_parse_int(&state.nsat, words[34]);
+ if (strcmp (words[36], "unlocked") != 0 && nword >= 41) {
state.locked = 1;
- sscanf(words[32], "%d:%d:%d", &state.gps_time.hour, &state.gps_time.minute, &state.gps_time.second);
- aoview_parse_pos(&state.lat, words[33]);
- aoview_parse_pos(&state.lon, words[34]);
- sscanf(words[35], "%dm", &state.alt);
+ sscanf(words[36], "%d:%d:%d", &state.gps_time.hour, &state.gps_time.minute, &state.gps_time.second);
+ aoview_parse_pos(&state.lat, words[39]);
+ aoview_parse_pos(&state.lon, words[40]);
+ sscanf(words[41], "%dm", &state.alt);
} else {
state.locked = 0;
state.gps_time.hour = state.gps_time.minute = state.gps_time.second = 0;
diff --git a/aoview/aoview_state.c b/aoview/aoview_state.c
index dda92af9..02ae0307 100644
--- a/aoview/aoview_state.c
+++ b/aoview/aoview_state.c
@@ -18,14 +18,9 @@
#include "aoview.h"
#include <math.h>
-static int pad_pres;
-static int pad_accel;
-static int pad_pres_total;
-static int pad_accel_total;
static double pad_lat_total;
static double pad_lon_total;
static int pad_alt_total;
-static int npad;
static int npad_gps;
static int prev_tick;
static double prev_accel;
@@ -88,40 +83,28 @@ aoview_state_notify(struct aostate *state)
double max_accel;
if (!strcmp(state->state, "pad")) {
- if (npad < NUM_PAD_SAMPLES) {
- pad_accel_total += state->flight_accel;
- pad_pres_total += state->flight_pres;
- if (state->locked) {
- pad_lat_total += state->lat;
- pad_lon_total += state->lon;
- pad_alt_total += state->alt;
- npad_gps++;
- }
- npad++;
+ if (state->locked && npad_gps < NUM_PAD_SAMPLES) {
+ pad_lat_total += state->lat;
+ pad_lon_total += state->lon;
+ pad_alt_total += state->alt;
+ npad_gps++;
}
- if (npad <= NUM_PAD_SAMPLES) {
- pad_pres = pad_pres_total / npad;
- pad_accel = pad_accel_total / npad;
- if (npad_gps) {
- pad_lat = pad_lat_total / npad_gps;
- pad_lon = pad_lon_total / npad_gps;
- pad_alt = pad_alt_total / npad_gps;
- }
- }
- if (npad == NUM_PAD_SAMPLES) {
- npad++;
- min_pres = pad_pres;
- min_accel = pad_accel;
+ if (state->locked && npad_gps <= NUM_PAD_SAMPLES) {
+ pad_lat = pad_lat_total / npad_gps;
+ pad_lon = pad_lon_total / npad_gps;
+ pad_alt = pad_alt_total / npad_gps;
}
+ min_pres = state->ground_pres;
+ min_accel = state->ground_accel;
}
if (state->flight_pres < min_pres)
min_pres = state->flight_pres;
if (state->flight_accel < min_accel)
min_accel = state->flight_accel;
- altitude = aoview_pres_to_altitude(state->flight_pres) - aoview_pres_to_altitude(pad_pres);
- accel = (pad_accel - state->flight_accel) / 27.0;
+ altitude = aoview_pres_to_altitude(state->flight_pres) - aoview_pres_to_altitude(state->ground_pres);
+ accel = (state->ground_accel - state->flight_accel) / 27.0;
velocity = state->flight_vel / 2700.0;
- max_accel = (pad_accel - min_accel) / 27.0;
+ max_accel = (state->ground_accel - min_accel) / 27.0;
ticks = state->tick - prev_tick;
temp = ((state->temp / 32767.0 * 3.3) - 0.5) / 0.01;
battery = (state->batt / 32767.0 * 5.0);
@@ -132,20 +115,20 @@ aoview_state_notify(struct aostate *state)
prev_tick = state->tick;
aoview_table_start();
- if (npad >= NUM_PAD_SAMPLES)
+ if (npad_gps >= NUM_PAD_SAMPLES)
aoview_table_add_row("Ground state", "ready");
else
- aoview_table_add_row("Ground state", "preparing (%d)",
- NUM_PAD_SAMPLES - npad);
+ aoview_table_add_row("Ground state", "waiting for gps (%d)",
+ NUM_PAD_SAMPLES - npad_gps);
aoview_table_add_row("Rocket state", "%s", state->state);
aoview_table_add_row("Callsign", "%s", state->callsign);
aoview_table_add_row("Rocket serial", "%d", state->serial);
- aoview_table_add_row("RSSI", "%ddB", state->rssi);
+ aoview_table_add_row("RSSI", "%ddBm", state->rssi);
aoview_table_add_row("Height", "%dm", altitude);
aoview_table_add_row("Max height", "%dm",
aoview_pres_to_altitude(min_pres) -
- aoview_pres_to_altitude(pad_pres));
+ aoview_pres_to_altitude(state->ground_pres));
aoview_table_add_row("Acceleration", "%gm/s²", accel);
aoview_table_add_row("Max acceleration", "%gm/s²", max_accel);
aoview_table_add_row("Velocity", "%gm/s", velocity);
@@ -153,7 +136,7 @@ aoview_state_notify(struct aostate *state)
aoview_table_add_row("Battery", "%gV", battery);
aoview_table_add_row("Drogue", "%gV", drogue_sense);
aoview_table_add_row("Main", "%gV", main_sense);
- aoview_table_add_row("Pad altitude", "%dm", aoview_pres_to_altitude(pad_pres));
+ aoview_table_add_row("Pad altitude", "%dm", aoview_pres_to_altitude(state->ground_pres));
aoview_table_add_row("Satellites", "%d", state->nsat);
if (state->locked) {
aoview_state_add_deg("Latitude", state->lat);
@@ -181,14 +164,9 @@ aoview_state_notify(struct aostate *state)
void
aoview_state_new(void)
{
- pad_pres = 0;
- pad_accel = 0;
- pad_pres_total = 0;
- pad_accel_total = 0;
pad_lat_total = 0;
pad_lon_total = 0;
pad_alt_total = 0;
- npad = 0;
npad_gps = 0;
prev_tick = 0;
prev_accel = 0;