Moved a lot of code around to arrange all the public/private stuff more clearly.
authorMalte S. Stretz <mss@apache.org>
Mon, 9 Mar 2009 14:40:23 +0000 (14:40 +0000)
committerMalte S. Stretz <mss@apache.org>
Mon, 9 Mar 2009 14:40:23 +0000 (14:40 +0000)
src/buf.c
src/dmx.c
src/tlc.c

index 897c849..e37ccc6 100644 (file)
--- a/src/buf.c
+++ b/src/buf.c
@@ -1,5 +1,8 @@
 #include "buf.h"
 
+/*********************************************************************/
+/* Declaration of public global variables.                           */
+
 /*
  * All channel greyscale data is initialized to zero.
  * TODO: Size should be based on N_PAINTER
index 038f6fc..51a5232 100644 (file)
--- a/src/dmx.c
+++ b/src/dmx.c
@@ -5,84 +5,7 @@
 #include "buf.h"
 
 /*********************************************************************/
-
-static void enable_timer(int8_t us)
-{
-  // Prepare timer counter.
-  TCNT0 = 0xFF - 2 * us;
-
-  // Enable timer, use a frequency prescaler of 8 (p72).
-  bits_mask_on(TCCR0, (1 << CS01));
-}
-
-static void disable_timer(void)
-{
-  // Disable timer (p72).
-  bits_mask_off(TCCR0, (1 << CS02) | (1 << CS01) | (1 << CS00));
-}
-
-
-static void enable_trigger(void)
-{
-  // Enable interrupt triggered by edge on pin.
-  bits_on(GICR, INT0);
-}
-
-static void disable_trigger(void)
-{
-  // Disable interrupt triggered by edge on pin.
-  bits_off(GICR, INT0);
-}
-
-static void enable_usart(void)
-{
-  // Enable RXD.
-  bits_on(UCSRB, RXEN);
-}
-
-static void disable_usart(void)
-{
-  // Disable RXD.
-  bits_off(UCSRB, RXEN);
-}
-
-/*********************************************************************/
-
-void dmx_init(void)
-{
-  // Configure both pins as input.
-  pin_in(PIN_DMX_INT);
-  pin_in(PIN_DMX_RXD);
-
-  // Initialize USART (p156) with
-  // 250kbaud    (UBRR = 3),
-  // 8 data bits (UCSZ = 011),
-  // 2 stop bits (USBS = 1),
-  // no parity   (UPM  = 00).
-  UBRRL = F_CPU / (16 * 250e3) - 1;
-  UBRRH = (0 << URSEL) | 0;
-  UCSRC = (1 << URSEL)
-        | bits_value(UCSZ1) | bits_value(UCSZ0)
-        | bits_value(USBS);
-  // Enable USART RXD interrupt (and clear UCSZ2 and *XEN).
-  UCSRB = bits_value(RXCIE);
-
-  // Enable timer interrupt (p72).
-  bits_on(TIMSK, TOIE0);
-
-  // Trigger INT0 on any edge (ISC0 = 01, p67).
-  bits_on(MCUCR, ISC00);
-  // But explicitly disable it for now.
-  disable_trigger();
-}
-
-void dmx_exec(void)
-{
-  // Just enable the trigger for the pin.
-  enable_trigger();
-}
-
-/*********************************************************************/
+/* Declaration of private global variables.                          */
 
 enum state {
   STATE_IDLE,
@@ -95,6 +18,20 @@ static volatile enum state state_;
 static          int16_t index_;
 
 
+/*********************************************************************/
+/* Declaration of private functions.                                 */
+
+static void enable_timer(int8_t us);
+static void disable_timer(void);
+static void enable_trigger(void);
+static void disable_trigger(void);
+static void enable_usart(void);
+static void disable_usart(void);
+
+
+/*********************************************************************/
+/* Implementation of public interrupts.                              */
+
 void dmx_int_timer0_ovf(void)
 {
   // Disable this interrupt.
@@ -108,7 +45,7 @@ void dmx_int_timer0_ovf(void)
     }
     case STATE_RECV:
     case STATE_STOR: {
-      // We got a timeout, back to Idle.
+    // We got a timeout, back to Idle.
       disable_usart();
       enable_trigger();
       state_ = STATE_IDLE;
@@ -118,7 +55,6 @@ void dmx_int_timer0_ovf(void)
       break;
     }
   }
-  
 }
 
 void dmx_int_ext(void)
