cewkomator/firmware/src/encoder.cpp

113 lines
2.2 KiB
C++

#include <Arduino.h>
#include "constants.h"
#include "encoder.h"
/*
SW - Switch, goes low when pressed
CLK and DT from high to low, and so on when rotated
When rotated clockwise, CLK changes before DT; when rotated counter-clockwise, DT changes before CLK
*/
bool previousClk = false;
bool previousDt = false;
void setupEncoder() {
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
pinMode(SW_PIN, INPUT_PULLUP);
// save initial state
previousClk = digitalRead(CLK_PIN);
previousDt = digitalRead(DT_PIN);
}
bool previousPressed = false;
unsigned long lastChangeAt = 0;
SwitchEvent handleSwitch() {
bool isPressed = !digitalRead(SW_PIN);
// only handle change
if (isPressed == previousPressed) {
return SWITCH_NONE;
}
// debounce
auto now = millis();
if (now - lastChangeAt < DEBOUNCE_MS) {
return SWITCH_NONE;
}
// save state
previousPressed = isPressed;
lastChangeAt = now;
// return event
return isPressed ? SWITCH_PRESSED : SWITCH_RELEASED;
}
bool shouldReleaseDebugSwitch = false;
SwitchEvent handleDebugSwitch(char key) {
if (shouldReleaseDebugSwitch) {
shouldReleaseDebugSwitch = false;
return SWITCH_RELEASED;
} else if (key == ' ') {
shouldReleaseDebugSwitch = true;
return SWITCH_PRESSED;
} else {
return SWITCH_NONE;
}
}
unsigned long lastEncoderChangeAt = 0;
EncoderEvent handleEncoder() {
bool clk = digitalRead(CLK_PIN);
bool dt = digitalRead(DT_PIN);
// only handle change
if (clk == previousClk && dt == previousDt) {
return ENCODER_NONE;
}
// debounce
auto now = millis();
if (now - lastEncoderChangeAt < DEBOUNCE_MS) {
return SWITCH_NONE;
}
// clockwise pattern:
// clk: 1001 1001
// dt: 1100 1100
// counter-clockwise pattern:
// clk: 1100 1100
// dt: 1001 1001
EncoderEvent event = ENCODER_NONE;
if (clk == dt) {
event = clk == previousClk ? ENCODER_CLOCKWISE : ENCODER_COUNTER_CLOCKWISE;
}
// save state
previousClk = clk;
previousDt = dt;
lastEncoderChangeAt = now;
// return event
return event;
}
EncoderEvent handleDebugEncoder(char key) {
if (key == '[') {
return ENCODER_COUNTER_CLOCKWISE;
} else if (key == ']') {
return ENCODER_CLOCKWISE;
} else {
return ENCODER_NONE;
}
}