This send_dc code should actually work...
authorMalte S. Stretz <mss@apache.org>
Sun, 11 Jan 2009 17:05:58 +0000 (17:05 +0000)
committerMalte S. Stretz <mss@apache.org>
Sun, 11 Jan 2009 17:05:58 +0000 (17:05 +0000)
src/tlc.c

index 6e5a785..6723c82 100644 (file)
--- a/src/tlc.c
+++ b/src/tlc.c
@@ -211,16 +211,37 @@ void send_gs_data(void)
 \r
 void send_dc_data(void)\r
 {\r
-  for (int rgb = 2; rgb != -1; rgb--) {\r
+  // All TLCs on all the connected painters will get the same DC value.\r
+  // That makes it easy to generate the 6-Bit format we need:  We just\r
+  // create a constant buffer for the packed rgb values, containing four\r
+  // values for each color.\r
+  uint8_t dc_out[3][3];\r
+  for (int8_t rgb = 2; rgb >= 0; rgb--) {\r
     uint8_t dc_data = gg_buffer_dc[rgb] & bits_uint8(1, 1, 1, 1, 1, 1, 0, 0);\r
-    uint8_t dc_out[3] = {\r
-      (dc_data << 0) | (dc_data >> 6),\r
-       (dc_data << 2) | (dc_data >> 4),\r
-        (dc_data << 4) | (dc_data >> 2)\r
-    };\r
-\r
-    for (int i = 0; i < TLC_N_CHANNELS; i++) {\r
-      shift8(dc_out[i % 3]);\r
+    dc_out[rgb][0] = (dc_data << 0) | (dc_data >> 6);\r
+    dc_out[rgb][1] = (dc_data << 2) | (dc_data >> 4);\r
+    dc_out[rgb][2] = (dc_data << 4) | (dc_data >> 2);\r
+  }\r
+\r
+  // Now, shift out the dc-data like we do it with the gs-data:  First the\r
+  // last blue, then green and red of the last painter, until we reach the\r
+  // first red.\r
+  int8_t painter = N_PAINTER;\r
+  int8_t rgb     = 3 - 1;\r
+  int8_t channel = TLC_N_CHANNELS_PER_TLC - 1;\r
+  while (1) {\r
+    shift8(dc_out[rgb][channel & (4 - 1)]);\r
+\r
+    channel--;\r
+    if (channel == 0) {\r
+      channel = TLC_N_CHANNELS_PER_TLC - 1;\r
+      rgb--;\r
+      if (rgb < 0) {\r
+        rgb = 3 - 1;\r
+        painter--;\r
+        if (painter == 0)\r
+          break;\r
+      }\r
     }\r
   }\r
 }\r