static void ao_launch_status(void) { uint8_t i; for (;;) { ao_delay(AO_SEC_TO_TICKS(1)); if (ao_igniter_status(ao_igniter_drogue) == ao_igniter_ready) { if (ao_igniter_status(ao_igniter_main) == ao_igniter_ready) { for (i = 0; i < 5; i++) { ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(50)); ao_delay(AO_MS_TO_TICKS(100)); } } else { ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200)); } } } }
void beep(void) { static __xdata struct ao_adc adc; for (;;) { ao_delay(AO_SEC_TO_TICKS(1)); ao_adc_get(&adc); if (adc.temp > 7400) ao_beep_for(AO_BEEP_LOW, AO_MS_TO_TICKS(50)); } }
static void ao_launch(void) { static __xdata struct ao_launch_command command; static __xdata struct ao_launch_query query; int16_t time_difference; ao_led_off(AO_LED_RED); ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200)); for (;;) { flush(); if (ao_radio_cmac_recv(&command, sizeof (command), 0) != AO_RADIO_CMAC_OK) continue; PRINTD ("tick %d serial %d cmd %d channel %d\n", command.tick, command.serial, command.cmd, command.channel); switch (command.cmd) { case AO_LAUNCH_QUERY: if (command.serial != ao_serial_number) { PRINTD ("serial number mismatch\n"); break; } if (command.channel == 0) { query.valid = 1; query.arm_status = ao_igniter_status(ao_igniter_drogue); query.igniter_status = ao_igniter_status(ao_igniter_main); } else { query.valid = 0; } query.tick = ao_time(); query.serial = ao_serial_number; query.channel = command.channel; PRINTD ("query tick %d serial %d channel %d valid %d arm %d igniter %d\n", query.tick, query.serial, query.channel, query.valid, query.arm_status, query.igniter_status); ao_radio_cmac_send(&query, sizeof (query)); break; case AO_LAUNCH_ARM: if (command.serial != ao_serial_number) { PRINTD ("serial number mismatch\n"); break; } if (command.channel != 0) break; time_difference = command.tick - ao_time(); PRINTD ("arm tick %d local tick %d\n", command.tick, ao_time()); if (time_difference < 0) time_difference = -time_difference; if (time_difference > 10) { PRINTD ("time difference too large %d\n", time_difference); break; } PRINTD ("armed\n"); ao_launch_armed = 1; ao_launch_arm_time = ao_time(); break; case AO_LAUNCH_FIRE: if (!ao_launch_armed) { PRINTD ("not armed\n"); break; } if ((uint16_t) (ao_time() - ao_launch_arm_time) > AO_SEC_TO_TICKS(20)) { PRINTD ("late launch arm_time %d time %d\n", ao_launch_arm_time, ao_time()); break; } time_difference = command.tick - ao_time(); if (time_difference < 0) time_difference = -time_difference; if (time_difference > 10) { PRINTD ("time different too large %d\n", time_difference); break; } PRINTD ("ignite\n"); ao_launch_ignite = 1; ao_wakeup(&ao_launch_ignite); break; } } }