Rotary Encoder handling library for mbed

Dependents:   MIDI_CW Gemphet8

Revision:
1:2732adb68dad
Parent:
0:c905f9e6866f
Child:
2:46173a05338e
--- a/REnc.cpp	Sat Jul 26 22:49:27 2014 +0000
+++ b/REnc.cpp	Wed Aug 06 06:35:47 2014 +0000
@@ -6,20 +6,47 @@
  *
  * Example:
  * @code
+ * // REnc sample
+ * #include "mbed.h"
+ * #include "REnc.h"
+ * void proc_REnc_right(void);
+ * void proc_REnc_left(void);
+ * 
+ * // void proc_REnc_right(void) { }
+ * // void proc_REnc_left(void)  { }
+ * 
+ * REnc renc(dp1, dp2);
+ * 
+ * int main()
+ * {
+ * 
+ *     // renc.setHandleRight(&proc_REnc_right);
+ *     // renc.setHandleLeft(&proc_REnc_left);
+ *  
+ *     while(1) {
+ *         if (renc.CMD == FORWARD) {
+ *             proc_REnc_right();
+ *             renc.CMD = STOP;
+ *         } else if (renc.CMD == REVERSE) {
+ *             proc_REnc_left();
+ *             renc.CMD = STOP;
+ *         }
+ *     }
+ * }
  * @endcode
  */
 
 using namespace mbed;
- // constructor
- /** Create a Beep object connected to the specified PwmOut pin
-  *
-  * @param pin PwmOut pin to connect to 
-  */
 
+// private function
+/** sample_encoder input and process
+ *
+ */
 void REnc::sample_encoder(void)
 {
     static unsigned char i;
-
+    static unsigned int cnt;
+    
     i = (i << 2) + ((~_pinb & 0x01)<< 1) + (~_pina & 0x1);
     i &= 0xf;
     
@@ -27,25 +54,39 @@
         case 0x7:
         case 0xe:
             CMD = FORWARD;
-            if (mRightCallback != NULL)  { mRightCallback();  CMD = IDLE; }
+            cnt = 300;
+            STABLE = 0;
+            if (mRightCallback != NULL)  { mRightCallback();  CMD = STOP; }
             break;
         case 0xb:
         case 0xd:
-            CMD = BACKWARD;
-            if (mLeftCallback != NULL)   { mLeftCallback();   CMD = IDLE; } 
+            CMD = REVERSE;
+            cnt = 300;
+            STABLE = 0;
+            if (mLeftCallback != NULL)   { mLeftCallback();   CMD = STOP; } 
             break;
         default:
-            CMD = IDLE;
+            CMD = STOP;
+            if (cnt)
+                cnt--;
+            else
+                STABLE = 1;
     }
 }
 
 void REnc::setHandleRight(void (*fptr)(void))  { mRightCallback = fptr; }
 void REnc::setHandleLeft(void (*fptr)(void))   { mLeftCallback  = fptr; }
 
+ // constructor
+ /** Create an REnc object connected to DigitalIn pins
+  *
+  * @param pina - Digital Input to A-phase of the rotary encoder
+  * @param pinb - Digital Input to B-phase of the rotary encoder   
+  */
 REnc::REnc(PinName pina, PinName pinb) : _pina(pina), _pinb(pinb)
 {
-    CMD = IDLE;
+    CMD = STOP;
     mRightCallback  = NULL;
     mLeftCallback   = NULL;
-    _tick.attach(this, &REnc::sample_encoder, 0.01);
+    _tick.attach(this, &REnc::sample_encoder, 0.002);
 }