Breath LED that turn on/off or loop the brightness smoothly.
Dependents: BreathLed-demo EPD_GDE021A1_demo mbed_esp8266_demo NUCLEO_uart_flow_control
This breathing-led uses Ticker and PWM which consumes few CPU, and most important, you can use it to tell system hang.
Just init it with a PWM pin which connected to a LED.
BreathLed.cpp@0:13c83a6b336f, 2015-04-06 (annotated)
- Committer:
- steeven
- Date:
- Mon Apr 06 11:02:16 2015 +0000
- Revision:
- 0:13c83a6b336f
init release;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
steeven | 0:13c83a6b336f | 1 | /* |
steeven | 0:13c83a6b336f | 2 | * BreathLed.cpp |
steeven | 0:13c83a6b336f | 3 | * |
steeven | 0:13c83a6b336f | 4 | * Created on: 2015/4/6 |
steeven | 0:13c83a6b336f | 5 | * Author: steeven@gmail.com |
steeven | 0:13c83a6b336f | 6 | */ |
steeven | 0:13c83a6b336f | 7 | |
steeven | 0:13c83a6b336f | 8 | #include <BreathLed/BreathLed.h> |
steeven | 0:13c83a6b336f | 9 | |
steeven | 0:13c83a6b336f | 10 | namespace steeven { |
steeven | 0:13c83a6b336f | 11 | BreathLed::BreathLed(PinName pin, float time, float hold) : |
steeven | 0:13c83a6b336f | 12 | _pin(pin), _ticker() { |
steeven | 0:13c83a6b336f | 13 | _pin = 0; |
steeven | 0:13c83a6b336f | 14 | _time = time; |
steeven | 0:13c83a6b336f | 15 | _hold = hold; |
steeven | 0:13c83a6b336f | 16 | _mode = 0; |
steeven | 0:13c83a6b336f | 17 | _off = 0; |
steeven | 0:13c83a6b336f | 18 | _step = 0; |
steeven | 0:13c83a6b336f | 19 | } |
steeven | 0:13c83a6b336f | 20 | void BreathLed::hold_tick() { |
steeven | 0:13c83a6b336f | 21 | _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS); |
steeven | 0:13c83a6b336f | 22 | } |
steeven | 0:13c83a6b336f | 23 | void BreathLed::step_tick() { |
steeven | 0:13c83a6b336f | 24 | |
steeven | 0:13c83a6b336f | 25 | if (_off) { |
steeven | 0:13c83a6b336f | 26 | if (_step <= 0) { |
steeven | 0:13c83a6b336f | 27 | if (_mode == 0) { //loop |
steeven | 0:13c83a6b336f | 28 | _off = !_off; |
steeven | 0:13c83a6b336f | 29 | if (_hold) |
steeven | 0:13c83a6b336f | 30 | _ticker.attach(this, &BreathLed::hold_tick, _hold); |
steeven | 0:13c83a6b336f | 31 | } else |
steeven | 0:13c83a6b336f | 32 | _ticker.detach(); |
steeven | 0:13c83a6b336f | 33 | return; |
steeven | 0:13c83a6b336f | 34 | } else { |
steeven | 0:13c83a6b336f | 35 | _step--; |
steeven | 0:13c83a6b336f | 36 | } |
steeven | 0:13c83a6b336f | 37 | } else { |
steeven | 0:13c83a6b336f | 38 | if (_step >= BREATH_STEPS) { |
steeven | 0:13c83a6b336f | 39 | if (_mode == 0) { //loop |
steeven | 0:13c83a6b336f | 40 | _off = !_off; |
steeven | 0:13c83a6b336f | 41 | if (_hold) |
steeven | 0:13c83a6b336f | 42 | _ticker.attach(this, &BreathLed::hold_tick, _hold); |
steeven | 0:13c83a6b336f | 43 | } else |
steeven | 0:13c83a6b336f | 44 | _ticker.detach(); |
steeven | 0:13c83a6b336f | 45 | return; |
steeven | 0:13c83a6b336f | 46 | } else { |
steeven | 0:13c83a6b336f | 47 | _step++; |
steeven | 0:13c83a6b336f | 48 | } |
steeven | 0:13c83a6b336f | 49 | } |
steeven | 0:13c83a6b336f | 50 | |
steeven | 0:13c83a6b336f | 51 | _pin = (float)(1 << _step) / (1 << BREATH_STEPS); |
steeven | 0:13c83a6b336f | 52 | } |
steeven | 0:13c83a6b336f | 53 | void BreathLed::loop(float time, float hold) { |
steeven | 0:13c83a6b336f | 54 | _time = time; |
steeven | 0:13c83a6b336f | 55 | _hold = hold; |
steeven | 0:13c83a6b336f | 56 | _mode = 0; |
steeven | 0:13c83a6b336f | 57 | _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS); |
steeven | 0:13c83a6b336f | 58 | } |
steeven | 0:13c83a6b336f | 59 | |
steeven | 0:13c83a6b336f | 60 | |
steeven | 0:13c83a6b336f | 61 | void BreathLed::on() { |
steeven | 0:13c83a6b336f | 62 | _mode = 1; |
steeven | 0:13c83a6b336f | 63 | _off = 0; |
steeven | 0:13c83a6b336f | 64 | if (_pin < 1) |
steeven | 0:13c83a6b336f | 65 | _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS); |
steeven | 0:13c83a6b336f | 66 | else |
steeven | 0:13c83a6b336f | 67 | _ticker.detach(); |
steeven | 0:13c83a6b336f | 68 | } |
steeven | 0:13c83a6b336f | 69 | void BreathLed::off() { |
steeven | 0:13c83a6b336f | 70 | _mode = 2; |
steeven | 0:13c83a6b336f | 71 | _off = 1; |
steeven | 0:13c83a6b336f | 72 | if (_pin > 0) |
steeven | 0:13c83a6b336f | 73 | _ticker.attach(this, &BreathLed::step_tick, _time / BREATH_STEPS); |
steeven | 0:13c83a6b336f | 74 | else |
steeven | 0:13c83a6b336f | 75 | _ticker.detach(); |
steeven | 0:13c83a6b336f | 76 | } |
steeven | 0:13c83a6b336f | 77 | BreathLed::~BreathLed() { |
steeven | 0:13c83a6b336f | 78 | if (!_pin != 0) |
steeven | 0:13c83a6b336f | 79 | _pin = 0; |
steeven | 0:13c83a6b336f | 80 | } |
steeven | 0:13c83a6b336f | 81 | }// namespace steeven |