/* * MTG RFID Companion - System state machine */ #include #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_SCANNER: return "SCANNER"; case APP_STATE_CARD_VIEW: return "CARD_VIEW"; case APP_STATE_LIFE_COUNTER: return "LIFE_COUNTER"; 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); } }