]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/main.c
5db08b17d7335ed07b370b775de44416819978e8
[bike-lights.git] / firmware / main.c
1 #include <avr/io.h>
2 #include <util/delay.h>
3 #include <avr/sleep.h>
4 #include <avr/interrupt.h>
5 #include <avr/power.h>
6 #include <avr/wdt.h>
7
8 #include "lights.h"
9
10 void hw_setup()
11 {
12         wdt_enable(WDTO_1S);
13         init_pwm();
14         init_adc();
15         init_tmr();
16         init_buttons();
17
18         pwmled_init();
19         gpio_init();
20         ambient_init();
21         pattern_init();
22
23         set_sleep_mode(SLEEP_MODE_IDLE);
24 }
25
26 void hw_suspend()
27 {
28         susp_pwm();
29         susp_adc();
30         susp_tmr();
31         susp_gpio();
32         wdt_disable();
33 }
34
35
36 void power_down()
37 {
38         // enable PCINT14, so that user can wake up later
39         GIMSK |= _BV(PCIE1);
40         PCMSK1 |= _BV(PCINT14);
41
42         // G'night
43         set_sleep_mode(SLEEP_MODE_PWR_DOWN);
44         sleep_enable();
45         sleep_bod_disable();
46         sei();
47         sleep_cpu();
48
49         // G'morning
50         cli();
51
52         sleep_disable();
53
54         // Disable PCINT14
55         GIMSK &= ~_BV(PCIE1);
56         PCMSK1 &= ~_BV(PCINT14);
57
58         hw_setup();
59 }
60
61
62 ISR(PCINT_vect)
63 {
64         GIMSK &= ~_BV(PCIE1);
65         PCMSK1 &= ~_BV(PCINT14);
66 }
67
68 int main(void)
69 {
70         log_init();
71         power_usi_disable(); // Once for lifetime
72
73         log_set_state(3);
74
75         hw_setup();
76         hw_suspend();
77         power_down();
78
79         sei();
80 #if 1
81         while (1) {
82                 wdt_reset();
83                 sleep_mode();
84         }
85 #endif
86
87 #if 0
88         DDRB |= _BV(PB2);
89         while (1) {
90                 PORTB |=  _BV( PB2 );
91                 _delay_ms(200);
92                 PORTB &=~ _BV( PB2 );
93                 _delay_ms(200);
94         }
95 #endif
96 }