Controll MCP23S17 as GPIO

Committer:
ryood
Date:
Fri Nov 04 16:09:03 2016 +0000
Revision:
14:2073b80c69cd
Parent:
9:b0e9ec45a720
keypad 4x4: Debounce

Who changed what in which revision?

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