#include #include #include #include #include #include #include #include "data_manager.h" #include "display.h" #include "timer.h" #include "ui.h" #include "barometer.h" #ifdef WDT_DISABLE # warning "WDT disabled in this build" # define WDT_SETUP_MAYBE(x) # define WDT_PAT_MAYBE() #else # define WDT_SETUP_MAYBE(x) do{wdt_enable(x);}while(0) # define WDT_PAT_MAYBE() do{wdt_reset();}while(0) #endif static struct data_ctx dctx = {}; static struct ui_ctx ui_ctx = {}; /* ISR for collecting and displaying pressure, altitude data etc */ ISR(TIMER1_COMPA_vect) { data_manager_tick(&dctx); ui_update(&ui_ctx, &dctx); WDT_PAT_MAYBE(); } int main(void) { struct barometer barometer; struct display display; struct timer timer; /* get descriptors for system default peripherals */ get_system_barometer(&barometer); get_system_display(&display); get_system_timer(&timer); /* Initialise peripherals/modules before enabling interrupts below */ barometer.init(); timer.init(); data_manager_init(&dctx, &timer, &barometer); ui_init(&ui_ctx, &display); #ifdef USBCON /* Disable USB controller if one is present - this spams (latches?) USB_GEN * interrupt which we're not handling for now */ USBCON &= ~(1 << USBE); #endif // FIXME measure current saving here if any //ACSR |= (1 << ACD); /* main body should take no longer than 1 second to run */ WDT_SETUP_MAYBE(WDTO_2S); sei(); while(1) { set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode(); } } /* FIXME remove these - handy for testing in gdb */ void up(void){ui_input_event(&ui_ctx, &dctx, UI_INPUT_EVENT_UP);ui_update(&ui_ctx, &dctx);} void down(void){ui_input_event(&ui_ctx, &dctx, UI_INPUT_EVENT_DOWN);ui_update(&ui_ctx, &dctx);} void press(void){ui_input_event(&ui_ctx, &dctx, UI_INPUT_EVENT_PRESS);ui_update(&ui_ctx, &dctx);} void hold(void){ui_input_event(&ui_ctx, &dctx, UI_INPUT_EVENT_HOLD);ui_update(&ui_ctx, &dctx);}