]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/main.c
firmware/buttons.c: preliminary user params setup
[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_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 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 sleep_again:
43         // enable PCINT14, so that user can wake up later
44         GIMSK |= _BV(PCIE1);
45         PCMSK1 |= _BV(PCINT14);
46
47         // G'night
48         set_sleep_mode(SLEEP_MODE_PWR_DOWN);
49         sleep_enable();
50         sleep_bod_disable();
51         sei();
52         sleep_cpu();
53
54         // G'morning
55         cli();
56
57         sleep_disable();
58
59         // Disable PCINT14
60         GIMSK &= ~_BV(PCIE1);
61         PCMSK1 &= ~_BV(PCINT14);
62
63         // allow wakeup by long button-press only
64         for (btn = 0; btn < 5; btn++) {
65                 if ((PINB & _BV(PB6)) != 0) {
66                         wake_count++;
67                         goto sleep_again;;
68                 }
69                 _delay_ms(100);
70         }
71
72         // ok, so I will wake up
73         log_byte(0xb1);
74         log_word(wake_count);
75         log_flush();
76
77         hw_setup();
78 }
79
80
81 ISR(PCINT_vect)
82 {
83         GIMSK &= ~_BV(PCIE1);
84         PCMSK1 &= ~_BV(PCINT14);
85 }
86
87 int main(void)
88 {
89         log_init();
90         power_usi_disable(); // Once for lifetime
91
92         log_set_state(3);
93
94         hw_setup();
95         hw_suspend();
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 }