Trackball revamp

This commit is contained in:
Jonathan Bennett
2026-01-26 13:36:22 -06:00
parent c038cfe69a
commit d4ab2df30b
4 changed files with 89 additions and 41 deletions

View File

@@ -55,6 +55,20 @@ int32_t TrackballInterruptBase::runOnce()
{ {
InputEvent e = {}; InputEvent e = {};
e.inputEvent = INPUT_BROKER_NONE; e.inputEvent = INPUT_BROKER_NONE;
#if TB_THRESHOLD
if (lastInterruptTime && lastInterruptTime < millis() - 1000) {
left_counter = 0;
right_counter = 0;
up_counter = 0;
down_counter = 0;
lastInterruptTime = 0;
}
#ifdef INPUT_DEBUG
if (left_counter > 0 || right_counter > 0 || up_counter > 0 || down_counter > 0) {
LOG_DEBUG("L %u R %u U %u D %u, time %u", left_counter, right_counter, up_counter, down_counter, millis());
}
#endif
#endif
// Handle long press detection for press button // Handle long press detection for press button
if (pressDetected && pressStartTime > 0) { if (pressDetected && pressStartTime > 0) {
@@ -130,23 +144,31 @@ int32_t TrackballInterruptBase::runOnce()
} }
} }
#if defined(T_DECK) // T-deck gets a super-simple debounce on trackball #if TB_THRESHOLD
if (this->action == TB_ACTION_PRESSED && (!pressDetected || pressStartTime == 0)) { if (this->action == TB_ACTION_PRESSED && (!pressDetected || pressStartTime == 0)) {
// Start long press detection // Start long press detection
pressDetected = true; pressDetected = true;
pressStartTime = millis(); pressStartTime = millis();
// Don't send event yet, wait to see if it's a long press // Don't send event yet, wait to see if it's a long press
} else if (this->action == TB_ACTION_UP && lastEvent == TB_ACTION_UP) { } else if (up_counter >= TB_THRESHOLD) {
// LOG_DEBUG("Trackball event UP"); #ifdef INPUT_DEBUG
LOG_DEBUG("Trackball event UP %u", millis());
#endif
e.inputEvent = this->_eventUp; e.inputEvent = this->_eventUp;
} else if (this->action == TB_ACTION_DOWN && lastEvent == TB_ACTION_DOWN) { } else if (down_counter >= TB_THRESHOLD) {
// LOG_DEBUG("Trackball event DOWN"); #ifdef INPUT_DEBUG
LOG_DEBUG("Trackball event DOWN %u", millis());
#endif
e.inputEvent = this->_eventDown; e.inputEvent = this->_eventDown;
} else if (this->action == TB_ACTION_LEFT && lastEvent == TB_ACTION_LEFT) { } else if (left_counter >= TB_THRESHOLD) {
// LOG_DEBUG("Trackball event LEFT"); #ifdef INPUT_DEBUG
LOG_DEBUG("Trackball event LEFT, %u", millis());
#endif
e.inputEvent = this->_eventLeft; e.inputEvent = this->_eventLeft;
} else if (this->action == TB_ACTION_RIGHT && lastEvent == TB_ACTION_RIGHT) { } else if (right_counter >= TB_THRESHOLD) {
// LOG_DEBUG("Trackball event RIGHT"); #ifdef INPUT_DEBUG
LOG_DEBUG("Trackball event RIGHT, %u", millis());
#endif
e.inputEvent = this->_eventRight; e.inputEvent = this->_eventRight;
} }
#else #else
@@ -179,6 +201,12 @@ int32_t TrackballInterruptBase::runOnce()
e.source = this->_originName; e.source = this->_originName;
e.kbchar = 0x00; e.kbchar = 0x00;
this->notifyObservers(&e); this->notifyObservers(&e);
#if TB_THRESHOLD
left_counter = 0;
right_counter = 0;
up_counter = 0;
down_counter = 0;
#endif
} }
// Only update lastEvent for non-press actions or completed press actions // Only update lastEvent for non-press actions or completed press actions
@@ -194,25 +222,49 @@ int32_t TrackballInterruptBase::runOnce()
void TrackballInterruptBase::intPressHandler() void TrackballInterruptBase::intPressHandler()
{ {
this->action = TB_ACTION_PRESSED; if (TB_THRESHOLD || lastInterruptTime < millis() - 10)
this->action = TB_ACTION_PRESSED;
lastInterruptTime = millis();
} }
void TrackballInterruptBase::intDownHandler() void TrackballInterruptBase::intDownHandler()
{ {
this->action = TB_ACTION_DOWN; if (TB_THRESHOLD || lastInterruptTime < millis() - 10)
this->action = TB_ACTION_DOWN;
lastInterruptTime = millis();
#if TB_THRESHOLD
down_counter++;
#endif
} }
void TrackballInterruptBase::intUpHandler() void TrackballInterruptBase::intUpHandler()
{ {
this->action = TB_ACTION_UP; if (TB_THRESHOLD || lastInterruptTime < millis() - 10)
this->action = TB_ACTION_UP;
lastInterruptTime = millis();
#if TB_THRESHOLD
up_counter++;
#endif
} }
void TrackballInterruptBase::intLeftHandler() void TrackballInterruptBase::intLeftHandler()
{ {
this->action = TB_ACTION_LEFT; if (TB_THRESHOLD || lastInterruptTime < millis() - 10)
this->action = TB_ACTION_LEFT;
lastInterruptTime = millis();
#if TB_THRESHOLD
left_counter++;
#endif
} }
void TrackballInterruptBase::intRightHandler() void TrackballInterruptBase::intRightHandler()
{ {
this->action = TB_ACTION_RIGHT; if (TB_THRESHOLD || lastInterruptTime < millis() - 10)
this->action = TB_ACTION_RIGHT;
lastInterruptTime = millis();
#if TB_THRESHOLD
right_counter++;
#endif
} }

