mirror of
https://github.com/meshtastic/firmware.git
synced 2026-01-27 12:12:07 +00:00
Trackball revamp
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user