Source code for the Curilights Controller. See http://www.saccade.com/writing/projects/CuriController/ for details.

Dependencies:   FatFileSystem mbed

This is the source code for the Curilights controller. This lets you interactively control a string of Curilights. It provides a simple click-wheel user interface for changing colors, brightness and behavior. It responds to movement and lighting.

Finished Controller

/media/uploads/isonno/nxp3872_controllerclose.jpg

System Block Diagram

/media/uploads/isonno/blockdiagram.png

Committer:
isonno
Date:
Mon Feb 11 05:04:18 2013 +0000
Revision:
4:cfef06d8bb96
Parent:
0:6da5625a6946
Minor changes to add backlight routines.  Not hooked up yet, shouldn't affect build operation.

Who changed what in which revision?

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