01d0114e261bc303732796c069ebc7338876825f
[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
64   // Start TLC.
65   tlc_exec();
66
67   // Start DMX processing.
68   dmx_exec();
69 }
70
71 /**
72  *
73  */
74 static inline void main_loop(void)
75 {
76   // Forever...
77   while (1) {
78     // FIXME
79     // TODO: Don't store more data than necessary.
80     tlc_update();
81   }
82 }
83
84 int main(void)
85 {
86   // Initialize modules.
87   main_init();
88   // Start modules if necessary.
89   main_exec();
90   // Gogogo!
91   main_loop();
92   // Never reached.
93   return 0;
94 }