心电图 (ecg)
这个示例模板主要演示心电图曲线的效果,主要有三个页面:
-
心电图主页面
-
血氧/血糖显示页面
-
二维码页面

自定义 custom 代码的实现
通过 lv_line 来实现心电图曲线 recycle 模式
static void sin_timer(lv_timer_t *timer)
{
float ecg_value = generate_ecg_waveform(ecg.index);
if (ecg_value < 0.0f)
ecg_value = 0.0f;
if (ecg_value > 400.0f)
ecg_value = 400.0f;
ecg.points[ecg.index].x = ecg.index * 4.0f;
ecg.points[ecg.index].y = ecg_value;
lv_line_set_points(ecg.line, ecg.points, ecg.index + 1);
ecg.index++;
if (ecg.index >= ECG_DATA_LENGTH)
{
ecg.index = 0;
}
}
void ecg_line_init()
{
lv_obj_t *btn2 = screen_get(&ui_manager)->button_2;
lv_obj_t *btn3 = screen_get(&ui_manager)->button_3;
lv_obj_set_style_bg_color(btn2, lv_color_hex(0xffaa00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(btn3, lv_color_hex(0x6db6f2), LV_PART_MAIN | LV_STATE_DEFAULT);
ecg.line = lv_line_create(screen_get(&ui_manager)->obj);
lv_obj_set_size(ecg.line, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
lv_line_set_y_invert(ecg.line, true);
lv_obj_set_pos(ecg.line, 10, 100);
lv_obj_set_style_line_width(ecg.line, 2, 0);
lv_obj_set_style_line_rounded(ecg.line, true, 0);
lv_obj_set_style_line_color(ecg.line, lv_color_hex(0x60d1fd), LV_PART_MAIN | LV_STATE_DEFAULT);
ecg.ecg_timer = lv_timer_create(sin_timer, 20, NULL);
}通过 lv_chart 来实现心电图曲线 shift 模式
static void ecg_chart_timer_cb(lv_timer_t *timer)
{
float ecg_value = generate_ecg_waveform(ecg.ecg_chart_index);
lv_chart_set_next_value(ecg.chart_ecg, ecg.chart_ecg_ser, ecg_value);
ecg.ecg_chart_index++;
if (ecg.ecg_chart_index >= 150)
{
ecg.ecg_chart_index = 0;
}
}
void ecg_chart_init()
{
lv_obj_t *btn2 = screen_get(&ui_manager)->button_2;
lv_obj_t *btn3 = screen_get(&ui_manager)->button_3;
lv_obj_set_style_bg_color(btn2, lv_color_hex(0x6db6f2), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(btn3, lv_color_hex(0xffaa00), LV_PART_MAIN | LV_STATE_DEFAULT);
if (ecg.chart_ecg == NULL)
{
ecg.chart_ecg = lv_chart_create(screen_get(&ui_manager)->obj);
}
lv_chart_set_type(ecg.chart_ecg, LV_CHART_TYPE_LINE);
lv_chart_set_range(ecg.chart_ecg, LV_CHART_AXIS_PRIMARY_Y, 0, 250);
lv_chart_set_point_count(ecg.chart_ecg, 150);
lv_obj_set_pos(ecg.chart_ecg, 12, 64);
lv_obj_set_size(ecg.chart_ecg, 800, 290);
lv_chart_set_update_mode(ecg.chart_ecg, LV_CHART_UPDATE_MODE_SHIFT);
ecg.chart_ecg_ser = lv_chart_add_series(ecg.chart_ecg, lv_color_hex(0x60d1fd), LV_CHART_AXIS_PRIMARY_Y);
lv_obj_set_style_line_rounded(ecg.chart_ecg, true, LV_PART_ITEMS);
lv_obj_set_style_width(ecg.chart_ecg, 0, LV_PART_INDICATOR);
lv_obj_set_style_bg_opa(ecg.chart_ecg, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(ecg.chart_ecg, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_line_width(ecg.chart_ecg, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
ecg.ecg_chart_timer = lv_timer_create(ecg_chart_timer_cb, 30, NULL);
}
