Andrew Shi / Mbed 2 deprecated Lab4

Dependencies:   mbed 4DGL-uLCD-SE PinDetect

Committer:
ashi31
Date:
Fri Oct 22 03:57:47 2021 +0000
Revision:
0:7d8ffdfdb16e
Lab4

Who changed what in which revision?

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