X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fkaka%2Fcakelight%2FLedFrame.java;h=18b8f226e8de066e062bec118410586fc9fa847d;hb=b72a3fc5da0c52bf5d478ee59f29c4e11251f623;hp=ab4ef5c9fa12bb825fc2a266538232c9b5d0de44;hpb=38c759f87fc7de47d9dee60088f2dbc60e0a55fb;p=kaka%2Fcakelight.git
diff --git a/src/kaka/cakelight/LedFrame.java b/src/kaka/cakelight/LedFrame.java
index ab4ef5c..18b8f22 100644
--- a/src/kaka/cakelight/LedFrame.java
+++ b/src/kaka/cakelight/LedFrame.java
@@ -1,14 +1,49 @@
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
+ /**
+ * @return a frame initiated to black
+ */
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 - 5, (byte)(0b11100000 | config.leds.brightness)); // Initiate the first byte of each LED
+ Arrays.fill(frame.bytes, frame.bytes.length - 5, frame.bytes.length - 1, (byte)0xff); // Initiate the end frame with ones
+ break;
+ }
return frame;
}
@@ -18,7 +53,7 @@ public class LedFrame {
public void fillColor(Color color) {
byte r = (byte)color.r(), g = (byte)color.g(), b = (byte)color.b(); // Gamma corrected values
- for (int i = 0; i < bytes.length; i += 3) {
+ for (int i = 0; i < bytes.length; i += stride) {
bytes[i + roff] = r;
bytes[i + goff] = g;
bytes[i + boff] = b;
@@ -26,14 +61,14 @@ public class LedFrame {
}
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,