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
Diff: main.cpp
- Revision:
- 2:590e99f4a313
- Parent:
- 1:1a0d5a780e57
- Child:
- 3:42efa00ffef4
--- a/main.cpp Sat Sep 21 15:21:53 2013 +0000 +++ b/main.cpp Sat Sep 21 19:10:43 2013 +0000 @@ -10,6 +10,9 @@ DigitalOut latch(p16); DigitalOut strobe(p17); +Ticker g_ticker; + + #define LENGTH 160 uint8_t strip[160]; @@ -23,6 +26,8 @@ #define MAGENTA (RED | BLUE) #define WHITE (RED | GREEN | BLUE) +#define FAST 0x40 + uint8_t fade_result[] = {0, 2, 3, 1}; @@ -91,7 +96,7 @@ virtual void Run() { strip[led_] = getcolor(a_, b_); if (fast_) { - strip[led_] |= 0x40; + strip[led_] |= FAST; time_ += 128; } else { time_ += 256; @@ -100,7 +105,7 @@ swap(a_,b_); Schedule(this); } - + private: int led_; uint8_t a_,b_; @@ -126,7 +131,7 @@ } strip[led_] = getcolor(a_, b_); if (fast_) { - strip[led_] |= 0x40; + strip[led_] |= FAST; time_ += 128; } else { time_ += 256; @@ -135,7 +140,7 @@ swap(a_,b_); Schedule(this); } - + private: int led_, stride_; uint8_t a_,b_; @@ -143,9 +148,98 @@ }; +class RegionWalkingFadeInOut : public Schedulable { +public: + RegionWalkingFadeInOut(int start_time, int led, int stride, int start_led, int length, uint8_t a, uint8_t b, bool fast, bool repeat, bool drop, Schedulable* next) + : led_(led - stride), stride_(stride), start_led_(start_led), length_(length), a_(a), b_(b), fast_(fast), step_(true), repeat_(repeat), drop_(drop), next_(next) { + time_ = start_time; + Schedule(this); + } -int main() { - Ticker t; + virtual void Run() { + if (step_) { + step_ = false; + if (led_ >= 0) strip[led_ + start_led_] = a_; + led_ += stride_; + if (repeat_) { + led_ %= length_; + } else { + if (led_ > length_) { + if (next_ && led_ == (length_ + stride_)) { + next_->time_ = global_tick + 1; + Schedule(next_); + } + delete this; + return; + } + } + } else { + if (led_ == length_ && drop_ && !repeat_) { + if (next_) { + next_->time_ = global_tick + 1; + Schedule(next_); + } + delete this; + return; + } + step_ = true; + } + strip[led_ + start_led_] = getcolor(a_, b_); + if (fast_) { + strip[led_ + start_led_] |= FAST; + time_ += 128; + } else { + time_ += 256; + } + strip_changed = true; + swap(a_,b_); + Schedule(this); + } + +private: + int led_, stride_; + int start_led_, length_; + uint8_t a_,b_; + bool fast_, step_; + bool repeat_, drop_; + Schedulable* next_; +}; + +/* Keep dropping water drops in a bucket, until it fills up. */ +class DropBucketFill : public Schedulable { +public: + DropBucketFill(int start_time, int start_led, int length, int drop_size, uint8_t from_color, uint8_t to_color) + : start_led_(start_led), length_(length), drop_size_(drop_size), from_color_(from_color), to_color_(to_color) { + time_ = start_time; + Schedule(this); + } + + virtual void Run() { + // The bucket starts with a drop at its end. + //strip[start_led_ + length_] = to_color_; + //strip[start_led_ + length_] = RED; + if (length_ > 0) { + // There's still space in the bucket. Drop a new drop. + for (int i = 0; i < drop_size_; ++i) { + Schedulable* next_drop = NULL; + next_drop = this; + new RegionWalkingFadeInOut(time_ + (256 * i / drop_size_), i, drop_size_, start_led_, length_ - 1, from_color_, to_color_, true, false, true, next_drop); + } + length_--; + } else { + // There's no more space in the bucket. Bail out. + delete this; + return; + } + } + +private: + int start_led_, length_; + int drop_size_; + uint8_t from_color_, to_color_; +}; + +void init_board() { pc.baud(115200); myled = 0; @@ -155,21 +249,14 @@ spi.frequency(300000); wait_ms(500); myled = 1; - memset(strip, 0x80, sizeof(strip)); + memset(strip, BLACK, sizeof(strip)); write_strip(strip, sizeof(strip)); - t.attach(&tick_cb, 1.0/1000); + g_ticker.attach(&tick_cb, 1.0/1000); memset(strip, 0x0, sizeof(strip)); - - /*new RepeatedFadeInOut(0, 0, BLACK, RED, false); - new RepeatedFadeInOut(171, 1, BLACK, RED, false); - new RepeatedFadeInOut(341, 2, BLACK, RED, false); -*/ - int stride = 7; - for (int i = 0; i < stride; i++) { - new WalkingFadeInOut((256 * i / stride), i, stride, BLACK, GREEN, true); - } - +} + +void run_loop() { while(1) { while (task_list.empty() || global_tick < task_list.top()->time_) { if (strip_changed) { @@ -182,50 +269,19 @@ task_list.pop(); action->Run(); } - strip[0] = BLACK; - strip[1] = GREEN; - strip[2] = BLUE; - strip[3] = getcolor(BLACK, RED); +} - (strip, sizeof(strip)); +int main() { + init_board(); - myled = 1; - int count = 0; - memset(strip, 0, sizeof(strip)); - while(1) { - ++count; - wait_us(300); - strobe = !strobe; - // count = 256 => one thing finished. - if (count > 511) count = 0; - bool flush = 0; - if (count == 0) { - strip[0] = getcolor(BLACK, RED); - flush = true; - } - if (count== 256) { - strip[0] = getcolor(RED, BLACK); - flush = true; - } - if (count == 256+83) { - strip[1] = getcolor(BLACK, RED); - flush = true; - } - if (count== 83) { - strip[1] = getcolor(RED, BLACK); - flush = true; - } - if (count == 166) { - strip[2] = getcolor(BLACK, RED); - flush = true; - } - if (count== 256+166) { - strip[2] = getcolor(RED, BLACK); - flush = true; - } - if (flush) { - write_strip(strip, sizeof(strip)); - memset(strip, 0, sizeof(strip)); - } + int stride = 7; + for (int i = 0; i < stride; i++) { + //new WalkingFadeInOut((256 * i / stride), i, stride, BLACK, RED, true); + /* new RepeatedFadeInOut(0, i, BLACK, RED, false); */ + //new RegionWalkingFadeInOut((256 * i / stride), i, stride, 5, 30, BLACK, BLUE, true, false); } -} + + new DropBucketFill(0, 10, 20, 3, BLACK, BLUE); + + run_loop(); +} \ No newline at end of file