113 lines
2.2 KiB
C++
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;
|
|
}
|
|
}
|