]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/main.c
buttons.c: param setup fixes
[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 static void hw_setup()
11 {
12         wdt_enable(WDTO_1S);
13         init_battery();
14         init_pwm();
15         init_adc();
16         init_tmr();
17         init_buttons();
18
19         pwmled_init();
20         gpio_init();
21         ambient_init();
22         pattern_init();
23
24         set_sleep_mode(SLEEP_MODE_IDLE);
25 }
26
27 static void hw_suspend()
28 {
29         susp_pwm();
30         susp_adc();
31         susp_tmr();
32         susp_gpio();
33         wdt_disable();
34 }
35
36
37 void power_down()
38 {
39         uint16_t wake_count = 0;
40         unsigned char btn;
41
42         hw_suspend();
43 sleep_again:
44         // enable PCINT14, so that user can wake up later
45         GIMSK |= _BV(PCIE1);
46         PCMSK1 |= _BV(PCINT14);
47
48         // G'night
49         set_sleep_mode(SLEEP_MODE_PWR_DOWN);
50         sleep_enable();
51         sleep_bod_disable();
52         sei();
53         sleep_cpu();
54
55         // G'morning
56         cli();
57
58         sleep_disable();
59
60         // Disable PCINT14
61         GIMSK &= ~_BV(PCIE1);
62         PCMSK1 &= ~_BV(PCINT14);
63
64         // allow wakeup by long button-press only
65         for (btn = 0; btn < 5; btn++) {
66                 if ((PINB & _BV(PB6)) != 0) {
67                         wake_count++;
68                         goto sleep_again;;
69                 }
70                 _delay_ms(100);
71         }
72
73         // ok, so I will wake up
74         log_byte(0xb1);
75         log_word(wake_count);
76         log_flush();
77
78         hw_setup();
79 }
80
81
82 ISR(PCINT_vect)
83 {
84         GIMSK &= ~_BV(PCIE1);
85         PCMSK1 &= ~_BV(PCINT14);
86 }
87
88 int main(void)
89 {
90         log_init();
91
92         power_usi_disable(); // Once for lifetime
93         ACSRA |= _BV(ACD);   // disable analog comparator
94
95         log_set_state(3);
96
97         hw_setup();
98         power_down();
99
100         sei();
101 #if 1
102         while (1) {
103                 wdt_reset();
104                 sleep_mode();
105         }
106 #endif
107
108 #if 0
109         DDRB |= _BV(PB2);
110         while (1) {
111                 PORTB |=  _BV( PB2 );
112                 _delay_ms(200);
113                 PORTB &=~ _BV( PB2 );
114                 _delay_ms(200);
115         }
116 #endif
117 }