Few things (broke everything related to sleep)

This commit is contained in:
Nacho
2025-08-30 16:21:24 +02:00
parent e138334e06
commit f1c1035c74
21 changed files with 529 additions and 62 deletions
+2 -1
View File
@@ -51,7 +51,7 @@ const int sleepyAnimationFrames[] = {
};
const int happyAnimationFrames[] = {
3, 7
7, 3
};
const int hatchingAnimationPositions[] = {
@@ -64,6 +64,7 @@ void animate_performEatingAnimation(TFT_eSprite &spr, struct SpriteData* spriteD
void animate_performRefuseAnimation(TFT_eSprite &spr, struct SpriteData* spriteData);
void animate_performSleepyAnimation(TFT_eSprite &spr, struct SpriteData* spriteData);
void animate_performHappyAnimation(TFT_eSprite &spr, struct SpriteData* spriteData);
void animate_performAngryAnimation(TFT_eSprite &spr, struct SpriteData* spriteData);
void animate_performHatchingAnimation(TFT_eSprite &spr, struct SpriteData* spriteData);
#endif
+14
View File
@@ -88,6 +88,20 @@ void animate_performHappyAnimation(TFT_eSprite &spr, struct SpriteData* spriteDa
);
}
void animate_performAngryAnimation(TFT_eSprite &spr, struct SpriteData* spriteData) {
currentAnimationFrame = (currentAnimationFrame + 1) % numFramesAngry;
draw_drawSprite(
spr,
spriteHeightOnScreen,
spriteHeightOnScreen,
spriteData,
angryAnimationFrames[currentAnimationFrame],
6,
false
);
}
void animate_performHatchingAnimation(TFT_eSprite &spr, struct SpriteData* spriteData) {
currentAnimationFrame = (currentAnimationFrame + 1) % numFramesHappy;
draw_drawSprite(
-12
View File
@@ -39,18 +39,6 @@ uint8_t buttons_getPressedButtons() {
(k4_prev == HIGH && k4_current == LOW)
);
if (retV == K4_PRESSED) {
tft.fillScreen(TFT_BLACK);
xPos++;
if (xPos > 1) {
yPos++;
xPos = 0;
if (yPos > 1) {
yPos = 0;
}
}
}
if (retV != 0) {
tone(SPK_PIN, BEEP_FREQ_HZ, BEEP_LEN_MS);
lastPressedButtonTime = esp_timer_get_time();
+5 -4
View File
@@ -17,10 +17,10 @@
#define BL_PIN 25
// BUTTONS PINOUT
#define K1_PIN 27
#define K2_PIN 26
#define K1_PIN 35
#define K2_PIN 13
#define K3_PIN 33
#define K4_PIN 32
#define K4_PIN 14
// SPEAKER PINOUT
#define SPK_PIN 21
@@ -101,7 +101,8 @@
#define CARE_MISTAKE_SCREEN 23
#define POOPING_SCREEN 24
#define HAPPY_SCREEN 25
#define MAIN_SCREEN 26
#define ANGRY_SCREEN 26
#define MAIN_SCREEN 27
// TRAINING MODES
#define TRAINING_SCREEN_1 30
+3 -3
View File
@@ -12,7 +12,7 @@ static const int BUF_H = 120;
void tft_initDisplay(TFT_eSPI &tft, uint16_t color) {
tft.begin();
tft.initDMA();
tft.setRotation(1);
tft.setRotation(0);
tft.fillScreen(TFT_RED);
}
@@ -32,8 +32,8 @@ void tft_initScreenBuffer(uint16_t color) {
void tft_drawBuffer() {
tft.startWrite();
composite1.pushSprite(xPos * -80, yPos * -112);
composite2.pushSprite(xPos * -80, (yPos * -112) + BUF_H);
composite1.pushSprite(0, 0);
composite2.pushSprite(0, 0 + BUF_H);
tft.endWrite();
}
+3 -1
View File
@@ -11,12 +11,14 @@
void energy_setUpLightSleep() {
// Plena confianza en manolo
esp_sleep_enable_ext0_wakeup(GPIO_NUM_32, 0);
esp_sleep_enable_ext0_wakeup((gpio_num_t) K4_PIN, LOW);
esp_sleep_enable_timer_wakeup(SLEEP_TIME_US);
}
void energy_startLightSleep() {
esp_light_sleep_start();
printf("[MAIN] Woken up\n");
// Who woke you up???? TELL me!!
auto cause = esp_sleep_get_wakeup_cause();
+11 -14
View File
@@ -72,8 +72,8 @@ void setup() {
Serial.begin(115200);
delay(100); // Give MPU6050 and ESP32 time to power up
Wire.begin(MPU_SDA_PIN, MPU_SCL_PIN); // I2C init before MPU6050
mpu.initialize();
//Wire.begin(MPU_SDA_PIN, MPU_SCL_PIN); // I2C init before MPU6050
//mpu.initialize();
tft_initDisplay(tft, TFT_BLACK);
tft_initScreenBuffer(TFT_BLACK);
@@ -172,6 +172,10 @@ void loop() {
menu_drawHappyScreen(bg, sprite, &mainCharacterSprites, &uiElementsData);
break;
case ANGRY_SCREEN:
menu_drawAngryScreen(bg, sprite, &mainCharacterSprites, &uiElementsData);
break;
case EGG_HATCH_SCREEN:
menu_eggHatchScreen(bg, sprite, &menuElementsData, &uiElementsData);
break;
@@ -207,20 +211,13 @@ void loop() {
}
void loop2() {
if (!pauseLoop) {
buttons_checkInactivity();
vpet_runVpetTasks();
buttons_checkInactivity();
vpet_runVpetTasks();
getLocalTime(&timeInfo, 50);
dayUnixTime = mktime(&timeInfo) % SECONDS_IN_DAY;
getLocalTime(&timeInfo, 50);
dayUnixTime = mktime(&timeInfo) % SECONDS_IN_DAY;
if (screenOff) { energy_startLightSleep(); }
} else {
buttons_getPressedButtons(); // REMOVE: Esto es porque tengo que shiftear el buffer de la pantalla
delay(100);
}
loopPaused = pauseLoop;
if (screenOff) { energy_startLightSleep(); }
}
void secondCoreTask(void*) {
+46
View File
@@ -0,0 +1,46 @@
#include "menu.h"
#include "defs/defs.h"
#include "defs/sprite_data.h"
#include "display/display.h"
#include "draw/draw.h"
#include "animations/animations.h"
void menu_drawAngryScreen(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements
) {
uint8_t frameCounter = 0;
while (true) {
uint64_t currentTime = esp_timer_get_time();
if (currentTime - lastUpdateTime > ANIMATION_THRESHOLD_TIME_US) {
if (frameCounter > 3) {
screenKey = MAIN_SCREEN; // TODO: Change for while battling
menuKey = STATUS_SCREEN;
vTaskResume(secondLoop);
return;
}
draw_drawBackground(bg, 90, 90, 3);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
animate_performAngryAnimation(sprite, spriteData);
if (frameCounter % 2 == 0) {
tone(SPK_PIN, 1000, 100);
tone(SPK_PIN, 1000, 200);
tft_clearBuffer(sprite, TFT_TRANSPARENT);
draw_drawSprite(sprite, 18, 72, smallUiElements, FIREWORKS_ICON, 6);
draw_drawSprite(sprite, 174, 72, smallUiElements, FIREWORKS_ICON, 6);
}
frameCounter++;
lastUpdateTime = currentTime;
}
tft_drawBuffer();
}
}
+1 -1
View File
@@ -150,7 +150,7 @@ void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
menu_freeCheckerboard();
loop_resumeLoop();
vTaskResume(secondLoop);
screenKey = MAIN_SCREEN;
+5 -4
View File
@@ -9,7 +9,7 @@
void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* mainSpriteData, struct SpriteData* uiSpriteData) {
loop_pauseLoop();
vTaskSuspend(secondLoop);
uint8_t selectedChara = currentCharacter;
CharacterData* selectedCharaData = &charaData[selectedChara];
@@ -30,7 +30,7 @@ void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteD
case K2_PRESSED:
currentCharacter = selectedChara;
loop_resumeLoop();
vTaskResume(secondLoop);
screenKey = MAIN_SCREEN;
menuKey = STATUS_SCREEN;
@@ -42,7 +42,7 @@ void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteD
sprintf(fileName, "/chara/%02x.bin", charaData[currentCharacter].idChara);
storage_readFile(fileName, mainSpriteData);
loop_resumeLoop();
vTaskResume(secondLoop);
screenKey = MAIN_SCREEN;
menuKey = STATUS_SCREEN;
@@ -64,6 +64,7 @@ void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteD
storage_readFile(fileName, mainSpriteData);
draw_drawSprite(sprite, 18, 72, mainSpriteData, 0, 6);
} else {
tft_drawCenteredText("EMPTY", 4, 120);
}
@@ -81,7 +82,7 @@ void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteD
sprintf(fileName, "/chara/%02x.bin", charaData[currentCharacter].idChara);
storage_readFile(fileName, mainSpriteData);
loop_resumeLoop();
vTaskResume(secondLoop);
screenKey = MAIN_SCREEN;
menuKey = STATUS_SCREEN;
-2
View File
@@ -50,8 +50,6 @@ void menu_drawClockEdit(TFT_eSprite &bg) {
case K3_PRESSED:
// Es un dia random, nada significativo, ya pondre mas adelante que tenga dia del año
rtc.setTime(0, clockMinuteCount, clockHourCount, 1, 11, 2024);
getLocalTime(&timeInfo, 50);
dayUnixTime = mktime(&timeInfo) % SECONDS_IN_DAY;
coldBoot = false;
+2
View File
@@ -18,6 +18,8 @@ void menu_drawHappyScreen(
screenKey = MAIN_SCREEN; // TODO: Change for while battling
menuKey = STATUS_SCREEN;
vTaskResume(secondLoop);
return;
}
+4
View File
@@ -47,6 +47,10 @@ void menu_drawDeathScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteDat
void menu_evolutionScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* mainCharacterSprites);
void menu_mainScreen();
void menu_changeCharaScreen(TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* mainSpriteData, struct SpriteData* uiSpriteData);
void menu_drawAngryScreen(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* spriteData, struct SpriteData* smallUiElements
);
void menu_sleepScreen_sleepAction();
void menu_sleepScreen_recalculateSleep();
+24 -1
View File
@@ -3,16 +3,39 @@
#include "display/display.h"
#include "defs/defs.h"
#include "defs/chara_data.h"
#include "animations/animations.h"
#include "defs/sprite_data.h"
void menu_clearPoopScreen(
TFT_eSprite &bg, TFT_eSprite &sprite, struct SpriteData* spriteData, struct SpriteData* bigUiElements, struct SpriteData* smallUiElements
) {
printf("[AAAAAAA] pausing loop...\n");
vTaskSuspend(secondLoop);
printf("[AAAAAAA] loop paused...\n");
int cleanerXPos = 174;
menu_drawIdleScreen(bg, sprite, spriteData, bigUiElements, smallUiElements);
lastUpdateTime = 0;
printf("[AAAAAAA] drawing idle screen...\n");
draw_drawBackground(bg, 90, 90, 3);
uint8_t offsetX = menu_poopOverlay(bg, sprite, smallUiElements);
printf("[AAAAAAA] drawing animation...\n");
animate_performAnimation(sprite, spriteData, offsetX);
printf("[AAAAAAA] drawing overlay...\n");
menu_uiOverlay(sprite, bigUiElements);
printf("[AAAAAAA] idle screen down...\n");
tft_clearBuffer(sprite, TFT_TRANSPARENT);
while (cleanerXPos > 18) {
draw_drawSprite(sprite, cleanerXPos, 72, smallUiElements, CLEANER_ICON, 6);
draw_drawSprite(sprite, cleanerXPos, 120, smallUiElements, CLEANER_ICON, 6);
+2 -5
View File
@@ -11,7 +11,8 @@ void training_screenTraining1(
TFT_eSprite &bg, TFT_eSprite &sprite,
struct SpriteData* mainCharaData, struct SpriteData* attackSprites
) {
vTaskSuspend(secondLoop);
draw_drawBackground(bg, 90, 90, 3);
draw_drawSpriteCentered(sprite, mainCharaData, 11, 6);
@@ -74,9 +75,5 @@ void training_screenTraining1(
attackResult = ATTACK_PATTERN_MEDIOCRE;
}
loop_pauseLoop();
training_displayTrainingResult(bg, sprite, mainCharaData, attackSprites, attackResult);
loop_resumeLoop();
}
-2
View File
@@ -5,10 +5,8 @@
#include "defs/screen_defs.h"
void menu_uiOverlay(TFT_eSprite &charSprite, struct SpriteData* uiElements) {
struct tm timeInfo;
char hourBuffer[6];
getLocalTime(&timeInfo, RTC_TIMEOUT_THRESHOLD_TIME_MS);
snprintf(hourBuffer, 6, "%02d:%02d", timeInfo.tm_hour, timeInfo.tm_min);
composite1.fillRect(0, 0, 240, 24, TFT_BLACK);
+4 -4
View File
@@ -59,7 +59,7 @@ void training_displayTrainingResult(
case ATTACK_PATTERN_BAD:
pattern = patternBad;
screenKey = MAIN_SCREEN;
screenKey = ANGRY_SCREEN;
charaData[currentCharacter].weight--;
if (charaData[currentCharacter].weight < charaData[currentCharacter].minWeight) {
@@ -71,14 +71,14 @@ void training_displayTrainingResult(
case ATTACK_PATTERN_MEDIOCRE:
default:
pattern = patternMediocre;
screenKey = MAIN_SCREEN;
screenKey = ANGRY_SCREEN;
break;
}
for (int i = 0; i < NUM_ROUNDS; i++) {
training_trainingAttackSounds();
for (int j = 78; j >= -48; j -= 6) {
for (int j = 78; j >= -48; j -= 3) {
draw_drawBackground(bg, 90, 90, 3);
draw_drawSprite(sprite, 126, 72, mainCharaData, 11, 6);
draw_drawAttacks(sprite, attackSprites, j, 72, pattern[i], charaData[currentCharacter].spriteAttackId, 6);
@@ -86,7 +86,7 @@ void training_displayTrainingResult(
tft_drawBuffer();
}
delay(100);
delay(20);
}
+8 -7
View File
@@ -160,10 +160,6 @@ void vpet_reduceTimers(uint8_t diff_sec) {
if (charaData[currentCharacter].strengthCareMistakeTimer > 0) {
charaData[currentCharacter].strengthCareMistakeTimer -= diff_sec;
}
if (charaData[currentCharacter].changeTimerLeft > 0) {
charaData[currentCharacter].changeTimerLeft -= diff_sec;
}
}
void vpet_evalHungerTimer() {
@@ -228,13 +224,17 @@ void vpet_evalStrengthTimer() {
}
}
void vpet_evalChangeTimer() {
void vpet_evalChangeTimer(uint8_t diff_sec) {
if (charaData[currentCharacter].changeTimerLeft > 0) {
charaData[currentCharacter].changeTimerLeft -= diff_sec;
}
if (charaData[currentCharacter].changeTimerLeft <= 0) {
if (change_onChangeTimerComplete()) {
screenKey = TIMER_FINISHED_SCREEN;
interruptKey = EVOLUTION_SCREEN;
pauseLoop = true;
vTaskSuspend(secondLoop);
}
}
}
@@ -259,7 +259,7 @@ void vpet_runVpetTasks() {
vpet_evalTimers();
}
vpet_evalChangeTimer();
vpet_evalChangeTimer(diffSec);
} else if (!charaData[currentCharacter].hatched && charaData[currentCharacter].hatching) {
charaData[currentCharacter].hatchTimer += diffSec;
@@ -272,6 +272,7 @@ void vpet_runVpetTasks() {
}
vpet_debugTimers(diffSec);
debug_printFreeMemory();
runVpetTasks = false;
vpetLastEvaluationTime = currentEvaluationTime;
+1
View File
@@ -14,6 +14,7 @@ void vpet_debugTimers(uint8_t diffSec);
void vpet_runVpetTasks();
void vpet_reduceTimers(uint8_t diff_sec);
void vpet_evalHungerTimer();
void vpet_evalChangeTimer(uint8_t diff_sec);
void vpet_evalStrengthTimer();
#endif