// ui.c #include "ui.h" #include "display.h" #include "led_driver.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include 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_top("MENU"); break; case MENU_PERC: display_text_top("PERC"); break; case MENU_READ: display_text_top("READ"); break; case MENU_TEST_LED: display_text_top("LEDS"); break; case MENU_TEST_DISP: display_text_top("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_top("70%"); break; case MENU_READ: // aqui no futuro: mostra entradas/saídas da EEPROM display_text_top("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_top("8888"); vTaskDelay(pdMS_TO_TICKS(500)); display_clear_top(); 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_top(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)); } }