InterruptIn style DigitalIn debounced with callbacks for pin state change and pin state hold.
Dependents: AVC_20110423 SimplePIDBot Pushbutton_Debounce_Interrupt FinalProgram ... more
Revision 1:611a8f5ac65c, committed 2011-01-13
- Comitter:
- AjK
- Date:
- Thu Jan 13 09:53:26 2011 +0000
- Parent:
- 0:4f4ccb203a70
- Child:
- 2:cb3afc45028b
- Commit message:
- 1.4 See ChangeLog.h
Changed in this revision
--- a/ChangeLog.h Thu Jan 13 01:47:31 2011 +0000
+++ b/ChangeLog.h Thu Jan 13 09:53:26 2011 +0000
@@ -19,6 +19,11 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+ 1.4 13 Jan 2011 - Added an extra overloaded constructor that allows
+ the DigitalIn PinMode to be passed when the the class
+ is declared. So mode() isn't really needed but is left
+ in for completeness.
+
1.3 13 Jan 2011 - Updated some doxygen comments.
1.2 13 Jan 2011 - Added ChangeLog.h file.
--- a/PinDetect.h Thu Jan 13 01:47:31 2011 +0000
+++ b/PinDetect.h Thu Jan 13 09:53:26 2011 +0000
@@ -31,8 +31,6 @@
#define PINDETECT_PIN_ASSTERED 1
#endif
-#define PINDETECT_PIN_DEASSTERED !PINDETECT_PIN_ASSTERED
-
#ifndef PINDETECT_SAMPLE_PERIOD
#define PINDETECT_SAMPLE_PERIOD 20000
#endif
@@ -130,32 +128,72 @@
* @see example.h
*/
class PinDetect {
+
+protected:
+ DigitalIn *_in;
+ Ticker *_ticker;
+ int _prevState;
+ int _currentStateCounter;
+ int _sampleTime;
+ int _assertValue;
+ int _samplesTillAssertReload;
+ int _samplesTillAssert;
+ int _samplesTillHeldReload;
+ int _samplesTillHeld;
+ FunctionPointer _callbackAsserted;
+ FunctionPointer _callbackDeasserted;
+ FunctionPointer _callbackAssertedHeld;
+ FunctionPointer _callbackDeassertedHeld;
+
+ /** initialise class
+ *
+ * @param PinName p is a valid pin that supports DigitalIn
+ * @param PinMode m The mode the DigitalIn should use.
+ */
+ void init(PinName p, PinMode m) {
+ _sampleTime = PINDETECT_SAMPLE_PERIOD;
+ _samplesTillAssert = PINDETECT_ASSERT_COUNT;
+ _samplesTillHeld = 0;
+ _samplesTillAssertReload = PINDETECT_ASSERT_COUNT;
+ _samplesTillHeldReload = PINDETECT_HOLD_COUNT;
+ _assertValue = PINDETECT_PIN_ASSTERED;
+
+ _in = new DigitalIn( p );
+ _in->mode( m );
+ _prevState = _in->read();
+ _ticker = new Ticker;
+ }
+
public:
PinDetect() { error("You must supply a PinName"); }
/** PinDetect constructor
*
+ * By default the PinMode is set to PullDown.
+ *
* @see http://mbed.org/handbook/DigitalIn
* @param p PinName is a valid pin that supports DigitalIn
*/
PinDetect(PinName p) {
- _sampleTime = PINDETECT_SAMPLE_PERIOD;
- _samplesTillAssert = PINDETECT_ASSERT_COUNT;
- _samplesTillHeld = 0;
- _samplesTillAssertReload = PINDETECT_ASSERT_COUNT;
- _samplesTillHeldReload = PINDETECT_HOLD_COUNT;
- _assertValue = PINDETECT_PIN_ASSTERED;
- _in = new DigitalIn(p);
- _prevState = _in->read();
- _ticker = new Ticker;
+ init( p, PullDown );
+ }
+
+ /** PinDetect constructor
+ *
+ * @see http://mbed.org/handbook/DigitalIn
+ * @param PinName p is a valid pin that supports DigitalIn
+ * @param PinMode m The mode the DigitalIn should use.
+ */
+ PinDetect(PinName p, PinMode m) {
+ init( p, m );
}
/** PinDetect destructor
*/
~PinDetect() {
- if (_ticker) delete(_ticker);
- if (_in) delete(_in);
+ if ( _ticker ) delete( _ticker );
+ if ( _in ) delete( _in );
}
/** Set the sampling time in microseconds.
@@ -164,7 +202,7 @@
*/
void setSampleFrequency(int i = PINDETECT_SAMPLE_PERIOD) {
_sampleTime = i;
- _ticker->attach_us(this, &PinDetect::isr, _sampleTime);
+ _ticker->attach_us( this, &PinDetect::isr, _sampleTime );
}
/** Set the value used as assert.
@@ -196,7 +234,7 @@
* @see http://mbed.org/projects/libraries/api/mbed/trunk/DigitalInOut#DigitalInOut.mode
* @param PinMode m The mode to pass on to the DigitalIn
*/
- void mode(PinMode m) { _in->mode(m); }
+ void mode(PinMode m) { _in->mode( m ); }
/** Attach a callback function
*
@@ -219,7 +257,7 @@
* @param function A C function pointer
*/
void attach_asserted(void (*function)(void)) {
- _callbackAsserted.attach(function);
+ _callbackAsserted.attach( function );
}
/** Attach a callback object/method
@@ -247,7 +285,7 @@
*/
template<typename T>
void attach_asserted(T *object, void (T::*member)(void)) {
- _callbackAsserted.attach(object, member);
+ _callbackAsserted.attach( object, member );
}
/** Attach a callback function
@@ -271,7 +309,7 @@
* @param function A C function pointer
*/
void attach_deasserted(void (*function)(void)) {
- _callbackDeasserted.attach(function);
+ _callbackDeasserted.attach( function );
}
/** Attach a callback object/method
@@ -299,7 +337,7 @@
*/
template<typename T>
void attach_deasserted(T *object, void (T::*member)(void)) {
- _callbackDeasserted.attach(object, member);
+ _callbackDeasserted.attach( object, member );
}
/** Attach a callback function
@@ -323,7 +361,7 @@
* @param function A C function pointer
*/
void attach_asserted_held(void (*function)(void)) {
- _callbackAssertedHeld.attach(function);
+ _callbackAssertedHeld.attach( function );
}
/** Attach a callback object/method
@@ -351,7 +389,7 @@
*/
template<typename T>
void attach_asserted_held(T *object, void (T::*member)(void)) {
- _callbackAssertedHeld.attach(object, member);
+ _callbackAssertedHeld.attach( object, member );
}
/** Attach a callback function
@@ -375,7 +413,7 @@
* @param function A C function pointer
*/
void attach_deasserted_held(void (*function)(void)) {
- _callbackDeassertedHeld.attach(function);
+ _callbackDeassertedHeld.attach( function );
}
/** Attach a callback object/method
@@ -403,7 +441,7 @@
*/
template<typename T>
void attach_deasserted_held(T *object, void (T::*member)(void)) {
- _callbackDeassertedHeld.attach(object, member);
+ _callbackDeassertedHeld.attach( object, member );
}
/** operator int()
@@ -417,11 +455,11 @@
void isr(void) {
int currentState = _in->read();
- if (currentState != _prevState) {
- if (_samplesTillAssert == 0) {
+ if ( currentState != _prevState ) {
+ if ( _samplesTillAssert == 0 ) {
_prevState = currentState;
_samplesTillHeld = _samplesTillHeldReload;
- if (currentState == _assertValue)
+ if ( currentState == _assertValue )
_callbackAsserted.call();
else
_callbackDeasserted.call();
@@ -434,11 +472,11 @@
_samplesTillAssert = _samplesTillAssertReload;
}
- if (_samplesTillHeld) {
- if (_prevState == currentState) {
+ if ( _samplesTillHeld ) {
+ if ( _prevState == currentState ) {
_samplesTillHeld--;
- if (_samplesTillHeld == 0) {
- if (currentState == _assertValue)
+ if ( _samplesTillHeld == 0 ) {
+ if ( currentState == _assertValue )
_callbackAssertedHeld.call();
else
_callbackDeassertedHeld.call();
@@ -450,21 +488,6 @@
}
}
-protected:
- DigitalIn *_in;
- Ticker *_ticker;
- int _prevState;
- int _currentStateCounter;
- int _sampleTime;
- int _assertValue;
- int _samplesTillAssertReload;
- int _samplesTillAssert;
- int _samplesTillHeldReload;
- int _samplesTillHeld;
- FunctionPointer _callbackAsserted;
- FunctionPointer _callbackDeasserted;
- FunctionPointer _callbackAssertedHeld;
- FunctionPointer _callbackDeassertedHeld;
};
}; // namespace AjK ends.
--- a/example.h Thu Jan 13 01:47:31 2011 +0000
+++ b/example.h Thu Jan 13 09:53:26 2011 +0000
@@ -25,12 +25,22 @@
#include "mbed.h"
#include "PinDetect.h"
-PinDetect pin( p21 );
+PinDetect pin ( p21 );
DigitalOut led1( LED1 );
DigitalOut led2( LED2 );
DigitalOut led3( LED3 );
DigitalOut led4( LED4 );
+/*
+ * Note, the PinDetect can be defined thus:-
+ * PinDetect pin( p21, PullDown );
+ * This allows you to specify the DigitalIn pinmode
+ * when you create the PinDetect object. This means
+ * using pin.mode() later is then no longer required.
+ */
+
+// C function callbacks follow.
+
void keyPressed( void ) {
led2 = 1;
led3 = 0;
@@ -51,6 +61,8 @@
led4 = 1;
}
+// The main program.
+
int main() {
pin.mode( PullDown );
Andy K