97 lines
2.2 KiB
C
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);
|
|
}
|
|
} |