mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-29 14:10:53 +00:00
* TwoButtonExtened mirrors TwoButton but added joystick functionality * basic ui navigation with a joystick settings->joystick.enabled setting added and SETTINGS_VERSION incremented by one in InkHUD/Persistence.h in seeed_wio_tracker_L1_eink/nicheGraphics.h enable joystick and disable "Next Tile" menu item in implement prevTile and prevApplet functions in InkHUD/WindowManager.h,cpp and InkHUD/InkHUD.h,cpp onStickCenterShort, onStickCenterLong, onStickUp, onStickDown, onStickLeft, and onStickRight functions added to: - InkHUD/InkHUD.h,cpp - InkHUD/Events.h,cpp - InkHUD/Applet.h change navigation actions in InkHUD/Events.cpp events based on whether the joystick is enabled or not in seeed_wio_tracker_L1_eink/nicheGraphics.h connect joystick events to the new joystick handler functions * handle joystick input in NotificationApplet and TipsApplet Both the joystick center short press and the user button short press can be used to advance through the Tips applet. dismiss notifications with any joystick input * MenuApplet controls allows menu navigation including a back button * add AlignStickApplet for aligning the joystick with the screen add joystick.aligned and joystick.alignment to InkHUD/Persistence.h for storing alignment status and relative angle create AlignStick applet that prompts the user for a joystick input and rotates the controls to align with the screen AlignStick applet is run after the tips applet if the joystick is enabled and not aligned add menu item for opening the AlignStick applet * update tips applet with joystick controls * format InkHUD additions * fix stroke consistency when resizing joystick graphic * tweak button tips for order consistency * increase joystick debounce * fix comments * remove unnecessary '+' * remap joystick controls to match standard inkHUD behavior Input with a joystick now behaves as follows User Button (joystick center): - short press in applet -> opens menu - long press in applet -> opens menu - short press in menu -> selects - long press in menu -> selects Exit Button: - short press in applet -> switches tile - long press in applet -> nothing for now - short press in menu -> closes menu - long press in menu -> nothing for now --------- Co-authored-by: scobert <scobert57@gmail.com> Co-authored-by: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com>
107 lines
4.0 KiB
C++
107 lines
4.0 KiB
C++
#ifdef MESHTASTIC_INCLUDE_INKHUD
|
|
|
|
#include "configuration.h"
|
|
|
|
#include "graphics/niche/Drivers/Backlight/LatchingBacklight.h"
|
|
#include "graphics/niche/InkHUD/InkHUD.h"
|
|
#include "graphics/niche/InkHUD/Persistence.h"
|
|
#include "graphics/niche/InkHUD/SystemApplet.h"
|
|
#include "graphics/niche/Utils/CannedMessageStore.h"
|
|
|
|
#include "./MenuItem.h"
|
|
#include "./MenuPage.h"
|
|
|
|
#include "Channels.h"
|
|
#include "concurrency/OSThread.h"
|
|
|
|
namespace NicheGraphics::InkHUD
|
|
{
|
|
|
|
class Applet;
|
|
|
|
class MenuApplet : public SystemApplet, public concurrency::OSThread
|
|
{
|
|
public:
|
|
MenuApplet();
|
|
void onForeground() override;
|
|
void onBackground() override;
|
|
void onButtonShortPress() override;
|
|
void onButtonLongPress() override;
|
|
void onExitShort() override;
|
|
void onNavUp() override;
|
|
void onNavDown() override;
|
|
void onNavLeft() override;
|
|
void onNavRight() override;
|
|
void onRender() override;
|
|
|
|
void show(Tile *t); // Open the menu, onto a user tile
|
|
|
|
protected:
|
|
Drivers::LatchingBacklight *backlight = nullptr; // Convenient access to the backlight singleton
|
|
|
|
int32_t runOnce() override;
|
|
|
|
void execute(MenuItem item); // Perform the MenuAction associated with a MenuItem, if any
|
|
void showPage(MenuPage page); // Load and display a MenuPage
|
|
|
|
void populateSendPage(); // Dynamically create MenuItems including canned messages
|
|
void populateRecipientPage(); // Dynamically create a page of possible destinations for a canned message
|
|
void populateAppletPage(); // Dynamically create MenuItems for toggling loaded applets
|
|
void populateAutoshowPage(); // Dynamically create MenuItems for selecting which applets can autoshow
|
|
void populateRecentsPage(); // Create menu items: a choice of values for settings.recentlyActiveSeconds
|
|
|
|
uint16_t getSystemInfoPanelHeight();
|
|
void drawSystemInfoPanel(int16_t left, int16_t top, uint16_t width,
|
|
uint16_t *height = nullptr); // Info panel at top of root menu
|
|
void sendText(NodeNum dest, ChannelIndex channel, const char *message); // Send a text message to mesh
|
|
void freeCannedMessageResources(); // Clear MenuApplet's canned message processing data
|
|
|
|
MenuPage currentPage = MenuPage::ROOT;
|
|
MenuPage previousPage = MenuPage::EXIT;
|
|
uint8_t cursor = 0; // Which menu item is currently highlighted
|
|
bool cursorShown = false; // Is *any* item highlighted? (Root menu: no initial selection)
|
|
|
|
uint16_t systemInfoPanelHeight = 0; // Need to know before we render
|
|
|
|
std::vector<MenuItem> items; // MenuItems for the current page. Filled by ShowPage
|
|
|
|
// Data for selecting and sending canned messages via the menu
|
|
// Placed into a sub-class for organization only
|
|
class CannedMessages
|
|
{
|
|
public:
|
|
// Share NicheGraphics component
|
|
// Handles loading, getting, setting
|
|
CannedMessageStore *store;
|
|
|
|
// One canned message
|
|
// Links the menu item to the true message text
|
|
struct MessageItem {
|
|
std::string label; // Shown in menu. Prefixed, and UTF-8 chars parsed
|
|
std::string rawText; // The message which will be sent, if this item is selected
|
|
} *selectedMessageItem;
|
|
|
|
// One possible destination for a canned message
|
|
// Links the menu item to the intended recipient
|
|
// May represent either broadcast or DM
|
|
struct RecipientItem {
|
|
std::string label; // Shown in menu
|
|
NodeNum dest = NODENUM_BROADCAST;
|
|
uint8_t channelIndex = 0;
|
|
} *selectedRecipientItem;
|
|
|
|
// These lists are generated when the menu page is populated
|
|
// Cleared onBackground (when MenuApplet closes)
|
|
std::vector<MessageItem> messageItems;
|
|
std::vector<RecipientItem> recipientItems;
|
|
} cm;
|
|
|
|
Applet *borrowedTileOwner = nullptr; // Which applet we have temporarily replaced while displaying menu
|
|
|
|
bool invertedColors = false; // Helper to display current state of config.display.displaymode in InkHUD options
|
|
};
|
|
|
|
} // namespace NicheGraphics::InkHUD
|
|
|
|
#endif
|