Blink LED_ON on startup and trigger LED_DEBUG on DMX error.
[dmxpainter.git] / src / main.c
index bb2859a..1501f68 100644 (file)
-// http://www.nongnu.org/avr-libc/user-manual/modules.html\r
-\r
-#include <inttypes.h>\r
-\r
-#include <avr/io.h>\r
-#include <avr/interrupt.h>\r
-#include <avr/sleep.h>\r
-\r
-//#include <util/atomic.h>\r
-\r
-#include "config.h"\r
-\r
-#include "bits.h"\r
-\r
-#include "pins.h"\r
-\r
-#include "shed.h"\r
-#include "dmx.h"\r
-#include "tlc.h"\r
-#include "sd.h"\r
-\r
-\r
-//////////////////////////////////////////\r
-\r
-//ISR(\r
-\r
-ISR(DMX_VECT)\r
-{\r
-  dmx_int_trigger();\r
-}\r
-\r
-//////////////////////////////////////////\r
-\r
-void main_init()\r
-{\r
-  /*ATOMIC_BLOCK(ATOMIC_FORCEON)*/ \r
-}\r
-\r
-int main(void)\r
-{\r
-  cli();\r
-\r
-  sched_init();\r
-\r
-  dmx_init();\r
-  tlc_init();\r
-\r
-  sei();\r
-  // Start TLC\r
-  tlc_start();\r
-\r
-  // Start scheduler.\r
-  sched_loop();\r
-  return 0;\r
-}\r
+// http://www.nongnu.org/avr-libc/user-manual/modules.html
+
+#include "mcu.h"
+
+#include "buf.h"
+
+#include "dmx.h"
+#include "tlc.h"
+
+#include <avr/delay.h>
+
+
+// We require GCC 4.x for inlining and stuff.
+// http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
+#if __GNUC__ < 4
+#error GCC 4.x.x required!
+#endif
+
+/*********************************************************************/
+// Interrupts
+
+// INT0:  External int, DMX sync
+mcu_register_isr(INT0);
+// TIMER0:  8-Bit: 4 us for DMX, timeouts
+mcu_register_isr(TIMER0_OVF);
+// USART:  RXD
+mcu_register_isr(USART_RXC);
+
+// TIMER1: 16-Bit: GSCLK
+mcu_register_isr(TIMER1_COMPA);
+// TIMER2:  8-Bit: GS-Refresh-Timer
+mcu_register_isr(TIMER2_COMP);
+
+
+/*********************************************************************/
+
+/**
+ * 
+ */
+static inline void main_init(void)
+{
+  // Disable interrupts while initializing.
+  cli();
+  mcu_init();
+
+  // Initialize buffer.
+  buf_init();
+
+  // Initialize peripherals.
+  dmx_init();
+  tlc_init();
+
+  // Enable interrupts again.
+  sei();
+}
+
+/**
+ *
+ */
+static inline void main_exec(void)
+{
+  // Signal that we're running.
+  pin_out(PIN_LED_ON);
+  pin_on( PIN_LED_ON);
+  _delay_ms(200);
+  pin_off(PIN_LED_ON);
+  _delay_ms(200);
+  pin_on (PIN_LED_ON);
+
+  // Start TLC.
+  tlc_exec();
+
+  // Start DMX processing.
+  dmx_exec();
+}
+
+/**
+ *
+ */
+static inline void main_loop(void)
+{
+  // Forever...
+  while (1) {
+    // FIXME
+    // TODO: Don't store more data than necessary.
+    dmx_update();
+    tlc_update();
+  }
+}
+
+int main(void)
+{
+  // Initialize modules.
+  main_init();
+  // Start modules if necessary.
+  main_exec();
+  // Gogogo!
+  main_loop();
+  // Never reached.
+  return 0;
+}