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.
PushDuration.cpp@1:28c022f61c0b, 2016-05-20 (annotated)
- Committer:
- jensstruemper
- Date:
- Fri May 20 15:13:45 2016 +0000
- Revision:
- 1:28c022f61c0b
- Parent:
- 0:19efa3fea668
minor formatting updates
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 | 0:19efa3fea668 | 22 | buttonPin.mode(PullUp); |
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 | * |
jensstruemper | 0:19efa3fea668 | 31 | * |
jensstruemper | 0:19efa3fea668 | 32 | * |
jensstruemper | 0:19efa3fea668 | 33 | **/ |
jensstruemper | 0:19efa3fea668 | 34 | |
jensstruemper | 0:19efa3fea668 | 35 | void ButtonHandler::disable() { |
jensstruemper | 0:19efa3fea668 | 36 | buttonPin.disable_irq(); |
jensstruemper | 0:19efa3fea668 | 37 | ticker.detach(); |
jensstruemper | 0:19efa3fea668 | 38 | } |
jensstruemper | 0:19efa3fea668 | 39 | |
jensstruemper | 0:19efa3fea668 | 40 | void ButtonHandler::press() { |
jensstruemper | 0:19efa3fea668 | 41 | counter = 0; |
jensstruemper | 0:19efa3fea668 | 42 | ticker.attach(this, &ButtonHandler::secondsCount, intervalInSeconds); |
jensstruemper | 0:19efa3fea668 | 43 | } |
jensstruemper | 0:19efa3fea668 | 44 | |
jensstruemper | 0:19efa3fea668 | 45 | void ButtonHandler::secondsCount() { |
jensstruemper | 0:19efa3fea668 | 46 | ++counter; |
jensstruemper | 0:19efa3fea668 | 47 | } |
jensstruemper | 0:19efa3fea668 | 48 | |
jensstruemper | 0:19efa3fea668 | 49 | void ButtonHandler::release() { |
jensstruemper | 0:19efa3fea668 | 50 | ticker.detach(); |
jensstruemper | 0:19efa3fea668 | 51 | react(counter); |
jensstruemper | 0:19efa3fea668 | 52 | counter = 0; |
jensstruemper | 0:19efa3fea668 | 53 | } |