Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LedStrip_test by
main.cpp@0:109a7a5e3e6e, 2013-09-21 (annotated)
- 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?
User | Revision | Line number | New 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 | } |