JongYong Park / Mbed 2 deprecated NUCLEO-F767_LIFI_4CH_os2_v2

Dependencies:   mbed

Committer:
JongYongPark
Date:
Wed Mar 20 09:24:35 2019 +0000
Revision:
0:488aa8153e15
initial working version

Who changed what in which revision?

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