Fork of AndyA/cylon, with support for STM32F4 and LPC8xx

Dependencies:   mbed wsDrive

Fork of cylon by Andy A

Committer:
JojoS
Date:
Sat Dec 10 14:25:55 2016 +0000
Revision:
2:c658370b1a08
Parent:
1:054df9ecd479
added support for STM32F4

Who changed what in which revision?

UserRevisionLine numberNew 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 }