/*******************************************************************************
* Main Entry Point
******************************************************************************/
void part4_ex3_ipc_sensor(void)
{
/* ===== ล้างหน้าจอ ===== */
lv_obj_t *scr = lv_screen_active();
lv_obj_clean(scr);
lv_obj_set_style_bg_color(scr, lv_color_hex(0x0d1117), 0);
/* ===== Title ===== */
label_title = lv_label_create(scr);
lv_label_set_text(label_title, "IPC Sensor Monitor");
lv_obj_set_style_text_font(label_title, &lv_font_montserrat_20, 0);
lv_obj_set_style_text_color(label_title, lv_color_hex(0x58a6ff), 0);
lv_obj_align(label_title, LV_ALIGN_TOP_MID, 0, 5);
/* ===== Accelerometer Chart ===== */
chart_accel = lv_chart_create(scr);
lv_obj_set_size(chart_accel, 290, 110);
lv_obj_align(chart_accel, LV_ALIGN_TOP_MID, 0, 32);
lv_chart_set_type(chart_accel, LV_CHART_TYPE_LINE);
lv_chart_set_point_count(chart_accel, CHART_POINT_COUNT);
lv_chart_set_range(chart_accel, LV_CHART_AXIS_PRIMARY_Y, -200, 200);
lv_obj_set_style_bg_color(chart_accel, lv_color_hex(0x010409), 0);
lv_obj_set_style_border_color(chart_accel, lv_color_hex(0x30363d), 0);
lv_obj_set_style_line_width(chart_accel, 2, LV_PART_ITEMS);
lv_obj_set_style_size(chart_accel, 0, 0, LV_PART_INDICATOR);
/* Series: X(Red), Y(Green), Z(Blue) */
ser_x = lv_chart_add_series(chart_accel,
lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y);
ser_y = lv_chart_add_series(chart_accel,
lv_palette_main(LV_PALETTE_GREEN), LV_CHART_AXIS_PRIMARY_Y);
ser_z = lv_chart_add_series(chart_accel,
lv_palette_main(LV_PALETTE_BLUE), LV_CHART_AXIS_PRIMARY_Y);
/* ===== Legend ===== */
lv_obj_t *legend_panel = lv_obj_create(scr);
lv_obj_set_size(legend_panel, 290, 22);
lv_obj_align(legend_panel, LV_ALIGN_TOP_MID, 0, 145);
lv_obj_set_style_bg_opa(legend_panel, LV_OPA_TRANSP, 0);
lv_obj_set_style_border_width(legend_panel, 0, 0);
lv_obj_set_style_pad_all(legend_panel, 0, 0);
lv_obj_set_flex_flow(legend_panel, LV_FLEX_FLOW_ROW);
lv_obj_set_flex_align(legend_panel,
LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lv_obj_remove_flag(legend_panel, LV_OBJ_FLAG_SCROLLABLE);
/* X legend */
lv_obj_t *lx = lv_label_create(legend_panel);
lv_label_set_text(lx, "X");
lv_obj_set_style_text_color(lx, lv_palette_main(LV_PALETTE_RED), 0);
lv_obj_set_style_text_font(lx, &lv_font_montserrat_14, 0);
lv_obj_t *sep1 = lv_label_create(legend_panel);
lv_label_set_text(sep1, " ");
/* Y legend */
lv_obj_t *ly = lv_label_create(legend_panel);
lv_label_set_text(ly, "Y");
lv_obj_set_style_text_color(ly, lv_palette_main(LV_PALETTE_GREEN), 0);
lv_obj_set_style_text_font(ly, &lv_font_montserrat_14, 0);
lv_obj_t *sep2 = lv_label_create(legend_panel);
lv_label_set_text(sep2, " ");
/* Z legend */
lv_obj_t *lz = lv_label_create(legend_panel);
lv_label_set_text(lz, "Z");
lv_obj_set_style_text_color(lz, lv_palette_main(LV_PALETTE_BLUE), 0);
lv_obj_set_style_text_font(lz, &lv_font_montserrat_14, 0);
/* ===== Accel Values Label ===== */
label_accel = lv_label_create(scr);
lv_label_set_text(label_accel, "Accel X:-- Y:-- Z:--");
lv_obj_set_style_text_font(label_accel, &lv_font_montserrat_14, 0);
lv_obj_set_style_text_color(label_accel, lv_color_hex(0xc9d1d9), 0);
lv_obj_align(label_accel, LV_ALIGN_TOP_MID, 0, 170);
/* ===== ADC Values Label ===== */
label_adc = lv_label_create(scr);
lv_label_set_text(label_adc, "ADC CH0:-- CH1:--");
lv_obj_set_style_text_font(label_adc, &lv_font_montserrat_14, 0);
lv_obj_set_style_text_color(label_adc, lv_color_hex(0x8b949e), 0);
lv_obj_align(label_adc, LV_ALIGN_TOP_MID, 0, 192);
/* ===== Sample Rate Label ===== */
label_rate = lv_label_create(scr);
lv_label_set_text(label_rate, "Rate: -- sps | Total: 0");
lv_obj_set_style_text_font(label_rate, &lv_font_montserrat_12, 0);
lv_obj_set_style_text_color(label_rate, lv_color_hex(0x484f58), 0);
lv_obj_align(label_rate, LV_ALIGN_BOTTOM_MID, 0, -8);
/* ===== Register IPC Callback ===== */
cm55_ipc_register_callback(ipc_sensor_callback, NULL);
/* ===== Create Timers ===== */
/* Request IMU ทุก 100ms */
lv_timer_create(sensor_request_timer_cb, SENSOR_POLL_MS, NULL);
/* Request ADC ทุก 100ms (offset 50ms จาก IMU) */
lv_timer_t *adc_timer = lv_timer_create(adc_request_timer_cb,
SENSOR_POLL_MS, NULL);
/* หน่วงเวลาเริ่มต้น 50ms เพื่อไม่ให้ชนกับ IMU request */
lv_timer_set_repeat_count(adc_timer, -1);
/* UI update ทุก 50ms */
lv_timer_create(ui_update_timer_cb, 50, NULL);
/* Initialize timing */
last_rate_tick = lv_tick_get();
CM55_LOGI("Part4 Ex3: IPC Sensor Monitor initialized");
}