e6aa21f97e4fbceeb0a9dc920b817d94f4e89d9b
[dmxpainter.git] / src / main.c
1 // http://www.nongnu.org/avr-libc/user-manual/modules.html
2
3 #include "mcu.h"
4
5 #include "buf.h"
6
7 #include "dmx.h"
8 #include "tlc.h"
9
10
11 // We require GCC 4.x for inlining and stuff.
12 // http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
13 #if __GNUC__ < 4
14 #error GCC 4.x.x required!
15 #endif
16
17 /*********************************************************************/
18 // Interrupts
19
20 // INT0:  External int, DMX sync
21 mcu_register_isr(INT0);
22 // TIMER0:  8-Bit: 4 us for DMX, timeouts
23 mcu_register_isr(TIMER0_OVF);
24 // USART:  RXD
25 mcu_register_isr(USART_RXC);
26
27 // TIMER1: 16-Bit: GSCLK
28 mcu_register_isr(TIMER1_COMPA);
29 // TIMER2:  8-Bit: GS-Refresh-Timer
30 mcu_register_isr(TIMER2_COMP);
31
32
33 /*********************************************************************/
34
35 /**
36  * 
37  */
38 static inline void main_init(void)
39 {
40   // Disable interrupts while initializing.
41   cli();
42   mcu_init();
43
44   // Initialize buffer.
45   buf_init();
46
47   // Initialize peripherals.
48   dmx_init();
49   tlc_init();
50
51   // Enable interrupts again.
52   sei();
53 }
54
55 /**
56  *
57  */
58 static inline void main_exec(void)
59 {
60   // Signal that we're running.
61   pin_out(PIN_LED_ON);
62   pin_on(PIN_LED_ON);
63   // Start DMX processing.
64   dmx_exec();
65 }
66
67 /**
68  *
69  */
70 static inline void main_loop(void)
71 {
72   // Forever...
73   while (1) {
74     // FIXME
75     // TODO: Don't store more data than necessary.
76     tlc_send_data();
77   }
78 }
79
80 int main(void)
81 {
82   // Initialize modules.
83   main_init();
84   // Start modules if necessary.
85   main_exec();
86   // Gogogo!
87   main_loop();
88   // Never reached.
89   return 0;
90 }