Files
MTGcompanion/main/app_state.c
2026-09-11 19:10:31 +02:00

97 lines
2.2 KiB
C

/*
* MTG RFID Companion - System state machine
*/
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "app_state.h"
static SemaphoreHandle_t s_lock;
static app_state_t s_view = APP_STATE_SCANNER;
static int32_t s_life = 20;
static int32_t s_life_preset = 20;
const char *app_state_name(app_state_t state)
{
switch (state) {
case APP_STATE_BOOT: return "BOOT";
case APP_STATE_MENU: return "MENU";
case APP_STATE_SCANNER: return "SCANNER";
case APP_STATE_CARD_VIEW: return "CARD_VIEW";
case APP_STATE_LIFE_COUNTER: return "LIFE_COUNTER";
case APP_STATE_DICE_ROLLER: return "DICE_ROLLER";
case APP_STATE_COMMANDER_TRACKER: return "COMMANDER_TRACKER";
case APP_STATE_TOKEN_SPAWNER: return "TOKEN_SPAWNER";
case APP_STATE_STORAGE_MANAGER: return "STORAGE_MANAGER";
case APP_STATE_DEVICE_INFO: return "DEVICE_INFO";
case APP_STATE_REGISTRATION: return "REGISTRATION";
}
return "UNKNOWN";
}
static void ensure_lock(void)
{
if (s_lock == NULL) {
s_lock = xSemaphoreCreateMutex();
}
}
void app_set_life(int32_t life)
{
ensure_lock();
xSemaphoreTake(s_lock, portMAX_DELAY);
s_life = life;
xSemaphoreGive(s_lock);
}
int32_t app_get_life(void)
{
ensure_lock();
xSemaphoreTake(s_lock, portMAX_DELAY);
int32_t v = s_life;
xSemaphoreGive(s_lock);
return v;
}
void app_set_life_preset(int32_t preset)
{
ensure_lock();
xSemaphoreTake(s_lock, portMAX_DELAY);
s_life_preset = preset;
s_life = preset;
xSemaphoreGive(s_lock);
}
int32_t app_get_life_preset(void)
{
ensure_lock();
xSemaphoreTake(s_lock, portMAX_DELAY);
int32_t v = s_life_preset;
xSemaphoreGive(s_lock);
return v;
}
void app_set_view(app_state_t view)
{
ensure_lock();
xSemaphoreTake(s_lock, portMAX_DELAY);
s_view = view;
xSemaphoreGive(s_lock);
}
app_state_t app_get_view(void)
{
ensure_lock();
xSemaphoreTake(s_lock, portMAX_DELAY);
app_state_t v = s_view;
xSemaphoreGive(s_lock);
return v;
}
void app_enter_keyed_view(app_state_t view)
{
if (view == APP_STATE_LIFE_COUNTER || view == APP_STATE_CARD_VIEW) {
app_set_view(view);
}
}