@@ -170,8 +106,8 @@ void dmx_int_usart_rxc(void)
     case STATE_RECV: {
       // TODO: Check for valid start byte.
       /*if (rxd != 0x00) {
-        goto last;
-      }*/
+      goto last;
+    }*/
 
       // Switch to data storage.
       index_ = 0;
@@ -197,8 +133,90 @@ void dmx_int_usart_rxc(void)
   return;
 last:
   // Either an invalid or the last frame appeared, stop DMX.
-  disable_usart();
+    disable_usart();
   enable_trigger();
   state_ = STATE_IDLE;
   return;
 }
+
+
+/*********************************************************************/
+/* Implementation of public functions.                               */
+
+void dmx_init(void)
+{
+  // Configure both pins as input.
+  pin_in(PIN_DMX_INT);
+  pin_in(PIN_DMX_RXD);
+
+  // Initialize USART (p156) with
+  // 250kbaud    (UBRR = 3),
+  // 8 data bits (UCSZ = 011),
+  // 2 stop bits (USBS = 1),
+  // no parity   (UPM  = 00).
+  UBRRL = F_CPU / (16 * 250e3) - 1;
+  UBRRH = (0 << URSEL) | 0;
+  UCSRC = (1 << URSEL)
+        | bits_value(UCSZ1) | bits_value(UCSZ0)
+        | bits_value(USBS);
+  // Enable USART RXD interrupt (and clear UCSZ2 and *XEN).
+  UCSRB = bits_value(RXCIE);
+
+  // Enable timer interrupt (p72).
+  bits_on(TIMSK, TOIE0);
+
+  // Trigger INT0 on any edge (ISC0 = 01, p67).
+  bits_on(MCUCR, ISC00);
+  // But explicitly disable it for now.
+  disable_trigger();
+}
+
+void dmx_exec(void)
+{
+  // Just enable the trigger for the pin.
+  enable_trigger();
+}
+
+
+/*********************************************************************/
+/* Implementation of private functions.                              */
+
+static void enable_timer(int8_t us)
+{
+  // Prepare timer counter.
+  TCNT0 = 0xFF - 2 * us;
+
+  // Enable timer, use a frequency prescaler of 8 (p72).
+  bits_mask_on(TCCR0, (1 << CS01));
+}
+
+static void disable_timer(void)
+{
+  // Disable timer (p72).
+  bits_mask_off(TCCR0, (1 << CS02) | (1 << CS01) | (1 << CS00));
+}
+
+
+static void enable_trigger(void)
+{
+  // Enable interrupt triggered by edge on pin.
+  bits_on(GICR, INT0);
+}
+
+static void disable_trigger(void)
+{
+  // Disable interrupt triggered by edge on pin.
+  bits_off(GICR, INT0);
+}
+
+static void enable_usart(void)
+{
+  // Enable RXD.
+  bits_on(UCSRB, RXEN);
+}
+
+static void disable_usart(void)
+{
+  // Disable RXD.
+  bits_off(UCSRB, RXEN);
+}
index 5835f34..e250829 100644 (file)
--- a/src/tlc.c
+++ b/src/tlc.c
@@ -6,64 +6,72 @@
 
 #include "buf.h"
 
+
 /*********************************************************************/
+/* Declaration of private global variables.                          */
 
+/**
+ * Flag to indicate that data is available for shifting.
+ */
 static volatile uint8_t data_available_;
+/**
+ * Flag to indicate that data is currently shifted out.
+ */
+static volatile uint8_t data_shifting_;
+
 
 /*********************************************************************/
+/* Declaration of private functions.                                 */
 
-static volatile uint8_t data_shifting_;
 static void send_data(void);
 static void start_gscycle(void);
-void tlc_wait_for_data()
-{
-  if (data_shifting_) return;
-  send_data();
-  start_gscycle();
-  // Continue in background...
-}
-static void set_shifting_off(void)
-{
-  data_shifting_ = 0;
-}
+
+static void set_shifting_off(void);
+static void clock_xlat(void);
+static void clock_sclk(void);
+static void set_blnk_on(void);
+static void set_blnk_off(void);
+static void set_vprg_gs_mode(void);
+static void set_vprg_dc_mode(void);
+
+static void send_data(void);
+
 
 /*********************************************************************/
+/* Implementation of public interrupts.                              */
 
-// XLAT pulse to apply data to internal register.
-static void clock_xlat(void)
+void tlc_int_timer1_ocma(void)
 {
-  pin_on(PIN_TLC_XLAT);
-  pin_off(PIN_TLC_XLAT);
-}
+  // First, disable this interrupt.
+  mcu_int_timer1_ocma_disable();
 
