From c1a9003edd67808fe6491671287c4055af11c3e7 Mon Sep 17 00:00:00 2001 From: Palo Date: Sun, 29 Mar 2026 15:12:18 +0200 Subject: [PATCH] Add JOYSTICK_ROTATION build flag for joystick-equipped boards Boards like the Wio Tracker L1 eInk can be mounted with the display beside the joystick (rotated 90 deg) rather than above it. In this orientation the physical up/down buttons correspond to right/left navigation on screen. JOYSTICK_ROTATION follows the same 0-3 convention as DISPLAY_ROTATION: 0 (default) - no rotation, left/right buttons navigate left/right 1 - 90 deg CW, up/down buttons navigate right/left 2 - 180 deg, left/right buttons are swapped 3 - 270 deg, up/down buttons navigate left/right Variants that define JOYSTICK_UP/JOYSTICK_DOWN pins (wio-tracker-l1, gat562_mesh_tracker_pro, gat562_30s_mesh_kit) now instantiate joystick_up and joystick_down MomentaryButton objects unconditionally so they are available when JOYSTICK_ROTATION 1 or 3 is selected. A compile-time #error fires if JOYSTICK_ROTATION 1/3 is requested on a board that does not define JOYSTICK_UP/JOYSTICK_DOWN pins. --- examples/companion_radio/ui-new/UITask.cpp | 49 +++++++++++++++++++++ variants/gat562_30s_mesh_kit/target.cpp | 4 ++ variants/gat562_30s_mesh_kit/target.h | 4 ++ variants/gat562_mesh_tracker_pro/target.cpp | 4 ++ variants/gat562_mesh_tracker_pro/target.h | 4 ++ variants/wio-tracker-l1-eink/platformio.ini | 1 + variants/wio-tracker-l1/target.cpp | 4 ++ variants/wio-tracker-l1/target.h | 4 ++ 8 files changed, 74 insertions(+) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 94a8ee3efa..2c0c95a475 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -29,6 +29,11 @@ #define PRESS_LABEL "long press" #endif +#if defined(JOYSTICK_ROTATION) && (JOYSTICK_ROTATION == 1 || JOYSTICK_ROTATION == 3) \ + && (!defined(JOYSTICK_UP) || !defined(JOYSTICK_DOWN)) + #error "JOYSTICK_ROTATION 1/3 requires JOYSTICK_UP and JOYSTICK_DOWN pin definitions" +#endif + #include "icons.h" class SplashScreen : public UIScreen { @@ -711,6 +716,49 @@ void UITask::loop() { } else if (ev == BUTTON_EVENT_LONG_PRESS) { c = handleLongPress(KEY_ENTER); // REVISIT: could be mapped to different key code } +#if defined(JOYSTICK_ROTATION) && JOYSTICK_ROTATION == 1 + // 90 deg clockwise: physical up/down map to right/left on screen + ev = joystick_down.check(); + if (ev == BUTTON_EVENT_CLICK) { + c = checkDisplayOn(KEY_LEFT); + } else if (ev == BUTTON_EVENT_LONG_PRESS) { + c = handleLongPress(KEY_LEFT); + } + ev = joystick_up.check(); + if (ev == BUTTON_EVENT_CLICK) { + c = checkDisplayOn(KEY_RIGHT); + } else if (ev == BUTTON_EVENT_LONG_PRESS) { + c = handleLongPress(KEY_RIGHT); + } +#elif defined(JOYSTICK_ROTATION) && JOYSTICK_ROTATION == 2 + // 180 deg: physical left/right are swapped + ev = joystick_right.check(); + if (ev == BUTTON_EVENT_CLICK) { + c = checkDisplayOn(KEY_LEFT); + } else if (ev == BUTTON_EVENT_LONG_PRESS) { + c = handleLongPress(KEY_LEFT); + } + ev = joystick_left.check(); + if (ev == BUTTON_EVENT_CLICK) { + c = checkDisplayOn(KEY_RIGHT); + } else if (ev == BUTTON_EVENT_LONG_PRESS) { + c = handleLongPress(KEY_RIGHT); + } +#elif defined(JOYSTICK_ROTATION) && JOYSTICK_ROTATION == 3 + // 270 deg (90 deg counter-clockwise): physical up/down map to left/right on screen + ev = joystick_up.check(); + if (ev == BUTTON_EVENT_CLICK) { + c = checkDisplayOn(KEY_LEFT); + } else if (ev == BUTTON_EVENT_LONG_PRESS) { + c = handleLongPress(KEY_LEFT); + } + ev = joystick_down.check(); + if (ev == BUTTON_EVENT_CLICK) { + c = checkDisplayOn(KEY_RIGHT); + } else if (ev == BUTTON_EVENT_LONG_PRESS) { + c = handleLongPress(KEY_RIGHT); + } +#else ev = joystick_left.check(); if (ev == BUTTON_EVENT_CLICK) { c = checkDisplayOn(KEY_LEFT); @@ -723,6 +771,7 @@ void UITask::loop() { } else if (ev == BUTTON_EVENT_LONG_PRESS) { c = handleLongPress(KEY_RIGHT); } +#endif ev = back_btn.check(); if (ev == BUTTON_EVENT_TRIPLE_CLICK) { c = handleTripleClick(KEY_SELECT); diff --git a/variants/gat562_30s_mesh_kit/target.cpp b/variants/gat562_30s_mesh_kit/target.cpp index 66723b4477..de21014911 100644 --- a/variants/gat562_30s_mesh_kit/target.cpp +++ b/variants/gat562_30s_mesh_kit/target.cpp @@ -15,6 +15,10 @@ GAT56230SMeshKitBoard board; MomentaryButton joystick_left(JOYSTICK_LEFT, 1000, true, false, false); MomentaryButton joystick_right(JOYSTICK_RIGHT, 1000, true, false, false); MomentaryButton back_btn(PIN_BACK_BTN, 1000, true, false, true); + #if defined(JOYSTICK_UP) && defined(JOYSTICK_DOWN) + MomentaryButton joystick_up(JOYSTICK_UP, 1000, true, false, false); + MomentaryButton joystick_down(JOYSTICK_DOWN, 1000, true, false, false); + #endif #endif diff --git a/variants/gat562_30s_mesh_kit/target.h b/variants/gat562_30s_mesh_kit/target.h index c112fd6cc2..b3a08b1ac2 100644 --- a/variants/gat562_30s_mesh_kit/target.h +++ b/variants/gat562_30s_mesh_kit/target.h @@ -16,6 +16,10 @@ extern MomentaryButton joystick_left; extern MomentaryButton joystick_right; extern MomentaryButton back_btn; + #if defined(JOYSTICK_UP) && defined(JOYSTICK_DOWN) + extern MomentaryButton joystick_up; + extern MomentaryButton joystick_down; + #endif #endif extern GAT56230SMeshKitBoard board; diff --git a/variants/gat562_mesh_tracker_pro/target.cpp b/variants/gat562_mesh_tracker_pro/target.cpp index 8ef0ecd34d..6afa94aac1 100644 --- a/variants/gat562_mesh_tracker_pro/target.cpp +++ b/variants/gat562_mesh_tracker_pro/target.cpp @@ -15,6 +15,10 @@ GAT562MeshTrackerProBoard board; MomentaryButton joystick_left(JOYSTICK_LEFT, 1000, true, false, false); MomentaryButton joystick_right(JOYSTICK_RIGHT, 1000, true, false, false); MomentaryButton back_btn(PIN_BACK_BTN, 1000, true, false, true); + #if defined(JOYSTICK_UP) && defined(JOYSTICK_DOWN) + MomentaryButton joystick_up(JOYSTICK_UP, 1000, true, false, false); + MomentaryButton joystick_down(JOYSTICK_DOWN, 1000, true, false, false); + #endif #endif diff --git a/variants/gat562_mesh_tracker_pro/target.h b/variants/gat562_mesh_tracker_pro/target.h index d43c5f25a6..508fbefb66 100644 --- a/variants/gat562_mesh_tracker_pro/target.h +++ b/variants/gat562_mesh_tracker_pro/target.h @@ -16,6 +16,10 @@ extern MomentaryButton joystick_left; extern MomentaryButton joystick_right; extern MomentaryButton back_btn; + #if defined(JOYSTICK_UP) && defined(JOYSTICK_DOWN) + extern MomentaryButton joystick_up; + extern MomentaryButton joystick_down; + #endif #endif extern GAT562MeshTrackerProBoard board; diff --git a/variants/wio-tracker-l1-eink/platformio.ini b/variants/wio-tracker-l1-eink/platformio.ini index 42c83477b7..2c15286637 100644 --- a/variants/wio-tracker-l1-eink/platformio.ini +++ b/variants/wio-tracker-l1-eink/platformio.ini @@ -51,6 +51,7 @@ build_flags = ${WioTrackerL1Eink.build_flags} -D OFFLINE_QUEUE_SIZE=256 -D DISPLAY_CLASS=GxEPDDisplay -D UI_HAS_JOYSTICK=1 + ; -D JOYSTICK_ROTATION=1 ; rotate joystick 90 deg CW (display mounted beside joystick) -D PIN_BUZZER=12 -D QSPIFLASH=1 ; -D MESH_PACKET_LOGGING=1 diff --git a/variants/wio-tracker-l1/target.cpp b/variants/wio-tracker-l1/target.cpp index 896ead26db..1b2817b1ee 100644 --- a/variants/wio-tracker-l1/target.cpp +++ b/variants/wio-tracker-l1/target.cpp @@ -25,6 +25,10 @@ EnvironmentSensorManager sensors = EnvironmentSensorManager(); MomentaryButton joystick_left(JOYSTICK_LEFT, 1000, true, false, false); MomentaryButton joystick_right(JOYSTICK_RIGHT, 1000, true, false, false); MomentaryButton back_btn(PIN_BACK_BTN, 1000, true, false, true); + #if defined(JOYSTICK_UP) && defined(JOYSTICK_DOWN) + MomentaryButton joystick_up(JOYSTICK_UP, 1000, true, false, false); + MomentaryButton joystick_down(JOYSTICK_DOWN, 1000, true, false, false); + #endif #endif bool radio_init() { diff --git a/variants/wio-tracker-l1/target.h b/variants/wio-tracker-l1/target.h index 72766e775f..050c097360 100644 --- a/variants/wio-tracker-l1/target.h +++ b/variants/wio-tracker-l1/target.h @@ -28,6 +28,10 @@ extern EnvironmentSensorManager sensors; extern MomentaryButton joystick_left; extern MomentaryButton joystick_right; extern MomentaryButton back_btn; + #if defined(JOYSTICK_UP) && defined(JOYSTICK_DOWN) + extern MomentaryButton joystick_up; + extern MomentaryButton joystick_down; + #endif #endif bool radio_init();