FAC_SPO2,
#endif
#endif
+ #ifdef __PULSE_WAVE_REAL_TIME_UI__
+ FAC_PULSE_WAVE,
+ #endif
#endif
#else
HEART_RATE,
static void factorymode_agetest_lcd_test_create(void *param);
static void factory_agetest_lcdcolor_timer_func(void * param);
static void factorymode_antenna_coupling_test_stop(void);
+#ifdef __PULSE_WAVE_REAL_TIME_UI__
+static void mmi_factorymode_pulse_wave_test_ui_data_deinit(void);
+static void mmi_factorymode_pulse_wave_event_cb(lv_obj_t * btn, lv_event_t e);
+#endif
/**********************
* STATIC VARIABLES
break;
#endif
#endif
+ #ifdef __PULSE_WAVE_REAL_TIME_UI__
+ case FAC_PULSE_WAVE:
+ mmi_hsensor_close();
+ mmi_factorymode_pulse_wave_test_ui_data_deinit();
+ break;
+ #endif
#endif
#else
case HEART_RATE:
Hal_Timer_Stop(fac_ext->timer);
fac_ext->timer = NULL;
}
+ if(NULL != fac_ext->cycle_timer_id)
+ {
+ Hal_Timer_Stop(fac_ext->cycle_timer_id);
+ fac_ext->cycle_timer_id = NULL;
+ }
}
}
}
}
+
+
+#ifdef __PULSE_WAVE_REAL_TIME_UI__
+
+#define PULSE_WAVE_ABS(x) (((x) < 0) ? (-(x)) : (x))
+#define PULSE_WAVE_TOTAL_COUNT (56)
+#define PULSE_WAVE_DATA_SECOND_NUM (2)
+#define PULSE_WAVE_POINT_NUM_MAX (MMI_HENGAI_BP_RAW_DATA_SAMPLE_RATE * PULSE_WAVE_DATA_SECOND_NUM)
+#define PULSE_WAVE_LINE_CONT_W (340)
+#define PULSE_WAVE_LINE_CONT_H (360) // (400)
+
+static lv_point_t s_line_point_array[PULSE_WAVE_POINT_NUM_MAX] = {0};
+static int s_last_raw_data_len = 0;
+static int * s_line_y_array_ptr = NULL;
+static int s_current_raw_data_len = 0;
+static unsigned char s_update_counter = 0;
+static unsigned char s_total_counter = 0;
+
+static void mmi_factorymode_pulse_wave_test_ui_data_init(void)
+{
+ _lv_memset_00(s_line_point_array, sizeof(lv_point_t) * PULSE_WAVE_POINT_NUM_MAX);
+
+ s_last_raw_data_len = 0;
+ s_current_raw_data_len = 0;
+ s_update_counter = 0;
+
+ if(NULL != s_line_y_array_ptr)
+ {
+ lv_mem_free(s_line_y_array_ptr);
+ s_line_y_array_ptr = NULL;
+ }
+ s_line_y_array_ptr = (int *)lv_mem_alloc(sizeof(int) * PULSE_WAVE_POINT_NUM_MAX);
+ _lv_memset_00(s_line_y_array_ptr, sizeof(int) * PULSE_WAVE_POINT_NUM_MAX);
+}
+
+static void mmi_factorymode_pulse_wave_test_ui_data_deinit(void)
+{
+ if(NULL != s_line_y_array_ptr)
+ {
+ lv_mem_free(s_line_y_array_ptr);
+ s_line_y_array_ptr = NULL;
+ }
+}
+
+static int mmi_factorymode_pulse_wave_test_line_update(lv_obj_t * line)
+{
+ int * temp_ptr = NULL;
+ int temp_len = 0;
+ unsigned int i = 0;
+ int temp_value = 0;
+ unsigned int x_step_value = 0;
+ unsigned int y_step_value = 0;
+
+ if(NULL == line)
+ {
+ return -1;
+ }
+
+ if(NULL == s_line_y_array_ptr)
+ {
+ s_line_y_array_ptr = (int *)lv_mem_alloc(sizeof(int) * PULSE_WAVE_POINT_NUM_MAX);
+ }
+ _lv_memset_00(s_line_y_array_ptr, sizeof(int) * PULSE_WAVE_POINT_NUM_MAX);
+
+ temp_ptr = fr8012haq_blood_data_get(&s_current_raw_data_len);
+ temp_len = s_current_raw_data_len - s_last_raw_data_len;
+ if(0 >= temp_len)
+ return -2;
+ if(PULSE_WAVE_POINT_NUM_MAX < temp_len)
+ temp_len = PULSE_WAVE_POINT_NUM_MAX;
+ _lv_memcpy(s_line_y_array_ptr, temp_ptr + s_last_raw_data_len, sizeof(int) * temp_len);
+ s_last_raw_data_len = s_current_raw_data_len;
+
+ temp_value = s_line_y_array_ptr[0];
+ for(i = 0; i < temp_len; i++)
+ {
+ if(PULSE_WAVE_ABS(temp_value) < PULSE_WAVE_ABS(s_line_y_array_ptr[i]))
+ {
+ temp_value = s_line_y_array_ptr[i];
+ }
+ }
+ y_step_value = PULSE_WAVE_ABS(temp_value) / (PULSE_WAVE_LINE_CONT_H / 2 - 10);
+ x_step_value = PULSE_WAVE_LINE_CONT_W / temp_len;
+ for(i = 0; i < temp_len; i++)
+ {
+ if(0 < i)
+ s_line_point_array[i].x = s_line_point_array[i-1].x + x_step_value;
+ else
+ s_line_point_array[i].x = 5;
+
+ if(0 > s_line_y_array_ptr[i])
+ {
+ //s_line_point_array[i].y = (PULSE_WAVE_LINE_CONT_H / 2) - (lv_coord_t)(PULSE_WAVE_ABS(s_line_y_array_ptr[i]) / y_step_value);
+ s_line_point_array[i].y = (PULSE_WAVE_LINE_CONT_H / 2) + (lv_coord_t)(PULSE_WAVE_ABS(s_line_y_array_ptr[i]) / y_step_value);
+ }
+ else
+ {
+ //s_line_point_array[i].y = (PULSE_WAVE_LINE_CONT_H / 2) + (s_line_y_array_ptr[i] / y_step_value);
+ s_line_point_array[i].y = (PULSE_WAVE_LINE_CONT_H / 2) - (s_line_y_array_ptr[i] / y_step_value);
+ }
+ }
+ lv_line_set_points(line, s_line_point_array, temp_len);
+
+ return 0;
+}
+
+static lv_obj_t * mmi_factorymode_pulse_wave_test_line_create(lv_obj_t * par)
+{
+ lv_obj_t * cont = lv_chart_create(par, NULL);
+ lv_obj_set_style_local_bg_color(cont, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK); // LV_COLOR_WHITE);
+
+ lv_obj_set_size(cont, PULSE_WAVE_LINE_CONT_W, PULSE_WAVE_LINE_CONT_H);
+ lv_obj_set_click(cont, false);
+
+ lv_obj_align(cont, NULL, LV_ALIGN_CENTER, 0, 0);
+
+ lv_obj_t * line = lv_line_create(cont, NULL);
+ lv_obj_set_style_local_line_color(line, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
+ lv_obj_set_style_local_line_width(line, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 2); // 1);
+ lv_obj_set_style_local_line_opa(line, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_100); // LV_OPA_50);
+ lv_line_set_points(line, s_line_point_array, PULSE_WAVE_POINT_NUM_MAX);
+
+ return line;
+}
+
+void mmi_factorymode_pulse_wave_test_auto_finish(void)
+{
+ mmi_hsensor_close();
+
+ mmi_factorymode_pulse_wave_test_ui_data_deinit();
+
+ lv_factory_obj_ext_t * ext = factorymode_get_ext();
+ if(NULL == ext)
+ return;
+
+ if(NULL != ext->cycle_timer_id)
+ {
+ Hal_Timer_Stop(ext->cycle_timer_id);
+ ext->cycle_timer_id = NULL;
+ }
+
+ //lv_watch_del_top_interface();
+
+ lv_obj_t * par_line = lv_obj_get_parent(ext->line);
+ if(NULL == par_line)
+ return;
+ lv_obj_t * par_cont = lv_obj_get_parent(par_line);
+ if(NULL == par_cont)
+ return;
+ lv_obj_clean(par_cont);
+
+ lv_obj_t * label_prompt = lv_label_create(par_cont, NULL);
+ lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT_BIG);
+ lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_MEASURE_DONE);
+ lv_obj_align(label_prompt, NULL, LV_ALIGN_CENTER, 0, -25);
+ lv_obj_set_click(label_prompt, false);
+
+ lv_obj_t * btn_start = lv_btn_create(par_cont, NULL);
+ lv_obj_set_size(btn_start, LV_HOR_RES / 2, LV_HOR_RES / 6);
+ lv_obj_set_event_cb(btn_start, mmi_factorymode_pulse_wave_event_cb);
+ lv_obj_align(btn_start, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -LV_VER_RES / 8);
+
+ lv_obj_t * label_start = lv_label_create(btn_start, NULL);
+ lv_label_set_text_id(label_start, WATCH_TEXT_ID_RETEST);
+ lv_obj_add_style(label_start,LV_OBJ_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT);
+ lv_label_set_align(label_start, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_start, NULL, LV_ALIGN_CENTER, 0, 0);
+}
+
+void mmi_factorymode_pulse_wave_test_cb(void * para)
+{
+ s_total_counter++;
+ if(PULSE_WAVE_TOTAL_COUNT <= s_total_counter) // stop action
+ {
+ mmi_factorymode_pulse_wave_test_auto_finish();
+ }
+ else
+ {
+ s_update_counter++;
+ if(PULSE_WAVE_DATA_SECOND_NUM <= s_update_counter)
+ {
+ s_update_counter = 0;
+
+ lv_factory_obj_ext_t * ext = factorymode_get_ext();
+ if(NULL == ext)
+ return;
+
+ int ret = mmi_factorymode_pulse_wave_test_line_update(ext->line);
+ if(0 == ret && NULL != ext->label_prompt)
+ {
+ lv_obj_del(ext->label_prompt);
+ ext->label_prompt = NULL;
+ }
+ }
+ }
+}
+
+static void mmi_factorymode_pulse_wave_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ return;
+
+ lv_factory_obj_ext_t * ext = factorymode_get_ext();
+ if(NULL == ext)
+ return;
+
+ if(NULL == btn)
+ return;
+
+ lv_obj_t * par = lv_obj_get_parent((lv_obj_t*)btn);
+ if(NULL == par)
+ return;
+ lv_obj_clean(par);
+
+ testing_st = FAC_PULSE_WAVE;
+ mmi_hsensor_blood_open();
+
+ mmi_factorymode_pulse_wave_test_ui_data_init();
+
+ lv_obj_t * line = mmi_factorymode_pulse_wave_test_line_create(par);
+ ext->line = line;
+
+ lv_obj_t * label_prompt = lv_label_create(par, NULL);
+ lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT_BIG);
+ lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_IN_MEASURE_PROMPT);
+ lv_obj_align(label_prompt, NULL, LV_ALIGN_CENTER, 0, -10);
+ lv_obj_set_click(label_prompt, false);
+ ext->label_prompt = label_prompt;
+
+ s_total_counter = 0;
+ if(NULL != ext->cycle_timer_id)
+ {
+ Hal_Timer_Stop(ext->cycle_timer_id);
+ ext->cycle_timer_id = NULL;
+ }
+ ext->cycle_timer_id = Hal_Timer_Start(1000, mmi_factorymode_pulse_wave_test_cb, NULL, true);
+}
+
+static lv_obj_t * mmi_factorymode_pulse_wave_test_create(lv_obj_t * activity_obj)
+{
+ if(NULL == activity_obj)
+ {
+ lv_watch_activity_ext_t activity_ext;
+ memset(&activity_ext, 0, sizeof(lv_watch_activity_ext_t));
+ activity_ext.actId = ACT_ID_FACTORY_MODE_TEST;
+ activity_ext.create = mmi_factorymode_pulse_wave_test_create;
+ activity_ext.prepare_destory = factorymode_test_prepare_destory;
+ activity_obj = lv_watch_creat_activity_obj(&activity_ext);
+ LV_ASSERT_MEM(activity_obj);
+ if(NULL == activity_obj)
+ return NULL;
+ }
+
+ lv_obj_t * obj = lv_watch_obj_create(activity_obj);
+ LV_ASSERT_MEM(obj);
+ if(NULL == obj)
+ return NULL;
+
+ lv_obj_t * content = lv_cont_create(obj, NULL);
+ lv_obj_set_size(content, LV_HOR_RES, LV_VER_RES); // lv_obj_get_width(obj), lv_obj_get_height(obj));
+ lv_obj_add_style(content,LV_OBJ_PART_MAIN, &lv_watch_style_transp);
+ lv_obj_align(content, NULL, LV_ALIGN_CENTER, 0, 0);
+ lv_obj_set_click(content, false);
+
+#if 1
+ lv_obj_t * label_prompt = lv_label_create(content, NULL);
+ lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT);
+ lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
+ lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_BREAK);
+ lv_obj_set_width(label_prompt, LV_HOR_RES * 2 / 3);
+ lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_CALIBRATE_PROMPT_0);
+ lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, LV_VER_RES / 4);
+
+ lv_obj_t * btn_start = lv_btn_create(content, NULL);
+ lv_obj_set_size(btn_start, LV_HOR_RES / 2, LV_HOR_RES / 6);
+ lv_obj_set_event_cb(btn_start, mmi_factorymode_pulse_wave_event_cb);
+ lv_obj_align(btn_start, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -LV_VER_RES / 8);
+
+ lv_obj_t * label_start = lv_label_create(btn_start, NULL);
+ lv_label_set_text_id(label_start, WATCH_TEXT_ID_START_TEST);
+ lv_obj_add_style(label_start,LV_OBJ_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT);
+ lv_label_set_align(label_start, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_start, NULL, LV_ALIGN_CENTER, 0, 0);
+
+#else
+ lv_obj_t * btn_start = lv_btn_create(content, NULL);
+ lv_obj_set_size(btn_start, LV_HOR_RES / 2, LV_HOR_RES / 6);
+ lv_obj_set_event_cb(btn_start, mmi_factorymode_pulse_wave_event_cb);
+ lv_obj_align(btn_start, NULL, LV_ALIGN_CENTER, 0, -10);
+
+ lv_obj_t * label_start = lv_label_create(btn_start, NULL);
+ lv_label_set_text_id(label_start, WATCH_TEXT_ID_START_TEST);
+ lv_obj_add_style(label_start,LV_OBJ_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT);
+ lv_label_set_align(label_start, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_start, NULL, LV_ALIGN_CENTER, 0, 0);
+
+ lv_obj_t * label_prompt = lv_label_create(content, NULL);
+ lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &FACTORY_MODE_TEST_ITEM_TEXT_FONT_BIG);
+ lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_SROLL);
+ lv_obj_set_width(label_prompt, LV_HOR_RES * 5 / 6);
+ lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_PULSE_WAVE_PROMPT);
+ lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -LV_VER_RES / 8);
+#endif
+
+ return obj;
+}
+
+void mmi_factorymode_pulse_wave_test_create_btn_cb(lv_obj_t * btn,lv_event_t e)
+{
+ if(LV_EVENT_CLICKED != e)
+ return;
+
+ mmi_factorymode_pulse_wave_test_create(NULL);
+}
+#endif
+
#endif
static uint32_t s_health_measure_temperature_timed_time_stamp = 0;
static uint32_t s_health_measure_blood_timed_time_stamp = 0;
static uint32_t s_health_measure_spo2_timed_time_stamp = 0;
+#if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+static uint32_t s_health_measure_micro_checkup_timed_time_stamp = 0;
+#endif
void mmi_hsensor_close(void)
data->blood_timed_interval = MMI_HEALTH_BLOOD_TIMED_INTERVAL;
data->spo2_timed_flag = MMI_HEALTH_SPO2_TIMED_FLAG;
data->spo2_timed_interval = MMI_HEALTH_SPO2_TIMED_INTERVAL;
+#if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+ data->micro_checkup_timed_flag = 0;
+ data->micro_checkup_timed_interval = 0;
+#endif
}
void mmi_health_measure_timed_list_clear(void)
s_health_measure_spo2_timed_time_stamp = time_stamp;
break;
+ #if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+ case MMI_HEALTH_MEASURE_MICRO_CHECKUP:
+ s_health_measure_micro_checkup_timed_time_stamp = time_stamp;
+ break;
+ #endif
+
default:
break;
}
return false;
}
+#if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+bool mmi_health_measure_micro_checkup_timed_action(bool direct_trigger, uint32_t cur_time_stamp)
+{
+ if(0 != s_health_measure_timed_data.micro_checkup_timed_flag)
+ {
+ if(true == direct_trigger
+ || s_health_measure_timed_data.micro_checkup_timed_interval <= (cur_time_stamp - s_health_measure_micro_checkup_timed_time_stamp)
+ )
+ {
+ if(true == direct_trigger)
+ {
+ s_health_measure_micro_checkup_timed_time_stamp = 0;
+ }
+
+ mmi_health_measure_timed_list_node_add(MMI_HEALTH_MEASURE_MICRO_CHECKUP);
+ if(true == mmi_health_measure_timed_list_trigger(MMI_HEALTH_MEASURE_MICRO_CHECKUP))
+ {
+ mmi_health_measure_timed_time_stamp_set(MMI_HEALTH_MEASURE_MICRO_CHECKUP, cur_time_stamp);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif
+
bool mmi_health_measure_timed_mission_action(uint32_t cur_time_stamp)
{
mmi_health_measure_heart_timed_action(false, cur_time_stamp);
mmi_health_measure_temperature_timed_action(false, cur_time_stamp);
mmi_health_measure_blood_timed_action(false, cur_time_stamp);
mmi_health_measure_spo2_timed_action(false, cur_time_stamp);
+#if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+ mmi_health_measure_micro_checkup_timed_action(false, cur_time_stamp);
+#endif
return true;
}
mmi_health_measure_temperature_timed_action(true, cur_time_stamp);
mmi_health_measure_blood_timed_action(true, cur_time_stamp);
mmi_health_measure_spo2_timed_action(true, cur_time_stamp);
+#if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+ mmi_health_measure_micro_checkup_timed_action(true, cur_time_stamp);
+#endif
return true;
}
}
break;
+ #if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
+ case MMI_HEALTH_MEASURE_MICRO_CHECKUP:
+ s_health_measure_timed_data.micro_checkup_timed_flag = flag;
+ if(1 == flag)
+ {
+ s_health_measure_timed_data.micro_checkup_timed_interval = value_interval;
+ mmi_health_measure_timed_time_stamp_set(MMI_HEALTH_MEASURE_MICRO_CHECKUP, cur_time_stamp);
+ }
+ break;
+ #endif
+
default:
break;
}
#if defined(__MMI_CUSTOM_HENGAI_MICRO_HEALTH_CHECKUP__)
case MMI_HEALTH_MEASURE_MICRO_CHECKUP:
- s_measure_time_total = 0xffff;
+ s_measure_time_total = 20 / MMI_HEALTH_MEASURE_CYCLE_DURATION; // 0xffff;
mmi_hsensor_blood_open();
mmi_hengai_micro_health_checkup_start();
break;