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
|
// 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
|
||||||
14
src/main.cpp
14
src/main.cpp
@ -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 {
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
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