mirror of
https://github.com/nacabaro/nacapet.git
synced 2026-06-05 14:02:53 +00:00
Add settings screen
This commit is contained in:
parent
f8f7c7a9b6
commit
e158f50970
@ -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
|
||||
14
src/main.cpp
14
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 {
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
101
src/menu/settings_screen.cpp
Normal file
101
src/menu/settings_screen.cpp
Normal 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();
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user