Fork of AndyA/cylon, with support for STM32F4 and LPC8xx
Fork of cylon by
main.cpp@4:4482500a0e5c, 2020-04-24 (annotated)
- Committer:
- JojoS
- Date:
- Fri Apr 24 18:36:55 2020 +0000
- Revision:
- 4:4482500a0e5c
- Parent:
- 2:c658370b1a08
test with LED 150 length
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AndyA | 0:35d68d1652e1 | 1 | #include "mbed.h" |
AndyA | 0:35d68d1652e1 | 2 | #include "wsDrive.h" |
AndyA | 0:35d68d1652e1 | 3 | |
JojoS | 2:c658370b1a08 | 4 | DigitalOut led1(LED1); |
JojoS | 2:c658370b1a08 | 5 | |
AndyA | 0:35d68d1652e1 | 6 | // time period between each movement |
JojoS | 2:c658370b1a08 | 7 | #define updatePeriodMS 10 |
AndyA | 0:35d68d1652e1 | 8 | |
AndyA | 0:35d68d1652e1 | 9 | // number of LEDs in chain |
JojoS | 2:c658370b1a08 | 10 | #define chainLen 300 |
AndyA | 0:35d68d1652e1 | 11 | |
AndyA | 0:35d68d1652e1 | 12 | // set the pulldown and then create the driver |
JojoS | 2:c658370b1a08 | 13 | //wsDrive ledDriver(P1_22, P0_22, P1_15); |
JojoS | 2:c658370b1a08 | 14 | wsDrive ledDriver(PC_12, NC, NC); |
AndyA | 0:35d68d1652e1 | 15 | |
AndyA | 0:35d68d1652e1 | 16 | Timer updateRateTimer; |
AndyA | 0:35d68d1652e1 | 17 | |
AndyA | 0:35d68d1652e1 | 18 | // pixel storage buffer |
AndyA | 1:054df9ecd479 | 19 | pixelInfo16 pixelData[chainLen]; |
AndyA | 1:054df9ecd479 | 20 | |
AndyA | 1:054df9ecd479 | 21 | const uint8_t trailCount = 3; |
AndyA | 1:054df9ecd479 | 22 | |
AndyA | 1:054df9ecd479 | 23 | // info for each trail |
AndyA | 1:054df9ecd479 | 24 | struct trailInfo { |
AndyA | 1:054df9ecd479 | 25 | float start; // location of the trail from 0 to chainLen-1 |
AndyA | 1:054df9ecd479 | 26 | int length; // length of the trail |
AndyA | 1:054df9ecd479 | 27 | float speed; // speed in moves at in LEDs per update |
AndyA | 1:054df9ecd479 | 28 | int backgroundRatio; // background glow level |
AndyA | 1:054df9ecd479 | 29 | pixelInfo colour; // colour (and brightness) at the start of the chain |
AndyA | 1:054df9ecd479 | 30 | bool dir; // direction of travel - true = increasing location |
AndyA | 1:054df9ecd479 | 31 | }; |
AndyA | 1:054df9ecd479 | 32 | |
AndyA | 1:054df9ecd479 | 33 | |
AndyA | 1:054df9ecd479 | 34 | struct trailInfo lines[trailCount]; |
AndyA | 1:054df9ecd479 | 35 | |
AndyA | 0:35d68d1652e1 | 36 | |
AndyA | 0:35d68d1652e1 | 37 | void blankBuffer(pixelInfo *Ptr) |
AndyA | 0:35d68d1652e1 | 38 | { |
AndyA | 0:35d68d1652e1 | 39 | memset( (void *)Ptr, 0, chainLen*sizeof(pixelInfo) ); |
AndyA | 0:35d68d1652e1 | 40 | } |
AndyA | 0:35d68d1652e1 | 41 | |
AndyA | 1:054df9ecd479 | 42 | void blankBuffer(pixelInfo16 *Ptr) |
AndyA | 1:054df9ecd479 | 43 | { |
AndyA | 1:054df9ecd479 | 44 | memset( (void *)Ptr, 0, chainLen*sizeof(pixelInfo16) ); |
AndyA | 1:054df9ecd479 | 45 | } |
AndyA | 1:054df9ecd479 | 46 | |
AndyA | 0:35d68d1652e1 | 47 | void setPixel (pixelInfo *pixel, pixelInfo *colour, float level) |
AndyA | 0:35d68d1652e1 | 48 | { |
AndyA | 1:054df9ecd479 | 49 | pixel->R = (colour->R * level); |
AndyA | 1:054df9ecd479 | 50 | pixel->G = (colour->G * level); |
AndyA | 1:054df9ecd479 | 51 | pixel->B = (colour->B * level); |
AndyA | 1:054df9ecd479 | 52 | } |
AndyA | 0:35d68d1652e1 | 53 | |
AndyA | 1:054df9ecd479 | 54 | void addPixel (pixelInfo16 *pixel, pixelInfo *colour, float level) |
AndyA | 1:054df9ecd479 | 55 | { |
AndyA | 1:054df9ecd479 | 56 | pixel->R = pixel->R + (int)(colour->R * level); |
AndyA | 1:054df9ecd479 | 57 | pixel->G = pixel->G + (int)(colour->G * level); |
AndyA | 1:054df9ecd479 | 58 | pixel->B = pixel->B + (int)(colour->B * level); |
AndyA | 1:054df9ecd479 | 59 | } |
AndyA | 1:054df9ecd479 | 60 | |
AndyA | 1:054df9ecd479 | 61 | void subtractPixel (pixelInfo16 *pixel, pixelInfo *colour, float level) |
AndyA | 1:054df9ecd479 | 62 | { |
AndyA | 1:054df9ecd479 | 63 | pixel->R = pixel->R - (int)(colour->R * level); |
AndyA | 1:054df9ecd479 | 64 | pixel->G = pixel->G - (int)(colour->G * level); |
AndyA | 1:054df9ecd479 | 65 | pixel->B = pixel->B - (int)(colour->B * level); |
AndyA | 0:35d68d1652e1 | 66 | } |
AndyA | 0:35d68d1652e1 | 67 | |
AndyA | 0:35d68d1652e1 | 68 | |
AndyA | 1:054df9ecd479 | 69 | void setTrail(bool add, pixelInfo16* buffer, pixelInfo *colour, int peakPoint, bool increasing, int len) |
AndyA | 0:35d68d1652e1 | 70 | { |
AndyA | 0:35d68d1652e1 | 71 | int pixelToUpdate = peakPoint; |
AndyA | 1:054df9ecd479 | 72 | for (int pixel = 0; pixel < len; pixel++) { |
AndyA | 1:054df9ecd479 | 73 | |
AndyA | 1:054df9ecd479 | 74 | if (add) |
JojoS | 2:c658370b1a08 | 75 | addPixel((buffer+pixelToUpdate), colour, 1.0f - (float)pixel/(float)len); |
AndyA | 1:054df9ecd479 | 76 | else |
JojoS | 2:c658370b1a08 | 77 | subtractPixel((buffer+pixelToUpdate), colour, 1.0f - (float)pixel/(float)len); |
AndyA | 1:054df9ecd479 | 78 | |
AndyA | 0:35d68d1652e1 | 79 | increasing ? pixelToUpdate-- : pixelToUpdate++; |
AndyA | 1:054df9ecd479 | 80 | |
AndyA | 0:35d68d1652e1 | 81 | if (pixelToUpdate == chainLen) { |
AndyA | 0:35d68d1652e1 | 82 | increasing = false; |
AndyA | 1:054df9ecd479 | 83 | pixelToUpdate = chainLen-2; |
AndyA | 0:35d68d1652e1 | 84 | } |
AndyA | 0:35d68d1652e1 | 85 | if (pixelToUpdate == -1) { |
AndyA | 0:35d68d1652e1 | 86 | increasing = true; |
AndyA | 1:054df9ecd479 | 87 | pixelToUpdate = 1; |
AndyA | 0:35d68d1652e1 | 88 | } |
AndyA | 0:35d68d1652e1 | 89 | } |
AndyA | 0:35d68d1652e1 | 90 | } |
AndyA | 0:35d68d1652e1 | 91 | |
AndyA | 1:054df9ecd479 | 92 | void removeTrail (pixelInfo16* buffer, pixelInfo *colour, int peakPoint, bool increasing, int len) |
AndyA | 0:35d68d1652e1 | 93 | { |
AndyA | 1:054df9ecd479 | 94 | setTrail (false, buffer, colour, peakPoint, increasing, len); |
AndyA | 1:054df9ecd479 | 95 | } |
AndyA | 0:35d68d1652e1 | 96 | |
AndyA | 1:054df9ecd479 | 97 | void addTrail (pixelInfo16* buffer, pixelInfo *colour, int peakPoint, bool increasing, int len) |
AndyA | 1:054df9ecd479 | 98 | { |
AndyA | 1:054df9ecd479 | 99 | setTrail (true, buffer, colour, peakPoint, increasing, len); |
AndyA | 0:35d68d1652e1 | 100 | } |
AndyA | 0:35d68d1652e1 | 101 | |
AndyA | 0:35d68d1652e1 | 102 | |
AndyA | 0:35d68d1652e1 | 103 | int main () |
AndyA | 0:35d68d1652e1 | 104 | { |
JojoS | 2:c658370b1a08 | 105 | //LEDs = 0; |
AndyA | 1:054df9ecd479 | 106 | |
AndyA | 1:054df9ecd479 | 107 | |
AndyA | 1:054df9ecd479 | 108 | // set up the lights. |
AndyA | 1:054df9ecd479 | 109 | lines[0].start = 0; |
JojoS | 2:c658370b1a08 | 110 | lines[0].speed = 1.6; |
JojoS | 2:c658370b1a08 | 111 | lines[0].length = 30; |
AndyA | 1:054df9ecd479 | 112 | lines[0].backgroundRatio = 40; |
JojoS | 2:c658370b1a08 | 113 | lines[0].colour.R = 200; |
AndyA | 1:054df9ecd479 | 114 | lines[0].colour.G = 0; |
AndyA | 1:054df9ecd479 | 115 | lines[0].colour.B = 0; |
AndyA | 1:054df9ecd479 | 116 | lines[0].dir = true; |
AndyA | 0:35d68d1652e1 | 117 | |
JojoS | 2:c658370b1a08 | 118 | #if 1 |
JojoS | 2:c658370b1a08 | 119 | lines[1].start = 150; |
JojoS | 2:c658370b1a08 | 120 | lines[1].speed = 1.4; |
JojoS | 2:c658370b1a08 | 121 | lines[1].length = 30; |
AndyA | 1:054df9ecd479 | 122 | lines[1].backgroundRatio = 40; |
AndyA | 1:054df9ecd479 | 123 | lines[1].colour.R = 0; |
AndyA | 1:054df9ecd479 | 124 | lines[1].colour.G = 0; |
JojoS | 2:c658370b1a08 | 125 | lines[1].colour.B = 200; |
AndyA | 1:054df9ecd479 | 126 | lines[1].dir = true; |
AndyA | 0:35d68d1652e1 | 127 | |
JojoS | 2:c658370b1a08 | 128 | lines[2].start = 299; |
JojoS | 2:c658370b1a08 | 129 | lines[2].speed = 1.1; |
JojoS | 2:c658370b1a08 | 130 | lines[2].length = 30; |
AndyA | 1:054df9ecd479 | 131 | lines[2].backgroundRatio = 40; |
AndyA | 1:054df9ecd479 | 132 | lines[2].colour.R = 0; |
JojoS | 2:c658370b1a08 | 133 | lines[2].colour.G = 200; |
AndyA | 1:054df9ecd479 | 134 | lines[2].colour.B = 0; |
AndyA | 1:054df9ecd479 | 135 | lines[2].dir = false; |
JojoS | 2:c658370b1a08 | 136 | #endif |
AndyA | 1:054df9ecd479 | 137 | |
AndyA | 1:054df9ecd479 | 138 | // clear the buffer |
AndyA | 0:35d68d1652e1 | 139 | blankBuffer(pixelData); |
AndyA | 0:35d68d1652e1 | 140 | |
AndyA | 1:054df9ecd479 | 141 | // add the optional background |
AndyA | 1:054df9ecd479 | 142 | /* |
AndyA | 1:054df9ecd479 | 143 | for (int i = 0; i< chainLen; i++) { |
AndyA | 1:054df9ecd479 | 144 | for (int j = 0; j <trailCount; j++) { |
AndyA | 1:054df9ecd479 | 145 | addPixel((pixelData+i), &(lines[j].colour), 1.0/lines[j].backgroundRatio); |
AndyA | 1:054df9ecd479 | 146 | } |
AndyA | 1:054df9ecd479 | 147 | } |
AndyA | 1:054df9ecd479 | 148 | */ |
AndyA | 1:054df9ecd479 | 149 | |
AndyA | 1:054df9ecd479 | 150 | // add the initial lines |
AndyA | 1:054df9ecd479 | 151 | for (int j = 0; j <trailCount; j++) { |
AndyA | 1:054df9ecd479 | 152 | addTrail (pixelData, &(lines[j].colour), lines[j].start, lines[j].dir, lines[j].length); // set the LED data |
AndyA | 1:054df9ecd479 | 153 | } |
AndyA | 0:35d68d1652e1 | 154 | // give the LED driver the buffer to use. |
AndyA | 0:35d68d1652e1 | 155 | ledDriver.setData(pixelData, chainLen); |
AndyA | 0:35d68d1652e1 | 156 | |
JojoS | 2:c658370b1a08 | 157 | //LEDs = 1; |
AndyA | 0:35d68d1652e1 | 158 | |
AndyA | 0:35d68d1652e1 | 159 | updateRateTimer.start(); |
AndyA | 0:35d68d1652e1 | 160 | while (true) { |
AndyA | 0:35d68d1652e1 | 161 | ledDriver.sendData(); // send the LED data |
AndyA | 1:054df9ecd479 | 162 | |
JojoS | 2:c658370b1a08 | 163 | led1 = !led1; |
JojoS | 2:c658370b1a08 | 164 | //LEDs = LEDs+1; |
AndyA | 0:35d68d1652e1 | 165 | |
AndyA | 1:054df9ecd479 | 166 | // subtract the current trail locations and then add the new locations. |
AndyA | 1:054df9ecd479 | 167 | for (int j = 0; j <trailCount; j++) { |
AndyA | 1:054df9ecd479 | 168 | removeTrail (pixelData, &(lines[j].colour), lines[j].start, lines[j].dir, lines[j].length); // set the LED data |
AndyA | 1:054df9ecd479 | 169 | |
AndyA | 1:054df9ecd479 | 170 | lines[j].dir ? lines[j].start+=lines[j].speed : lines[j].start-=lines[j].speed; |
AndyA | 1:054df9ecd479 | 171 | if ((int)lines[j].start >= chainLen) { |
AndyA | 1:054df9ecd479 | 172 | lines[j].dir = false; |
AndyA | 1:054df9ecd479 | 173 | lines[j].start = chainLen-1 - lines[j].speed; |
AndyA | 1:054df9ecd479 | 174 | } |
AndyA | 1:054df9ecd479 | 175 | if ((int)lines[j].start <= -1) { |
AndyA | 1:054df9ecd479 | 176 | lines[j].dir = true; |
AndyA | 1:054df9ecd479 | 177 | lines[j].start = lines[j].speed; |
AndyA | 1:054df9ecd479 | 178 | } |
AndyA | 1:054df9ecd479 | 179 | addTrail (pixelData, &(lines[j].colour), lines[j].start, lines[j].dir, lines[j].length); // set the LED data |
AndyA | 0:35d68d1652e1 | 180 | } |
AndyA | 0:35d68d1652e1 | 181 | // wait for the next update time. |
AndyA | 0:35d68d1652e1 | 182 | while (updateRateTimer.read_ms() < updatePeriodMS) { |
AndyA | 0:35d68d1652e1 | 183 | } |
AndyA | 0:35d68d1652e1 | 184 | updateRateTimer.reset(); |
AndyA | 0:35d68d1652e1 | 185 | } |
AndyA | 0:35d68d1652e1 | 186 | |
AndyA | 0:35d68d1652e1 | 187 | } |