MCP23S17 Bufferd

Committer:
ryood
Date:
Fri Nov 04 23:16:41 2016 +0000
Revision:
6:cc3b65d44e9e
Add: Test ExioBufferedPinDetect

Who changed what in which revision?

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