115 lines
2.6 KiB
C++
115 lines
2.6 KiB
C++
// ----------------------------------------------------------------------------
|
|
// Rotary Encoder Driver with Acceleration
|
|
// Supports Click, DoubleClick, Long Click
|
|
//
|
|
// (c) 2010 karl@pitrich.com
|
|
// (c) 2014 karl@pitrich.com
|
|
//
|
|
// Timer-based rotary encoder logic by Peter Dannegger
|
|
// http://www.mikrocontroller.net/articles/Drehgeber
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#ifndef __have__ClickEncoder_h__
|
|
#define __have__ClickEncoder_h__
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include <stdint.h>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#define ENC_NORMAL (1 << 1) // use Peter Danneger's decoder
|
|
#define ENC_FLAKY (1 << 2) // use Table-based decoder
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#ifndef ENC_DECODER
|
|
# define ENC_DECODER ENC_NORMAL
|
|
#endif
|
|
|
|
#if ENC_DECODER == ENC_FLAKY
|
|
# ifndef ENC_HALFSTEP
|
|
# define ENC_HALFSTEP 1 // use table for half step per default
|
|
# endif
|
|
#endif
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class ClickEncoder
|
|
{
|
|
public:
|
|
typedef enum Button_e {
|
|
Open = 0,
|
|
Closed,
|
|
|
|
Pressed,
|
|
Held,
|
|
Released,
|
|
|
|
Clicked,
|
|
DoubleClicked
|
|
|
|
} Button;
|
|
|
|
public:
|
|
ClickEncoder(uint8_t A, uint8_t B, uint8_t BTN = -1,
|
|
uint8_t stepsPerNotch = 1, bool active = false);
|
|
|
|
void service(void);
|
|
int16_t getValue(void);
|
|
|
|
#ifndef WITHOUT_BUTTON
|
|
public:
|
|
Button getButton(void);
|
|
#endif
|
|
|
|
#ifndef WITHOUT_BUTTON
|
|
public:
|
|
void setDoubleClickEnabled(const bool &d)
|
|
{
|
|
doubleClickEnabled = d;
|
|
}
|
|
|
|
const bool getDoubleClickEnabled()
|
|
{
|
|
return doubleClickEnabled;
|
|
}
|
|
#endif
|
|
|
|
public:
|
|
void setAccelerationEnabled(const bool &a)
|
|
{
|
|
accelerationEnabled = a;
|
|
if (accelerationEnabled == false) {
|
|
acceleration = 0;
|
|
}
|
|
}
|
|
|
|
const bool getAccelerationEnabled()
|
|
{
|
|
return accelerationEnabled;
|
|
}
|
|
|
|
private:
|
|
const uint8_t pinA;
|
|
const uint8_t pinB;
|
|
const uint8_t pinBTN;
|
|
const bool pinsActive;
|
|
volatile int16_t delta;
|
|
volatile int16_t last;
|
|
uint8_t steps;
|
|
volatile uint16_t acceleration;
|
|
#if ENC_DECODER != ENC_NORMAL
|
|
static const int8_t table[16];
|
|
#endif
|
|
#ifndef WITHOUT_BUTTON
|
|
volatile Button button;
|
|
bool doubleClickEnabled;
|
|
bool accelerationEnabled;
|
|
#endif
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#endif // __have__ClickEncoder_h__
|