]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/main.c
patterns: 3 bits for duration, 5 bits for mode
[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
7 #include "lights.h"
8
9 static void hw_setup()
10 {
11         init_battery();
12         init_pwm();
13         init_adc();
14         init_tmr();
15         init_buttons();
16
17         init_pwmled();
18         init_gpio();
19         init_ambient();
20         init_pattern();
21         init_control();
22
23         set_sleep_mode(SLEEP_MODE_IDLE);
24 }
25
26 static void hw_suspend()
27 {
28         susp_pwm();
29         susp_adc();
30         susp_tmr();
31         susp_gpio();
32         susp_ambient();
33         susp_buttons();
34 }
35
36 void power_down()
37 {
38         hw_suspend();
39
40         do {
41                 // G'night
42                 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
43                 sleep_enable();
44                 sleep_bod_disable();
45                 sei();
46                 sleep_cpu();
47
48                 // G'morning
49                 cli();
50                 sleep_disable();
51
52                 // allow wakeup by long button-press only
53         } while (!buttons_wait_for_release());
54
55         // ok, so I will wake up
56         hw_setup();
57 }
58
59 int main(void)
60 {
61         init_log();
62
63         power_usi_disable(); // Once for lifetime
64         ACSRA |= _BV(ACD);   // disable analog comparator
65
66         log_set_state(3);
67
68         hw_setup();
69         power_down();
70
71         sei();
72 #if 1
73         while (1) {
74                 cli();
75                 if (TIMER1_IS_ON()) {
76                         set_sleep_mode(SLEEP_MODE_IDLE);
77                 } else if (adc_is_on) {
78                         set_sleep_mode(SLEEP_MODE_ADC);
79                 } else {
80                         set_sleep_mode(SLEEP_MODE_PWR_DOWN);
81                 }
82
83                 sleep_enable();
84                 // keep BOD active, no sleep_bod_disable();
85                 sei();
86                 sleep_cpu();
87                 sleep_disable();
88         }
89 #endif
90
91 #if 0
92         DDRB |= _BV(PB2);
93         while (1) {
94                 PORTB |=  _BV( PB2 );
95                 _delay_ms(200);
96                 PORTB &=~ _BV( PB2 );
97                 _delay_ms(200);
98         }
99 #endif
100 }