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 Jens Strümper

Committer:
jensstruemper
Date:
Fri May 20 15:05:10 2016 +0000
Revision:
0:19efa3fea668
Child:
1:28c022f61c0b
Initial commit of PushDuration Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jensstruemper 0:19efa3fea668 1 /* PushDuration Library by Jens Strümper
jensstruemper 0:19efa3fea668 2 */
jensstruemper 0:19efa3fea668 3 #ifndef __PUSHDURATION_H_INCLUDED__
jensstruemper 0:19efa3fea668 4 #define __PUSHDURATION_H_INCLUDED__
jensstruemper 0:19efa3fea668 5
jensstruemper 0:19efa3fea668 6 namespace js{
jensstruemper 0:19efa3fea668 7
jensstruemper 0:19efa3fea668 8 /**
jensstruemper 0:19efa3fea668 9 * PushDuration calls a function based on the duration of a button push
jensstruemper 0:19efa3fea668 10 *
jensstruemper 0:19efa3fea668 11 * The following code demonstrates the usage of the PushDuration library.
jensstruemper 0:19efa3fea668 12 * The library is meant for cases where different callbank functions are triggered by
jensstruemper 0:19efa3fea668 13 * different button push durations. E.g function "state1" is called when the button is
jensstruemper 0:19efa3fea668 14 * released after 1 second, "state4" is called when the button is released after 4 seconds
jensstruemper 0:19efa3fea668 15 * and so on. Please note that the implementation is far from being perfect. E.g. it
jensstruemper 0:19efa3fea668 16 * will not work if you instantiate the class in ram.
jensstruemper 0:19efa3fea668 17
jensstruemper 0:19efa3fea668 18 * Paramters are:-
jensstruemper 0:19efa3fea668 19 * <ul>
jensstruemper 0:19efa3fea668 20 * <li> Key value table for function <-> duration assignment. </li>
jensstruemper 0:19efa3fea668 21 * <li> PinName used for Button </li>
jensstruemper 0:19efa3fea668 22 * <li> Interval - typically "1" for full seconds </li>
jensstruemper 0:19efa3fea668 23 * </ul>
jensstruemper 0:19efa3fea668 24 *
jensstruemper 0:19efa3fea668 25 *
jensstruemper 0:19efa3fea668 26 * Example:
jensstruemper 0:19efa3fea668 27 * @code
jensstruemper 0:19efa3fea668 28
jensstruemper 0:19efa3fea668 29
jensstruemper 0:19efa3fea668 30 * #include "mbed.h"
jensstruemper 0:19efa3fea668 31 * #include "PushDuration.h"
jensstruemper 0:19efa3fea668 32
jensstruemper 0:19efa3fea668 33 * void state1() {
jensstruemper 0:19efa3fea668 34 * //function called after 1 seconds
jensstruemper 0:19efa3fea668 35 * printf("state1\n");
jensstruemper 0:19efa3fea668 36 * }
jensstruemper 0:19efa3fea668 37 * void state4() {
jensstruemper 0:19efa3fea668 38 * //function called after 4 seconds
jensstruemper 0:19efa3fea668 39 * printf("state4\n");
jensstruemper 0:19efa3fea668 40 * }
jensstruemper 0:19efa3fea668 41 * void state10() {
jensstruemper 0:19efa3fea668 42 * //function called after 4 seconds
jensstruemper 0:19efa3fea668 43 * printf("state8\n");
jensstruemper 0:19efa3fea668 44 * }
jensstruemper 0:19efa3fea668 45
jensstruemper 0:19efa3fea668 46 * PinName pin(p17);
jensstruemper 0:19efa3fea668 47
jensstruemper 0:19efa3fea668 48 * //Action Table specifiying push duration and callback function
jensstruemper 0:19efa3fea668 49 * const action action_table[] =
jensstruemper 0:19efa3fea668 50 * {
jensstruemper 0:19efa3fea668 51 * { 1, state1 },
jensstruemper 0:19efa3fea668 52 * { 4, state4 },
jensstruemper 0:19efa3fea668 53 * { 10, state10 },
jensstruemper 0:19efa3fea668 54 * };
jensstruemper 0:19efa3fea668 55
jensstruemper 0:19efa3fea668 56 * int main()
jensstruemper 0:19efa3fea668 57 * //creating the ButtonHandler Object by specifiying arraysize, action table, pin and interval in seconds
jensstruemper 0:19efa3fea668 58 * {
jensstruemper 0:19efa3fea668 59 * ButtonHandler green(
jensstruemper 0:19efa3fea668 60 * sizeof(action_table)/sizeof(action_table[0]),
jensstruemper 0:19efa3fea668 61 * action_table,
jensstruemper 0:19efa3fea668 62 * pin,
jensstruemper 0:19efa3fea668 63 * 2
jensstruemper 0:19efa3fea668 64 * );
jensstruemper 0:19efa3fea668 65
jensstruemper 0:19efa3fea668 66 * //enabling Button Handler
jensstruemper 0:19efa3fea668 67 * green.enable();
jensstruemper 0:19efa3fea668 68 * while(1){
jensstruemper 0:19efa3fea668 69 * printf("alive\n");
jensstruemper 0:19efa3fea668 70 * wait(5);
jensstruemper 0:19efa3fea668 71 * }
jensstruemper 0:19efa3fea668 72 * }
jensstruemper 0:19efa3fea668 73 **/
jensstruemper 0:19efa3fea668 74
jensstruemper 0:19efa3fea668 75 /**
jensstruemper 0:19efa3fea668 76 * struct to define duration and
jensstruemper 0:19efa3fea668 77 * callback function
jensstruemper 0:19efa3fea668 78 **/
jensstruemper 0:19efa3fea668 79
jensstruemper 0:19efa3fea668 80 struct action
jensstruemper 0:19efa3fea668 81 {
jensstruemper 0:19efa3fea668 82 int counter_limit;
jensstruemper 0:19efa3fea668 83 void (*transition)(void);
jensstruemper 0:19efa3fea668 84 };
jensstruemper 0:19efa3fea668 85
jensstruemper 0:19efa3fea668 86 /**
jensstruemper 0:19efa3fea668 87 * struct to hold table size and p
jensstruemper 0:19efa3fea668 88 * pointer to the first element of the table
jensstruemper 0:19efa3fea668 89 **/
jensstruemper 0:19efa3fea668 90
jensstruemper 0:19efa3fea668 91 struct action_list
jensstruemper 0:19efa3fea668 92 {
jensstruemper 0:19efa3fea668 93 size_t size;
jensstruemper 0:19efa3fea668 94 const action *table;
jensstruemper 0:19efa3fea668 95 };
jensstruemper 0:19efa3fea668 96
jensstruemper 0:19efa3fea668 97
jensstruemper 0:19efa3fea668 98 class ButtonHandler {
jensstruemper 0:19efa3fea668 99 public:
jensstruemper 0:19efa3fea668 100 /**
jensstruemper 0:19efa3fea668 101 * ButtonHandler Constructor:
jensstruemper 0:19efa3fea668 102 *
jensstruemper 0:19efa3fea668 103 * @param table_size sitze_t
jensstruemper 0:19efa3fea668 104 * @param begin const action*
jensstruemper 0:19efa3fea668 105 * @param pin PinName
jensstruemper 0:19efa3fea668 106 * @param seconds float
jensstruemper 0:19efa3fea668 107 **/
jensstruemper 0:19efa3fea668 108 ButtonHandler(std::size_t table_size, const action* begin, PinName pin, float seconds ): buttonPin(pin){
jensstruemper 0:19efa3fea668 109 mTable.size = table_size;
jensstruemper 0:19efa3fea668 110 mTable.table = begin;
jensstruemper 0:19efa3fea668 111 intervalInSeconds = seconds;
jensstruemper 0:19efa3fea668 112 printf("initialized\n");
jensstruemper 0:19efa3fea668 113 }
jensstruemper 0:19efa3fea668 114
jensstruemper 0:19efa3fea668 115 /**
jensstruemper 0:19efa3fea668 116 * Enables Button Handler
jensstruemper 0:19efa3fea668 117 **/
jensstruemper 0:19efa3fea668 118 void enable();
jensstruemper 0:19efa3fea668 119
jensstruemper 0:19efa3fea668 120 /**
jensstruemper 0:19efa3fea668 121 * Disables Button Handler
jensstruemper 0:19efa3fea668 122 **/
jensstruemper 0:19efa3fea668 123
jensstruemper 0:19efa3fea668 124 void disable();
jensstruemper 0:19efa3fea668 125
jensstruemper 0:19efa3fea668 126 /**
jensstruemper 0:19efa3fea668 127 * ButtonHandler Destructor
jensstruemper 0:19efa3fea668 128 **/
jensstruemper 0:19efa3fea668 129 virtual ~ButtonHandler() {
jensstruemper 0:19efa3fea668 130 disable();
jensstruemper 0:19efa3fea668 131 }
jensstruemper 0:19efa3fea668 132 protected:
jensstruemper 0:19efa3fea668 133 void press();
jensstruemper 0:19efa3fea668 134 void secondsCount();
jensstruemper 0:19efa3fea668 135 void release();
jensstruemper 0:19efa3fea668 136 void react(int counter) const;
jensstruemper 0:19efa3fea668 137
jensstruemper 0:19efa3fea668 138 private:
jensstruemper 0:19efa3fea668 139 volatile unsigned counter;
jensstruemper 0:19efa3fea668 140 InterruptIn buttonPin;
jensstruemper 0:19efa3fea668 141 float intervalInSeconds;
jensstruemper 0:19efa3fea668 142 action_list mTable;
jensstruemper 0:19efa3fea668 143 Ticker ticker;
jensstruemper 0:19efa3fea668 144
jensstruemper 0:19efa3fea668 145 };
jensstruemper 0:19efa3fea668 146 }; //name space ends
jensstruemper 0:19efa3fea668 147
jensstruemper 0:19efa3fea668 148 using namespace js;
jensstruemper 0:19efa3fea668 149
jensstruemper 0:19efa3fea668 150 #endif //__PUSHDURATION_H_INCLUDED__