PinDetect

Dependents:   Lab4

Committer:
trmontgomery
Date:
Fri Apr 05 19:42:29 2019 +0000
Revision:
0:045ce8e569c8
Finished Lab 4;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
trmontgomery 0:045ce8e569c8 1 /*
trmontgomery 0:045ce8e569c8 2 Copyright (c) 2010 Andy Kirkham
trmontgomery 0:045ce8e569c8 3
trmontgomery 0:045ce8e569c8 4 Permission is hereby granted, free of charge, to any person obtaining a copy
trmontgomery 0:045ce8e569c8 5 of this software and associated documentation files (the "Software"), to deal
trmontgomery 0:045ce8e569c8 6 in the Software without restriction, including without limitation the rights
trmontgomery 0:045ce8e569c8 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
trmontgomery 0:045ce8e569c8 8 copies of the Software, and to permit persons to whom the Software is
trmontgomery 0:045ce8e569c8 9 furnished to do so, subject to the following conditions:
trmontgomery 0:045ce8e569c8 10
trmontgomery 0:045ce8e569c8 11 The above copyright notice and this permission notice shall be included in
trmontgomery 0:045ce8e569c8 12 all copies or substantial portions of the Software.
trmontgomery 0:045ce8e569c8 13
trmontgomery 0:045ce8e569c8 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
trmontgomery 0:045ce8e569c8 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
trmontgomery 0:045ce8e569c8 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
trmontgomery 0:045ce8e569c8 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
trmontgomery 0:045ce8e569c8 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
trmontgomery 0:045ce8e569c8 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
trmontgomery 0:045ce8e569c8 20 THE SOFTWARE.
trmontgomery 0:045ce8e569c8 21 */
trmontgomery 0:045ce8e569c8 22
trmontgomery 0:045ce8e569c8 23 #ifndef AJK_PIN_DETECT_H
trmontgomery 0:045ce8e569c8 24 #define AJK_PIN_DETECT_H
trmontgomery 0:045ce8e569c8 25
trmontgomery 0:045ce8e569c8 26 #ifndef MBED_H
trmontgomery 0:045ce8e569c8 27 #include "mbed.h"
trmontgomery 0:045ce8e569c8 28 #endif
trmontgomery 0:045ce8e569c8 29
trmontgomery 0:045ce8e569c8 30 #ifndef PINDETECT_PIN_ASSTERED
trmontgomery 0:045ce8e569c8 31 #define PINDETECT_PIN_ASSTERED 1
trmontgomery 0:045ce8e569c8 32 #endif
trmontgomery 0:045ce8e569c8 33
trmontgomery 0:045ce8e569c8 34 #ifndef PINDETECT_SAMPLE_PERIOD
trmontgomery 0:045ce8e569c8 35 #define PINDETECT_SAMPLE_PERIOD 20000
trmontgomery 0:045ce8e569c8 36 #endif
trmontgomery 0:045ce8e569c8 37
trmontgomery 0:045ce8e569c8 38 #ifndef PINDETECT_ASSERT_COUNT
trmontgomery 0:045ce8e569c8 39 #define PINDETECT_ASSERT_COUNT 1
trmontgomery 0:045ce8e569c8 40 #endif
trmontgomery 0:045ce8e569c8 41
trmontgomery 0:045ce8e569c8 42 #ifndef PINDETECT_HOLD_COUNT
trmontgomery 0:045ce8e569c8 43 #define PINDETECT_HOLD_COUNT 50
trmontgomery 0:045ce8e569c8 44 #endif
trmontgomery 0:045ce8e569c8 45
trmontgomery 0:045ce8e569c8 46 namespace AjK {
trmontgomery 0:045ce8e569c8 47
trmontgomery 0:045ce8e569c8 48 /** PinDetect adds mechanical switch debouncing to DigitialIn and interrupt callbacks.
trmontgomery 0:045ce8e569c8 49 *
trmontgomery 0:045ce8e569c8 50 * This is done by sampling the specified pin at regular intervals and detecting any
trmontgomery 0:045ce8e569c8 51 * change of state ( 0 -> 1 or 1 -> 0 ). When a state change is detected the attached
trmontgomery 0:045ce8e569c8 52 * callback handler is called. Additionally, if the pin stays in the same state after
trmontgomery 0:045ce8e569c8 53 * a state change for a defined period of time, an extra callback is made allowing a
trmontgomery 0:045ce8e569c8 54 * program to detect when a "key is pressed and held down" rather than a momentary
trmontgomery 0:045ce8e569c8 55 * key/switch press.
trmontgomery 0:045ce8e569c8 56 *
trmontgomery 0:045ce8e569c8 57 * All parameters are customisable which include:-
trmontgomery 0:045ce8e569c8 58 * <ul>
trmontgomery 0:045ce8e569c8 59 * <li> The sampling frequency. </li>
trmontgomery 0:045ce8e569c8 60 * <li> The number of continuous samples until a state change is detected. </li>
trmontgomery 0:045ce8e569c8 61 * <li> The number of continuous samples until a key is assumed held after a state change. </li>
trmontgomery 0:045ce8e569c8 62 * <li> The logic level which is assumed to be asserted (0volts or +volts). </li>
trmontgomery 0:045ce8e569c8 63 * </ul>
trmontgomery 0:045ce8e569c8 64 *
trmontgomery 0:045ce8e569c8 65 * Only callbacks that have been attached will be called by the library.
trmontgomery 0:045ce8e569c8 66 *
trmontgomery 0:045ce8e569c8 67 * Example:
trmontgomery 0:045ce8e569c8 68 * @code
trmontgomery 0:045ce8e569c8 69 * #include "mbed.h"
trmontgomery 0:045ce8e569c8 70 * #include "PinDetect.h"
trmontgomery 0:045ce8e569c8 71 *
trmontgomery 0:045ce8e569c8 72 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 73 * DigitialOut led1( LED1 );
trmontgomery 0:045ce8e569c8 74 * DigitialOut led2( LED2 );
trmontgomery 0:045ce8e569c8 75 * DigitialOut led3( LED3 );
trmontgomery 0:045ce8e569c8 76 * DigitialOut led4( LED4 );
trmontgomery 0:045ce8e569c8 77 *
trmontgomery 0:045ce8e569c8 78 * void keyPressed( void ) {
trmontgomery 0:045ce8e569c8 79 * led2 = 1;
trmontgomery 0:045ce8e569c8 80 * led3 = 0;
trmontgomery 0:045ce8e569c8 81 * led4 = 0;
trmontgomery 0:045ce8e569c8 82 * }
trmontgomery 0:045ce8e569c8 83 *
trmontgomery 0:045ce8e569c8 84 * void keyReleased( void ) {
trmontgomery 0:045ce8e569c8 85 * led2 = 0;
trmontgomery 0:045ce8e569c8 86 * led3 = 0;
trmontgomery 0:045ce8e569c8 87 * led4 = 0;
trmontgomery 0:045ce8e569c8 88 * }
trmontgomery 0:045ce8e569c8 89 *
trmontgomery 0:045ce8e569c8 90 * void keyPressedHeld( void ) {
trmontgomery 0:045ce8e569c8 91 * led3 = 1;
trmontgomery 0:045ce8e569c8 92 * }
trmontgomery 0:045ce8e569c8 93 *
trmontgomery 0:045ce8e569c8 94 * void keyReleasedHeld( void ) {
trmontgomery 0:045ce8e569c8 95 * led4 = 1;
trmontgomery 0:045ce8e569c8 96 * }
trmontgomery 0:045ce8e569c8 97 *
trmontgomery 0:045ce8e569c8 98 * int main() {
trmontgomery 0:045ce8e569c8 99 *
trmontgomery 0:045ce8e569c8 100 * pin.mode( PullDown );
trmontgomery 0:045ce8e569c8 101 * pin.attach_asserted( &keyPressed );
trmontgomery 0:045ce8e569c8 102 * pin.attach_deasserted( &keyReleased );
trmontgomery 0:045ce8e569c8 103 * pin.attach_asserted_held( &keyPressedHeld );
trmontgomery 0:045ce8e569c8 104 * pin.attach_deasserted_held( &keyReleasedHeld );
trmontgomery 0:045ce8e569c8 105 *
trmontgomery 0:045ce8e569c8 106 * // Sampling does not begin until you set a frequency.
trmontgomery 0:045ce8e569c8 107 * // The default is 20ms. If you want a different frequency
trmontgomery 0:045ce8e569c8 108 * // then pass the period in microseconds for example, for 10ms :-
trmontgomery 0:045ce8e569c8 109 * // pin.setSampleFrequency( 10000 );
trmontgomery 0:045ce8e569c8 110 * //
trmontgomery 0:045ce8e569c8 111 * pin.setSampleFrequency(); // Defaults to 20ms.
trmontgomery 0:045ce8e569c8 112 *
trmontgomery 0:045ce8e569c8 113 * while( 1 ) {
trmontgomery 0:045ce8e569c8 114 * led1 = !led1;
trmontgomery 0:045ce8e569c8 115 * wait( 0.2 );
trmontgomery 0:045ce8e569c8 116 * }
trmontgomery 0:045ce8e569c8 117 * }
trmontgomery 0:045ce8e569c8 118 * @endcode
trmontgomery 0:045ce8e569c8 119 *
trmontgomery 0:045ce8e569c8 120 * This example will flash led1 in a similar to a standard starting program.
trmontgomery 0:045ce8e569c8 121 *
trmontgomery 0:045ce8e569c8 122 * Applying a "1" (switch on) to pin 30 will switch on led2, removing the "1" to "0"
trmontgomery 0:045ce8e569c8 123 * (switch off) led2 goes out. Holding the "switch" at one for one second will switch
trmontgomery 0:045ce8e569c8 124 * on led3. An unasserted P30 (switched off) will, after one second illuminate led4
trmontgomery 0:045ce8e569c8 125 * when the deasserted calledback is called.
trmontgomery 0:045ce8e569c8 126 *
trmontgomery 0:045ce8e569c8 127 * The above is a very basic introduction. For more details:-
trmontgomery 0:045ce8e569c8 128 * @see example.h
trmontgomery 0:045ce8e569c8 129 */
trmontgomery 0:045ce8e569c8 130 class PinDetect {
trmontgomery 0:045ce8e569c8 131
trmontgomery 0:045ce8e569c8 132 protected:
trmontgomery 0:045ce8e569c8 133 DigitalIn *_in;
trmontgomery 0:045ce8e569c8 134 Ticker *_ticker;
trmontgomery 0:045ce8e569c8 135 int _prevState;
trmontgomery 0:045ce8e569c8 136 int _currentStateCounter;
trmontgomery 0:045ce8e569c8 137 int _sampleTime;
trmontgomery 0:045ce8e569c8 138 int _assertValue;
trmontgomery 0:045ce8e569c8 139 int _samplesTillAssertReload;
trmontgomery 0:045ce8e569c8 140 int _samplesTillAssert;
trmontgomery 0:045ce8e569c8 141 int _samplesTillHeldReload;
trmontgomery 0:045ce8e569c8 142 int _samplesTillHeld;
trmontgomery 0:045ce8e569c8 143 FunctionPointer _callbackAsserted;
trmontgomery 0:045ce8e569c8 144 FunctionPointer _callbackDeasserted;
trmontgomery 0:045ce8e569c8 145 FunctionPointer _callbackAssertedHeld;
trmontgomery 0:045ce8e569c8 146 FunctionPointer _callbackDeassertedHeld;
trmontgomery 0:045ce8e569c8 147
trmontgomery 0:045ce8e569c8 148 /** initialise class
trmontgomery 0:045ce8e569c8 149 *
trmontgomery 0:045ce8e569c8 150 * @param PinName p is a valid pin that supports DigitalIn
trmontgomery 0:045ce8e569c8 151 * @param PinMode m The mode the DigitalIn should use.
trmontgomery 0:045ce8e569c8 152 */
trmontgomery 0:045ce8e569c8 153 void init(PinName p, PinMode m) {
trmontgomery 0:045ce8e569c8 154 _sampleTime = PINDETECT_SAMPLE_PERIOD;
trmontgomery 0:045ce8e569c8 155 _samplesTillAssert = PINDETECT_ASSERT_COUNT;
trmontgomery 0:045ce8e569c8 156 _samplesTillHeld = 0;
trmontgomery 0:045ce8e569c8 157 _samplesTillAssertReload = PINDETECT_ASSERT_COUNT;
trmontgomery 0:045ce8e569c8 158 _samplesTillHeldReload = PINDETECT_HOLD_COUNT;
trmontgomery 0:045ce8e569c8 159 _assertValue = PINDETECT_PIN_ASSTERED;
trmontgomery 0:045ce8e569c8 160
trmontgomery 0:045ce8e569c8 161 _in = new DigitalIn( p );
trmontgomery 0:045ce8e569c8 162 _in->mode( m );
trmontgomery 0:045ce8e569c8 163 _prevState = _in->read();
trmontgomery 0:045ce8e569c8 164 _ticker = new Ticker;
trmontgomery 0:045ce8e569c8 165 }
trmontgomery 0:045ce8e569c8 166
trmontgomery 0:045ce8e569c8 167 public:
trmontgomery 0:045ce8e569c8 168
trmontgomery 0:045ce8e569c8 169 friend class Ticker;
trmontgomery 0:045ce8e569c8 170
trmontgomery 0:045ce8e569c8 171 PinDetect() { error("You must supply a PinName"); }
trmontgomery 0:045ce8e569c8 172
trmontgomery 0:045ce8e569c8 173 /** PinDetect constructor
trmontgomery 0:045ce8e569c8 174 *
trmontgomery 0:045ce8e569c8 175 * By default the PinMode is set to PullDown.
trmontgomery 0:045ce8e569c8 176 *
trmontgomery 0:045ce8e569c8 177 * @see http://mbed.org/handbook/DigitalIn
trmontgomery 0:045ce8e569c8 178 * @param p PinName is a valid pin that supports DigitalIn
trmontgomery 0:045ce8e569c8 179 */
trmontgomery 0:045ce8e569c8 180 PinDetect(PinName p) {
trmontgomery 0:045ce8e569c8 181 init( p, PullDown );
trmontgomery 0:045ce8e569c8 182 }
trmontgomery 0:045ce8e569c8 183
trmontgomery 0:045ce8e569c8 184 /** PinDetect constructor
trmontgomery 0:045ce8e569c8 185 *
trmontgomery 0:045ce8e569c8 186 * @see http://mbed.org/handbook/DigitalIn
trmontgomery 0:045ce8e569c8 187 * @param PinName p is a valid pin that supports DigitalIn
trmontgomery 0:045ce8e569c8 188 * @param PinMode m The mode the DigitalIn should use.
trmontgomery 0:045ce8e569c8 189 */
trmontgomery 0:045ce8e569c8 190 PinDetect(PinName p, PinMode m) {
trmontgomery 0:045ce8e569c8 191 init( p, m );
trmontgomery 0:045ce8e569c8 192 }
trmontgomery 0:045ce8e569c8 193
trmontgomery 0:045ce8e569c8 194 /** PinDetect destructor
trmontgomery 0:045ce8e569c8 195 */
trmontgomery 0:045ce8e569c8 196 ~PinDetect() {
trmontgomery 0:045ce8e569c8 197 if ( _ticker ) delete( _ticker );
trmontgomery 0:045ce8e569c8 198 if ( _in ) delete( _in );
trmontgomery 0:045ce8e569c8 199 }
trmontgomery 0:045ce8e569c8 200
trmontgomery 0:045ce8e569c8 201 /** Set the sampling time in microseconds.
trmontgomery 0:045ce8e569c8 202 *
trmontgomery 0:045ce8e569c8 203 * @param int The time between pin samples in microseconds.
trmontgomery 0:045ce8e569c8 204 */
trmontgomery 0:045ce8e569c8 205 void setSampleFrequency(int i = PINDETECT_SAMPLE_PERIOD) {
trmontgomery 0:045ce8e569c8 206 _sampleTime = i;
trmontgomery 0:045ce8e569c8 207 _prevState = _in->read();
trmontgomery 0:045ce8e569c8 208 _ticker->attach_us( this, &PinDetect::isr, _sampleTime );
trmontgomery 0:045ce8e569c8 209 }
trmontgomery 0:045ce8e569c8 210
trmontgomery 0:045ce8e569c8 211 /** Set the value used as assert.
trmontgomery 0:045ce8e569c8 212 *
trmontgomery 0:045ce8e569c8 213 * Defaults to 1 (ie if pin == 1 then pin asserted).
trmontgomery 0:045ce8e569c8 214 *
trmontgomery 0:045ce8e569c8 215 * @param int New assert value (1 or 0)
trmontgomery 0:045ce8e569c8 216 */
trmontgomery 0:045ce8e569c8 217 void setAssertValue (int i = PINDETECT_PIN_ASSTERED) { _assertValue = i & 1; }
trmontgomery 0:045ce8e569c8 218
trmontgomery 0:045ce8e569c8 219 /** Set the number of continuous samples until assert assumed.
trmontgomery 0:045ce8e569c8 220 *
trmontgomery 0:045ce8e569c8 221 * Defaults to 1 (1 * sample frequency).
trmontgomery 0:045ce8e569c8 222 *
trmontgomery 0:045ce8e569c8 223 * @param int The number of continuous samples until assert assumed.
trmontgomery 0:045ce8e569c8 224 */
trmontgomery 0:045ce8e569c8 225 void setSamplesTillAssert(int i) { _samplesTillAssertReload = i; }
trmontgomery 0:045ce8e569c8 226
trmontgomery 0:045ce8e569c8 227 /** Set the number of continuous samples until held assumed.
trmontgomery 0:045ce8e569c8 228 *
trmontgomery 0:045ce8e569c8 229 * Defaults to 50 * sample frequency.
trmontgomery 0:045ce8e569c8 230 *
trmontgomery 0:045ce8e569c8 231 * @param int The number of continuous samples until held assumed.
trmontgomery 0:045ce8e569c8 232 */
trmontgomery 0:045ce8e569c8 233 void setSamplesTillHeld(int i) { _samplesTillHeldReload = i; }
trmontgomery 0:045ce8e569c8 234
trmontgomery 0:045ce8e569c8 235 /** Set the pin mode.
trmontgomery 0:045ce8e569c8 236 *
trmontgomery 0:045ce8e569c8 237 * @see http://mbed.org/projects/libraries/api/mbed/trunk/DigitalInOut#DigitalInOut.mode
trmontgomery 0:045ce8e569c8 238 * @param PinMode m The mode to pass on to the DigitalIn
trmontgomery 0:045ce8e569c8 239 */
trmontgomery 0:045ce8e569c8 240 void mode(PinMode m) { _in->mode( m ); }
trmontgomery 0:045ce8e569c8 241
trmontgomery 0:045ce8e569c8 242 /** Attach a callback function
trmontgomery 0:045ce8e569c8 243 *
trmontgomery 0:045ce8e569c8 244 * @code
trmontgomery 0:045ce8e569c8 245 *
trmontgomery 0:045ce8e569c8 246 * DigitalOut led1( LED1 );
trmontgomery 0:045ce8e569c8 247 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 248 *
trmontgomery 0:045ce8e569c8 249 * void myCallback( void ) {
trmontgomery 0:045ce8e569c8 250 * led1 = 1;
trmontgomery 0:045ce8e569c8 251 * };
trmontgomery 0:045ce8e569c8 252 *
trmontgomery 0:045ce8e569c8 253 * main() {
trmontgomery 0:045ce8e569c8 254 * pin.attach_asserted( &myCallback );
trmontgomery 0:045ce8e569c8 255 * }
trmontgomery 0:045ce8e569c8 256 *
trmontgomery 0:045ce8e569c8 257 * @endcode
trmontgomery 0:045ce8e569c8 258 *
trmontgomery 0:045ce8e569c8 259 * Call this function when a pin is asserted.
trmontgomery 0:045ce8e569c8 260 * @param function A C function pointer
trmontgomery 0:045ce8e569c8 261 */
trmontgomery 0:045ce8e569c8 262 void attach_asserted(void (*function)(void)) {
trmontgomery 0:045ce8e569c8 263 _callbackAsserted.attach( function );
trmontgomery 0:045ce8e569c8 264 }
trmontgomery 0:045ce8e569c8 265
trmontgomery 0:045ce8e569c8 266 /** Attach a callback object/method
trmontgomery 0:045ce8e569c8 267 *
trmontgomery 0:045ce8e569c8 268 * @code
trmontgomery 0:045ce8e569c8 269 *
trmontgomery 0:045ce8e569c8 270 * class Bar {
trmontgomery 0:045ce8e569c8 271 * public:
trmontgomery 0:045ce8e569c8 272 * void myCallback( void ) { led1 = 1; }
trmontgomery 0:045ce8e569c8 273 * };
trmontgomery 0:045ce8e569c8 274 *
trmontgomery 0:045ce8e569c8 275 * DigitalOut led1( LED1 );
trmontgomery 0:045ce8e569c8 276 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 277 * Bar bar;
trmontgomery 0:045ce8e569c8 278 *
trmontgomery 0:045ce8e569c8 279 * main() {
trmontgomery 0:045ce8e569c8 280 * pin.attach_asserted( &bar, &Bar::myCallback );
trmontgomery 0:045ce8e569c8 281 * }
trmontgomery 0:045ce8e569c8 282 *
trmontgomery 0:045ce8e569c8 283 * @endcode
trmontgomery 0:045ce8e569c8 284 *
trmontgomery 0:045ce8e569c8 285 * Call this function when a pin is asserted.
trmontgomery 0:045ce8e569c8 286 * @param object An object that conatins the callback method.
trmontgomery 0:045ce8e569c8 287 * @param method The method within the object to call.
trmontgomery 0:045ce8e569c8 288 */
trmontgomery 0:045ce8e569c8 289 template<typename T>
trmontgomery 0:045ce8e569c8 290 void attach_asserted(T *object, void (T::*member)(void)) {
trmontgomery 0:045ce8e569c8 291 _callbackAsserted.attach( object, member );
trmontgomery 0:045ce8e569c8 292 }
trmontgomery 0:045ce8e569c8 293
trmontgomery 0:045ce8e569c8 294 /** Attach a callback function
trmontgomery 0:045ce8e569c8 295 *
trmontgomery 0:045ce8e569c8 296 * @code
trmontgomery 0:045ce8e569c8 297 *
trmontgomery 0:045ce8e569c8 298 * DigitalOut led1( LED1 );
trmontgomery 0:045ce8e569c8 299 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 300 *
trmontgomery 0:045ce8e569c8 301 * void myCallback( void ) {
trmontgomery 0:045ce8e569c8 302 * led1 = 0;
trmontgomery 0:045ce8e569c8 303 * };
trmontgomery 0:045ce8e569c8 304 *
trmontgomery 0:045ce8e569c8 305 * main() {
trmontgomery 0:045ce8e569c8 306 * pin.attach_deasserted( &myCallback );
trmontgomery 0:045ce8e569c8 307 * }
trmontgomery 0:045ce8e569c8 308 *
trmontgomery 0:045ce8e569c8 309 * @endcode
trmontgomery 0:045ce8e569c8 310 *
trmontgomery 0:045ce8e569c8 311 * Call this function when a pin is deasserted.
trmontgomery 0:045ce8e569c8 312 * @param function A C function pointer
trmontgomery 0:045ce8e569c8 313 */
trmontgomery 0:045ce8e569c8 314 void attach_deasserted(void (*function)(void)) {
trmontgomery 0:045ce8e569c8 315 _callbackDeasserted.attach( function );
trmontgomery 0:045ce8e569c8 316 }
trmontgomery 0:045ce8e569c8 317
trmontgomery 0:045ce8e569c8 318 /** Attach a callback object/method
trmontgomery 0:045ce8e569c8 319 *
trmontgomery 0:045ce8e569c8 320 * @code
trmontgomery 0:045ce8e569c8 321 *
trmontgomery 0:045ce8e569c8 322 * class Bar {
trmontgomery 0:045ce8e569c8 323 * public:
trmontgomery 0:045ce8e569c8 324 * void myCallback( void ) { led1 = 0; }
trmontgomery 0:045ce8e569c8 325 * };
trmontgomery 0:045ce8e569c8 326 *
trmontgomery 0:045ce8e569c8 327 * DigitalOut led1( LED1 );
trmontgomery 0:045ce8e569c8 328 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 329 * Bar bar;
trmontgomery 0:045ce8e569c8 330 *
trmontgomery 0:045ce8e569c8 331 * main() {
trmontgomery 0:045ce8e569c8 332 * pin.attach_deasserted( &bar, &Bar::myCallback );
trmontgomery 0:045ce8e569c8 333 * }
trmontgomery 0:045ce8e569c8 334 *
trmontgomery 0:045ce8e569c8 335 * @endcode
trmontgomery 0:045ce8e569c8 336 *
trmontgomery 0:045ce8e569c8 337 * Call this function when a pin is deasserted.
trmontgomery 0:045ce8e569c8 338 * @param object An object that conatins the callback method.
trmontgomery 0:045ce8e569c8 339 * @param method The method within the object to call.
trmontgomery 0:045ce8e569c8 340 */
trmontgomery 0:045ce8e569c8 341 template<typename T>
trmontgomery 0:045ce8e569c8 342 void attach_deasserted(T *object, void (T::*member)(void)) {
trmontgomery 0:045ce8e569c8 343 _callbackDeasserted.attach( object, member );
trmontgomery 0:045ce8e569c8 344 }
trmontgomery 0:045ce8e569c8 345
trmontgomery 0:045ce8e569c8 346 /** Attach a callback function
trmontgomery 0:045ce8e569c8 347 *
trmontgomery 0:045ce8e569c8 348 * @code
trmontgomery 0:045ce8e569c8 349 *
trmontgomery 0:045ce8e569c8 350 * DigitalOut led2( LED2 );
trmontgomery 0:045ce8e569c8 351 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 352 *
trmontgomery 0:045ce8e569c8 353 * void myCallback( void ) {
trmontgomery 0:045ce8e569c8 354 * led2 = 1;
trmontgomery 0:045ce8e569c8 355 * };
trmontgomery 0:045ce8e569c8 356 *
trmontgomery 0:045ce8e569c8 357 * main() {
trmontgomery 0:045ce8e569c8 358 * pin.attach_asserted_held( &myCallback );
trmontgomery 0:045ce8e569c8 359 * }
trmontgomery 0:045ce8e569c8 360 *
trmontgomery 0:045ce8e569c8 361 * @endcode
trmontgomery 0:045ce8e569c8 362 *
trmontgomery 0:045ce8e569c8 363 * Call this function when a pin is asserted and held.
trmontgomery 0:045ce8e569c8 364 * @param function A C function pointer
trmontgomery 0:045ce8e569c8 365 */
trmontgomery 0:045ce8e569c8 366 void attach_asserted_held(void (*function)(void)) {
trmontgomery 0:045ce8e569c8 367 _callbackAssertedHeld.attach( function );
trmontgomery 0:045ce8e569c8 368 }
trmontgomery 0:045ce8e569c8 369
trmontgomery 0:045ce8e569c8 370 /** Attach a callback object/method
trmontgomery 0:045ce8e569c8 371 *
trmontgomery 0:045ce8e569c8 372 * @code
trmontgomery 0:045ce8e569c8 373 *
trmontgomery 0:045ce8e569c8 374 * class Bar {
trmontgomery 0:045ce8e569c8 375 * public:
trmontgomery 0:045ce8e569c8 376 * void myCallback( void ) { led2 = 0; }
trmontgomery 0:045ce8e569c8 377 * };
trmontgomery 0:045ce8e569c8 378 *
trmontgomery 0:045ce8e569c8 379 * DigitalOut led2( LED2 );
trmontgomery 0:045ce8e569c8 380 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 381 * Bar bar;
trmontgomery 0:045ce8e569c8 382 *
trmontgomery 0:045ce8e569c8 383 * main() {
trmontgomery 0:045ce8e569c8 384 * pin.attach_asserted_held( &bar, &Bar::myCallback );
trmontgomery 0:045ce8e569c8 385 * }
trmontgomery 0:045ce8e569c8 386 *
trmontgomery 0:045ce8e569c8 387 * @endcode
trmontgomery 0:045ce8e569c8 388 *
trmontgomery 0:045ce8e569c8 389 * Call this function when a pin is asserted and held.
trmontgomery 0:045ce8e569c8 390 * @param object An object that conatins the callback method.
trmontgomery 0:045ce8e569c8 391 * @param method The method within the object to call.
trmontgomery 0:045ce8e569c8 392 */
trmontgomery 0:045ce8e569c8 393 template<typename T>
trmontgomery 0:045ce8e569c8 394 void attach_asserted_held(T *object, void (T::*member)(void)) {
trmontgomery 0:045ce8e569c8 395 _callbackAssertedHeld.attach( object, member );
trmontgomery 0:045ce8e569c8 396 }
trmontgomery 0:045ce8e569c8 397
trmontgomery 0:045ce8e569c8 398 /** Attach a callback function
trmontgomery 0:045ce8e569c8 399 *
trmontgomery 0:045ce8e569c8 400 * @code
trmontgomery 0:045ce8e569c8 401 *
trmontgomery 0:045ce8e569c8 402 * DigitalOut led3( LED3 );
trmontgomery 0:045ce8e569c8 403 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 404 *
trmontgomery 0:045ce8e569c8 405 * void myCallback( void ) {
trmontgomery 0:045ce8e569c8 406 * led3 = 1;
trmontgomery 0:045ce8e569c8 407 * };
trmontgomery 0:045ce8e569c8 408 *
trmontgomery 0:045ce8e569c8 409 * main() {
trmontgomery 0:045ce8e569c8 410 * pin.attach_deasserted_held( &myCallback );
trmontgomery 0:045ce8e569c8 411 * }
trmontgomery 0:045ce8e569c8 412 *
trmontgomery 0:045ce8e569c8 413 * @endcode
trmontgomery 0:045ce8e569c8 414 *
trmontgomery 0:045ce8e569c8 415 * Call this function when a pin is deasserted and held.
trmontgomery 0:045ce8e569c8 416 * @param function A C function pointer
trmontgomery 0:045ce8e569c8 417 */
trmontgomery 0:045ce8e569c8 418 void attach_deasserted_held(void (*function)(void)) {
trmontgomery 0:045ce8e569c8 419 _callbackDeassertedHeld.attach( function );
trmontgomery 0:045ce8e569c8 420 }
trmontgomery 0:045ce8e569c8 421
trmontgomery 0:045ce8e569c8 422 /** Attach a callback object/method
trmontgomery 0:045ce8e569c8 423 *
trmontgomery 0:045ce8e569c8 424 * @code
trmontgomery 0:045ce8e569c8 425 *
trmontgomery 0:045ce8e569c8 426 * class Bar {
trmontgomery 0:045ce8e569c8 427 * public:
trmontgomery 0:045ce8e569c8 428 * void myCallback( void ) { led3 = 0; }
trmontgomery 0:045ce8e569c8 429 * };
trmontgomery 0:045ce8e569c8 430 *
trmontgomery 0:045ce8e569c8 431 * DigitalOut led3( LED3 );
trmontgomery 0:045ce8e569c8 432 * PinDetect pin( p30 );
trmontgomery 0:045ce8e569c8 433 * Bar bar;
trmontgomery 0:045ce8e569c8 434 *
trmontgomery 0:045ce8e569c8 435 * main() {
trmontgomery 0:045ce8e569c8 436 * pin.attach_deasserted_held( &bar, &Bar::myCallback );
trmontgomery 0:045ce8e569c8 437 * }
trmontgomery 0:045ce8e569c8 438 *
trmontgomery 0:045ce8e569c8 439 * @endcode
trmontgomery 0:045ce8e569c8 440 *
trmontgomery 0:045ce8e569c8 441 * Call this function when a pin is deasserted and held.
trmontgomery 0:045ce8e569c8 442 * @param object An object that conatins the callback method.
trmontgomery 0:045ce8e569c8 443 * @param method The method within the object to call.
trmontgomery 0:045ce8e569c8 444 */
trmontgomery 0:045ce8e569c8 445 template<typename T>
trmontgomery 0:045ce8e569c8 446 void attach_deasserted_held(T *object, void (T::*member)(void)) {
trmontgomery 0:045ce8e569c8 447 _callbackDeassertedHeld.attach( object, member );
trmontgomery 0:045ce8e569c8 448 }
trmontgomery 0:045ce8e569c8 449
trmontgomery 0:045ce8e569c8 450 /** operator int()
trmontgomery 0:045ce8e569c8 451 *
trmontgomery 0:045ce8e569c8 452 * Read the value of the pin being sampled.
trmontgomery 0:045ce8e569c8 453 */
trmontgomery 0:045ce8e569c8 454 operator int() { return _in->read(); }
trmontgomery 0:045ce8e569c8 455
trmontgomery 0:045ce8e569c8 456 protected:
trmontgomery 0:045ce8e569c8 457 /** The Ticker periodic callback function
trmontgomery 0:045ce8e569c8 458 */
trmontgomery 0:045ce8e569c8 459 void isr(void) {
trmontgomery 0:045ce8e569c8 460 int currentState = _in->read();
trmontgomery 0:045ce8e569c8 461
trmontgomery 0:045ce8e569c8 462 if ( currentState != _prevState ) {
trmontgomery 0:045ce8e569c8 463 if ( _samplesTillAssert == 0 ) {
trmontgomery 0:045ce8e569c8 464 _prevState = currentState;
trmontgomery 0:045ce8e569c8 465 _samplesTillHeld = _samplesTillHeldReload;
trmontgomery 0:045ce8e569c8 466 if ( currentState == _assertValue )
trmontgomery 0:045ce8e569c8 467 _callbackAsserted.call();
trmontgomery 0:045ce8e569c8 468 else
trmontgomery 0:045ce8e569c8 469 _callbackDeasserted.call();
trmontgomery 0:045ce8e569c8 470 }
trmontgomery 0:045ce8e569c8 471 else {
trmontgomery 0:045ce8e569c8 472 _samplesTillAssert--;
trmontgomery 0:045ce8e569c8 473 }
trmontgomery 0:045ce8e569c8 474 }
trmontgomery 0:045ce8e569c8 475 else {
trmontgomery 0:045ce8e569c8 476 _samplesTillAssert = _samplesTillAssertReload;
trmontgomery 0:045ce8e569c8 477 }
trmontgomery 0:045ce8e569c8 478
trmontgomery 0:045ce8e569c8 479 if ( _samplesTillHeld ) {
trmontgomery 0:045ce8e569c8 480 if ( _prevState == currentState ) {
trmontgomery 0:045ce8e569c8 481 _samplesTillHeld--;
trmontgomery 0:045ce8e569c8 482 if ( _samplesTillHeld == 0 ) {
trmontgomery 0:045ce8e569c8 483 if ( currentState == _assertValue )
trmontgomery 0:045ce8e569c8 484 _callbackAssertedHeld.call();
trmontgomery 0:045ce8e569c8 485 else
trmontgomery 0:045ce8e569c8 486 _callbackDeassertedHeld.call();
trmontgomery 0:045ce8e569c8 487 }
trmontgomery 0:045ce8e569c8 488 }
trmontgomery 0:045ce8e569c8 489 else {
trmontgomery 0:045ce8e569c8 490 _samplesTillHeld = 0;
trmontgomery 0:045ce8e569c8 491 }
trmontgomery 0:045ce8e569c8 492 }
trmontgomery 0:045ce8e569c8 493 }
trmontgomery 0:045ce8e569c8 494
trmontgomery 0:045ce8e569c8 495 };
trmontgomery 0:045ce8e569c8 496
trmontgomery 0:045ce8e569c8 497 }; // namespace AjK ends.
trmontgomery 0:045ce8e569c8 498
trmontgomery 0:045ce8e569c8 499 using namespace AjK;
trmontgomery 0:045ce8e569c8 500
trmontgomery 0:045ce8e569c8 501 #endif