InterruptIn style DigitalIn debounced with callbacks for pin state change and pin state hold.

Dependents:   AVC_20110423 SimplePIDBot Pushbutton_Debounce_Interrupt FinalProgram ... more

Files at this revision

API Documentation at this revision

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

ChangeLog.h Show annotated file Show diff for this revision Revisions of this file
PinDetect.h Show annotated file Show diff for this revision Revisions of this file
example.h Show annotated file Show diff for this revision Revisions of this file
--- 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 );