Julio G / Mbed 2 deprecated LedStrip

Dependencies:   mbed

Fork of LedStrip_test by Balazs Racz

Committer:
bracz
Date:
Sat Sep 21 13:07:11 2013 +0000
Revision:
0:109a7a5e3e6e
Child:
1:1a0d5a780e57
scheduler, repeated fadein/out.

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 0:109a7a5e3e6e 13 uint8_t strip[160];
bracz 0:109a7a5e3e6e 14
bracz 0:109a7a5e3e6e 15 #define BLACK 0x80
bracz 0:109a7a5e3e6e 16 #define BLUE (BLACK | 0x10)
bracz 0:109a7a5e3e6e 17 #define RED (BLACK | 0x04)
bracz 0:109a7a5e3e6e 18 #define GREEN (BLACK | 0x01)
bracz 0:109a7a5e3e6e 19 #define YELLOW (RED | GREEN)
bracz 0:109a7a5e3e6e 20 #define CYAN (GREEN | BLUE)
bracz 0:109a7a5e3e6e 21 #define MAGENTA (RED | BLUE)
bracz 0:109a7a5e3e6e 22 #define WHITE (RED | GREEN | BLUE)
bracz 0:109a7a5e3e6e 23
bracz 0:109a7a5e3e6e 24 uint8_t fade_result[] =
bracz 0:109a7a5e3e6e 25 {0, 2, 3, 1};
bracz 0:109a7a5e3e6e 26
bracz 0:109a7a5e3e6e 27 uint8_t getbit(uint8_t from, uint8_t to) {
bracz 0:109a7a5e3e6e 28 return fade_result[((from&1) << 1) | (to & 1)];
bracz 0:109a7a5e3e6e 29 }
bracz 0:109a7a5e3e6e 30
bracz 0:109a7a5e3e6e 31 uint8_t getcolor(uint8_t from, uint8_t to) {
bracz 0:109a7a5e3e6e 32 uint8_t result = 0x80;
bracz 0:109a7a5e3e6e 33 result |= getbit(from >> 0, to >> 0) << 0;
bracz 0:109a7a5e3e6e 34 result |= getbit(from >> 2, to >> 2) << 2;
bracz 0:109a7a5e3e6e 35 result |= getbit(from >> 4, to >> 4) << 4;
bracz 0:109a7a5e3e6e 36 return result;
bracz 0:109a7a5e3e6e 37 }
bracz 0:109a7a5e3e6e 38
bracz 0:109a7a5e3e6e 39
bracz 0:109a7a5e3e6e 40 void write_strip(uint8_t* data, int len) {
bracz 0:109a7a5e3e6e 41 latch = 0;
bracz 0:109a7a5e3e6e 42 for (int i = len - 1; i >= 0; i--) {
bracz 0:109a7a5e3e6e 43 spi.write(data[i]);
bracz 0:109a7a5e3e6e 44 }
bracz 0:109a7a5e3e6e 45 latch = 1;
bracz 0:109a7a5e3e6e 46 wait_us(2);
bracz 0:109a7a5e3e6e 47 latch = 0;
bracz 0:109a7a5e3e6e 48 }
bracz 0:109a7a5e3e6e 49
bracz 0:109a7a5e3e6e 50 class Schedulable {
bracz 0:109a7a5e3e6e 51 public:
bracz 0:109a7a5e3e6e 52 int time_;
bracz 0:109a7a5e3e6e 53 virtual void Run() = 0;
bracz 0:109a7a5e3e6e 54
bracz 0:109a7a5e3e6e 55 bool operator<(const Schedulable& o) const {
bracz 0:109a7a5e3e6e 56 return time_ < o.time_;
bracz 0:109a7a5e3e6e 57 }
bracz 0:109a7a5e3e6e 58 };
bracz 0:109a7a5e3e6e 59
bracz 0:109a7a5e3e6e 60
bracz 0:109a7a5e3e6e 61 struct comp {
bracz 0:109a7a5e3e6e 62 bool operator()(const Schedulable* a, const Schedulable* b) {
bracz 0:109a7a5e3e6e 63 return *b < *a;
bracz 0:109a7a5e3e6e 64 }
bracz 0:109a7a5e3e6e 65 };
bracz 0:109a7a5e3e6e 66
bracz 0:109a7a5e3e6e 67 priority_queue<Schedulable*, vector<Schedulable*>, comp> task_list;
bracz 0:109a7a5e3e6e 68
bracz 0:109a7a5e3e6e 69 void Schedule(Schedulable* action) {
bracz 0:109a7a5e3e6e 70 task_list.push(action);
bracz 0:109a7a5e3e6e 71 }
bracz 0:109a7a5e3e6e 72
bracz 0:109a7a5e3e6e 73 int global_tick = 0;
bracz 0:109a7a5e3e6e 74 bool strip_changed;
bracz 0:109a7a5e3e6e 75
bracz 0:109a7a5e3e6e 76 void tick_cb() {
bracz 0:109a7a5e3e6e 77 ++global_tick;
bracz 0:109a7a5e3e6e 78 strobe = !strobe;
bracz 0:109a7a5e3e6e 79 }
bracz 0:109a7a5e3e6e 80
bracz 0:109a7a5e3e6e 81 class RepeatedFadeInOut : public Schedulable {
bracz 0:109a7a5e3e6e 82 public:
bracz 0:109a7a5e3e6e 83 RepeatedFadeInOut(int start_time, int led, uint8_t a, uint8_t b, bool fast)
bracz 0:109a7a5e3e6e 84 : led_(led), a_(a), b_(b), fast_(fast) {
bracz 0:109a7a5e3e6e 85 time_ = start_time;
bracz 0:109a7a5e3e6e 86 Schedule(this);
bracz 0:109a7a5e3e6e 87 }
bracz 0:109a7a5e3e6e 88
bracz 0:109a7a5e3e6e 89 virtual void Run() {
bracz 0:109a7a5e3e6e 90 strip[led_] = getcolor(a_, b_);
bracz 0:109a7a5e3e6e 91 if (fast_) {
bracz 0:109a7a5e3e6e 92 strip[led_] |= 0x40;
bracz 0:109a7a5e3e6e 93 time_ += 128;
bracz 0:109a7a5e3e6e 94 } else {
bracz 0:109a7a5e3e6e 95 time_ += 256;
bracz 0:109a7a5e3e6e 96 }
bracz 0:109a7a5e3e6e 97 strip_changed = true;
bracz 0:109a7a5e3e6e 98 swap(a_,b_);
bracz 0:109a7a5e3e6e 99 Schedule(this);
bracz 0:109a7a5e3e6e 100 }
bracz 0:109a7a5e3e6e 101
bracz 0:109a7a5e3e6e 102 private:
bracz 0:109a7a5e3e6e 103 int led_;
bracz 0:109a7a5e3e6e 104 uint8_t a_,b_;
bracz 0:109a7a5e3e6e 105 bool fast_;
bracz 0:109a7a5e3e6e 106 };
bracz 0:109a7a5e3e6e 107
bracz 0:109a7a5e3e6e 108 int main() {
bracz 0:109a7a5e3e6e 109 Ticker t;
bracz 0:109a7a5e3e6e 110 pc.baud(115200);
bracz 0:109a7a5e3e6e 111
bracz 0:109a7a5e3e6e 112 myled = 0;
bracz 0:109a7a5e3e6e 113 latch = 0;
bracz 0:109a7a5e3e6e 114
bracz 0:109a7a5e3e6e 115 spi.format(8, 0);
bracz 0:109a7a5e3e6e 116 spi.frequency(300000);
bracz 0:109a7a5e3e6e 117 wait_ms(500);
bracz 0:109a7a5e3e6e 118 myled = 1;
bracz 0:109a7a5e3e6e 119 memset(strip, 0x80, sizeof(strip));
bracz 0:109a7a5e3e6e 120 write_strip(strip, sizeof(strip));
bracz 0:109a7a5e3e6e 121 t.attach(&tick_cb, 1.0/400);
bracz 0:109a7a5e3e6e 122
bracz 0:109a7a5e3e6e 123 memset(strip, 0x0, sizeof(strip));
bracz 0:109a7a5e3e6e 124
bracz 0:109a7a5e3e6e 125 new RepeatedFadeInOut(0, 0, BLACK, RED, false);
bracz 0:109a7a5e3e6e 126 new RepeatedFadeInOut(171, 1, BLACK, RED, false);
bracz 0:109a7a5e3e6e 127 new RepeatedFadeInOut(341, 2, BLACK, RED, false);
bracz 0:109a7a5e3e6e 128
bracz 0:109a7a5e3e6e 129 while(1) {
bracz 0:109a7a5e3e6e 130 while (task_list.empty() || global_tick < task_list.top()->time_) {
bracz 0:109a7a5e3e6e 131 if (strip_changed) {
bracz 0:109a7a5e3e6e 132 write_strip(strip, sizeof(strip));
bracz 0:109a7a5e3e6e 133 strip_changed = false;
bracz 0:109a7a5e3e6e 134 memset(strip, 0x0, sizeof(strip));
bracz 0:109a7a5e3e6e 135 }
bracz 0:109a7a5e3e6e 136 }
bracz 0:109a7a5e3e6e 137 Schedulable* action = task_list.top();
bracz 0:109a7a5e3e6e 138 task_list.pop();
bracz 0:109a7a5e3e6e 139 action->Run();
bracz 0:109a7a5e3e6e 140 }
bracz 0:109a7a5e3e6e 141 strip[0] = BLACK;
bracz 0:109a7a5e3e6e 142 strip[1] = GREEN;
bracz 0:109a7a5e3e6e 143 strip[2] = BLUE;
bracz 0:109a7a5e3e6e 144 strip[3] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 145
bracz 0:109a7a5e3e6e 146 write_strip(strip, sizeof(strip));
bracz 0:109a7a5e3e6e 147
bracz 0:109a7a5e3e6e 148 myled = 1;
bracz 0:109a7a5e3e6e 149 int count = 0;
bracz 0:109a7a5e3e6e 150 memset(strip, 0, sizeof(strip));
bracz 0:109a7a5e3e6e 151 while(1) {
bracz 0:109a7a5e3e6e 152 ++count;
bracz 0:109a7a5e3e6e 153 wait_us(300);
bracz 0:109a7a5e3e6e 154 strobe = !strobe;
bracz 0:109a7a5e3e6e 155 // count = 256 => one thing finished.
bracz 0:109a7a5e3e6e 156 if (count > 511) count = 0;
bracz 0:109a7a5e3e6e 157 bool flush = 0;
bracz 0:109a7a5e3e6e 158 if (count == 0) {
bracz 0:109a7a5e3e6e 159 strip[0] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 160 flush = true;
bracz 0:109a7a5e3e6e 161 }
bracz 0:109a7a5e3e6e 162 if (count== 256) {
bracz 0:109a7a5e3e6e 163 strip[0] = getcolor(RED, BLACK);
bracz 0:109a7a5e3e6e 164 flush = true;
bracz 0:109a7a5e3e6e 165 }
bracz 0:109a7a5e3e6e 166 if (count == 256+83) {
bracz 0:109a7a5e3e6e 167 strip[1] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 168 flush = true;
bracz 0:109a7a5e3e6e 169 }
bracz 0:109a7a5e3e6e 170 if (count== 83) {
bracz 0:109a7a5e3e6e 171 strip[1] = getcolor(RED, BLACK);
bracz 0:109a7a5e3e6e 172 flush = true;
bracz 0:109a7a5e3e6e 173 }
bracz 0:109a7a5e3e6e 174 if (count == 166) {
bracz 0:109a7a5e3e6e 175 strip[2] = getcolor(BLACK, RED);
bracz 0:109a7a5e3e6e 176 flush = true;
bracz 0:109a7a5e3e6e 177 }
bracz 0:109a7a5e3e6e 178 if (count== 256+166) {
bracz 0:109a7a5e3e6e 179 strip[2] = getcolor(RED, BLACK);
bracz 0:109a7a5e3e6e 180 flush = true;
bracz 0:109a7a5e3e6e 181 }
bracz 0:109a7a5e3e6e 182 if (flush) {
bracz 0:109a7a5e3e6e 183 write_strip(strip, sizeof(strip));
bracz 0:109a7a5e3e6e 184 memset(strip, 0, sizeof(strip));
bracz 0:109a7a5e3e6e 185 }
bracz 0:109a7a5e3e6e 186 }
bracz 0:109a7a5e3e6e 187 }