Phase 7: EC11 encoder, life counter views, WS2812B RMT + LEDC buzzer feedback, E2E UI state machine; document build/hardware notes
This commit is contained in:
91
main/app_state.c
Normal file
91
main/app_state.c
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user