/** * @file display.c * @brief Display manager - main screen and OLED rendering */ #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "oled.h" #include "display.h" #include "app_main.h" static const char *TAG = "display"; /* Display state */ static display_mode_t current_mode = DISPLAY_MODE_CHANNELS; /* Format buffer (unused currently) */ //static char line_buf[24]; void display_init(void) { oled_init(OLED_SDA_GPIO, OLED_SCL_GPIO); ESP_LOGI(TAG, "Display initialized"); } void display_set_mode(display_mode_t mode) { current_mode = mode; } void display_update(adc_data_t *adc_data) { oled_clear(); /* Draw top bar (yellow area - first 16px) */ /* Signal strength, flight battery, TX battery */ oled_draw_string(0, 0, "ALICERC v1.0", OLED_COLOR_WHITE); /* Draw horizontal separator */ oled_draw_hline(0, 16, OLED_WIDTH, OLED_COLOR_WHITE); /* Draw main content based on mode */ switch (current_mode) { case DISPLAY_MODE_CHANNELS: display_draw_channels(adc_data); break; case DISPLAY_MODE_TELEMETRY: display_draw_telemetry(adc_data); break; case DISPLAY_MODE_MENU: /* Menu drawing handled by menu system */ break; } oled_update(); } void display_draw_channels(adc_data_t *adc_data) { char buf[32]; uint8_t y = 20; /* Draw 8 channel values in 4 rows of 2 */ for (int i = 0; i < 8; i += 2) { snprintf(buf, sizeof(buf), "CH%d:%4d CH%d:%4d", i + 1, adc_data->channels[i], i + 2, adc_data->channels[i + 1]); oled_draw_string(0, y, buf, OLED_COLOR_WHITE); y += 10; } /* Draw battery voltage */ snprintf(buf, sizeof(buf), "BAT:%4dmV %3d%%", adc_data->battery_mv, battery_get_percent(adc_data->battery_mv)); oled_draw_string(0, y, buf, OLED_COLOR_WHITE); } void display_draw_telemetry(adc_data_t *adc_data) { char buf[32]; /* Placeholder for telemetry display */ snprintf(buf, sizeof(buf), "RSSI: -- Link: --"); oled_draw_string(0, 20, buf, OLED_COLOR_WHITE); snprintf(buf, sizeof(buf), "RX Batt: -- mV"); oled_draw_string(0, 30, buf, OLED_COLOR_WHITE); } void display_show_message(const char *msg, uint16_t duration_ms) { oled_clear(); oled_draw_string(0, 28, msg, OLED_COLOR_WHITE); oled_update(); vTaskDelay(pdMS_TO_TICKS(duration_ms)); }