Code used in RGB-123 Kickstarter. Conways Game of Life
Dependencies: WS2811_RY_A mbed
Fork of WS2811_RY_A by
main.cpp@0:f19c80146d55, 2013-01-04 (annotated)
- Committer:
- ohararp
- Date:
- Fri Jan 04 13:43:52 2013 +0000
- Revision:
- 0:f19c80146d55
- Child:
- 1:1b91ef74cc9c
mbed code to drive WS2811 chips
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ohararp | 0:f19c80146d55 | 1 | #include "mbed.h" |
ohararp | 0:f19c80146d55 | 2 | Serial pc(USBTX, USBRX); |
ohararp | 0:f19c80146d55 | 3 | DigitalOut dat(p5); |
ohararp | 0:f19c80146d55 | 4 | |
ohararp | 0:f19c80146d55 | 5 | |
ohararp | 0:f19c80146d55 | 6 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 7 | // DEFINE WS2811 Strip Parameters |
ohararp | 0:f19c80146d55 | 8 | #define numLEDs 64*5 |
ohararp | 0:f19c80146d55 | 9 | uint8_t *pixels; |
ohararp | 0:f19c80146d55 | 10 | Timer guardtime; |
ohararp | 0:f19c80146d55 | 11 | uint32_t bogocal; |
ohararp | 0:f19c80146d55 | 12 | |
ohararp | 0:f19c80146d55 | 13 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 14 | void setup () { |
ohararp | 0:f19c80146d55 | 15 | if ((pixels = (uint8_t *)malloc(numLEDs * 3))) { |
ohararp | 0:f19c80146d55 | 16 | memset(pixels, 0x00, numLEDs * 3); // Init to RGB 'off' state |
ohararp | 0:f19c80146d55 | 17 | } |
ohararp | 0:f19c80146d55 | 18 | // calibrate delay loops for NRZ |
ohararp | 0:f19c80146d55 | 19 | int i; |
ohararp | 0:f19c80146d55 | 20 | guardtime.start(); |
ohararp | 0:f19c80146d55 | 21 | for (i=0; i<1000; i++) |
ohararp | 0:f19c80146d55 | 22 | /* do nothing */; |
ohararp | 0:f19c80146d55 | 23 | i=guardtime.read_us(); |
ohararp | 0:f19c80146d55 | 24 | printf("ws2811: 1000 iters took %d usec.\n", i); |
ohararp | 0:f19c80146d55 | 25 | bogocal = (1000 / (i*4));//2.4)); // iterations per bitcell (417 nsec) |
ohararp | 0:f19c80146d55 | 26 | printf("ws2811: calibrating to %d bogojiffies.\n", bogocal); |
ohararp | 0:f19c80146d55 | 27 | } |
ohararp | 0:f19c80146d55 | 28 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 29 | inline void celldelay(void) { |
ohararp | 0:f19c80146d55 | 30 | for (int i = 0; i<bogocal; i++) |
ohararp | 0:f19c80146d55 | 31 | /* do nothing */ ; |
ohararp | 0:f19c80146d55 | 32 | } |
ohararp | 0:f19c80146d55 | 33 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 34 | void writebit(bool bit) { |
ohararp | 0:f19c80146d55 | 35 | // first cell is always 1 |
ohararp | 0:f19c80146d55 | 36 | dat = 1; |
ohararp | 0:f19c80146d55 | 37 | celldelay(); |
ohararp | 0:f19c80146d55 | 38 | if (bit) { |
ohararp | 0:f19c80146d55 | 39 | celldelay(); |
ohararp | 0:f19c80146d55 | 40 | } else { |
ohararp | 0:f19c80146d55 | 41 | dat=0; |
ohararp | 0:f19c80146d55 | 42 | celldelay(); |
ohararp | 0:f19c80146d55 | 43 | } |
ohararp | 0:f19c80146d55 | 44 | // last cell is always 0 |
ohararp | 0:f19c80146d55 | 45 | dat=0; |
ohararp | 0:f19c80146d55 | 46 | celldelay(); |
ohararp | 0:f19c80146d55 | 47 | } |
ohararp | 0:f19c80146d55 | 48 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 49 | void write(uint8_t byte) { |
ohararp | 0:f19c80146d55 | 50 | __disable_irq(); |
ohararp | 0:f19c80146d55 | 51 | for (int i=0; i<8; i++) { |
ohararp | 0:f19c80146d55 | 52 | if (byte & 0x80) |
ohararp | 0:f19c80146d55 | 53 | writebit(1); |
ohararp | 0:f19c80146d55 | 54 | else |
ohararp | 0:f19c80146d55 | 55 | writebit(0); |
ohararp | 0:f19c80146d55 | 56 | byte <<= 1; |
ohararp | 0:f19c80146d55 | 57 | } |
ohararp | 0:f19c80146d55 | 58 | __enable_irq(); |
ohararp | 0:f19c80146d55 | 59 | } |
ohararp | 0:f19c80146d55 | 60 | |
ohararp | 0:f19c80146d55 | 61 | uint16_t numPixels(void) { |
ohararp | 0:f19c80146d55 | 62 | return numLEDs; |
ohararp | 0:f19c80146d55 | 63 | } |
ohararp | 0:f19c80146d55 | 64 | |
ohararp | 0:f19c80146d55 | 65 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 66 | void show(void) { |
ohararp | 0:f19c80146d55 | 67 | uint16_t i, nl3 = numLEDs * 3; // 3 bytes per LED |
ohararp | 0:f19c80146d55 | 68 | while (guardtime.read_us() < 50) |
ohararp | 0:f19c80146d55 | 69 | /* spin */; |
ohararp | 0:f19c80146d55 | 70 | for (i=0; i<nl3; i++ ) { |
ohararp | 0:f19c80146d55 | 71 | write(pixels[i]); |
ohararp | 0:f19c80146d55 | 72 | } |
ohararp | 0:f19c80146d55 | 73 | guardtime.reset(); |
ohararp | 0:f19c80146d55 | 74 | } |
ohararp | 0:f19c80146d55 | 75 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 76 | void blank(void) { |
ohararp | 0:f19c80146d55 | 77 | memset(pixels, 0x00, numLEDs * 3); |
ohararp | 0:f19c80146d55 | 78 | show(); |
ohararp | 0:f19c80146d55 | 79 | } |
ohararp | 0:f19c80146d55 | 80 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 81 | void blankDelay(int n) { |
ohararp | 0:f19c80146d55 | 82 | memset(pixels, 0x00, numLEDs * 3); |
ohararp | 0:f19c80146d55 | 83 | show(); |
ohararp | 0:f19c80146d55 | 84 | wait_ms(n); |
ohararp | 0:f19c80146d55 | 85 | } |
ohararp | 0:f19c80146d55 | 86 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 87 | uint32_t total_luminance(void) { |
ohararp | 0:f19c80146d55 | 88 | uint32_t running_total; |
ohararp | 0:f19c80146d55 | 89 | running_total = 0; |
ohararp | 0:f19c80146d55 | 90 | for (int i=0; i<numLEDs*3; i++) |
ohararp | 0:f19c80146d55 | 91 | running_total += pixels[i]; |
ohararp | 0:f19c80146d55 | 92 | return running_total; |
ohararp | 0:f19c80146d55 | 93 | } |
ohararp | 0:f19c80146d55 | 94 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 95 | // Convert R,G,B to combined 32-bit color |
ohararp | 0:f19c80146d55 | 96 | uint32_t Color(uint8_t r, uint8_t g, uint8_t b) { |
ohararp | 0:f19c80146d55 | 97 | // Take the lowest 7 bits of each value and append them end to end |
ohararp | 0:f19c80146d55 | 98 | // We have the top bit set high (its a 'parity-like' bit in the protocol |
ohararp | 0:f19c80146d55 | 99 | // and must be set!) |
ohararp | 0:f19c80146d55 | 100 | return ((uint32_t)g << 16) | ((uint32_t)r << 8) | (uint32_t)b; |
ohararp | 0:f19c80146d55 | 101 | } |
ohararp | 0:f19c80146d55 | 102 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 103 | // store the rgb component in our array |
ohararp | 0:f19c80146d55 | 104 | void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) { |
ohararp | 0:f19c80146d55 | 105 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 106 | pixels[n*3 ] = g; |
ohararp | 0:f19c80146d55 | 107 | pixels[n*3+1] = r; |
ohararp | 0:f19c80146d55 | 108 | pixels[n*3+2] = b; |
ohararp | 0:f19c80146d55 | 109 | //pc.printf("setPixelColor-4 inputs\n"); |
ohararp | 0:f19c80146d55 | 110 | } |
ohararp | 0:f19c80146d55 | 111 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 112 | void setPixelR(uint16_t n, uint8_t r) { |
ohararp | 0:f19c80146d55 | 113 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 114 | pixels[n*3+1] = r; |
ohararp | 0:f19c80146d55 | 115 | } |
ohararp | 0:f19c80146d55 | 116 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 117 | void setPixelG(uint16_t n, uint8_t g) { |
ohararp | 0:f19c80146d55 | 118 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 119 | pixels[n*3] = g; |
ohararp | 0:f19c80146d55 | 120 | } |
ohararp | 0:f19c80146d55 | 121 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 122 | void setPixelB(uint16_t n, uint8_t b) { |
ohararp | 0:f19c80146d55 | 123 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 124 | pixels[n*3+2] = b; |
ohararp | 0:f19c80146d55 | 125 | } |
ohararp | 0:f19c80146d55 | 126 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 127 | void setPixelColor(uint16_t n, uint32_t c) { |
ohararp | 0:f19c80146d55 | 128 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 129 | pixels[n*3 ] = (c >> 16); |
ohararp | 0:f19c80146d55 | 130 | pixels[n*3+1] = (c >> 8); |
ohararp | 0:f19c80146d55 | 131 | pixels[n*3+2] = c; |
ohararp | 0:f19c80146d55 | 132 | //pc.printf("setPixelColor-2 inputs\n"); |
ohararp | 0:f19c80146d55 | 133 | } |
ohararp | 0:f19c80146d55 | 134 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 135 | // Fill the dots one after the other with a color |
ohararp | 0:f19c80146d55 | 136 | void colorWipe(uint32_t c, uint8_t wait) { |
ohararp | 0:f19c80146d55 | 137 | for(uint16_t i=0; i<numPixels(); i++) { |
ohararp | 0:f19c80146d55 | 138 | setPixelColor(i, c); |
ohararp | 0:f19c80146d55 | 139 | show(); |
ohararp | 0:f19c80146d55 | 140 | wait_ms(wait); |
ohararp | 0:f19c80146d55 | 141 | } |
ohararp | 0:f19c80146d55 | 142 | } |
ohararp | 0:f19c80146d55 | 143 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 144 | // Input a value 0 to 255 to get a color value. |
ohararp | 0:f19c80146d55 | 145 | // The colours are a transition r - g - b - back to r. |
ohararp | 0:f19c80146d55 | 146 | uint32_t Wheel(int WheelPos) { |
ohararp | 0:f19c80146d55 | 147 | if(WheelPos < 85) { |
ohararp | 0:f19c80146d55 | 148 | return Color(WheelPos * 3, 255 - WheelPos * 3, 0); |
ohararp | 0:f19c80146d55 | 149 | } else if(WheelPos < 170) { |
ohararp | 0:f19c80146d55 | 150 | WheelPos -= 85; |
ohararp | 0:f19c80146d55 | 151 | return Color(255 - WheelPos * 3, 0, WheelPos * 3); |
ohararp | 0:f19c80146d55 | 152 | } else { |
ohararp | 0:f19c80146d55 | 153 | WheelPos -= 170; |
ohararp | 0:f19c80146d55 | 154 | return Color(0, WheelPos * 3, 255 - WheelPos * 3); |
ohararp | 0:f19c80146d55 | 155 | } |
ohararp | 0:f19c80146d55 | 156 | } |
ohararp | 0:f19c80146d55 | 157 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 158 | void rainbow(uint8_t rwait) { |
ohararp | 0:f19c80146d55 | 159 | uint16_t i, j; |
ohararp | 0:f19c80146d55 | 160 | |
ohararp | 0:f19c80146d55 | 161 | for(j=0; j<256; j++) { |
ohararp | 0:f19c80146d55 | 162 | for(i=0; i<numPixels(); i++) { |
ohararp | 0:f19c80146d55 | 163 | setPixelColor(i, Wheel((i+j) & 255)); |
ohararp | 0:f19c80146d55 | 164 | } |
ohararp | 0:f19c80146d55 | 165 | show(); |
ohararp | 0:f19c80146d55 | 166 | wait_ms(rwait); |
ohararp | 0:f19c80146d55 | 167 | } |
ohararp | 0:f19c80146d55 | 168 | } |
ohararp | 0:f19c80146d55 | 169 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 170 | // Slightly different, this makes the rainbow equally distributed throughout |
ohararp | 0:f19c80146d55 | 171 | void rainbowCycle(uint8_t rwait) { |
ohararp | 0:f19c80146d55 | 172 | uint16_t i, j; |
ohararp | 0:f19c80146d55 | 173 | |
ohararp | 0:f19c80146d55 | 174 | for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel |
ohararp | 0:f19c80146d55 | 175 | for(i=0; i< numPixels(); i++) { |
ohararp | 0:f19c80146d55 | 176 | setPixelColor(i, Wheel(((i * 256 / numPixels()) + j) & 255)); |
ohararp | 0:f19c80146d55 | 177 | } |
ohararp | 0:f19c80146d55 | 178 | show(); |
ohararp | 0:f19c80146d55 | 179 | wait_ms(rwait); |
ohararp | 0:f19c80146d55 | 180 | } |
ohararp | 0:f19c80146d55 | 181 | } |
ohararp | 0:f19c80146d55 | 182 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 183 | int main() { |
ohararp | 0:f19c80146d55 | 184 | pc.baud(38400); |
ohararp | 0:f19c80146d55 | 185 | setup(); |
ohararp | 0:f19c80146d55 | 186 | while (1) { |
ohararp | 0:f19c80146d55 | 187 | pc.printf("Top of the Loop\n"); |
ohararp | 0:f19c80146d55 | 188 | colorWipe(Color(64, 0, 0), 50); // Red |
ohararp | 0:f19c80146d55 | 189 | blankDelay(250); |
ohararp | 0:f19c80146d55 | 190 | colorWipe(Color(0, 64, 0), 50); // Grn |
ohararp | 0:f19c80146d55 | 191 | blankDelay(250); |
ohararp | 0:f19c80146d55 | 192 | colorWipe(Color(0, 0, 64), 50); // Blu |
ohararp | 0:f19c80146d55 | 193 | blankDelay(250); |
ohararp | 0:f19c80146d55 | 194 | //rainbow(20); |
ohararp | 0:f19c80146d55 | 195 | //blankDelay(250); |
ohararp | 0:f19c80146d55 | 196 | //rainbowCycle(10); |
ohararp | 0:f19c80146d55 | 197 | //blankDelay(250); |
ohararp | 0:f19c80146d55 | 198 | |
ohararp | 0:f19c80146d55 | 199 | } |
ohararp | 0:f19c80146d55 | 200 | } |
ohararp | 0:f19c80146d55 | 201 | |
ohararp | 0:f19c80146d55 | 202 | //write(128); |
ohararp | 0:f19c80146d55 | 203 | //wait_us(10); |
ohararp | 0:f19c80146d55 | 204 | //write(0); |
ohararp | 0:f19c80146d55 | 205 | //wait_us(10); |