Class mRotaryEncoder for mechanical incremental rotary encoders with pushbuttons. Use debouncing and callback-functions for rotation and pressing of button. This version is for old mbed. New version for mbed-os see https://os.mbed.com/users/charly/code/mRotaryEncoder-os/

Dependencies:   PinDetect

Dependents:   SimplePIDBot FinalProgram VS1053Player SPK-DVIMXR ... more

Revision:
5:75ddffaf3721
Parent:
3:39c2fc4482be
Child:
7:ec80fd9c0c08
--- a/mRotaryEncoder.cpp	Tue Feb 01 20:06:48 2011 +0000
+++ b/mRotaryEncoder.cpp	Wed Feb 09 20:18:34 2011 +0000
@@ -3,7 +3,7 @@
 
 
 mRotaryEncoder::mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode, int debounceTime_us) {
-    m_pinA = new InterruptIn(pinA);                    // interrrupts on pinA
+    m_pinA = new PinDetect(pinA);                      // interrrupts on pinA
     m_pinB = new DigitalIn(pinB);                      // only digitalIn for pinB
 
     //set pins with internal PullUP-default
@@ -11,8 +11,11 @@
     m_pinB->mode(pullMode);
 
     // attach interrrupts on pinA
-    m_pinA->rise(this, &mRotaryEncoder::rise);
-    m_pinA->fall(this, &mRotaryEncoder::fall);
+    m_pinA->attach_asserted(this, &mRotaryEncoder::rise);
+    m_pinA->attach_deasserted(this, &mRotaryEncoder::fall);
+    
+    //start sampling pinA
+    m_pinA->setSampleFrequency(debounceTime_us);                  // Start timers an Defaults debounce time.
 
     // Switch on pinSW
     m_pinSW = new PinDetect(pinSW);                 // interrupt on press switch
@@ -44,10 +47,7 @@
 
 
 void mRotaryEncoder::fall(void) {
-    //no interrupts
-    m_pinA->rise(NULL);
-    m_pinA->fall(NULL);
-    wait_us(m_debounceTime_us);            // wait while switch is bouncing
+    // debouncing does PinDetect for us
     //pinA still low?
     if (*m_pinA == 0) {
         if (*m_pinB == 1) {
@@ -56,17 +56,11 @@
             m_position--;
         }
     }
-    //reenable interrupts
-    m_pinA->rise(this, &mRotaryEncoder::rise);
-    m_pinA->fall(this, &mRotaryEncoder::fall);
     rotIsr.call();                        // call the isr for rotation
 }
 
 void mRotaryEncoder::rise(void) {
-    //no interrupts
-    m_pinA->rise(NULL);
-    m_pinA->fall(NULL);
-    wait_us(m_debounceTime_us);            // wait while switch is bouncing
+    //PinDetect does debouncing
     //pinA still high?
     if (*m_pinA == 1) {
         if (*m_pinB == 1) {
@@ -75,9 +69,6 @@
             m_position++;
         }
     }
-    //reenable interrupts
-    m_pinA->rise(this, &mRotaryEncoder::rise);
-    m_pinA->fall(this, &mRotaryEncoder::fall);
     rotIsr.call();                        // call the isr for rotation
 }