}
void
-ao_delay_until(uint16_t target) {
+ao_delay_until(AO_TICK_TYPE target) {
int16_t delay = target - ao_time();
if (delay > 0) {
ao_sleep_for(ao_delay_until, delay);
stm_rcc.apb2enr &= ~(1 << STM_RCC_APB2ENR_ADCEN);
}
-static uint16_t
+static AO_TICK_TYPE
ao_battery_voltage(void)
{
- uint16_t vrefint;
+ AO_TICK_TYPE vrefint;
ao_battery_init();
return 330 * stm_cal.vrefint_cal / vrefint;
}
+static void
+ao_log_erase(void)
+{
+ ao_storage_erase(0, ao_storage_log_max);
+}
uint8_t ao_on_battery;
ao_micropeak(void)
{
ao_ms5607_setup();
- ao_storage_setup();
/* Give the person a second to get their finger out of the way */
ao_delay(AO_MS_TO_TICKS(1000));
- ao_pips();
-
ao_log_micro_restore();
ao_compute_height();
ao_report_altitude();
+
+ ao_pips();
+
ao_log_micro_dump();
#if BOOST_DELAY
ao_delay(BOOST_DELAY);
#endif
+ ao_log_erase();
ao_microflight();
ao_compute_height();
ao_report_altitude();
+ ao_sleep_mode();
ao_sleep(&ao_on_battery);
}
printf("battery: %u\n", ao_battery_voltage());
}
+uint8_t
+ao_log_present(void)
+{
+ AO_TICK_TYPE n_samples;
+
+ ao_eeprom_read(N_SAMPLES_OFFSET, &n_samples, sizeof (n_samples));
+
+ return n_samples != 0xffff;
+}
+
+static void
+ao_log_list(void)
+{
+ if (ao_log_present())
+ printf ("flight %d start %x end %x\n",
+ 1,
+ 0, (unsigned) (MAX_LOG_OFFSET >> 8));
+ printf ("done\n");
+}
+
+static void
+ao_log_delete(void)
+{
+ int16_t cmd_flight = 1;
+
+ ao_cmd_white();
+ if (ao_cmd_lex_c == '-') {
+ cmd_flight = -1;
+ ao_cmd_lex();
+ }
+ cmd_flight *= ao_cmd_decimal();
+ if (ao_cmd_status != ao_cmd_success)
+ return;
+
+ /* Look for the flight log matching the requested flight */
+ if (cmd_flight == 1 && ao_log_present()) {
+ ao_log_erase();
+ puts("Erased");
+ return;
+ }
+ printf("No such flight: %d\n", cmd_flight);
+}
+
static struct ao_cmds mp_cmd[] = {
+ { ao_log_list, "l\0List logs" },
+ { ao_log_delete, "d <flight-number>\0Delete flight" },
{ ao_show_bat, "b\0Show battery voltage" },
{ 0 }
};
/* Enable prefetch */
stm_flash.acr |= (1 << STM_FLASH_ACR_PRFTBE);
- /* Enable power interface clock */
- stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_PWREN);
-
/* HCLK to 48MHz -> AHB prescaler = /1 */
cfgr = stm_rcc.cfgr;
cfgr &= ~(STM_RCC_CFGR_HPRE_MASK << STM_RCC_CFGR_HPRE);
stm_rcc.csr |= (1 << STM_RCC_CSR_RMVF);
}
-void
+int
main(void)
{
int i;
ao_led_init();
ao_task_init();
ao_timer_init();
- ao_serial_init();
stm_moder_set(&stm_gpioa, 2, STM_MODER_OUTPUT);
ao_dma_init();
ao_spi_init();
ao_exti_init();
+ ao_storage_setup();
+
ao_ms5607_init();
ao_storage_init();
+ /* Let FLITF clock turn off in sleep mode */
+ stm_rcc.ahbenr &= ~(1 << STM_RCC_AHBENR_FLITFEN);
+
+ /* Le SRAM clock turn off in sleep mode */
+ stm_rcc.ahbenr &= ~(1 << STM_RCC_AHBENR_SRAMEN);
+
if (ao_on_battery) {
/* On battery power, run the flight code */
ao_add_task(&mp_task, ao_micropeak, "micropeak");
ao_usb_init();
ao_cmd_init();
ao_cmd_register(mp_cmd);
+ ao_config_init();
}
ao_start_scheduler();
}