X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fmain.c;h=25ea829511781e3e365c282a9bc0ae0e4357b8c3;hb=ed608010c0a708b9be0d3577d7f4d3313eb2e851;hp=efebdabafb5d2aa30571b65e49ca1683b006a2c6;hpb=f956c1fa7f47b0e8b8afe323c2eff1b6c2607c2a;p=bike-lights.git diff --git a/firmware/main.c b/firmware/main.c index efebdab..25ea829 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -2,12 +2,15 @@ #include #include #include +#include #include #include "lights.h" void hw_setup() { + wdt_enable(WDTO_1S); + init_battery(); init_pwm(); init_adc(); init_tmr(); @@ -21,17 +24,77 @@ void hw_setup() set_sleep_mode(SLEEP_MODE_IDLE); } -int main(void) +void hw_suspend() { - log_init(); - wdt_enable(WDTO_1S); + susp_pwm(); + susp_adc(); + susp_tmr(); + susp_gpio(); + wdt_disable(); +} + + +void power_down() +{ + uint16_t wake_count = 0; + unsigned char btn; + +sleep_again: + // enable PCINT14, so that user can wake up later + GIMSK |= _BV(PCIE1); + PCMSK1 |= _BV(PCINT14); + + // G'night + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + sleep_enable(); + sleep_bod_disable(); + sei(); + sleep_cpu(); + + // G'morning + cli(); + + sleep_disable(); + + // Disable PCINT14 + GIMSK &= ~_BV(PCIE1); + PCMSK1 &= ~_BV(PCINT14); - _delay_ms(100); + // allow wakeup by long button-press only + for (btn = 0; btn < 5; btn++) { + if ((PINB & _BV(PB6)) != 0) { + wake_count++; + goto sleep_again;; + } + _delay_ms(100); + } + + // ok, so I will wake up + log_byte(0xb1); + log_word(wake_count); + log_flush(); hw_setup(); +} + + +ISR(PCINT_vect) +{ + GIMSK &= ~_BV(PCIE1); + PCMSK1 &= ~_BV(PCINT14); +} + +int main(void) +{ + log_init(); + power_usi_disable(); // Once for lifetime log_set_state(3); + hw_setup(); + hw_suspend(); + power_down(); + sei(); #if 1 while (1) {