From e158f5097026fb13453737e0c96ec4bcfa7bed02 Mon Sep 17 00:00:00 2001 From: Nacho Date: Thu, 28 May 2026 21:32:52 +0200 Subject: [PATCH] Add settings screen --- src/defs/defs.h | 7 +++ src/main.cpp | 14 ++++- src/menu/menu.h | 2 + src/menu/menu_screen.cpp | 6 +++ src/menu/settings_screen.cpp | 101 +++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/menu/settings_screen.cpp diff --git a/src/defs/defs.h b/src/defs/defs.h index f1c05e2..b08fef2 100644 --- a/src/defs/defs.h +++ b/src/defs/defs.h @@ -125,6 +125,9 @@ // TRAINING MODES #define TRAINING_SCREEN_1 30 +// SETTINGS SUBSCREENS +#define BACKGROUND_CHANGE_SCREEN 40 + // SMALL UI ICONS (UI.BIN) #define POOP_ICON 0 #define FOOD_ICON 1 @@ -217,4 +220,8 @@ extern bool isSamplingSteps; extern uint64_t sampleStartTime; extern uint16_t initialSteps; +// Settings screen options +extern bool soundEnabled; +extern bool alwaysOnEnabled; + #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c9990d9..2b0cd0a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,6 +67,11 @@ int currentBackground = 0; // Tasks TaskHandle_t secondLoop = NULL; +// Settings +bool soundEnabled = true; +bool alwaysOnEnabled = false; + +// Background step counting bool isSamplingSteps = false; uint64_t sampleStartTime = 0; uint16_t initialSteps = 0; @@ -216,6 +221,14 @@ void loop() { case FROZEN_SCREEN: menu_drawFridgeScreen(bg, sprite, &mainCharacterSprites, &menuElementsData); break; + + case SETTINGS_SCREEN: + menu_settingsScreen(bg, sprite, &uiElementsData); + break; + + case BACKGROUND_CHANGE_SCREEN: + menu_changeBackgroundScreen(bg, sprite, &uiElementsData); + break; } if (screenKey == IDLE_SCREEN || screenKey == OFF_SCREEN) { @@ -244,7 +257,6 @@ void loop2() { stepCounter += approximatedSteps; printf("[STEPS] Sampled %d steps in 10s, added %d approximated steps for sleep period.\n", sampledSteps, approximatedSteps); - energy_startLightSleep(); } } else { diff --git a/src/menu/menu.h b/src/menu/menu.h index bba3cec..52c4874 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -60,6 +60,8 @@ void training_screenTraining2( void menu_changeBackgroundScreen( TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiSpriteData ); +void menu_settingsScreen(TFT_eSprite &bg, TFT_eSprite &mainChara, struct SpriteData *spriteData); +void menu_settingsScreen_drawEntry(uint8_t entryId, const char *textEntry); void menu_sleepScreen_sleepAction(); void menu_sleepScreen_recalculateSleep(); diff --git a/src/menu/menu_screen.cpp b/src/menu/menu_screen.cpp index 2d5192f..a9440ed 100644 --- a/src/menu/menu_screen.cpp +++ b/src/menu/menu_screen.cpp @@ -73,6 +73,12 @@ void menu_drawCurrentMenuOption(TFT_eSprite& bg, TFT_eSprite &icon, struct Sprit return; break; + case SETTINGS_SCREEN_MENU: + menuKey = STATUS_SCREEN; + screenKey = SETTINGS_SCREEN; + return; + break; + default: break; } diff --git a/src/menu/settings_screen.cpp b/src/menu/settings_screen.cpp new file mode 100644 index 0000000..306c57c --- /dev/null +++ b/src/menu/settings_screen.cpp @@ -0,0 +1,101 @@ +#include "buttons/buttons.h" +#include "defs/chara_data.h" +#include "defs/defs.h" +#include "display/display.h" +#include "draw/draw.h" +#include "menu.h" +#include "vpet/vpet/vpet.h" + +enum SettingsItemType { + SETTINGS_SUBMENU, + SETTINGS_ACTION +}; + +struct SettingsMenuItem { + const char* label; + SettingsItemType type; + uint8_t targetScreen; + void (*actionFunction)(); + bool* stateValue; +}; + +void switchSoundState() { + if (soundEnabled) { + pinMode(SPK_PIN, INPUT); + } else { + pinMode(SPK_PIN, OUTPUT); + } + + soundEnabled = !soundEnabled; + printf("[SETTINGS] soundEnabled=%i\n", soundEnabled); +} + + +void switchScreenState() { + alwaysOnEnabled = !alwaysOnEnabled; + printf("[SETTINGS] alwaysOnEnabled=%i\n", alwaysOnEnabled); +} + +void menu_settingsScreen(TFT_eSprite &bg, TFT_eSprite &mainChara, struct SpriteData *spriteData) +{ + static uint8_t arrowPosition = 0; + + static SettingsMenuItem menuItems[] = { + { "BG", SETTINGS_SUBMENU, BACKGROUND_CHANGE_SCREEN, nullptr, nullptr }, + { "SOUND", SETTINGS_ACTION, 0, switchSoundState, &soundEnabled }, + { "ALWAYS ON", SETTINGS_ACTION, 0, switchScreenState, &alwaysOnEnabled } + }; + + const uint8_t maxItems = sizeof(menuItems) / sizeof(menuItems[0]); + + uint8_t pressedButtons = buttons_getPressedButtons(); + switch (pressedButtons) { + + case K1_PRESSED: + arrowPosition = (arrowPosition + 1) % maxItems; + printf("[SETTINGS] arrowPosition=%i\n", arrowPosition); + break; + + case K3_PRESSED: + screenKey = MENU_SCREEN; + return; + + case K2_PRESSED: + lastUpdateTime = 0; + + if (menuItems[arrowPosition].type == SETTINGS_ACTION) { + if (menuItems[arrowPosition].actionFunction != nullptr) { + menuItems[arrowPosition].actionFunction(); + } + } else if (menuItems[arrowPosition].type == SETTINGS_SUBMENU) { + screenKey = menuItems[arrowPosition].targetScreen; + return; + } + + break; + + default: + break; + } + + draw_drawBackground(bg, 90, 90, 3); + + const int startX = 20; + const int startY = 10; + const int spacingY = 40; + + for (uint8_t i = 0; i < maxItems; i++) { + bool selected = (i == arrowPosition); + int y = startY + (i * spacingY); + + tft_drawText(menuItems[i].label, 4, startX, y, selected ? TFT_BLACK : TFT_WHITE, selected ? TFT_WHITE : TFT_TRANSPARENT); + + if (menuItems[i].stateValue != nullptr) { + const char* stateText = (*menuItems[i].stateValue) ? "ON" : "OFF"; + + tft_drawText(stateText, 4, 150, y, selected ? TFT_BLACK : TFT_WHITE, selected ? TFT_WHITE : TFT_TRANSPARENT); + } + } + + tft_drawBuffer(); +} \ No newline at end of file