View File

@@ -12,6 +12,10 @@
#endif #endif
#endif #endif
#ifndef TB_THRESHOLD
#define TB_THRESHOLD 0
#endif
class TrackballInterruptBase : public Observable<const InputEvent *>, public concurrency::OSThread class TrackballInterruptBase : public Observable<const InputEvent *>, public concurrency::OSThread
{ {
public: public:
@@ -25,8 +29,6 @@ class TrackballInterruptBase : public Observable<const InputEvent *>, public con
void intUpHandler(); void intUpHandler();
void intLeftHandler(); void intLeftHandler();
void intRightHandler(); void intRightHandler();
uint32_t lastTime = 0;
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
protected: protected:
@@ -67,4 +69,12 @@ class TrackballInterruptBase : public Observable<const InputEvent *>, public con
input_broker_event _eventPressedLong = INPUT_BROKER_NONE; input_broker_event _eventPressedLong = INPUT_BROKER_NONE;
const char *_originName; const char *_originName;
TrackballInterruptBaseActionType lastEvent = TB_ACTION_NONE; TrackballInterruptBaseActionType lastEvent = TB_ACTION_NONE;
uint32_t lastInterruptTime = 0;
#if TB_THRESHOLD
uint8_t left_counter = 0;
uint8_t right_counter = 0;
uint8_t up_counter = 0;
uint8_t down_counter = 0;
#endif
}; };

View File

@@ -24,41 +24,26 @@ void TrackballInterruptImpl1::init(uint8_t pinDown, uint8_t pinUp, uint8_t pinLe
void TrackballInterruptImpl1::handleIntDown() void TrackballInterruptImpl1::handleIntDown()
{ {
if (TB_DIRECTION == RISING || millis() > trackballInterruptImpl1->lastTime + 10) { trackballInterruptImpl1->intDownHandler();
trackballInterruptImpl1->lastTime = millis(); trackballInterruptImpl1->setIntervalFromNow(20);
trackballInterruptImpl1->intDownHandler();
trackballInterruptImpl1->setIntervalFromNow(20);
}
} }
void TrackballInterruptImpl1::handleIntUp() void TrackballInterruptImpl1::handleIntUp()
{ {
if (TB_DIRECTION == RISING || millis() > trackballInterruptImpl1->lastTime + 10) { trackballInterruptImpl1->intUpHandler();
trackballInterruptImpl1->lastTime = millis(); trackballInterruptImpl1->setIntervalFromNow(20);
trackballInterruptImpl1->intUpHandler();
trackballInterruptImpl1->setIntervalFromNow(20);
}
} }
void TrackballInterruptImpl1::handleIntLeft() void TrackballInterruptImpl1::handleIntLeft()
{ {
if (TB_DIRECTION == RISING || millis() > trackballInterruptImpl1->lastTime + 10) { trackballInterruptImpl1->intLeftHandler();
trackballInterruptImpl1->lastTime = millis(); trackballInterruptImpl1->setIntervalFromNow(20);
trackballInterruptImpl1->intLeftHandler();
trackballInterruptImpl1->setIntervalFromNow(20);
}
} }
void TrackballInterruptImpl1::handleIntRight() void TrackballInterruptImpl1::handleIntRight()
{ {
if (TB_DIRECTION == RISING || millis() > trackballInterruptImpl1->lastTime + 10) { trackballInterruptImpl1->intRightHandler();
trackballInterruptImpl1->lastTime = millis(); trackballInterruptImpl1->setIntervalFromNow(20);
trackballInterruptImpl1->intRightHandler();
trackballInterruptImpl1->setIntervalFromNow(20);
}
} }
void TrackballInterruptImpl1::handleIntPressed() void TrackballInterruptImpl1::handleIntPressed()
{ {
if (TB_DIRECTION == RISING || millis() > trackballInterruptImpl1->lastTime + 10) { trackballInterruptImpl1->intPressHandler();
trackballInterruptImpl1->lastTime = millis(); trackballInterruptImpl1->setIntervalFromNow(20);
trackballInterruptImpl1->intPressHandler();
trackballInterruptImpl1->setIntervalFromNow(20);
}
} }

View File

@@ -71,6 +71,7 @@
#define TB_RIGHT 2 #define TB_RIGHT 2
#define TB_PRESS 0 // BUTTON_PIN #define TB_PRESS 0 // BUTTON_PIN
#define TB_DIRECTION FALLING #define TB_DIRECTION FALLING
#define TB_THRESHOLD 3
// microphone // microphone
#define ES7210_SCK 47 #define ES7210_SCK 47