-// SCLK pulse to clock in serial data from SIN.
-static void clock_sclk(void)
-{
-  pin_on(PIN_TLC_SCLK);
-  pin_off(PIN_TLC_SCLK);
-}
+  // Restart and enable timeout timer.
+  mcu_set_timer2_cnt(0);
+  mcu_int_timer2_ocm_enable();
 
-static void set_blnk_on(void)
-{
-  pin_on(PIN_TLC_BLNK);
+  // Switch off BLNK.
+  set_blnk_off();
+  // Hack: Switch on GSCLK
+  pin_out(PIN_TLC_GSCK);
 }
 
-static void set_blnk_off(void)
+void tlc_int_timer2_ocm(void)
 {
-  pin_off(PIN_TLC_BLNK);
-}
+  // Hack: Switch off GSCLK
+  pin_in(PIN_TLC_GSCK);
+  // Go into BLNK mode (switch off LEDs and reset GSCLK counter)
+  set_blnk_on();
 
-static void set_vprg_gs_mode(void)
-{
-  pin_off(PIN_TLC_VPRG);
-}
+  // Disable GS cycle timeout timer.
+  mcu_int_timer2_ocm_disable();
 
-static void set_vprg_dc_mode(void)
-{
-  pin_on(PIN_TLC_VPRG);
+  // Wait for next DMX packet.
+  set_shifting_off();
 }
 
+
 /*********************************************************************/
+/* Implementation of public functions.                               */
 
 void tlc_init(void)
 {
@@ -111,42 +119,64 @@ void tlc_set_data_done(void)
   data_available_ = 1;
 }
 
+void tlc_wait_for_data()
+{
+  if (data_shifting_) return;
+  send_data();
+  start_gscycle();
+  // Continue in background...
+}
+
+
 /*********************************************************************/
+/* Implementation of private functions.                              */
 
-static void start_gscycle(void)
+static void set_shifting_off(void)
 {
-  data_shifting_ = 1;
-  // Start counter with next GS pulse.
-  mcu_int_timer1_ocma_enable();
+  data_shifting_ = 0;
 }
 
-void tlc_int_timer1_ocma(void)
+// XLAT pulse to apply data to internal register.
+static void clock_xlat(void)
 {
-  // First, disable this interrupt.
-  mcu_int_timer1_ocma_disable();
+  pin_on(PIN_TLC_XLAT);
+  pin_off(PIN_TLC_XLAT);
+}
 
-  // Restart and enable timeout timer.
-  mcu_set_timer2_cnt(0);
-  mcu_int_timer2_ocm_enable();
+// SCLK pulse to clock in serial data from SIN.
+static void clock_sclk(void)
+{
+  pin_on(PIN_TLC_SCLK);
+  pin_off(PIN_TLC_SCLK);
+}
 
-  // Switch off BLNK.
-  set_blnk_off();
-  // Hack: Switch on GSCLK
-  pin_out(PIN_TLC_GSCK);
+static void set_blnk_on(void)
+{
+  pin_on(PIN_TLC_BLNK);
 }
 
-void tlc_int_timer2_ocm(void)
+static void set_blnk_off(void)
 {
-  // Hack: Switch off GSCLK
-  pin_in(PIN_TLC_GSCK);
-  // Go into BLNK mode (switch off LEDs and reset GSCLK counter)
-  set_blnk_on();
+  pin_off(PIN_TLC_BLNK);
+}
 
-  // Disable GS cycle timeout timer.
-  mcu_int_timer2_ocm_disable();
+static void set_vprg_gs_mode(void)
+{
+  pin_off(PIN_TLC_VPRG);
+}
 
-  // Wait for next DMX packet.
-  set_shifting_off();
+static void set_vprg_dc_mode(void)
+{
+  pin_on(PIN_TLC_VPRG);
+}
+
+/*********************************************************************/
+
+static void start_gscycle(void)
+{
+  data_shifting_ = 1;
+  // Start counter with next GS pulse.
+  mcu_int_timer1_ocma_enable();
 }
 
 /*********************************************************************/
@@ -231,7 +261,7 @@ static void send_gs_data(void)
 static void send_dc_data(void)
 {
   // Set VPRG to DC mode. 
-  set_vprg_dc_mode();  
+  set_vprg_dc_mode();
 
   // All TLCs on all the connected painters will get the same DC value.
   // That makes it easy to generate the 6-Bit format we need:  We just