Add settings screen

This commit is contained in:
Nacho 2026-05-28 21:32:52 +02:00
parent f8f7c7a9b6
commit e158f50970
5 changed files with 129 additions and 1 deletions

View File

@ -125,6 +125,9 @@
// TRAINING MODES // TRAINING MODES
#define TRAINING_SCREEN_1 30 #define TRAINING_SCREEN_1 30
// SETTINGS SUBSCREENS
#define BACKGROUND_CHANGE_SCREEN 40
// SMALL UI ICONS (UI.BIN) // SMALL UI ICONS (UI.BIN)
#define POOP_ICON 0 #define POOP_ICON 0
#define FOOD_ICON 1 #define FOOD_ICON 1
@ -217,4 +220,8 @@ extern bool isSamplingSteps;
extern uint64_t sampleStartTime; extern uint64_t sampleStartTime;
extern uint16_t initialSteps; extern uint16_t initialSteps;
// Settings screen options
extern bool soundEnabled;
extern bool alwaysOnEnabled;
#endif #endif

View File

@ -67,6 +67,11 @@ int currentBackground = 0;
// Tasks // Tasks
TaskHandle_t secondLoop = NULL; TaskHandle_t secondLoop = NULL;
// Settings
bool soundEnabled = true;
bool alwaysOnEnabled = false;
// Background step counting
bool isSamplingSteps = false; bool isSamplingSteps = false;
uint64_t sampleStartTime = 0; uint64_t sampleStartTime = 0;
uint16_t initialSteps = 0; uint16_t initialSteps = 0;
@ -216,6 +221,14 @@ void loop() {
case FROZEN_SCREEN: case FROZEN_SCREEN:
menu_drawFridgeScreen(bg, sprite, &mainCharacterSprites, &menuElementsData); menu_drawFridgeScreen(bg, sprite, &mainCharacterSprites, &menuElementsData);
break; 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) { if (screenKey == IDLE_SCREEN || screenKey == OFF_SCREEN) {
@ -244,7 +257,6 @@ void loop2() {
stepCounter += approximatedSteps; stepCounter += approximatedSteps;
printf("[STEPS] Sampled %d steps in 10s, added %d approximated steps for sleep period.\n", sampledSteps, approximatedSteps); printf("[STEPS] Sampled %d steps in 10s, added %d approximated steps for sleep period.\n", sampledSteps, approximatedSteps);
energy_startLightSleep(); energy_startLightSleep();
} }
} else { } else {

View File

@ -60,6 +60,8 @@ void training_screenTraining2(
void menu_changeBackgroundScreen( void menu_changeBackgroundScreen(
TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* uiSpriteData 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_sleepAction();
void menu_sleepScreen_recalculateSleep(); void menu_sleepScreen_recalculateSleep();

View File

@ -73,6 +73,12 @@ void menu_drawCurrentMenuOption(TFT_eSprite& bg, TFT_eSprite &icon, struct Sprit
return; return;
break; break;
case SETTINGS_SCREEN_MENU:
menuKey = STATUS_SCREEN;
screenKey = SETTINGS_SCREEN;
return;
break;
default: default:
break; break;
} }

View File

@ -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();
}