Edit online

心电图 (ecg)

这个示例模板主要演示心电图曲线的效果,主要有三个页面:

  1. 心电图主页面

  2. 血氧/血糖显示页面

  3. 二维码页面


_images/ecg_main.png

自定义 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);
}