Julio G / Mbed 2 deprecated LedStrip

Dependencies:   mbed

Fork of LedStrip_test by Balazs Racz

Committer:
bracz
Date:
Sat Sep 21 15:21:53 2013 +0000
Revision:
1:1a0d5a780e57
Parent:
0:109a7a5e3e6e
Child:
2:590e99f4a313
green moving strip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bracz 0:109a7a5e3e6e 1 #include <queue>
bracz 0:109a7a5e3e6e 2
bracz 0:109a7a5e3e6e 3 #include "mbed.h"
bracz 0:109a7a5e3e6e 4
bracz 0:109a7a5e3e6e 5 DigitalOut myled(LED1);
bracz 0:109a7a5e3e6e 6
bracz 0:109a7a5e3e6e 7 Serial pc(USBTX, USBRX);
bracz 0:109a7a5e3e6e 8
bracz 0:109a7a5e3e6e 9 SPI spi(p5, p6, p20); // mosi, miso, sclk
bracz 0:109a7a5e3e6e 10 DigitalOut latch(p16);
bracz 0:109a7a5e3e6e 11 DigitalOut strobe(p17);
bracz 0:109a7a5e3e6e 12
bracz 1:1a0d5a780e57 13 #define LENGTH 160
bracz 1:1a0d5a780e57 14
bracz 0:109a7a5e3e6e 15 uint8_t strip[160];
bracz 0:109a7a5e3e6e 16
bracz 0:109a7a5e3e6e 17 #define BLACK 0x80
bracz 0:109a7a5e3e6e 18 #define BLUE (BLACK | 0x10)
bracz 0:109a7a5e3e6e 19 #define RED (BLACK | 0x04)
bracz 0:109a7a5e3e6e 20 #define GREEN (BLACK | 0x01)
bracz 0:109a7a5e3e6e 21 #define YELLOW (RED | GREEN)
bracz 0:109a7a5e3e6e 22 #define CYAN (GREEN | BLUE)
bracz 0:109a7a5e3e6e 23 #define MAGENTA (RED | BLUE)
bracz 0:109a7a5e3e6e 24 #define WHITE (RED | GREEN | BLUE)
bracz 0:109a7a5e3e6e 25
bracz 0:109a7a5e3e6e 26 uint8_t fade_result[] =
bracz 0:109a7a5e3e6e 27 {0, 2, 3, 1};
bracz 0:109a7a5e3e6e 28
bracz 0:109a7a5e3e6e 29 uint8_t getbit(uint8_t from, uint8_t to) {
bracz 0:109a7a5e3e6e 30 return fade_result[((from&1) << 1) | (to & 1)];
bracz 0:109a7a5e3e6e 31 }
bracz 0:109a7a5e3e6e 32
bracz 0:109a7a5e3e6e 33 uint8_t getcolor(uint8_t from, uint8_t to) {
bracz 0:109a7a5e3e6e 34 uint8_t result = 0x80;
bracz 0:109a7a5e3e6e 35 result |= getbit(from >> 0, to >> 0) << 0;
bracz 0:109a7a5e3e6e 36 result |= getbit(from >> 2, to >> 2) << 2;
bracz 0:109a7a5e3e6e 37 result |= getbit(from >> 4, to >> 4) << 4;
bracz 0:109a7a5e3e6e 38 return result;
bracz 0:109a7a5e3e6e 39 }
bracz 0:109a7a5e3e6e 40
bracz 0:109a7a5e3e6e 41
bracz 0:109a7a5e3e6e 42 void write_strip(uint8_t* data, int len) {
bracz 0:109a7a5e3e6e 43 latch = 0;
bracz 0:109a7a5e3e6e 44 for (int i = len - 1; i >= 0; i--) {
bracz 0:109a7a5e3e6e 45 spi.write(data[i]);
bracz 0:109a7a5e3e6e 46 }
bracz 0:109a7a5e3e6e 47 latch = 1;
bracz 0:109a7a5e3e6e 48 wait_us(2);
bracz 0:109a7a5e3e6e 49 latch = 0;
bracz 0:109a7a5e3e6e 50 }
bracz 0:109a7a5e3e6e 51
bracz 0:109a7a5e3e6e 52 class Schedulable {
bracz 0:109a7a5e3e6e 53 public:
bracz 0:109a7a5e3e6e 54 int time_;
bracz 0:109a7a5e3e6e 55 virtual void Run() = 0;
bracz 0:109a7a5e3e6e 56
bracz 0:109a7a5e3e6e 57 bool operator<(const Schedulable& o) const {
bracz 0:109a7a5e3e6e 58 return time_ < o.time_;
bracz 0:109a7a5e3e6e 59 }
bracz 0:109a7a5e3e6e 60 };
bracz 0:109a7a5e3e6e 61
bracz 0:109a7a5e3e6e 62
bracz 0:109a7a5e3e6e 63 struct comp {
bracz 0:109a7a5e3e6e 64 bool operator()(const Schedulable* a, const Schedulable* b) {
bracz 0:109a7a5e3e6e 65 return *b < *a;
bracz 0:109a7a5e3e6e 66 }
bracz 0:109a7a5e3e6e 67 };
bracz 0:109a7a5e3e6e 68
bracz 0:109a7a5e3e6e 69 priority_queue<Schedulable*, vector<Schedulable*>, comp> task_list;
bracz 0:109a7a5e3e6e 70
bracz 0:109a7a5e3e6e 71 void Schedule(Schedulable* action) {
bracz 0:109a7a5e3e6e 72 task_list.push(action);
bracz 0:109a7a5e3e6e 73 }
bracz 0:109a7a5e3e6e 74
bracz 0:109a7a5e3e6e 75 int global_tick = 0;
bracz 0:109a7a5e3e6e 76 bool strip_changed;
bracz 0:109a7a5e3e6e 77
bracz 0:109a7a5e3e6e 78 void tick_cb() {
bracz 0:109a7a5e3e6e 79 ++global_tick;
bracz 0:109a7a5e3e6e 80 strobe = !strobe;
bracz 0:109a7a5e3e6e 81 }
bracz 0:109a7a5e3e6e 82
bracz 0:109a7a5e3e6e 83 class RepeatedFadeInOut : public Schedulable {
bracz 0:109a7a5e3e6e 84 public:
bracz 0:109a7a5e3e6e 85 RepeatedFadeInOut(int start_time, int led, uint8_t a, uint8_t b, bool fast)
bracz 0:109a7a5e3e6e 86 : led_(led), a_(a), b_(b), fast_(fast) {
bracz 0:109a7a5e3e6e 87 time_ = start_time;
bracz 0:109a7a5e3e6e 88 Schedule(this);
bracz 0:109a7a5e3e6e 89 }
bracz 0:109a7a5e3e6e 90
bracz 0:109a7a5e3e6e 91 virtual void Run() {
bracz 0:109a7a5e3e6e 92 strip[led_] = getcolor(a_, b_);
bracz 0:109a7a5e3e6e 93 if (fast_) {
bracz 0:109a7a5e3e6e 94 strip[led_] |= 0x40;
bracz 0:109a7a5e3e6e 95 time_ += 128;
bracz 0:109a7a5e3e6e 96 } else {
bracz 0:109a7a5e3e6e 97 time_ += 256;
bracz 0:109a7a5e3e6e 98 }
bracz 0:109a7a5e3e6e 99 strip_changed = true;
bracz 0:109a7a5e3e6e 100 swap(a_,b_);
bracz 0:109a7a5e3e6e 101 Schedule(this);
bracz 0:109a7a5e3e6e 102 }
bracz 0:109a7a5e3e6e 103
bracz 0:109a7a5e3e6e 104 private:
bracz 0:109a7a5e3e6e 105 int led_;
bracz 0:109a7a5e3e6e 106 uint8_t a_,b_;
bracz 0:109a7a5e3e6e 107 bool fast_;
bracz 0:109a7a5e3e6e 108 };
bracz 0:109a7a5e3e6e 109
bracz 1:1a0d5a780e57 110 class WalkingFadeInOut : public Schedulable {
bracz 1:1a0d5a780e57 111 public:
bracz 1:1a0d5a780e57 112 WalkingFadeInOut(int start_time, int led, int stride, uint8_t a, uint8_t b, bool fast)
bracz 1:1a0d5a780e57 113 : led_(led - stride), stride_(stride), a_(a), b_(b), fast_(fast), step_(true) {
bracz 1:1a0d5a780e57 114 time_ = start_time;
bracz 1:1a0d5a780e57 115 Schedule(this);
bracz 1:1a0d5a780e57 116 }
bracz 1:1a0d5a780e57 117
bracz 1:1a0d5a780e57 118 virtual void Run() {
bracz 1:1a0d5a780e57 119 if (step_) {
bracz 1:1a0d5a780e57 120 step_ = false;
bracz 1:1a0d5a780e57 121 if (led_ >= 0) strip[led_] = a_;
bracz 1:1a0d5a780e57 122 led_ += stride_;
bracz 1:1a0d5a780e57 123 led_ %= LENGTH;
bracz 1:1a0d5a780e57 124 } else {
bracz 1:1a0d5a780e57 125 step_ = true;
bracz 1:1a0d5a780e57 126 }
bracz 1:1a0d5a780e57 127 strip[led_] = getcolor(a_, b_);
bracz 1:1a0d5a780e57 128 if (fast_) {
bracz 1:1a0d5a780e57 129 strip[led_] |= 0x40;
bracz 1:1a0d5a780e57 130 time_ += 128;
bracz 1:1a0d5a780e57 131 } else {
bracz 1:1a0d5a780e57 132 time_ += 256;
bracz 1:1a0d5a780e57 133 }
bracz 1:1a0d5a780e57 134 strip_changed = true;
bracz 1:1a0d5a780e57 135 swap(a_,b_);
bracz 1:1a0d5a780e57 136 Schedule(this);
bracz 1:1a0d5a780e57 137 }
bracz 1:1a0d5a780e57 138
bracz 1:1a0d5a780e57 139 private:
bracz 1:1a0d5a780e57 140 int led_, stride_;
bracz 1:1a0d5a780e57 141 uint8_t a_,b_;
bracz 1:1a0d5a780e57 142 bool fast_, step_;
bracz 1:1a0d5a780e57 143
bracz 1:1a0d5a780e57 144 };
bracz 1:1a0d5a780e57 145
bracz 1:1a0d5a780e57 146
bracz 0:109a7a5e3e6e 147 int main() {
bracz 0:109a7a5e3e6e 148 Ticker t;
bracz 0:109a7a5e3e6e 149 pc.baud(115200);
bracz 0:109a7a5e3e6e 150
bracz 0:109a7a5e3e6e 151 myled = 0;
bracz 0:109a7a5e3e6e 152 latch = 0;
bracz 0:109a7a5e3e6e 153
bracz 0:109a7a5e3e6e 154 spi.format(8, 0);
bracz 0:109a7a5e3e6e 155 spi.frequency(300000);
bracz 0:109a7a5e3e6e 156 wait_ms(500);
bracz 0:109a7a5e3e6e 157 myled = 1;
bracz 0:109a7a5e3e6e 158 memset(strip, 0x80, sizeof(strip));
bracz 0:109a7a5e3e6e 159 write_strip(strip, sizeof(strip));
bracz 1:1a0d5a780e57 160 t.attach(&tick_cb, 1.0/1000);
bracz 0:109a7a5e3e6e 161
bracz 0:109a7a5e3e6e 162 memset(strip, 0x0, sizeof(strip));
bracz 0:109a7a5e3e6e 163
bracz 1:1a0d5a780e57 164 /*new RepeatedFadeInOut(0, 0, BLACK, RED, false);
bracz 0:109a7a5e3e6e 165 new RepeatedFadeInOut(171, 1, BLACK, RED, false);
bracz 0:109a7a5e3e6e 166 new RepeatedFadeInOut(341, 2, BLACK, RED, false);
bracz 1:1a0d5a780e57 167 */
bracz 1:1a0d5a780e57 168 int stride = 7;
bracz 1:1a0d5a780e57 169 for (int i = 0; i < stride; i++) {
bracz 1:1a0d5a780e57 170 new WalkingFadeInOut((256 * i / stride), i, stride, BLACK, GREEN, true);
bracz 1:1a0d5a780e57 171 }
bracz 0:109a7a5e3e6e 172
bracz 0:109a7a5e3e6e 173 while(1) {
bracz 0:109a7a5e3e6e 174 while (task_list.empty() || global_tick < task_list.top()->time_) {
bracz 0:109a7a5e3e6e 175 if (strip_changed) {
bracz 0:109a7a5e3e6e 176 write_strip(strip, sizeof(strip));
bracz 0:109a7a5e3e6e 177 strip_changed = false;
bracz 0:109a7a5e3e6e 178 memset(strip, 0x0, sizeof(strip));
bracz 0:109a7a5e3e6e 179 }
bracz 0:109a7a5e3e6e 180 }
bracz 0:109a7a5e3e6e 181 Schedulable* action = task_list.top();
bracz 0:109a7a5e3e6e 182 task_list.pop();
bracz 0:109a7a5e3e6e 183 action->Run();
bracz 0:109a7a5e3e6e 184 }
bracz 0:109a7a5e3e6e 185 strip[0] = BLACK;
bracz 0:109a7a5e3e6e 186 strip[1] = GREEN;
bracz 0:109a7a5e3e6e 187 strip[2] = BLUE;
bracz 0:109a7a5e3e6e 188 strip[3] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 189
bracz 1:1a0d5a780e57 190 (strip, sizeof(strip));
bracz 0:109a7a5e3e6e 191
bracz 0:109a7a5e3e6e 192 myled = 1;
bracz 0:109a7a5e3e6e 193 int count = 0;
bracz 0:109a7a5e3e6e 194 memset(strip, 0, sizeof(strip));
bracz 0:109a7a5e3e6e 195 while(1) {
bracz 0:109a7a5e3e6e 196 ++count;
bracz 0:109a7a5e3e6e 197 wait_us(300);
bracz 0:109a7a5e3e6e 198 strobe = !strobe;
bracz 0:109a7a5e3e6e 199 // count = 256 => one thing finished.
bracz 0:109a7a5e3e6e 200 if (count > 511) count = 0;
bracz 0:109a7a5e3e6e 201 bool flush = 0;
bracz 0:109a7a5e3e6e 202 if (count == 0) {
bracz 0:109a7a5e3e6e 203 strip[0] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 204 flush = true;
bracz 0:109a7a5e3e6e 205 }
bracz 0:109a7a5e3e6e 206 if (count== 256) {
bracz 0:109a7a5e3e6e 207 strip[0] = getcolor(RED, BLACK);
bracz 0:109a7a5e3e6e 208 flush = true;
bracz 0:109a7a5e3e6e 209 }
bracz 0:109a7a5e3e6e 210 if (count == 256+83) {
bracz 0:109a7a5e3e6e 211 strip[1] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 212 flush = true;
bracz 0:109a7a5e3e6e 213 }
bracz 0:109a7a5e3e6e 214 if (count== 83) {
bracz 0:109a7a5e3e6e 215 strip[1] = getcolor(RED, BLACK);
bracz 0:109a7a5e3e6e 216 flush = true;
bracz 0:109a7a5e3e6e 217 }
bracz 0:109a7a5e3e6e 218 if (count == 166) {
bracz 0:109a7a5e3e6e 219 strip[2] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 220 flush = true;
bracz 0:109a7a5e3e6e 221 }
bracz 0:109a7a5e3e6e 222 if (count== 256+166) {
bracz 0:109a7a5e3e6e 223 strip[2] = getcolor(RED, BLACK);
bracz 0:109a7a5e3e6e 224 flush = true;
bracz 0:109a7a5e3e6e 225 }
bracz 0:109a7a5e3e6e 226 if (flush) {
bracz 0:109a7a5e3e6e 227 write_strip(strip, sizeof(strip));
bracz 0:109a7a5e3e6e 228 memset(strip, 0, sizeof(strip));
bracz 0:109a7a5e3e6e 229 }
bracz 0:109a7a5e3e6e 230 }
bracz 0:109a7a5e3e6e 231 }