Copy void part3_ex1_waveform_generator(void)
{
lv_obj_t *scr = lv_screen_active();
lv_obj_set_style_bg_color(scr, lv_color_hex(0x0a0a1e), 0);
/* ===== Title ===== */
lv_obj_t *title = lv_label_create(scr);
lv_label_set_text(title, "Part 3 Ex1: Waveform Generator");
lv_obj_set_style_text_color(title, lv_color_hex(0x00ff88), 0);
lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 5);
/* ===== Waveform Chart ===== */
wave_chart = lv_chart_create(scr);
lv_obj_set_size(wave_chart, 380, 150);
lv_obj_align(wave_chart, LV_ALIGN_TOP_MID, 0, 30);
lv_chart_set_type(wave_chart, LV_CHART_TYPE_LINE);
lv_chart_set_point_count(wave_chart, DISPLAY_POINTS);
lv_chart_set_range(wave_chart, LV_CHART_AXIS_PRIMARY_Y, 0, 100);
lv_chart_set_div_line_count(wave_chart, 4, 5);
/* สไตล์ oscilloscope - พื้นหลังดำ เส้น grid สีเข้ม */
lv_obj_set_style_bg_color(wave_chart, lv_color_hex(0x001a00), 0);
lv_obj_set_style_line_color(wave_chart, lv_color_hex(0x003300), LV_PART_MAIN);
lv_obj_set_style_border_color(wave_chart, lv_color_hex(0x00ff00), 0);
lv_obj_set_style_border_width(wave_chart, 1, 0);
lv_obj_set_style_size(wave_chart, 0, 0, LV_PART_INDICATOR);
/* เพิ่ม series สีเขียว (oscilloscope style) */
wave_series = lv_chart_add_series(wave_chart,
lv_color_hex(0x00ff00),
LV_CHART_AXIS_PRIMARY_Y);
/* ===== Dropdown เลือก Waveform ===== */
lv_obj_t *dropdown = lv_dropdown_create(scr);
lv_dropdown_set_options(dropdown, "Square\nSine\nTriangle\nSawtooth");
lv_dropdown_set_selected(dropdown, WAVE_SINE);
lv_obj_set_width(dropdown, 120);
lv_obj_align(dropdown, LV_ALIGN_BOTTOM_LEFT, 10, -55);
lv_obj_add_event_cb(dropdown, wave_dropdown_cb,
LV_EVENT_VALUE_CHANGED, NULL);
/* ===== Frequency Slider ===== */
lv_obj_t *freq_lbl = lv_label_create(scr);
lv_label_set_text(freq_lbl, "Freq:");
lv_obj_set_style_text_color(freq_lbl, lv_color_hex(0xaaaaaa), 0);
lv_obj_align(freq_lbl, LV_ALIGN_BOTTOM_LEFT, 145, -70);
lv_obj_t *freq_slider = lv_slider_create(scr);
lv_slider_set_range(freq_slider, 10, 1000);
lv_slider_set_value(freq_slider, DEFAULT_FREQ, LV_ANIM_OFF);
lv_obj_set_width(freq_slider, 160);
lv_obj_align(freq_slider, LV_ALIGN_BOTTOM_LEFT, 185, -70);
lv_obj_add_event_cb(freq_slider, freq_slider_cb,
LV_EVENT_VALUE_CHANGED, NULL);
freq_label = lv_label_create(scr);
lv_label_set_text_fmt(freq_label, "%u Hz", DEFAULT_FREQ);
lv_obj_set_style_text_color(freq_label, lv_color_hex(0x00ffff), 0);
lv_obj_align(freq_label, LV_ALIGN_BOTTOM_RIGHT, -10, -70);
/* ===== Amplitude Slider ===== */
lv_obj_t *amp_lbl_title = lv_label_create(scr);
lv_label_set_text(amp_lbl_title, "Amp:");
lv_obj_set_style_text_color(amp_lbl_title, lv_color_hex(0xaaaaaa), 0);
lv_obj_align(amp_lbl_title, LV_ALIGN_BOTTOM_LEFT, 145, -45);
lv_obj_t *amp_slider = lv_slider_create(scr);
lv_slider_set_range(amp_slider, 100, 1000);
lv_slider_set_value(amp_slider, DEFAULT_AMP, LV_ANIM_OFF);
lv_obj_set_width(amp_slider, 160);
lv_obj_align(amp_slider, LV_ALIGN_BOTTOM_LEFT, 185, -45);
lv_obj_add_event_cb(amp_slider, amp_slider_cb,
LV_EVENT_VALUE_CHANGED, NULL);
amp_label = lv_label_create(scr);
lv_label_set_text_fmt(amp_label, "Amp: %d", DEFAULT_AMP);
lv_obj_set_style_text_color(amp_label, lv_color_hex(0xffff00), 0);
lv_obj_align(amp_label, LV_ALIGN_BOTTOM_RIGHT, -10, -45);
/* ===== Info Label ===== */
info_label = lv_label_create(scr);
lv_obj_set_style_text_color(info_label, lv_color_hex(0x888888), 0);
lv_obj_align(info_label, LV_ALIGN_BOTTOM_MID, 0, -10);
/* สร้าง waveform แรก */
generate_waveform();
}