91 lines
1.9 KiB
C
91 lines
1.9 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_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);
|
|
}
|
|
} |