extern __pdata uint16_t ao_flight_tick;
extern __pdata int16_t ao_flight_accel;
extern __pdata int16_t ao_flight_pres;
+extern __pdata int32_t ao_flight_vel;
extern __pdata int16_t ao_ground_pres;
extern __pdata int16_t ao_ground_accel;
extern __pdata int16_t ao_min_pres;
struct ao_telemetry {
uint8_t addr;
uint8_t flight_state;
+ int16_t flight_accel;
+ int32_t flight_vel;
+ int16_t flight_pres;
struct ao_adc adc;
struct ao_gps_data gps;
char callsign[AO_MAX_CALLSIGN];
recv.telemetry.addr,
(int) recv.rssi - 74, recv.status,
ao_state_names[state]);
- printf("%5u a: %5d p: %5d t: %5d v: %5d d: %5d m: %5d ",
+ printf("%5u a: %5d p: %5d t: %5d v: %5d d: %5d m: %5d fa: %5d fv: %7ld fp: %5d ",
recv.telemetry.adc.tick,
recv.telemetry.adc.accel,
recv.telemetry.adc.pres,
recv.telemetry.adc.temp,
recv.telemetry.adc.v_batt,
recv.telemetry.adc.sense_d,
- recv.telemetry.adc.sense_m);
+ recv.telemetry.adc.sense_m,
+ recv.telemetry.flight_accel,
+ recv.telemetry.flight_vel,
+ recv.telemetry.flight_pres);
ao_gps_print(&recv.telemetry.gps);
ao_rssi_set((int) recv.rssi - 74);
} else {
while (ao_telemetry_interval == 0)
ao_sleep(&ao_telemetry_interval);
telemetry.flight_state = ao_flight_state;
+ telemetry.flight_accel = ao_flight_accel;
+ telemetry.flight_vel = ao_flight_vel;
+ telemetry.flight_pres = ao_flight_pres;
ao_adc_get(&telemetry.adc);
ao_mutex_get(&ao_gps_mutex);
memcpy(&telemetry.gps, &ao_gps_data, sizeof (struct ao_gps_data));
int batt;
int drogue;
int main;
+ int flight_accel;
+ int flight_vel;
+ int flight_pres;
int nsat;
int locked;
struct {
if (words[nword] == NULL)
break;
}
- if (nword < 26)
+ if (nword < 32)
return;
if (strcmp(words[0], "CALL") != 0)
return;
aoview_parse_int(&state.batt, words[18]);
aoview_parse_int(&state.drogue, words[20]);
aoview_parse_int(&state.main, words[22]);
- aoview_parse_int(&state.nsat, words[24]);
- if (strcmp (words[26], "unlocked") != 0 && nword >= 29) {
+ 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) {
state.locked = 1;
- sscanf(words[26], "%d:%d:%d", &state.gps_time.hour, &state.gps_time.minute, &state.gps_time.second);
- aoview_parse_pos(&state.lat, words[27]);
- aoview_parse_pos(&state.lon, words[28]);
- sscanf(words[29], "%dm", &state.alt);
+ 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);
} else {
state.locked = 0;
state.gps_time.hour = state.gps_time.minute = state.gps_time.second = 0;
static int pad_pres;
static int pad_accel;
-
static int pad_pres_total;
static int pad_accel_total;
static double pad_lat_total;
static int npad_gps;
static int prev_tick;
static double prev_accel;
-static double velocity;
static double pad_lat;
static double pad_lon;
static double pad_alt;
{
int altitude;
double accel;
- double velocity_change;
int ticks;
double dist;
double bearing;
double temp;
+ double velocity;
double battery;
double drogue_sense, main_sense;
double max_accel;
if (!strcmp(state->state, "pad")) {
if (npad < NUM_PAD_SAMPLES) {
- pad_accel_total += state->accel;
- pad_pres_total += state->pres;
+ 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;
npad_gps++;
}
npad++;
- velocity = 0;
}
if (npad <= NUM_PAD_SAMPLES) {
pad_pres = pad_pres_total / npad;
}
if (npad == NUM_PAD_SAMPLES) {
npad++;
- velocity = 0;
min_pres = pad_pres;
min_accel = pad_accel;
}
}
- if (state->pres < min_pres)
- min_pres = state->pres;
- if (state->accel < min_accel)
- min_accel = state->accel;
- altitude = aoview_pres_to_altitude(state->pres) - aoview_pres_to_altitude(pad_pres);
- accel = (pad_accel - state->accel) / 264.8 * 9.80665;
- max_accel = (pad_accel - min_accel) / 264.8 * 9.80665;
- velocity_change = (accel + prev_accel) / 2.0;
+ 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;
+ velocity = state->flight_vel / 2700.0;
+ max_accel = (pad_accel - min_accel) / 27.0;
ticks = state->tick - prev_tick;
- velocity -= velocity_change * (ticks / 100.0);
temp = ((state->temp / 32767.0 * 3.3) - 0.5) / 0.01;
battery = (state->batt / 32767.0 * 5.0);
drogue_sense = (state->drogue / 32767.0 * 15.0);
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;
+ pad_lat = 0;
+ pad_lon = 0;
+ pad_alt = 0;
min_pres = 32767;
min_accel = 32767;
- npad = 0;
}
void