#include "aic-eec.h"
/* ===== Global Variables ===== */
static lv_obj_t * raw_label;
static lv_obj_t * percent_label;
static lv_obj_t * voltage_label;
static lv_obj_t * adc_bar;
static lv_obj_t * adc_slider;
/* ===== Timer Callback: Poll ADC ===== */
static void adc_poll_cb(lv_timer_t * t)
{
/* [1] Read Hardware */
uint16_t raw = aic_adc_read();
/* [2] Convert */
int percent = (int)((uint32_t)raw * 100 / 4095);
float voltage = (float)raw * 3.3f / 4095.0f;
/* [3] Update Labels */
lv_label_set_text_fmt(raw_label, "Raw: %d / 4095", (int)raw);
lv_label_set_text_fmt(percent_label, "%d%%", percent);
lv_label_set_text_fmt(voltage_label, "Voltage: %.2fV", voltage);
/* [4] Update Bar */
lv_bar_set_value(adc_bar, percent, LV_ANIM_ON);
/* [5] Update read-only Slider */
lv_slider_set_value(adc_slider, percent, LV_ANIM_ON);
}
/* ===== Main Function ===== */
void part1_ex8_hw_adc_display(void)
{
/* ============================== */
/* HARDWARE INITIALIZATION */
/* ============================== */
aic_sensors_init(); /* CRITICAL: must call before adc_read! */
/* ============================== */
/* LVGL UI SETUP */
/* ============================== */
lv_obj_t * scr = lv_screen_active();
lv_obj_set_style_bg_color(scr, lv_color_hex(0x1a1a2e), 0);
/* --- Title --- */
lv_obj_t * title = lv_label_create(scr);
lv_label_set_text(title, "Lab 8: HW ADC Display");
lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0);
lv_obj_set_style_text_font(title, &lv_font_montserrat_18, 0);
lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 10);
/* --- Container --- */
lv_obj_t * cont = lv_obj_create(scr);
lv_obj_set_size(cont, 440, 200);
lv_obj_align(cont, LV_ALIGN_CENTER, 0, 10);
lv_obj_set_style_bg_color(cont, lv_color_hex(0x16213e), 0);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(cont, LV_FLEX_ALIGN_CENTER,
LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lv_obj_set_style_pad_row(cont, 8, 0);
lv_obj_set_style_pad_all(cont, 15, 0);
/* --- Row: Raw + Voltage --- */
lv_obj_t * row_top = lv_obj_create(cont);
lv_obj_set_size(row_top, LV_PCT(100), 30);
lv_obj_set_flex_flow(row_top, LV_FLEX_FLOW_ROW);
lv_obj_set_flex_align(row_top, LV_FLEX_ALIGN_SPACE_BETWEEN,
LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lv_obj_set_style_bg_opa(row_top, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(row_top, 0, 0);
lv_obj_set_style_pad_all(row_top, 0, 0);
lv_obj_remove_flag(row_top, LV_OBJ_FLAG_SCROLLABLE);
raw_label = lv_label_create(row_top);
lv_label_set_text(raw_label, "Raw: --- / 4095");
lv_obj_set_style_text_color(raw_label, lv_color_hex(0xCCCCCC), 0);
voltage_label = lv_label_create(row_top);
lv_label_set_text(voltage_label, "Voltage: --.--V");
lv_obj_set_style_text_color(voltage_label, lv_color_hex(0x00FF88), 0);
/* --- Bar Widget --- */
adc_bar = lv_bar_create(cont);
lv_obj_set_size(adc_bar, LV_PCT(90), 25);
lv_bar_set_range(adc_bar, 0, 100);
lv_bar_set_value(adc_bar, 0, LV_ANIM_OFF);
lv_obj_set_style_bg_color(adc_bar, lv_color_hex(0x333333), 0);
lv_obj_set_style_bg_color(adc_bar, lv_palette_main(LV_PALETTE_BLUE),
LV_PART_INDICATOR);
/* --- Percent Label (large) --- */
percent_label = lv_label_create(cont);
lv_label_set_text(percent_label, "0%");
lv_obj_set_style_text_color(percent_label, lv_color_hex(0x00BFFF), 0);
lv_obj_set_style_text_font(percent_label, &lv_font_montserrat_24, 0);
/* --- Read-only Slider --- */
adc_slider = lv_slider_create(cont);
lv_obj_set_size(adc_slider, LV_PCT(90), 15);
lv_slider_set_range(adc_slider, 0, 100);
lv_slider_set_value(adc_slider, 0, LV_ANIM_OFF);
lv_obj_remove_flag(adc_slider, LV_OBJ_FLAG_CLICKABLE); /* Read-only! */
lv_obj_set_style_bg_color(adc_slider, lv_color_hex(0x333333), 0);
lv_obj_set_style_bg_color(adc_slider,
lv_palette_main(LV_PALETTE_CYAN), LV_PART_INDICATOR);
/* --- Footer --- */
lv_obj_t * footer = lv_label_create(scr);
lv_label_set_text(footer,
"[Part II - HW] Turn the potentiometer on the board");
lv_obj_set_style_text_color(footer, lv_color_hex(0x888888), 0);
lv_obj_align(footer, LV_ALIGN_BOTTOM_MID, 0, -10);
/* ============================== */
/* START POLLING TIMER */
/* ============================== */
lv_timer_create(adc_poll_cb, 100, NULL); /* 100ms = 10 Hz */
}