#include "apps.h" #include "os_gfx.h" #include "os_status.h" #include "sys_uart.h" #include #include #include "esp_netif.h" #include "esp_log.h" static const uint32_t s_baud_presets[] = {9600, 19200, 38400, 57600, 115200, 230400}; #define BAUD_PRESETS_COUNT (sizeof(s_baud_presets) / sizeof(s_baud_presets[0])) static void serial_init(void) { sys_uart_init(SYS_UART_DEFAULT_BAUD); } static void serial_enter(void) { } static void serial_update(uint32_t delta_ms) { (void)delta_ms; sys_status_t status; sys_status_get(&status); sys_gfx_draw_status_bar(&status); uint32_t rx_count = 0, tx_count = 0; sys_uart_get_stats(&rx_count, &tx_count); uint32_t baud = sys_uart_get_baud_rate(); /* Title */ sys_gfx_draw_str_3x5(3, 9, "SERIAL CONSOLE", COLOR_WHITE); /* Web URL / IP Info */ char ip_str[24] = "192.168.4.1"; if (status.wifi_state == WIFI_STATE_CONNECTED) { esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); if (netif) { esp_netif_ip_info_t ip_info; if (esp_netif_get_ip_info(netif, &ip_info) == ESP_OK) { esp_ip4addr_ntoa(&ip_info.ip, ip_str, sizeof(ip_str)); } } } char url_buf[32]; snprintf(url_buf, sizeof(url_buf), "IP:%s", ip_str); sys_gfx_draw_str_3x5(3, 16, url_buf, COLOR_WHITE); /* Stats Line: Baud, RX, TX */ char stats_buf[32]; snprintf(stats_buf, sizeof(stats_buf), "B:%lu R:%lu T:%lu", (unsigned long)baud, (unsigned long)rx_count, (unsigned long)tx_count); sys_gfx_draw_str_3x5(3, 23, stats_buf, COLOR_WHITE); sys_gfx_draw_action_bar("C:PING D:BAUD", "H:HOME"); } static void serial_handle_input(input_action_t action) { if (action == INPUT_ACTION_CLICK) { sys_uart_write_str("ESP32C3-OS PING\r\n"); sys_gfx_show_toast("TX: PING SENT", 1000); } else if (action == INPUT_ACTION_DOUBLE_CLICK) { uint32_t current_baud = sys_uart_get_baud_rate(); size_t next_idx = 0; for (size_t i = 0; i < BAUD_PRESETS_COUNT; i++) { if (s_baud_presets[i] == current_baud) { next_idx = (i + 1) % BAUD_PRESETS_COUNT; break; } } sys_uart_set_baud_rate(s_baud_presets[next_idx]); char toast[24]; snprintf(toast, sizeof(toast), "BAUD:%lu", (unsigned long)s_baud_presets[next_idx]); sys_gfx_show_toast(toast, 1200); } else if (action == INPUT_ACTION_LONG_PRESS) { sys_uart_clear_rx_buffer(); sys_gfx_show_toast("BUF CLEARED", 1000); } } static void serial_exit(void) { } const sys_app_t g_app_serial = { .id = "serial", .name = "Web Serial", .init = serial_init, .enter = serial_enter, .update = serial_update, .handle_input = serial_handle_input, .exit = serial_exit, };