89 lines
2.0 KiB
C
89 lines
2.0 KiB
C
// ui.c
|
|
#include "ui.h"
|
|
#include "display.h"
|
|
#include "led_driver.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include <time.h>
|
|
|
|
static menu_state_t g_menu = MENU_OFF;
|
|
|
|
void ui_set_menu(menu_state_t s)
|
|
{
|
|
g_menu = s;
|
|
}
|
|
|
|
void ui_menu_next(void)
|
|
{
|
|
if (g_menu == MENU_OFF) return;
|
|
|
|
g_menu++;
|
|
if (g_menu > MENU_TEST_DISP)
|
|
g_menu = MENU_MAIN;
|
|
}
|
|
|
|
static void ui_render_menu(void)
|
|
{
|
|
switch (g_menu) {
|
|
case MENU_MAIN: display_text("MENU"); break;
|
|
case MENU_PERC: display_text("PERC"); break;
|
|
case MENU_READ: display_text("READ"); break;
|
|
case MENU_TEST_LED: display_text("LEDS"); break;
|
|
case MENU_TEST_DISP: display_text("DISP"); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
void ui_menu_ok(void)
|
|
{
|
|
switch (g_menu) {
|
|
case MENU_PERC:
|
|
// aqui no futuro: mostra % atual, muda via MQTT, etc
|
|
display_text("70%");
|
|
break;
|
|
|
|
case MENU_READ:
|
|
// aqui no futuro: mostra entradas/saídas da EEPROM
|
|
display_text("CNT ");
|
|
break;
|
|
|
|
case MENU_TEST_LED:
|
|
// efeito simples na roda
|
|
led_clear();
|
|
for (int i = 0; i < led_get_count(); i++) {
|
|
led_set_pixel(i, 0, 0, 40);
|
|
led_show();
|
|
vTaskDelay(pdMS_TO_TICKS(10));
|
|
}
|
|
break;
|
|
|
|
case MENU_TEST_DISP:
|
|
display_text("8888");
|
|
vTaskDelay(pdMS_TO_TICKS(500));
|
|
display_clear();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ui_task(void *pv)
|
|
{
|
|
while (1) {
|
|
if (g_menu == MENU_OFF) {
|
|
// modo normal → relógio + LED do segundo
|
|
time_t now = time(NULL);
|
|
struct tm t;
|
|
localtime_r(&now, &t);
|
|
|
|
display_set_time(t.tm_hour, t.tm_min);
|
|
// aqui podes chamar a animação da roda (se quiseres relógio visual)
|
|
} else {
|
|
ui_render_menu();
|
|
}
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(200));
|
|
}
|
|
}
|