]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/main.c
02e75d9adfdc868d53aceede6cc9c0cd00f82f1d
[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         power_usi_disable(); // Once for lifetime
92
93         log_set_state(3);
94
95         hw_setup();
96         power_down();
97
98         sei();
99 #if 1
100         while (1) {
101                 wdt_reset();
102                 sleep_mode();
103         }
104 #endif
105
106 #if 0
107         DDRB |= _BV(PB2);
108         while (1) {
109                 PORTB |=  _BV( PB2 );
110                 _delay_ms(200);
111                 PORTB &=~ _BV( PB2 );
112                 _delay_ms(200);
113         }
114 #endif
115 }