PushDuration maps n callback functions to the duration of a button press. E.g. foo() is called when a button is released after 1 second where bar() is called after 3 seconds.
Fork of PushDuration by
PushDuration.cpp@3:d2aec01c8227, 2016-08-20 (annotated)
- Committer:
- jensstruemper
- Date:
- Sat Aug 20 18:58:48 2016 +0000
- Revision:
- 3:d2aec01c8227
- Parent:
- 2:126fed923ada
few changes on Pushduration (reversed pullup and rise / fall logic)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jensstruemper | 0:19efa3fea668 | 1 | #include "mbed.h" |
jensstruemper | 0:19efa3fea668 | 2 | #include "PushDuration.h" |
jensstruemper | 0:19efa3fea668 | 3 | /** |
jensstruemper | 0:19efa3fea668 | 4 | * React() function is called by release() when the button is released. It traverses through the two |
jensstruemper | 0:19efa3fea668 | 5 | * dimensional key vale array and matches the push duration with the corresponding callback function. |
jensstruemper | 0:19efa3fea668 | 6 | **/ |
jensstruemper | 0:19efa3fea668 | 7 | void ButtonHandler::react(int counter) const { |
jensstruemper | 0:19efa3fea668 | 8 | const action *a = mTable.table; |
jensstruemper | 0:19efa3fea668 | 9 | for (std::size_t i=mTable.size; i; --i, ++a) { |
jensstruemper | 0:19efa3fea668 | 10 | if ((counter >= a->counter_limit) && counter < (a+1)->counter_limit ) { |
jensstruemper | 0:19efa3fea668 | 11 | a->transition(); |
jensstruemper | 0:19efa3fea668 | 12 | return; |
jensstruemper | 0:19efa3fea668 | 13 | } |
jensstruemper | 0:19efa3fea668 | 14 | } |
jensstruemper | 0:19efa3fea668 | 15 | } |
jensstruemper | 0:19efa3fea668 | 16 | |
jensstruemper | 0:19efa3fea668 | 17 | /** |
jensstruemper | 0:19efa3fea668 | 18 | * Configures the button pin mode, attaches callback functions for rise and fall |
jensstruemper | 0:19efa3fea668 | 19 | * and enables IRQ for the given pin. |
jensstruemper | 0:19efa3fea668 | 20 | **/ |
jensstruemper | 0:19efa3fea668 | 21 | void ButtonHandler::enable() { |
jensstruemper | 2:126fed923ada | 22 | buttonPin.mode(PullDown); |
jensstruemper | 0:19efa3fea668 | 23 | wait(0.01); |
jensstruemper | 0:19efa3fea668 | 24 | buttonPin.rise(this, &ButtonHandler::release); |
jensstruemper | 0:19efa3fea668 | 25 | buttonPin.fall(this, &ButtonHandler::press); |
jensstruemper | 0:19efa3fea668 | 26 | buttonPin.enable_irq(); |
jensstruemper | 0:19efa3fea668 | 27 | } |
jensstruemper | 0:19efa3fea668 | 28 | |
jensstruemper | 0:19efa3fea668 | 29 | |
jensstruemper | 0:19efa3fea668 | 30 | void ButtonHandler::disable() { |
jensstruemper | 0:19efa3fea668 | 31 | buttonPin.disable_irq(); |
jensstruemper | 0:19efa3fea668 | 32 | ticker.detach(); |
jensstruemper | 0:19efa3fea668 | 33 | } |
jensstruemper | 0:19efa3fea668 | 34 | |
jensstruemper | 3:d2aec01c8227 | 35 | void ButtonHandler::release() { |
jensstruemper | 0:19efa3fea668 | 36 | counter = 0; |
jensstruemper | 0:19efa3fea668 | 37 | ticker.attach(this, &ButtonHandler::secondsCount, intervalInSeconds); |
jensstruemper | 0:19efa3fea668 | 38 | } |
jensstruemper | 0:19efa3fea668 | 39 | |
jensstruemper | 3:d2aec01c8227 | 40 | void ButtonHandler::press() { |
jensstruemper | 3:d2aec01c8227 | 41 | ticker.detach(); |
jensstruemper | 3:d2aec01c8227 | 42 | react(counter); |
jensstruemper | 3:d2aec01c8227 | 43 | counter = 0; |
jensstruemper | 3:d2aec01c8227 | 44 | } |
jensstruemper | 3:d2aec01c8227 | 45 | |
jensstruemper | 0:19efa3fea668 | 46 | void ButtonHandler::secondsCount() { |
jensstruemper | 0:19efa3fea668 | 47 | ++counter; |
jensstruemper | 3:d2aec01c8227 | 48 | printf("counter: %d\n", counter); |
jensstruemper | 0:19efa3fea668 | 49 | } |