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.

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?

UserRevisionLine numberNew 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 }