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.h@0:19efa3fea668, 2016-05-20 (annotated)
- 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?
User | Revision | Line number | New 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__ |