From d3057523331431efc1e3c48744881d382cac72db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Mon, 30 Mar 2026 20:38:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=8A=82=E7=82=B9=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E5=8F=8C=E5=87=BB=E5=88=87=E6=8D=A2=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F\n\n-=20TCA9535=20=E4=B8=8D=E6=94=AF=E6=8C=81=E9=95=BF?= =?UTF-8?q?=E6=8C=89=E4=BA=8B=E4=BB=B6=EF=BC=8C=E6=94=B9=E7=94=A8=E5=8F=8C?= =?UTF-8?q?=E5=87=BB=E6=A3=80=E6=B5=8B=EF=BC=88400ms=E5=86=85=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=E4=B8=A4=E6=AC=A1=E6=8C=89=E9=94=AE=EF=BC=89\n-=20?= =?UTF-8?q?=E5=8F=8C=E5=87=BB=20UP=EF=BC=9A=E5=88=87=E6=8D=A2=E5=88=B0?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E4=B8=AA=E6=A8=A1=E5=BC=8F\n-=20=E5=8F=8C?= =?UTF-8?q?=E5=87=BB=20DOWN=EF=BC=9A=E5=88=87=E6=8D=A2=E5=88=B0=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=A8=A1=E5=BC=8F\n-=20=E5=8D=95=E5=87=BB?= =?UTF-8?q?=EF=BC=9A=E4=BF=9D=E6=8C=81=E5=8E=9F=E6=9C=89=E8=A1=8C=E4=B8=BA?= =?UTF-8?q?=EF=BC=88=E6=BB=9A=E5=8A=A8=E7=95=8C=E9=9D=A2=EF=BC=89"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/graphics/Screen.cpp | 16 ++-- .../src/graphics/draw/NodeListRenderer.cpp | 93 ++++++------------- .../src/graphics/draw/NodeListRenderer.h | 9 +- 3 files changed, 41 insertions(+), 77 deletions(-) diff --git a/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp b/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp index 20cd7db..0db0505 100644 --- a/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp +++ b/code/firmware-2.7.15.567b8ea/src/graphics/Screen.cpp @@ -1597,16 +1597,20 @@ int Screen::handleInputEvent(const InputEvent *event) } else if (event->inputEvent == INPUT_BROKER_RIGHT || event->inputEvent == INPUT_BROKER_USER_PRESS) { showNextFrame(); } else if (event->inputEvent == INPUT_BROKER_UP) { - // 在节点列表界面,记录按键按下时间,由渲染函数检测长按 + // 在节点列表界面,双击切换到上一个模式 if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) { - graphics::NodeListRenderer::onUpPressed(); - setFastFramerate(); + if (graphics::NodeListRenderer::handleUpDoubleClick()) { + setFastFramerate(); + ui->update(); + } } } else if (event->inputEvent == INPUT_BROKER_DOWN) { - // 在节点列表界面,记录按键按下时间,由渲染函数检测长按 + // 在节点列表界面,双击切换到下一个模式 if (this->ui->getUiState()->currentFrame == framesetInfo.positions.nodelist) { - graphics::NodeListRenderer::onDownPressed(); - setFastFramerate(); + if (graphics::NodeListRenderer::handleDownDoubleClick()) { + setFastFramerate(); + ui->update(); + } } } else if (event->inputEvent == INPUT_BROKER_SELECT) { if (this->ui->getUiState()->currentFrame == framesetInfo.positions.home) { diff --git a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp index f352354..0c6c46a 100644 --- a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp +++ b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.cpp @@ -50,12 +50,10 @@ static NodeListMode currentMode = MODE_LAST_HEARD; static int scrollIndex = 0; static bool autoCycleEnabled = false; // 禁用自动切换,改为手动按键控制 -// 长按检测变量 +// 双击检测变量(用于切换模式) static unsigned long lastUpPressTime = 0; static unsigned long lastDownPressTime = 0; -static bool upLongPressHandled = false; -static bool downLongPressHandled = false; -#define LONG_PRESS_THRESHOLD_MS 500 +#define DOUBLE_CLICK_THRESHOLD_MS 400 // ============================= // Mode Control Functions (manual UP/DOWN control) @@ -76,70 +74,38 @@ void switchToPrevMode() currentMode = static_cast((currentMode + MODE_COUNT - 1) % MODE_COUNT); } -// 处理 UP 按键(短按滚动,长按切换模式) -void handleUpKey(bool isLongPress) -{ - if (isLongPress) { - switchToPrevMode(); - } - // 短按不做任何事(让 Screen.cpp 处理滚动) -} - -// 处理 DOWN 按键(短按滚动,长按切换模式) -void handleDownKey(bool isLongPress) -{ - if (isLongPress) { - switchToNextMode(); - } - // 短按不做任何事(让 Screen.cpp 处理滚动) -} - -// 定时器函数,检查长按状态(在 runOnce 中调用) -void checkLongPress() +// 处理 UP 按键双击检测(从 Screen.cpp 调用) +// 返回 true 表示检测到双击,需要切换模式 +bool handleUpDoubleClick() { unsigned long now = millis(); - // 检查 UP 长按 - if (lastUpPressTime > 0 && !upLongPressHandled) { - if (now - lastUpPressTime > LONG_PRESS_THRESHOLD_MS) { - switchToPrevMode(); - upLongPressHandled = true; - } + if (lastUpPressTime > 0 && (now - lastUpPressTime) < DOUBLE_CLICK_THRESHOLD_MS) { + // 双击触发:切换到上一个模式 + switchToPrevMode(); + lastUpPressTime = 0; // 重置,防止三次点击触发两次 + return true; } - // 检查 DOWN 长按 - if (lastDownPressTime > 0 && !downLongPressHandled) { - if (now - lastDownPressTime > LONG_PRESS_THRESHOLD_MS) { - switchToNextMode(); - downLongPressHandled = true; - } + lastUpPressTime = now; + return false; +} + +// 处理 DOWN 按键双击检测(从 Screen.cpp 调用) +// 返回 true 表示检测到双击,需要切换模式 +bool handleDownDoubleClick() +{ + unsigned long now = millis(); + + if (lastDownPressTime > 0 && (now - lastDownPressTime) < DOUBLE_CLICK_THRESHOLD_MS) { + // 双击触发:切换到下一个模式 + switchToNextMode(); + lastDownPressTime = 0; // 重置,防止三次点击触发两次 + return true; } -} - -// 标记按键按下(从 Screen.cpp 调用) -void onUpPressed() -{ - lastUpPressTime = millis(); - upLongPressHandled = false; -} - -void onDownPressed() -{ - lastDownPressTime = millis(); - downLongPressHandled = false; -} - -// 标记按键释放(从 Screen.cpp 调用) -void onUpReleased() -{ - lastUpPressTime = 0; - upLongPressHandled = false; -} - -void onDownReleased() -{ - lastDownPressTime = 0; - downLongPressHandled = false; + + lastDownPressTime = now; + return false; } // ============================= @@ -615,9 +581,6 @@ void drawDynamicNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, unsigned long now = millis(); - // 检查长按并切换模式 - checkLongPress(); - // 如果模式改变了,强制刷新显示 if (previousMode != currentMode) { previousMode = currentMode; diff --git a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h index d988d33..5b4ee33 100644 --- a/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h +++ b/code/firmware-2.7.15.567b8ea/src/graphics/draw/NodeListRenderer.h @@ -59,12 +59,9 @@ void switchToNextMode(); void switchToPrevMode(); NodeListMode getCurrentMode(); -// Long press detection for UP/DOWN keys -void onUpPressed(); -void onDownPressed(); -void onUpReleased(); -void onDownReleased(); -void checkLongPress(); +// Double-click detection for UP/DOWN keys (returns true if double-click detected) +bool handleUpDoubleClick(); +bool handleDownDoubleClick(); // Bitmap drawing function void drawScaledXBitmap16x16(int x, int y, int width, int height, const uint8_t *bitmapXBM, OLEDDisplay *display);