PB / RotaryEncoder

Files at this revision

API Documentation at this revision

Comitter:
Sateg
Date:
Wed Jul 20 00:30:23 2016 +0000
Commit message:
Working, conservative rotary encoder handler.

Changed in this revision

RotaryEncoder.cpp Show annotated file Show diff for this revision Revisions of this file
RotaryEncoder.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r db7f371c8530 RotaryEncoder.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RotaryEncoder.cpp	Wed Jul 20 00:30:23 2016 +0000
@@ -0,0 +1,45 @@
+#include "RotaryEncoder.h"
+
+RotaryEncoder::RotaryEncoder(void (*cb)(void), PinName channelA_, PinName channelB_, PinName pushPin_, float period)
+ : channelA(channelA_), channelB(channelB_), pushPin(pushPin_)
+{
+    direction = 0;
+    counter = 0;
+    lastDirection = 0;
+
+    encoderTicker.attach(this, &RotaryEncoder::pulse, period);
+    pushPin.rise(cb);
+}
+
+RotaryEncoder::~RotaryEncoder() {};
+
+/** Public methods **/
+
+int8_t RotaryEncoder::getDirection() const
+{
+    return direction;   
+}
+
+int RotaryEncoder::getCounter() const
+{
+    return counter;
+}
+
+bool RotaryEncoder::getPushButton() const
+{
+    return false;   
+}
+
+/** Private methods **/
+
+void RotaryEncoder::pulse()
+{    
+    lastDirection <<= 2;
+    if (channelB) lastDirection |= 1;
+    if (channelA) lastDirection |= 2;
+    
+    direction = encoderTable[lastDirection & 0x0F];
+    counter += direction;
+}
+
+const int8_t RotaryEncoder::encoderTable[] = {0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 0, 0, 0};
\ No newline at end of file
diff -r 000000000000 -r db7f371c8530 RotaryEncoder.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RotaryEncoder.h	Wed Jul 20 00:30:23 2016 +0000
@@ -0,0 +1,40 @@
+#include "mbed.h"
+
+#ifndef ROTARY_ENCODER_H_
+#define ROTARY_ENCODER_H_
+
+/**
+ Rotary encoder handling class.
+ Starts a ticker which checks the status of the encoder and
+ sets the rotation directions based on its status.
+*/
+class RotaryEncoder {
+public:
+    RotaryEncoder(void (*cb)(void), PinName channelA_, PinName channelB_, PinName pushPin_, float period = 0.01);
+    virtual ~RotaryEncoder();
+    
+    /// Retrieve rotation direction.
+    int8_t getDirection() const;
+    /// Retrieve push button status.
+    bool getPushButton() const;
+    /// Launched by Ticker to determine rotation direction
+    void pulse();
+    
+    int getCounter() const;
+    
+    private:
+    
+    /// Table which helps determine the rotation direction
+    static const int8_t encoderTable[];
+
+    int counter;
+    int8_t direction;
+    int8_t lastDirection;
+    InterruptIn channelA;
+    InterruptIn channelB;
+    InterruptIn pushPin;
+    Ticker encoderTicker;
+    
+};
+
+#endif /* ROTARY_ENCODER_H_ */
\ No newline at end of file