Files
tactility_apps/Apps/TamaTac/main/Source/TamaTac.h
T
2026-02-13 21:26:23 +01:00

131 lines
3.6 KiB
C++

/**
* @file TamaTac.h
* @brief TamaTac virtual pet app for Tactility
*/
#pragma once
#include <TactilityCpp/App.h>
#include <tt_app.h>
#include <lvgl.h>
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>
#include "PetLogic.h"
#include "Sprites.h"
#include "MainView.h"
#include "StatsView.h"
#include "MenuView.h"
#include "SettingsView.h"
#include "PatternGame.h"
#include "ReactionGame.h"
#include "CemeteryView.h"
#include "Achievements.h"
#include "SfxEngine.h"
// Canvas buffers for sprite rendering (shared by views)
extern lv_color_t TamaTac_canvasBuffer[72 * 72];
extern lv_color_t TamaTac_iconBuffers[12][16 * 16];
class TamaTac final : public App {
public:
// Active view type (scoped to TamaTac class)
enum class ViewType {
None,
Main,
Menu,
Stats,
Settings,
PatternGameView,
ReactionGameView,
CemeteryViewType,
AchievementsViewType
};
private:
// UI elements
lv_obj_t* toolbar = nullptr;
lv_obj_t* wrapperWidget = nullptr;
lv_obj_t* menuButton = nullptr;
// Views
MainView mainView;
StatsView statsView;
MenuView menuView;
SettingsView settingsView;
PatternGame patternGame;
ReactionGame reactionGame;
CemeteryView cemeteryView;
AchievementsView achievementsView;
ViewType activeView = ViewType::None;
// Static data (singleton — only one TamaTac instance exists at a time)
static PetLogic* petLogic;
static TimerHandle_t updateTimer;
static SemaphoreHandle_t timerMutex;
static AppHandle currentApp;
static AppLaunchId resetDialogId;
static LifeStage lastKnownStage;
static SfxEngine* sfxEngine;
static DecaySpeed decaySpeed;
static uint32_t lastPetTime;
static bool pendingResetUI;
public:
void onCreate(AppHandle app) override;
void onShow(AppHandle context, lv_obj_t* parent) override;
void onHide(AppHandle context) override;
void onDestroy(AppHandle app) override;
void onResult(AppHandle app, void* data, AppLaunchId launchId, AppResult result, BundleHandle resultData) override;
// Action handlers (called by MainView)
void handleFeedAction();
void handlePlayAction();
void handleMedicineAction();
void handleSleepAction();
void handlePetTap();
// Mini-game callbacks
void onPatternGameComplete(int roundsCompleted, bool won);
void onReactionGameComplete(int score, bool won);
// Settings handlers (called by SettingsView)
void setSoundEnabled(bool enabled);
void setDecaySpeed(DecaySpeed speed);
// View navigation (called by MenuView)
void showMainView();
void showStatsView();
void showSettingsView();
void showCemeteryView();
void showAchievementsView();
// Getters (note: getSfxEngine() may return nullptr before onCreate() or after onDestroy())
static DecaySpeed getDecaySpeed() { return decaySpeed; }
static SfxEngine* getSfxEngine() { return sfxEngine; }
private:
// View management
void stopActiveView();
void showMenuView();
// Timer callback (called every 30 seconds)
static void onTimerUpdate(TimerHandle_t timer);
// Event handlers
static void onCleanClicked(lv_event_t* e);
static void onMenuClicked(lv_event_t* e);
static void onResetClicked(lv_event_t* e);
// View navigation (internal)
void showPatternGame();
void showReactionGame();
friend class MainView;
friend class StatsView;
friend class MenuView;
friend class SettingsView;
friend class PatternGame;
friend class ReactionGame;
friend class CemeteryView;
friend class AchievementsView;
};