X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_flight_test.c;h=f4731aa8718a9ef326134e379cda363f8fbfa08c;hp=78469c798d6a61b63afe46201e4c8fc7ff72e1e5;hb=3a3bfd471a868d546d83cdc431b53c8f5208edb9;hpb=b99315cee4ab796376458a2442cf36806fa4aed3 diff --git a/ao_flight_test.c b/ao_flight_test.c index 78469c79..f4731aa8 100644 --- a/ao_flight_test.c +++ b/ao_flight_test.c @@ -15,9 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#define _GNU_SOURCE + #include #include #include +#include #define AO_ADC_RING 64 #define ao_adc_ring_next(n) (((n) + 1) & (AO_ADC_RING - 1)) @@ -39,6 +42,8 @@ struct ao_adc { #define __pdata #define __data #define __xdata +#define __code +#define __reentrant enum ao_flight_state { ao_flight_startup = 0, @@ -60,6 +65,9 @@ uint8_t ao_adc_head; #define ao_led_off(l) #define ao_timer_set_adc_interval(i) #define ao_wakeup(wchan) ao_dump_state() +#define ao_cmd_register(c) +#define ao_usb_disable() +#define ao_telemetry_set_interval(x) enum ao_igniter { ao_igniter_drogue = 0, @@ -96,6 +104,51 @@ ao_dump_state(void); void ao_sleep(void *wchan); +const char const * const ao_state_names[] = { + "startup", "idle", "pad", "boost", "coast", + "apogee", "drogue", "main", "landed", "invalid" +}; + +struct ao_cmds { + char cmd; + void (*func)(void); + const char *help; +}; + + +static int16_t altitude_table[2048] = { +#include "altitude.h" +}; + +int16_t +ao_pres_to_altitude(int16_t pres) __reentrant +{ + pres = pres >> 4; + if (pres < 0) pres = 0; + if (pres > 2047) pres = 2047; + return altitude_table[pres]; +} + +int16_t +ao_altitude_to_pres(int16_t alt) __reentrant +{ + int16_t pres; + + for (pres = 0; pres < 2047; pres++) + if (altitude_table[pres] <= alt) + break; + return pres << 4; +} + +struct ao_config { + uint16_t main_deploy; + int16_t accel_zero_g; +}; + +#define ao_config_get() + +struct ao_config ao_config = { 250, 16000 }; + #include "ao_flight.c" void @@ -112,6 +165,9 @@ ao_insert(void) } static int ao_records_read = 0; +static int ao_eof_read = 0; +static int ao_flight_ground_accel; +static int ao_flight_started = 0; void ao_sleep(void *wchan) @@ -122,24 +178,60 @@ ao_sleep(void *wchan) uint16_t tick; uint16_t a, b; int ret; + char line[1024]; + char *saveptr; + char *l; + char *words[64]; + int nword; for (;;) { - if (ao_records_read > 20 && ao_flight_state == ao_flight_startup) + if (ao_records_read > 2 && ao_flight_state == ao_flight_startup) { + ao_adc_static.accel = ao_flight_ground_accel; ao_insert(); return; } - ret = fscanf(emulator_in, "%c %hx %hx %hx\n", &type, &tick, &a, &b); - if (ret == EOF) { - printf ("no more data, exiting simulation\n"); - exit(0); + if (!fgets(line, sizeof (line), emulator_in)) { + if (++ao_eof_read >= 1000) { + printf ("no more data, exiting simulation\n"); + exit(0); + } + ao_adc_static.tick += 10; + ao_insert(); return; } - if (ret != 4) + l = line; + for (nword = 0; nword < 64; nword++) { + words[nword] = strtok_r(l, " \t\n", &saveptr); + l = NULL; + if (words[nword] == NULL) + break; + } + if (nword == 4) { + type = words[0][0]; + tick = strtoul(words[1], NULL, 16); + a = strtoul(words[2], NULL, 16); + b = strtoul(words[2], NULL, 16); + } else if (nword >= 36 && strcmp(words[0], "CALL") == 0) { + tick = atoi(words[10]); + if (!ao_flight_started) { + type = 'F'; + a = atoi(words[26]); + ao_flight_started = 1; + } else { + type = 'A'; + a = atoi(words[12]); + b = atoi(words[14]); + } + } + if (type != 'F' && !ao_flight_started) continue; + switch (type) { case 'F': + ao_flight_ground_accel = a; + ao_flight_started = 1; break; case 'S': break; @@ -166,16 +258,6 @@ ao_sleep(void *wchan) } } - -const char const * const ao_state_names[] = { - "startup", "idle", "pad", "boost", "coast", - "apogee", "drogue", "main", "landed", "invalid" -}; - -static int16_t altitude[2048] = { -#include "altitude.h" -}; - #define COUNTS_PER_G 264.8 void @@ -183,11 +265,12 @@ ao_dump_state(void) { if (ao_flight_state == ao_flight_startup) return; - printf ("\t%s accel %g vel %g alt %d\n", + printf ("\t\t\t\t\t%s accel %g vel %g alt %d main %d\n", ao_state_names[ao_flight_state], - (ao_flight_accel - ao_ground_accel) / COUNTS_PER_G * GRAVITY, + (ao_ground_accel - ao_flight_accel) / COUNTS_PER_G * GRAVITY, (double) ao_flight_vel / 100 / COUNTS_PER_G * GRAVITY, - altitude[ao_flight_pres >> 4]); + ao_pres_to_altitude(ao_flight_pres) - ao_pres_to_altitude(ao_ground_pres), + ao_pres_to_altitude(ao_main_pres) - ao_pres_to_altitude(ao_ground_pres)); if (ao_flight_state == ao_flight_landed) exit(0); }