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