This should shift the GS-data properly.
authorMalte S. Stretz <mss@apache.org>
Sun, 11 Jan 2009 15:25:05 +0000 (15:25 +0000)
committerMalte S. Stretz <mss@apache.org>
Sun, 11 Jan 2009 15:25:05 +0000 (15:25 +0000)
src/tlc.c

index e2207e0..ac7d9e4 100644 (file)
--- a/src/tlc.c
+++ b/src/tlc.c
@@ -185,19 +185,43 @@ void send_gs_data(void)
   // channels of the last TLC first, then 16 green ones and finally 16 red \r
   // ones.  The last data we shift out is thus the first red of the first\r
   // painter.\r
-  int16_t offset = TLC_N_CHANNELS - 1;\r
+  // This will always point to the start of the current painter data, \r
+  // starting with the last one.\r
+  char * painter_gs = gg_buffer_gs\r
+                    + (TLC_N_CHANNELS - 1)\r
+                    - (TLC_N_CHANNELS_PER_PAINTER - 1);\r
+  // Find the current data byte to shift out, starting with the last one.\r
+  // Its signed so we can determine when we reached the end/start, eight\r
+  // bit are enough to index 48 channels per painter.\r
+#if TLC_N_CHANNELS_PER_PAINTER != 48\r
+#error What a weird painter...\r
+#endif\r
+  int8_t index = TLC_N_CHANNELS_PER_PAINTER - 1;\r
   while (1) {\r
-    // Shift out current channel.\r
-    shift12(gg_buffer_gs[offset]);\r
-\r
-    // Skip two colors.\r
-    offset -= 3;\r
-    // If we reached the start, we jump to the next color.\r
-    if (offset < 0) {\r
-      offset += TLC_N_CHANNELS - 1; // Jump to end again, next color implicit\r
-      if (offset != TLC_N_CHANNELS - 1 - 3)\r
-        break;\r
+    while (1) {\r
+      // Shift out current channel.\r
+      shift12(painter_gs[index]);\r
+\r
+      // Skip two colors.\r
+      index -= 3;\r
+\r
+      // If we reached the start, we jump to the next color.\r
+      if (index < 0) {\r
+        // Did we just finish the last (ie. red) channel?\r
+        if (index == -3)\r
+          break;\r
+\r
+        // Jump to end again and skip to next color.\r
+        index += TLC_N_CHANNELS_PER_PAINTER - 1;\r
+      }\r
     }\r
+\r
+    // Did we just finish the last (ie. first) painter?\r
+    if (painter_gs == gg_buffer_gs)\r
+      break;\r
+\r
+    // Move to next painter.\r
+    painter_gs -= TLC_N_CHANNELS_PER_PAINTER;\r
   }\r
 }\r
 \r