Initial commit - sync AliceRC to Gitea
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* @file display.c
|
||||
* @brief Display manager - main screen and OLED rendering
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#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));
|
||||
}
|
||||
Reference in New Issue
Block a user