Code used in RGB-123 Kickstarter. Conways Game of Life
Dependencies: WS2811_RY_A mbed
Fork of WS2811_RY_A by
Diff: main.cpp
- 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