WS2811 Led Strip Code for mBed

Dependencies:   mbed WS2811_RY_A

Dependents:   WS2811_RY_A WS2811_RY_32x48_ConwayA

Revision:
0:f19c80146d55
Child:
1:1b91ef74cc9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jan 04 13:43:52 2013 +0000
@@ -0,0 +1,205 @@
+#include "mbed.h"
+Serial pc(USBTX, USBRX);
+DigitalOut dat(p5);
+
+
+//*******************************************************************************    
+// DEFINE WS2811 Strip Parameters
+#define numLEDs 64*5
+uint8_t *pixels;
+Timer guardtime;
+uint32_t bogocal;
+
+//*******************************************************************************
+void setup () {
+    if ((pixels = (uint8_t *)malloc(numLEDs * 3))) {
+        memset(pixels, 0x00, numLEDs * 3); // Init to RGB 'off' state
+    }
+    // calibrate delay loops for NRZ 
+    int i;
+    guardtime.start();
+    for (i=0; i<1000; i++)
+        /* do nothing */;
+    i=guardtime.read_us();
+    printf("ws2811:  1000 iters took %d usec.\n", i);
+    bogocal = (1000 / (i*4));//2.4)); // iterations per bitcell (417 nsec)
+    printf("ws2811:  calibrating to %d bogojiffies.\n", bogocal);
+}
+//*******************************************************************************
+inline void celldelay(void) {
+    for (int i = 0; i<bogocal; i++)
+        /* do nothing */ ;
+}
+//*******************************************************************************
+void writebit(bool bit) {
+    // first cell is always 1
+    dat = 1;
+    celldelay();
+    if (bit) {
+        celldelay();
+    } else {
+        dat=0;
+        celldelay();
+    }
+    // last cell is always 0
+    dat=0;
+    celldelay();
+}
+//*******************************************************************************
+void write(uint8_t byte) {
+    __disable_irq();
+    for (int i=0; i<8; i++) {
+        if (byte & 0x80)
+            writebit(1);
+        else
+            writebit(0);
+        byte <<= 1;
+    }
+    __enable_irq();
+}
+
+uint16_t numPixels(void) {
+    return numLEDs;
+}
+
+//*******************************************************************************
+void show(void) {
+    uint16_t i, nl3 = numLEDs * 3; // 3 bytes per LED
+    while (guardtime.read_us() < 50)
+        /* spin */;
+    for (i=0; i<nl3; i++ ) {
+        write(pixels[i]);
+    }
+    guardtime.reset();
+}
+//*******************************************************************************
+void blank(void) {
+    memset(pixels, 0x00, numLEDs * 3);
+    show();
+}
+//*******************************************************************************
+void blankDelay(int n) {
+    memset(pixels, 0x00, numLEDs * 3);
+    show();
+    wait_ms(n);
+}
+//*******************************************************************************
+uint32_t total_luminance(void) {
+    uint32_t running_total;
+    running_total = 0;
+    for (int i=0; i<numLEDs*3; i++)
+        running_total += pixels[i];
+    return running_total;
+}
+//*******************************************************************************
+// Convert R,G,B to combined 32-bit color
+uint32_t Color(uint8_t r, uint8_t g, uint8_t b) {
+    // Take the lowest 7 bits of each value and append them end to end
+    // We have the top bit set high (its a 'parity-like' bit in the protocol
+    // and must be set!)
+    return ((uint32_t)g << 16) | ((uint32_t)r << 8) | (uint32_t)b;
+}
+//*******************************************************************************
+// store the rgb component in our array
+void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) {
+    if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+    pixels[n*3  ] = g;
+    pixels[n*3+1] = r;
+    pixels[n*3+2] = b;
+    //pc.printf("setPixelColor-4 inputs\n");   
+}
+//*******************************************************************************
+void setPixelR(uint16_t n, uint8_t r) {
+    if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+    pixels[n*3+1] = r;
+}
+//*******************************************************************************
+void setPixelG(uint16_t n, uint8_t g) {
+    if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+    pixels[n*3] = g;
+}
+//*******************************************************************************
+void setPixelB(uint16_t n, uint8_t b) {
+    if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+    pixels[n*3+2] = b;
+}
+//*******************************************************************************
+void setPixelColor(uint16_t n, uint32_t c) {
+    if (n >= numLEDs) return; // '>=' because arrays are 0-indexed
+    pixels[n*3  ] = (c >> 16);
+    pixels[n*3+1] = (c >>  8);
+    pixels[n*3+2] =  c;
+    //pc.printf("setPixelColor-2 inputs\n");   
+}
+//*******************************************************************************
+// Fill the dots one after the other with a color
+void colorWipe(uint32_t c, uint8_t wait) {
+  for(uint16_t i=0; i<numPixels(); i++) {
+      setPixelColor(i, c);
+      show();
+      wait_ms(wait);
+  }
+}
+//*******************************************************************************
+// Input a value 0 to 255 to get a color value.
+// The colours are a transition r - g - b - back to r.
+uint32_t Wheel(int WheelPos) {
+  if(WheelPos < 85) {
+   return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
+  } else if(WheelPos < 170) {
+   WheelPos -= 85;
+   return Color(255 - WheelPos * 3, 0, WheelPos * 3);
+  } else {
+   WheelPos -= 170;
+   return Color(0, WheelPos * 3, 255 - WheelPos * 3);
+  }
+}
+//*******************************************************************************
+void rainbow(uint8_t rwait) {
+  uint16_t i, j;
+
+  for(j=0; j<256; j++) {
+    for(i=0; i<numPixels(); i++) {
+      setPixelColor(i, Wheel((i+j) & 255));
+    }
+    show();
+    wait_ms(rwait);
+  }
+}
+//*******************************************************************************
+// Slightly different, this makes the rainbow equally distributed throughout
+void rainbowCycle(uint8_t rwait) {
+  uint16_t i, j;
+
+  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
+    for(i=0; i< numPixels(); i++) {
+      setPixelColor(i, Wheel(((i * 256 / numPixels()) + j) & 255));
+    }
+    show();
+    wait_ms(rwait);
+  }
+}
+//*******************************************************************************
+int main() {
+    pc.baud(38400);
+    setup();
+    while (1) {
+        pc.printf("Top of the Loop\n");
+        colorWipe(Color(64, 0, 0), 50); // Red
+        blankDelay(250);
+        colorWipe(Color(0, 64, 0), 50); // Grn
+        blankDelay(250);
+        colorWipe(Color(0, 0, 64), 50); // Blu
+        blankDelay(250);
+        //rainbow(20);
+        //blankDelay(250);
+        //rainbowCycle(10);
+        //blankDelay(250);
+        
+    }
+}
+
+//write(128);
+//wait_us(10);
+//write(0);
+//wait_us(10);
\ No newline at end of file