![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Additional routines to provide multiple LED strip port connections.
Fork of WS2811_RY_A by
main.cpp@2:047d1e5230b8, 2013-04-08 (annotated)
- Committer:
- rmsteele
- Date:
- Mon Apr 08 00:38:50 2013 +0000
- Revision:
- 2:047d1e5230b8
- Parent:
- 1:08d0b5e3b8e3
Finxed Timing issues and added additional routines for multiple ports for multiple strips.
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); |
rmsteele | 2:047d1e5230b8 | 3 | DigitalOut dat(p5), dat1(p6), dat2(p7), dat3(p8), dat4(p9), dat5(p10); |
ohararp | 0:f19c80146d55 | 4 | |
ohararp | 0:f19c80146d55 | 5 | |
ohararp | 0:f19c80146d55 | 6 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 7 | // DEFINE WS2811 Strip Parameters |
rmsteele | 2:047d1e5230b8 | 8 | #define numLEDs 9 |
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; |
rmsteele | 2:047d1e5230b8 | 37 | // celldelay(); |
ohararp | 0:f19c80146d55 | 38 | if (bit) { |
ohararp | 0:f19c80146d55 | 39 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 40 | celldelay(); |
ohararp | 0:f19c80146d55 | 41 | } else { |
ohararp | 0:f19c80146d55 | 42 | dat=0; |
ohararp | 0:f19c80146d55 | 43 | celldelay(); |
ohararp | 0:f19c80146d55 | 44 | } |
ohararp | 0:f19c80146d55 | 45 | // last cell is always 0 |
ohararp | 0:f19c80146d55 | 46 | dat=0; |
ohararp | 0:f19c80146d55 | 47 | celldelay(); |
ohararp | 0:f19c80146d55 | 48 | } |
ohararp | 0:f19c80146d55 | 49 | //******************************************************************************* |
rmsteele | 2:047d1e5230b8 | 50 | void writebit1(bool bit) { |
rmsteele | 2:047d1e5230b8 | 51 | // first cell is always 1 |
rmsteele | 2:047d1e5230b8 | 52 | dat1 = 1; |
rmsteele | 2:047d1e5230b8 | 53 | // celldelay(); |
rmsteele | 2:047d1e5230b8 | 54 | if (bit) { |
rmsteele | 2:047d1e5230b8 | 55 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 56 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 57 | } else { |
rmsteele | 2:047d1e5230b8 | 58 | dat1=0; |
rmsteele | 2:047d1e5230b8 | 59 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 60 | } |
rmsteele | 2:047d1e5230b8 | 61 | // last cell is always 0 |
rmsteele | 2:047d1e5230b8 | 62 | dat1=0; |
rmsteele | 2:047d1e5230b8 | 63 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 64 | } |
rmsteele | 2:047d1e5230b8 | 65 | //******************************************************************************* |
rmsteele | 2:047d1e5230b8 | 66 | void writebit2(bool bit) { |
rmsteele | 2:047d1e5230b8 | 67 | // first cell is always 1 |
rmsteele | 2:047d1e5230b8 | 68 | dat2 = 1; |
rmsteele | 2:047d1e5230b8 | 69 | // celldelay(); |
rmsteele | 2:047d1e5230b8 | 70 | if (bit) { |
rmsteele | 2:047d1e5230b8 | 71 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 72 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 73 | } else { |
rmsteele | 2:047d1e5230b8 | 74 | dat2=0; |
rmsteele | 2:047d1e5230b8 | 75 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 76 | } |
rmsteele | 2:047d1e5230b8 | 77 | // last cell is always 0 |
rmsteele | 2:047d1e5230b8 | 78 | dat2=0; |
rmsteele | 2:047d1e5230b8 | 79 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 80 | } |
rmsteele | 2:047d1e5230b8 | 81 | //******************************************************************************* |
rmsteele | 2:047d1e5230b8 | 82 | void writebit3(bool bit) { |
rmsteele | 2:047d1e5230b8 | 83 | // first cell is always 1 |
rmsteele | 2:047d1e5230b8 | 84 | dat3 = 1; |
rmsteele | 2:047d1e5230b8 | 85 | // celldelay(); |
rmsteele | 2:047d1e5230b8 | 86 | if (bit) { |
rmsteele | 2:047d1e5230b8 | 87 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 88 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 89 | } else { |
rmsteele | 2:047d1e5230b8 | 90 | dat3=0; |
rmsteele | 2:047d1e5230b8 | 91 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 92 | } |
rmsteele | 2:047d1e5230b8 | 93 | // last cell is always 0 |
rmsteele | 2:047d1e5230b8 | 94 | dat3=0; |
rmsteele | 2:047d1e5230b8 | 95 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 96 | } |
rmsteele | 2:047d1e5230b8 | 97 | //******************************************************************************* |
rmsteele | 2:047d1e5230b8 | 98 | void writebit4(bool bit) { |
rmsteele | 2:047d1e5230b8 | 99 | // first cell is always 1 |
rmsteele | 2:047d1e5230b8 | 100 | dat4 = 1; |
rmsteele | 2:047d1e5230b8 | 101 | // celldelay(); |
rmsteele | 2:047d1e5230b8 | 102 | if (bit) { |
rmsteele | 2:047d1e5230b8 | 103 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 104 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 105 | } else { |
rmsteele | 2:047d1e5230b8 | 106 | dat4=0; |
rmsteele | 2:047d1e5230b8 | 107 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 108 | } |
rmsteele | 2:047d1e5230b8 | 109 | // last cell is always 0 |
rmsteele | 2:047d1e5230b8 | 110 | dat4=0; |
rmsteele | 2:047d1e5230b8 | 111 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 112 | } |
rmsteele | 2:047d1e5230b8 | 113 | //******************************************************************************* |
rmsteele | 2:047d1e5230b8 | 114 | void writebit5(bool bit) { |
rmsteele | 2:047d1e5230b8 | 115 | // first cell is always 1 |
rmsteele | 2:047d1e5230b8 | 116 | dat5 = 1; |
rmsteele | 2:047d1e5230b8 | 117 | // celldelay(); |
rmsteele | 2:047d1e5230b8 | 118 | if (bit) { |
rmsteele | 2:047d1e5230b8 | 119 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 120 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 121 | } else { |
rmsteele | 2:047d1e5230b8 | 122 | dat5=0; |
rmsteele | 2:047d1e5230b8 | 123 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 124 | } |
rmsteele | 2:047d1e5230b8 | 125 | // last cell is always 0 |
rmsteele | 2:047d1e5230b8 | 126 | dat5=0; |
rmsteele | 2:047d1e5230b8 | 127 | celldelay(); |
rmsteele | 2:047d1e5230b8 | 128 | } |
rmsteele | 2:047d1e5230b8 | 129 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 130 | void write(uint8_t byte) { |
ohararp | 0:f19c80146d55 | 131 | __disable_irq(); |
ohararp | 0:f19c80146d55 | 132 | for (int i=0; i<8; i++) { |
ohararp | 0:f19c80146d55 | 133 | if (byte & 0x80) |
ohararp | 0:f19c80146d55 | 134 | writebit(1); |
ohararp | 0:f19c80146d55 | 135 | else |
ohararp | 0:f19c80146d55 | 136 | writebit(0); |
ohararp | 0:f19c80146d55 | 137 | byte <<= 1; |
ohararp | 0:f19c80146d55 | 138 | } |
rmsteele | 2:047d1e5230b8 | 139 | |
rmsteele | 2:047d1e5230b8 | 140 | __enable_irq(); |
rmsteele | 2:047d1e5230b8 | 141 | } |
rmsteele | 2:047d1e5230b8 | 142 | |
rmsteele | 2:047d1e5230b8 | 143 | void write1(uint8_t byte) { |
rmsteele | 2:047d1e5230b8 | 144 | __disable_irq(); |
rmsteele | 2:047d1e5230b8 | 145 | for (int i=0; i<8; i++) { |
rmsteele | 2:047d1e5230b8 | 146 | if (byte & 0x80) |
rmsteele | 2:047d1e5230b8 | 147 | writebit1(1); |
rmsteele | 2:047d1e5230b8 | 148 | else |
rmsteele | 2:047d1e5230b8 | 149 | writebit1(0); |
rmsteele | 2:047d1e5230b8 | 150 | byte <<= 1; |
rmsteele | 2:047d1e5230b8 | 151 | } |
rmsteele | 2:047d1e5230b8 | 152 | |
rmsteele | 2:047d1e5230b8 | 153 | __enable_irq(); |
rmsteele | 2:047d1e5230b8 | 154 | } |
rmsteele | 2:047d1e5230b8 | 155 | |
rmsteele | 2:047d1e5230b8 | 156 | void write2(uint8_t byte) { |
rmsteele | 2:047d1e5230b8 | 157 | __disable_irq(); |
rmsteele | 2:047d1e5230b8 | 158 | for (int i=0; i<8; i++) { |
rmsteele | 2:047d1e5230b8 | 159 | if (byte & 0x80) |
rmsteele | 2:047d1e5230b8 | 160 | writebit2(1); |
rmsteele | 2:047d1e5230b8 | 161 | else |
rmsteele | 2:047d1e5230b8 | 162 | writebit2(0); |
rmsteele | 2:047d1e5230b8 | 163 | byte <<= 1; |
rmsteele | 2:047d1e5230b8 | 164 | } |
rmsteele | 2:047d1e5230b8 | 165 | |
rmsteele | 2:047d1e5230b8 | 166 | __enable_irq(); |
rmsteele | 2:047d1e5230b8 | 167 | } |
rmsteele | 2:047d1e5230b8 | 168 | |
rmsteele | 2:047d1e5230b8 | 169 | void write3(uint8_t byte) { |
rmsteele | 2:047d1e5230b8 | 170 | __disable_irq(); |
rmsteele | 2:047d1e5230b8 | 171 | for (int i=0; i<8; i++) { |
rmsteele | 2:047d1e5230b8 | 172 | if (byte & 0x80) |
rmsteele | 2:047d1e5230b8 | 173 | writebit3(1); |
rmsteele | 2:047d1e5230b8 | 174 | else |
rmsteele | 2:047d1e5230b8 | 175 | writebit3(0); |
rmsteele | 2:047d1e5230b8 | 176 | byte <<= 1; |
rmsteele | 2:047d1e5230b8 | 177 | } |
rmsteele | 2:047d1e5230b8 | 178 | |
rmsteele | 2:047d1e5230b8 | 179 | __enable_irq(); |
rmsteele | 2:047d1e5230b8 | 180 | } |
rmsteele | 2:047d1e5230b8 | 181 | |
rmsteele | 2:047d1e5230b8 | 182 | void write4(uint8_t byte) { |
rmsteele | 2:047d1e5230b8 | 183 | __disable_irq(); |
rmsteele | 2:047d1e5230b8 | 184 | for (int i=0; i<8; i++) { |
rmsteele | 2:047d1e5230b8 | 185 | if (byte & 0x80) |
rmsteele | 2:047d1e5230b8 | 186 | writebit4(1); |
rmsteele | 2:047d1e5230b8 | 187 | else |
rmsteele | 2:047d1e5230b8 | 188 | writebit4(0); |
rmsteele | 2:047d1e5230b8 | 189 | byte <<= 1; |
rmsteele | 2:047d1e5230b8 | 190 | } |
rmsteele | 2:047d1e5230b8 | 191 | |
rmsteele | 2:047d1e5230b8 | 192 | __enable_irq(); |
rmsteele | 2:047d1e5230b8 | 193 | } |
rmsteele | 2:047d1e5230b8 | 194 | |
rmsteele | 2:047d1e5230b8 | 195 | void write5(uint8_t byte) { |
rmsteele | 2:047d1e5230b8 | 196 | __disable_irq(); |
rmsteele | 2:047d1e5230b8 | 197 | for (int i=0; i<8; i++) { |
rmsteele | 2:047d1e5230b8 | 198 | if (byte & 0x80) |
rmsteele | 2:047d1e5230b8 | 199 | writebit5(1); |
rmsteele | 2:047d1e5230b8 | 200 | else |
rmsteele | 2:047d1e5230b8 | 201 | writebit5(0); |
rmsteele | 2:047d1e5230b8 | 202 | byte <<= 1; |
rmsteele | 2:047d1e5230b8 | 203 | } |
rmsteele | 2:047d1e5230b8 | 204 | |
ohararp | 0:f19c80146d55 | 205 | __enable_irq(); |
ohararp | 0:f19c80146d55 | 206 | } |
ohararp | 0:f19c80146d55 | 207 | |
ohararp | 0:f19c80146d55 | 208 | uint16_t numPixels(void) { |
ohararp | 0:f19c80146d55 | 209 | return numLEDs; |
ohararp | 0:f19c80146d55 | 210 | } |
ohararp | 0:f19c80146d55 | 211 | |
ohararp | 0:f19c80146d55 | 212 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 213 | void show(void) { |
ohararp | 0:f19c80146d55 | 214 | uint16_t i, nl3 = numLEDs * 3; // 3 bytes per LED |
rmsteele | 2:047d1e5230b8 | 215 | while (guardtime.read_us() < 50) // was 50 |
ohararp | 0:f19c80146d55 | 216 | /* spin */; |
ohararp | 0:f19c80146d55 | 217 | for (i=0; i<nl3; i++ ) { |
ohararp | 0:f19c80146d55 | 218 | write(pixels[i]); |
rmsteele | 2:047d1e5230b8 | 219 | // write1(pixels[i]); |
rmsteele | 2:047d1e5230b8 | 220 | } |
rmsteele | 2:047d1e5230b8 | 221 | guardtime.reset(); |
rmsteele | 2:047d1e5230b8 | 222 | |
rmsteele | 2:047d1e5230b8 | 223 | while (guardtime.read_us() < 50) // was 50 |
rmsteele | 2:047d1e5230b8 | 224 | /* spin */; |
rmsteele | 2:047d1e5230b8 | 225 | for (i=0; i<nl3; i++ ) { |
rmsteele | 2:047d1e5230b8 | 226 | write1(pixels[i]); |
rmsteele | 2:047d1e5230b8 | 227 | } |
rmsteele | 2:047d1e5230b8 | 228 | guardtime.reset(); |
rmsteele | 2:047d1e5230b8 | 229 | |
rmsteele | 2:047d1e5230b8 | 230 | while (guardtime.read_us() < 50) // was 50 |
rmsteele | 2:047d1e5230b8 | 231 | /* spin */; |
rmsteele | 2:047d1e5230b8 | 232 | for (i=0; i<nl3; i++ ) { |
rmsteele | 2:047d1e5230b8 | 233 | write2(pixels[i]); |
ohararp | 0:f19c80146d55 | 234 | } |
ohararp | 0:f19c80146d55 | 235 | guardtime.reset(); |
rmsteele | 2:047d1e5230b8 | 236 | |
rmsteele | 2:047d1e5230b8 | 237 | while (guardtime.read_us() < 50) // was 50 |
rmsteele | 2:047d1e5230b8 | 238 | /* spin */; |
rmsteele | 2:047d1e5230b8 | 239 | for (i=0; i<nl3; i++ ) { |
rmsteele | 2:047d1e5230b8 | 240 | write3(pixels[i]); |
rmsteele | 2:047d1e5230b8 | 241 | } |
rmsteele | 2:047d1e5230b8 | 242 | guardtime.reset(); |
rmsteele | 2:047d1e5230b8 | 243 | |
rmsteele | 2:047d1e5230b8 | 244 | while (guardtime.read_us() < 50) // was 50 |
rmsteele | 2:047d1e5230b8 | 245 | /* spin */; |
rmsteele | 2:047d1e5230b8 | 246 | for (i=0; i<nl3; i++ ) { |
rmsteele | 2:047d1e5230b8 | 247 | write4(pixels[i]); |
rmsteele | 2:047d1e5230b8 | 248 | } |
rmsteele | 2:047d1e5230b8 | 249 | guardtime.reset(); |
rmsteele | 2:047d1e5230b8 | 250 | |
rmsteele | 2:047d1e5230b8 | 251 | while (guardtime.read_us() < 50) // was 50 |
rmsteele | 2:047d1e5230b8 | 252 | /* spin */; |
rmsteele | 2:047d1e5230b8 | 253 | for (i=0; i<nl3; i++ ) { |
rmsteele | 2:047d1e5230b8 | 254 | write5(pixels[i]); |
rmsteele | 2:047d1e5230b8 | 255 | } |
rmsteele | 2:047d1e5230b8 | 256 | guardtime.reset(); |
rmsteele | 2:047d1e5230b8 | 257 | |
ohararp | 0:f19c80146d55 | 258 | } |
ohararp | 0:f19c80146d55 | 259 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 260 | void blank(void) { |
ohararp | 0:f19c80146d55 | 261 | memset(pixels, 0x00, numLEDs * 3); |
ohararp | 0:f19c80146d55 | 262 | show(); |
ohararp | 0:f19c80146d55 | 263 | } |
ohararp | 0:f19c80146d55 | 264 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 265 | void blankDelay(int n) { |
ohararp | 0:f19c80146d55 | 266 | memset(pixels, 0x00, numLEDs * 3); |
ohararp | 0:f19c80146d55 | 267 | show(); |
ohararp | 0:f19c80146d55 | 268 | wait_ms(n); |
ohararp | 0:f19c80146d55 | 269 | } |
ohararp | 0:f19c80146d55 | 270 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 271 | uint32_t total_luminance(void) { |
ohararp | 0:f19c80146d55 | 272 | uint32_t running_total; |
ohararp | 0:f19c80146d55 | 273 | running_total = 0; |
ohararp | 0:f19c80146d55 | 274 | for (int i=0; i<numLEDs*3; i++) |
ohararp | 0:f19c80146d55 | 275 | running_total += pixels[i]; |
ohararp | 0:f19c80146d55 | 276 | return running_total; |
ohararp | 0:f19c80146d55 | 277 | } |
ohararp | 0:f19c80146d55 | 278 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 279 | // Convert R,G,B to combined 32-bit color |
ohararp | 0:f19c80146d55 | 280 | uint32_t Color(uint8_t r, uint8_t g, uint8_t b) { |
ohararp | 0:f19c80146d55 | 281 | // Take the lowest 7 bits of each value and append them end to end |
ohararp | 0:f19c80146d55 | 282 | // We have the top bit set high (its a 'parity-like' bit in the protocol |
ohararp | 0:f19c80146d55 | 283 | // and must be set!) |
ohararp | 0:f19c80146d55 | 284 | return ((uint32_t)g << 16) | ((uint32_t)r << 8) | (uint32_t)b; |
ohararp | 0:f19c80146d55 | 285 | } |
ohararp | 0:f19c80146d55 | 286 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 287 | // store the rgb component in our array |
ohararp | 0:f19c80146d55 | 288 | void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) { |
ohararp | 0:f19c80146d55 | 289 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 290 | pixels[n*3 ] = g; |
ohararp | 0:f19c80146d55 | 291 | pixels[n*3+1] = r; |
ohararp | 0:f19c80146d55 | 292 | pixels[n*3+2] = b; |
ohararp | 0:f19c80146d55 | 293 | //pc.printf("setPixelColor-4 inputs\n"); |
ohararp | 0:f19c80146d55 | 294 | } |
ohararp | 0:f19c80146d55 | 295 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 296 | void setPixelR(uint16_t n, uint8_t r) { |
ohararp | 0:f19c80146d55 | 297 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 298 | pixels[n*3+1] = r; |
ohararp | 0:f19c80146d55 | 299 | } |
ohararp | 0:f19c80146d55 | 300 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 301 | void setPixelG(uint16_t n, uint8_t g) { |
ohararp | 0:f19c80146d55 | 302 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 303 | pixels[n*3] = g; |
ohararp | 0:f19c80146d55 | 304 | } |
ohararp | 0:f19c80146d55 | 305 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 306 | void setPixelB(uint16_t n, uint8_t b) { |
ohararp | 0:f19c80146d55 | 307 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 308 | pixels[n*3+2] = b; |
ohararp | 0:f19c80146d55 | 309 | } |
ohararp | 0:f19c80146d55 | 310 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 311 | void setPixelColor(uint16_t n, uint32_t c) { |
ohararp | 0:f19c80146d55 | 312 | if (n >= numLEDs) return; // '>=' because arrays are 0-indexed |
ohararp | 0:f19c80146d55 | 313 | pixels[n*3 ] = (c >> 16); |
ohararp | 0:f19c80146d55 | 314 | pixels[n*3+1] = (c >> 8); |
ohararp | 0:f19c80146d55 | 315 | pixels[n*3+2] = c; |
ohararp | 0:f19c80146d55 | 316 | //pc.printf("setPixelColor-2 inputs\n"); |
ohararp | 0:f19c80146d55 | 317 | } |
ohararp | 0:f19c80146d55 | 318 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 319 | // Fill the dots one after the other with a color |
ohararp | 0:f19c80146d55 | 320 | void colorWipe(uint32_t c, uint8_t wait) { |
ohararp | 0:f19c80146d55 | 321 | for(uint16_t i=0; i<numPixels(); i++) { |
ohararp | 0:f19c80146d55 | 322 | setPixelColor(i, c); |
ohararp | 0:f19c80146d55 | 323 | show(); |
ohararp | 0:f19c80146d55 | 324 | wait_ms(wait); |
ohararp | 0:f19c80146d55 | 325 | } |
ohararp | 0:f19c80146d55 | 326 | } |
ohararp | 0:f19c80146d55 | 327 | //******************************************************************************* |
rmsteele | 2:047d1e5230b8 | 328 | // Fill the dots one after the other with a color |
rmsteele | 2:047d1e5230b8 | 329 | void colorAll(uint32_t c, uint8_t rwait) { |
rmsteele | 2:047d1e5230b8 | 330 | for(uint16_t i=0; i<numPixels(); i++) { |
rmsteele | 2:047d1e5230b8 | 331 | setPixelColor(i, c); |
rmsteele | 2:047d1e5230b8 | 332 | } |
rmsteele | 2:047d1e5230b8 | 333 | show(); |
rmsteele | 2:047d1e5230b8 | 334 | wait_ms(rwait); |
rmsteele | 2:047d1e5230b8 | 335 | } |
rmsteele | 2:047d1e5230b8 | 336 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 337 | // Input a value 0 to 255 to get a color value. |
ohararp | 0:f19c80146d55 | 338 | // The colours are a transition r - g - b - back to r. |
ohararp | 0:f19c80146d55 | 339 | uint32_t Wheel(int WheelPos) { |
ohararp | 0:f19c80146d55 | 340 | if(WheelPos < 85) { |
ohararp | 0:f19c80146d55 | 341 | return Color(WheelPos * 3, 255 - WheelPos * 3, 0); |
ohararp | 0:f19c80146d55 | 342 | } else if(WheelPos < 170) { |
ohararp | 0:f19c80146d55 | 343 | WheelPos -= 85; |
ohararp | 0:f19c80146d55 | 344 | return Color(255 - WheelPos * 3, 0, WheelPos * 3); |
ohararp | 0:f19c80146d55 | 345 | } else { |
ohararp | 0:f19c80146d55 | 346 | WheelPos -= 170; |
ohararp | 0:f19c80146d55 | 347 | return Color(0, WheelPos * 3, 255 - WheelPos * 3); |
ohararp | 0:f19c80146d55 | 348 | } |
ohararp | 0:f19c80146d55 | 349 | } |
ohararp | 0:f19c80146d55 | 350 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 351 | void rainbow(uint8_t rwait) { |
ohararp | 0:f19c80146d55 | 352 | uint16_t i, j; |
ohararp | 0:f19c80146d55 | 353 | |
ohararp | 0:f19c80146d55 | 354 | for(j=0; j<256; j++) { |
ohararp | 0:f19c80146d55 | 355 | for(i=0; i<numPixels(); i++) { |
ohararp | 0:f19c80146d55 | 356 | setPixelColor(i, Wheel((i+j) & 255)); |
ohararp | 0:f19c80146d55 | 357 | } |
ohararp | 0:f19c80146d55 | 358 | show(); |
ohararp | 0:f19c80146d55 | 359 | wait_ms(rwait); |
ohararp | 0:f19c80146d55 | 360 | } |
ohararp | 0:f19c80146d55 | 361 | } |
ohararp | 0:f19c80146d55 | 362 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 363 | // Slightly different, this makes the rainbow equally distributed throughout |
ohararp | 0:f19c80146d55 | 364 | void rainbowCycle(uint8_t rwait) { |
ohararp | 0:f19c80146d55 | 365 | uint16_t i, j; |
ohararp | 0:f19c80146d55 | 366 | |
ohararp | 0:f19c80146d55 | 367 | for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel |
ohararp | 0:f19c80146d55 | 368 | for(i=0; i< numPixels(); i++) { |
ohararp | 0:f19c80146d55 | 369 | setPixelColor(i, Wheel(((i * 256 / numPixels()) + j) & 255)); |
ohararp | 0:f19c80146d55 | 370 | } |
ohararp | 0:f19c80146d55 | 371 | show(); |
ohararp | 0:f19c80146d55 | 372 | wait_ms(rwait); |
ohararp | 0:f19c80146d55 | 373 | } |
ohararp | 0:f19c80146d55 | 374 | } |
ohararp | 0:f19c80146d55 | 375 | //******************************************************************************* |
ohararp | 0:f19c80146d55 | 376 | int main() { |
ohararp | 0:f19c80146d55 | 377 | pc.baud(38400); |
ohararp | 0:f19c80146d55 | 378 | setup(); |
ohararp | 0:f19c80146d55 | 379 | while (1) { |
ohararp | 0:f19c80146d55 | 380 | pc.printf("Top of the Loop\n"); |
rmsteele | 2:047d1e5230b8 | 381 | colorWipe(Color(255, 0, 0), 40); // Red |
rmsteele | 2:047d1e5230b8 | 382 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 383 | colorWipe(Color(0, 255, 0), 40); // Grn |
ohararp | 0:f19c80146d55 | 384 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 385 | colorWipe(Color(0, 0, 255), 40); // Blu |
rmsteele | 2:047d1e5230b8 | 386 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 387 | colorAll(Color(255, 0, 0), 250); |
ohararp | 0:f19c80146d55 | 388 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 389 | colorAll(Color(0, 255, 0), 250); |
rmsteele | 2:047d1e5230b8 | 390 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 391 | colorAll(Color(0, 0, 255), 250); |
ohararp | 0:f19c80146d55 | 392 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 393 | rainbow(20); |
rmsteele | 2:047d1e5230b8 | 394 | blankDelay(250); |
rmsteele | 2:047d1e5230b8 | 395 | rainbowCycle(5); |
rmsteele | 2:047d1e5230b8 | 396 | blankDelay(250); |
ohararp | 0:f19c80146d55 | 397 | |
ohararp | 0:f19c80146d55 | 398 | } |
ohararp | 0:f19c80146d55 | 399 | } |
ohararp | 0:f19c80146d55 | 400 | |
ohararp | 0:f19c80146d55 | 401 | //write(128); |
ohararp | 0:f19c80146d55 | 402 | //wait_us(10); |
ohararp | 0:f19c80146d55 | 403 | //write(0); |
ohararp | 0:f19c80146d55 | 404 | //wait_us(10); |