#define __pdata
#define __data
#define __xdata
+#define __code
+#define __reentrant
enum ao_flight_state {
ao_flight_startup = 0,
#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)
+#define ao_rdf_set(rdf)
enum ao_igniter {
ao_igniter_drogue = 0,
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
ao_adc_ring[ao_adc_head] = ao_adc_static;
ao_adc_head = ao_adc_ring_next(ao_adc_head);
if (ao_flight_state != ao_flight_startup) {
- printf("tick %04x accel %04x pres %04x\n",
- ao_adc_static.tick,
+ printf("time %g accel %d pres %d\n",
+ (double) ao_adc_static.tick / 100,
ao_adc_static.accel,
ao_adc_static.pres);
}
}
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)
uint16_t tick;
uint16_t a, b;
int ret;
+ char line[1024];
for (;;) {
if (ao_records_read > 20 && 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) {
+ 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;
}
+ ret = sscanf(line, "%c %hx %hx %hx", &type, &tick, &a, &b);
if (ret != 4)
continue;
+ if (type != 'F' && !ao_flight_started)
+ continue;
+
switch (type) {
case 'F':
+ ao_flight_ground_accel = a;
+ ao_flight_started = 1;
break;
case 'S':
break;
break;
}
}
-
+
}
}
-
-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 GRAVITY 9.80665
#define COUNTS_PER_G 264.8
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,
- (double) ao_flight_vel,
- altitude[ao_flight_pres >> 4]);
+ (ao_ground_accel - ao_flight_accel) / COUNTS_PER_G * GRAVITY,
+ (double) ao_flight_vel / 100 / COUNTS_PER_G * GRAVITY,
+ 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);
}