X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fkaka%2Fcakelight%2FLedFrame.java;h=a0e14049d392528ae131cc62cfae187a726ecad2;hb=5766b2bf1868379db46b4d7146281a4cc8c92f8e;hp=9d95b0ca742e77d500395b73c18a97ff8492369f;hpb=0bf6c885fdaa8273ab72789f7efcd9477234168a;p=kaka%2Fcakelight.git
diff --git a/src/kaka/cakelight/LedFrame.java b/src/kaka/cakelight/LedFrame.java
index 9d95b0c..a0e1404 100644
--- a/src/kaka/cakelight/LedFrame.java
+++ b/src/kaka/cakelight/LedFrame.java
@@ -1,38 +1,70 @@
package kaka.cakelight;
+import java.util.Arrays;
+
public class LedFrame {
private Configuration config;
private byte[] bytes;
- private int roff = 0, goff = 2, boff = 1; // Color values are stored as RBG, which is what the LED list takes.
+ private int stride;
+ private int roff, goff, boff; // RGB offsets
public static LedFrame from(Configuration config) {
LedFrame frame = new LedFrame();
frame.config = config;
- frame.bytes = new byte[config.leds.getCount() * 3];
+ switch (config.leds.type) {
+ /*
+ * The WS2801 strip takes its input as a plain list of 24-bit colors in RBG order (at least mine did).
+ */
+ case WS2801:
+ frame.stride = 3;
+ frame.roff = 0;
+ frame.goff = 2;
+ frame.boff = 1;
+ frame.bytes = new byte[config.leds.getCount() * frame.stride];
+ break;
+
+ /*
+ * The APA102 strip takes its input as:
+ *
+ * - a start frame of 4 bytes (all zeroes)
+ * - a frame of 4 bytes for each LED (111 (3 bits) + global illumination (5 bits) + BGR)
+ * - an (optional) end frame of 4 bytes (all ones)
+ *
+ */
+ case APA102:
+ frame.stride = 4;
+ frame.roff = 3 + 4;
+ frame.goff = 2 + 4;
+ frame.boff = 1 + 4;
+ frame.bytes = new byte[4 + config.leds.getCount() * frame.stride + 4];
+ Arrays.fill(frame.bytes, 4, frame.bytes.length - 1, (byte)0xff); // Initiate the first byte of each LED + the end frame with ones
+ break;
+ }
return frame;
}
public void fillColor(int r, int g, int b) {
- for (int i = 0; i < bytes.length; i += 3) {
- bytes[i + roff] = (byte)r;
- bytes[i + goff] = (byte)g;
- bytes[i + boff] = (byte)b;
- }
+ fillColor(Color.rgb(r, g, b));
}
public void fillColor(Color color) {
- fillColor(color.r(), color.g(), color.b());
+ byte r = (byte)color.r(), g = (byte)color.g(), b = (byte)color.b(); // Gamma corrected values
+ for (int i = 0; i < bytes.length; i += stride) {
+ bytes[i + roff] = r;
+ bytes[i + goff] = g;
+ bytes[i + boff] = b;
+ }
}
public void setLedColor(int led, Color color) {
- int offset = led * 3;
+ int offset = led * stride;
bytes[offset + roff] = (byte)color.r();
bytes[offset + goff] = (byte)color.g();
bytes[offset + boff] = (byte)color.b();
}
public Color getLedColor(int led) {
- int offset = led * 3;
+ int offset = led * stride;
return Color.rgb(
bytes[offset + roff] & 0xff,
bytes[offset + goff] & 0xff,