gengxin
authorCCC <2393524978@qq.com>
Fri, 29 Dec 2023 03:12:35 +0000 (11:12 +0800)
committerCCC <2393524978@qq.com>
Fri, 29 Dec 2023 03:12:35 +0000 (11:12 +0800)
13 files changed:
2.sdk/sdk/gui/lv_watch/framework/language/lang_ch.c
2.sdk/sdk/gui/lv_watch/framework/language/lang_en.c
2.sdk/sdk/gui/lv_watch/framework/nvm/ui_nvm.h
2.sdk/sdk/gui/lv_watch/framework/nvm/ui_nvm_api.c
2.sdk/sdk/gui/lv_watch/include/ui_nvm_interface.h
2.sdk/sdk/gui/lv_watch/include/ui_textid.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/heng_ai_blood_pressure.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/heng_ai_blood_pressure.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/heng_ai_http_protocol.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/heng_ai_http_protocol.h
2.sdk/sdk/gui/lv_watch/lv_apps/health_measure/health_measure.c
2.sdk/sdk/gui/lv_watch/lv_watch.c
2.sdk/sdk/gui/lv_watch/lv_watch_res.h

index b1f3998..ed245c1 100644 (file)
@@ -841,6 +841,7 @@ const void * lang_text_ch[] = {
     "正在测量",
     "测量完成",
     "测量失败",
+    "测量成功", // WATCH_TEXT_ID_MEASURE_SUCCESS,
     "未正确佩戴",
     "请保持佩戴",
     "当前体温",
@@ -934,17 +935,21 @@ const void * lang_text_ch[] = {
     "精准模式", // WATCH_TEXT_ID_BP_MEASURE_MODE,
     "校准模式", // WATCH_TEXT_ID_BP_CALIBRATION_MODE,
     "体验模式", // WATCH_TEXT_ID_BP_ATTEMPT_MODE,
+    "结果分析中", // WATCH_TEXT_ID_WAIT_RESULT,
     "开始测量", // WATCH_TEXT_ID_START_MEASURE,
     "停止测量", // WATCH_TEXT_ID_STOP_MEASURE,
     "测量说明", // WATCH_TEXT_ID_MEASURE_PROMPT,
     "开始校准", // WATCH_TEXT_ID_START_CALIBRATE,
+    "校准中", // WATCH_TEXT_ID_CALIBRATING,
     "停止校准", // WATCH_TEXT_ID_STOP_CALIBRATE,
     "校准完成", // WATCH_TEXT_ID_CALIBRATE_SUCCESS,
     "校准失败", // WATCH_TEXT_ID_CALIBRATE_FAILED,
     "校准说明", // WATCH_TEXT_ID_CALIBRATE_PROMPT,
     "双脚着地,端坐在椅子上。双手手背朝上,手臂平放在桌子上", // WATCH_TEXT_ID_CALIBRATE_PROMPT_0,
     "手表和手腕之间仅限一指距离,手表偏紧佩戴", // WATCH_TEXT_ID_CALIBRATE_PROMPT_1,
-    "1.建立血压模型需进行2次校准\n2.高血压患者需要进行2轮校准\n3.建议每个月进行重新校准\n4.校准过程和实际血压测量使用同一只手", // WATCH_TEXT_ID_CALIBRATE_PROMPT_2,
+    "1.建立血压模型需进行2次校准\n2.建议每个月进行重新校准\n3.校准过程和实际血压测量使用同一只手", // WATCH_TEXT_ID_CALIBRATE_PROMPT_2,
+    "请使用传统血压计测量手腕同一位置", // WATCH_TEXT_ID_CALIBRATE_PROMPT_3,
+    "需用时约1分钟", // WATCH_TEXT_ID_NEED_ONE_MINUTE,
     "首次校准中,请保持静止", // WATCH_TEXT_ID_IN_CALIBRATE_PROMPT_FIRST,
     "再次校准中,请保持静止", // WATCH_TEXT_ID_IN_CALIBRATE_PROMPT_SECOND,
     "测量中,请保持静止", // WATCH_TEXT_ID_IN_CALIBRATE_PROMPT,
index d3150e8..e7800eb 100644 (file)
@@ -842,6 +842,7 @@ const void * lang_text_en[] = {
     "Measuring",
     "Measure done",
     "Measure fail",
+    "Measure success", // WATCH_TEXT_ID_MEASURE_SUCCESS,
     "Not wear",
     "Please keep wearing",
     "Body temperature",
@@ -935,10 +936,12 @@ const void * lang_text_en[] = {
     "Measure mode", // WATCH_TEXT_ID_BP_MEASURE_MODE,
     "Calibration mode", // WATCH_TEXT_ID_BP_CALIBRATION_MODE,
     "Attempt mode", // WATCH_TEXT_ID_BP_ATTEMPT_MODE,
+    "Wait result", // WATCH_TEXT_ID_WAIT_RESULT,
     "Start test", // WATCH_TEXT_ID_START_MEASURE,
     "Stop test", // WATCH_TEXT_ID_STOP_MEASURE,
     "Measure prompt", // WATCH_TEXT_ID_MEASURE_PROMPT,
     "Start calibrate", // WATCH_TEXT_ID_START_CALIBRATE,
+    "Calibrating", // WATCH_TEXT_ID_CALIBRATING,
     "Stop calibrate", // WATCH_TEXT_ID_STOP_CALIBRATE,
     "Calibrate success", // WATCH_TEXT_ID_CALIBRATE_SUCCESS,
     "Calibrate failed", // WATCH_TEXT_ID_CALIBRATE_FAILED,
@@ -946,6 +949,8 @@ const void * lang_text_en[] = {
     "Calibrate prompt", // WATCH_TEXT_ID_CALIBRATE_PROMPT_0,
     "Calibrate prompt", // WATCH_TEXT_ID_CALIBRATE_PROMPT_1,
     "Calibrate prompt", // WATCH_TEXT_ID_CALIBRATE_PROMPT_2,
+    "Calibrate prompt", // WATCH_TEXT_ID_CALIBRATE_PROMPT_3,
+    "Takes about 1 minute", // WATCH_TEXT_ID_NEED_ONE_MINUTE,
     "Calibrating,keep still", // WATCH_TEXT_ID_IN_CALIBRATE_PROMPT_FIRST,
     "Calibrating,keep still", // WATCH_TEXT_ID_IN_CALIBRATE_PROMPT_SECOND,
     "Measuring,keep still", // WATCH_TEXT_ID_IN_CALIBRATE_PROMPT,
index fa78713..2fa0ae5 100644 (file)
@@ -89,6 +89,10 @@ extern "C" {
 #define NV_SECTION_UI_HENG_AI_WAKE_RING_TYPE_LEN       (sizeof(nv_watch_switch_t))
 #define NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION_LEN     (sizeof(nv_watch_heng_ai_sleep_activation_t))
 #endif
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+#define NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE_LEN       (sizeof(nv_watch_heng_ai_blood_pressure_t))
+#endif
+
 
 #endif
 
@@ -224,6 +228,9 @@ typedef lv_fs_dir_t  ui_dir_t;
 #define NV_SECTION_UI_HENG_AI_WAKE_RING_TYPE_FILE      "ui_heng_ai_wake_ring_type.nv"
 #define NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION_FILE    "ui_heng_ai_sleep_activation.nv"
 #endif
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+#define NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE_FILE      "ui_heng_ai_blood_pressure.nv"
+#endif
 
 
 #endif
index 8688953..df2fff2 100644 (file)
@@ -150,6 +150,10 @@ uint32_t UI_NV_Get_Section_Len(NV_UI_SECTION_ID SectionId)
                case NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION:
                        return (NV_SECTION_LEN(NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION));
        #endif
+       #ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+               case NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE:
+                       return (NV_SECTION_LEN(NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE));
+       #endif
                                
                        
        #endif
@@ -301,6 +305,10 @@ char * UI_NV_Get_Section_path(NV_UI_SECTION_ID SectionId)
                case NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION:
                        return (NV_SECTION_FILE_PATH(NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION));
        #endif
+       #ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+               case NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE:
+                       return (NV_SECTION_FILE_PATH(NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE));
+       #endif
 
                        
        #endif
@@ -392,6 +400,9 @@ uint8_t UI_NV_Reset_Default(NV_UI_SECTION_ID SectionId)
 #ifdef __MMI_CUSTOM_HENG_AI__
        nv_watch_heng_ai_sleep_activation_t * heng_ai_sleep_activation;
 #endif
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+       nv_watch_heng_ai_blood_pressure_t * heng_ai_blood_pressure;
+#endif
 
 #endif
 
@@ -718,6 +729,14 @@ uint8_t UI_NV_Reset_Default(NV_UI_SECTION_ID SectionId)
                        TempData = (char *)heng_ai_sleep_activation;
                        break;
        #endif
+
+       #ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+               case NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE:
+                       heng_ai_blood_pressure = lv_mem_alloc(SectionLen);
+                       memset(heng_ai_blood_pressure, 0x0, SectionLen);
+                       TempData = (char *)heng_ai_blood_pressure;
+                       break;
+       #endif
                        
                        
        #endif
index fdaca54..504cbbb 100644 (file)
@@ -452,6 +452,20 @@ typedef struct
 } __packed nv_watch_heng_ai_sleep_activation_t;
 #endif
 
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+typedef struct
+{
+#if 0
+       uint8_t is_activated; // 0-not activated; 1-activated
+       char req_code[128];
+       char act_code[128];
+#endif
+       uint8_t is_calibrated; // 0-not calibrated; 1-calibrated
+       hal_rtc_t calibrate_time;
+} __packed nv_watch_heng_ai_blood_pressure_t;
+#endif
+
+
 #endif
 
 
@@ -686,6 +700,10 @@ enum
        NV_SECTION_UI_HENG_AI_WAKE_RING_TYPE,                   // nv_watch_switch_t
        NV_SECTION_UI_HENG_AI_SLEEP_ACTIVATION,                 // nv_watch_heng_ai_sleep_activation_t
 #endif
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+       NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE,                   // nv_watch_heng_ai_blood_pressure_t
+#endif
+
 
 #endif
 
index 855a0af..65db4ad 100644 (file)
@@ -848,6 +848,7 @@ enum
     WATCH_TEXT_ID_MEASURING,                         /*"正在测量"        "Measuring"*/
     WATCH_TEXT_ID_MEASURE_DONE,                      /*"测量完成"        "Measure done"*/
     WATCH_TEXT_ID_MEASURE_FAIL,                      /*"测量失败"        "Measure fail"*/
+    WATCH_TEXT_ID_MEASURE_SUCCESS,                   /*"测量成功"        "Measure success"*/
     WATCH_TEXT_ID_NOT_WEAR,                          /*"未正确佩戴"      "Not wear"*/
     WATCH_TEXT_ID_KEEP_WEAR,                         /*"请保持佩戴"      "Please keep wearing"*/
     WATCH_TEXT_ID_CURRENT_BODY_TEMPERATURE,                            // 当前体温
@@ -941,18 +942,22 @@ enum
     WATCH_TEXT_ID_BP_MEASURE_MODE,                      /* "精准模式"                    "Measure mode" */
     WATCH_TEXT_ID_BP_CALIBRATION_MODE,                  /* "校准模式"                    "Calibration mode" */
     WATCH_TEXT_ID_BP_ATTEMPT_MODE,                      /* "体验模式"                    "Attempt mode" */
+    WATCH_TEXT_ID_WAIT_RESULT,                          /* "结果分析中"                      "Wait result" */
     WATCH_TEXT_ID_START_MEASURE,                        /* "开始测量"                      "Start test" */
     WATCH_TEXT_ID_STOP_MEASURE,                         /* "停止测量"                      "Stop test" */
     WATCH_TEXT_ID_MEASURE_PROMPT,                       /* "测量说明"                      "Measure prompt" */
     WATCH_TEXT_ID_START_CALIBRATE,                      /* "开始校准"                      "Start calibrate" */
+    WATCH_TEXT_ID_CALIBRATING,                          /* "校准中"                      "Calibrating" */
     WATCH_TEXT_ID_STOP_CALIBRATE,                       /* "停止校准"                      "Stop calibrate" */
     WATCH_TEXT_ID_CALIBRATE_SUCCESS,                    /* "校准完成"                      "Calibrate success" */
     WATCH_TEXT_ID_CALIBRATE_FAILED,                     /* "校准失败"                      "Calibrate failed" */
     WATCH_TEXT_ID_CALIBRATE_PROMPT,                     /* "校准说明"                      "Calibrate prompt" */
     WATCH_TEXT_ID_CALIBRATE_PROMPT_0,                   /* "双脚着地,端坐在椅子上。双手手背朝上,手臂平放在桌子上"                      "Calibrate prompt" */
     WATCH_TEXT_ID_CALIBRATE_PROMPT_1,                   /* "手表和手腕之间仅限一指距离,手表偏紧佩戴"                      "Calibrate prompt" */
-    WATCH_TEXT_ID_CALIBRATE_PROMPT_2,                   /* "1.建立血压模型需进行2次校准\n2.高血压患者需要进行2轮校准\n3.建议每个月进行重新校准\n4.校准过程和实际血压测量使用同一只手"
+    WATCH_TEXT_ID_CALIBRATE_PROMPT_2,                   /* "1.建立血压模型需进行2次校准\n2.建议每个月进行重新校准\n3.校准过程和实际血压测量使用同一只手"
                                                           "Calibrate prompt" */
+    WATCH_TEXT_ID_CALIBRATE_PROMPT_3,                   /* "请使用传统血压计测量手腕同一位置"                      "Calibrate prompt" */
+    WATCH_TEXT_ID_NEED_ONE_MINUTE,                      /* "需用时约1分钟"                      "Takes about 1 minute" */
     WATCH_TEXT_ID_IN_CALIBRATE_PROMPT_FIRST,            /* "首次校准中,请保持静止"                      "Calibrating,keep still" */
     WATCH_TEXT_ID_IN_CALIBRATE_PROMPT_SECOND,           /* "再次校准中,请保持静止"                      "Calibrating,keep still" */
     WATCH_TEXT_ID_IN_MEASURE_PROMPT,                    /* "测量中,请保持静止"                      "Measuring,keep still" */
index 494f1b7..7a0b468 100644 (file)
 
 #ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
 
-static uint8_t s_hengai_bp_calibrated = 0; // 0-not calibrated; 1-calibrated
-static const lv_point_t s_hengai_bp_valid_pos[] = {{0, 0}, {1, 0}, {2, 0}};
-static uint8_t s_hengai_bp_measure_count = 0;
-static uint8_t s_hengai_bp_calibrate_times = 0;
-static uint16_t s_bp_value_high = 0, s_bp_value_low = 0;
-
-
-void mmi_heng_ai_bp_raw_data_save(void){}
-
-void mmi_heng_ai_bp_raw_data_send(void){}
-
-void mmi_heng_ai_bp_calibrate_input_value_send(void){}
+static nv_watch_heng_ai_blood_pressure_t s_hengai_blood_pressure_data = {0};
 
-
-
-// 0-ring; 1-vibrator
-void mmi_heng_ai_wake_ring_type_set(uint8_t ring_type)
+void mmi_hengai_blood_pressure_nv_write(void)
 {
-       nv_watch_switch_t ring_type_data = {0};
-       uint32_t nv_data_length = sizeof(nv_watch_switch_t);
+       uint32_t nv_data_length = sizeof(nv_watch_heng_ai_blood_pressure_t);
        
-       ring_type_data.switch_flag = ring_type;
-       if(nv_data_length != UI_NV_Write_Req(NV_SECTION_UI_HENG_AI_WAKE_RING_TYPE, 0, nv_data_length, (uint8_t *)&ring_type_data))
+       if(nv_data_length != UI_NV_Write_Req(NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE, 0, nv_data_length, (uint8_t *)&s_hengai_blood_pressure_data))
        {
                printf("[@CHENG_DEBUG][%s][%d]: nv write fail\n", __FUNCTION__, __LINE__);
        }
 }
 
-uint8_t mmi_heng_ai_wake_ring_type_get(void)
+void mmi_hengai_blood_pressure_nv_read(void)
 {
-       nv_watch_switch_t ring_type_data = {0};
-       uint32_t nv_data_length = sizeof(nv_watch_switch_t);
-
-       if(nv_data_length != UI_NV_Read_Req(NV_SECTION_UI_HENG_AI_WAKE_RING_TYPE, 0, nv_data_length, (uint8_t *)&ring_type_data))
+       uint32_t nv_data_length = sizeof(nv_watch_heng_ai_blood_pressure_t);
+       
+       if(nv_data_length != UI_NV_Read_Req(NV_SECTION_UI_HENG_AI_BLOOD_PRESSURE, 0, nv_data_length, (uint8_t *)&s_hengai_blood_pressure_data))
        {
                printf("[@CHENG_DEBUG][%s][%d]: nv read fail\n", __FUNCTION__, __LINE__);
+               _lv_memset_00(&s_hengai_blood_pressure_data, sizeof(nv_watch_heng_ai_blood_pressure_t));
        }
-
-       return (ring_type_data.switch_flag);
-}
-
-
-bool mmi_heng_ai_warning_screen_is_active(void)
-{
-       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_HENG_AI_WARNING);
-       if(NULL != activity_obj) 
-               return true;
-
-       return false;
 }
 
-static lv_remind_obj_ext_t * mmi_heng_ai_warning_screen_ext_get(void)
+void mmi_hengai_blood_pressure_data_set(nv_watch_heng_ai_blood_pressure_t * data)
 {
-       lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_HENG_AI_WARNING);
-       if(NULL == activity_obj) 
-               return NULL;
-       
-       lv_obj_t * watch_obj = NULL;
-       lv_watch_get_child_obj(activity_obj, lv_watch_obj_signal, &watch_obj);
-       if(NULL != watch_obj) 
+       if(NULL != data)
        {
-               void * ext = lv_obj_get_ext_attr(watch_obj);
-               return ext;
+               _lv_memset_00(&s_hengai_blood_pressure_data, sizeof(nv_watch_heng_ai_blood_pressure_t));
+               _lv_memcpy(&s_hengai_blood_pressure_data, data, sizeof(nv_watch_heng_ai_blood_pressure_t));
+               mmi_hengai_blood_pressure_nv_write();
        }
-
-       return NULL;
 }
 
-static void mmi_heng_ai_warning_screen_prepare_destory(lv_obj_t * activity_obj)
+uint8_t mmi_hengai_bp_is_calibrated(void)
 {
-    lv_watch_png_cache_all_free();
-
-       Hal_Vibrator_Play_End();
-
-    Hal_Tone_Play_End();
-    Hal_Audio_Manage_End_Ind(AUDIO_CTRL_PRIORITY_REMIND);
+       return (s_hengai_blood_pressure_data.is_calibrated);
+}
 
-       printf("[@CHENG_DEBUG][%s][%d]: 0x%x\n", __FUNCTION__, __LINE__, s_heng_ai_warning_info.prompt_str);
-       if(NULL != s_heng_ai_warning_info.prompt_str)
-       {
-               lv_mem_free(s_heng_ai_warning_info.prompt_str);
-               s_heng_ai_warning_info.prompt_str = NULL;
-       }
+#if 0
+uint8_t mmi_hengai_bp_is_activated(void)
+{
+       return (s_hengai_blood_pressure_data.is_activated);
+}
 
-       lv_heng_ai_warning_obj_ext_t * ext = mmi_heng_ai_warning_screen_ext_get();
-    if(ext)
-       {
-        if(NULL != ext->timer_id)
-               {
-            Hal_Timer_Stop(ext->timer_id);
-                       ext->timer_id = NULL;
-        }
-    }
+char * mmi_hengai_bp_req_code_get(void)
+{
+       return (s_hengai_blood_pressure_data.req_code);
+}
 
-    watch_set_suspend_enable(true, ACT_ID_HENG_AI_WARNING, 0);
+void mmi_hengai_bp_req_code_set(char * req_code)
+{
+       _lv_memcpy(s_hengai_blood_pressure_data.req_code, req_code, strlen(req_code));
 }
 
-void mmi_heng_ai_warning_screen_clean(void)
+char * mmi_hengai_bp_act_code_get(void)
 {
-       mmi_heng_ai_warning_screen_prepare_destory(NULL);
-       
-    lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_HENG_AI_WARNING);
-    if(NULL != activity_obj)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-        lv_obj_del(activity_obj);
-    }
+       return (s_hengai_blood_pressure_data.act_code);
 }
 
-void mmi_heng_ai_warning_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+void mmi_hengai_bp_act_code_set(char * act_code)
 {
-       if(LV_EVENT_CLICKED == e)
-       {
-               mmi_heng_ai_warning_screen_clean();
-       }
+       _lv_memcpy(s_hengai_blood_pressure_data.act_code, act_code, strlen(act_code));
 }
 
-static void mmi_heng_ai_warning_screen_timeout(void * para)
+void mmi_hengai_bp_activated_finish(void)
 {
-       mmi_heng_ai_warning_screen_clean();
+       s_hengai_blood_pressure_data.is_activated = 1;
+       mmi_hengai_blood_pressure_nv_write();
 }
+#endif
+
 
+#if 0
 static lv_obj_t * mmi_heng_ai_warning_screen_create(lv_obj_t * activity_obj)
 {
        printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
@@ -195,9 +146,6 @@ static lv_obj_t * mmi_heng_ai_warning_screen_create(lv_obj_t * activity_obj)
        return obj;
 }
 
-
-
-
 lv_heart_rate_obj_ext_t * health_heart_rate_get_ext(void)
 {
     lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_HEALTH_MEASURE_HEART);
@@ -267,9 +215,119 @@ void health_heart_rate_display_update(void)
                        break;
        }
 }
+#endif
+
+
+static const lv_point_t s_hengai_bp_valid_pos[] = {{0, 0}, {1, 0}, {2, 0}};
+static uint8_t s_hengai_bp_measure_count = 0;
+static uint8_t s_hengai_bp_calibrate_times = 0;
+static uint16_t s_bp_value_high = 0, s_bp_value_low = 0;
+static uint8_t s_hengai_bp_measuring = 0;
+static char s_hengai_bp_begin_time_str[24] = {0}, s_hengai_bp_end_time_str[24] = {0};
+static int * s_hengai_bp_raw_data_ptr = NULL;
+static int s_hengai_bp_raw_data_len = 0;
+
+
+uint8_t mmi_hengai_bp_is_measuring(void)
+{
+       return (s_hengai_bp_measuring);
+}
+
+char * mmi_hengai_bp_measure_action_time_string_get(uint8_t is_begin)
+{
+       return ((1 == is_begin) ? s_hengai_bp_begin_time_str : s_hengai_bp_end_time_str);
+}
+
+void mmi_hengai_bp_measure_action_time_string_set(uint8_t is_begin)
+{
+       hal_rtc_t cur_time = {0};
+       char * temp_ptr = mmi_hengai_bp_measure_action_time_string_get(is_begin);
+
+       Hal_Rtc_Gettime(&cur_time);
+       sprintf(temp_ptr, "%04d-%02d-%02d %02d:%02d:%02d",
+                                                                               cur_time.tm_year,
+                                                                               cur_time.tm_mon,
+                                                                               cur_time.tm_mday,
+                                                                               cur_time.tm_hour,
+                                                                               cur_time.tm_min,
+                                                                               cur_time.tm_sec);
+}
+
+void mmi_hengai_bp_raw_data_fill(void)
+{
+       if(NULL != s_hengai_bp_raw_data_ptr)
+       {
+               lv_mem_free(s_hengai_bp_raw_data_ptr);
+               s_hengai_bp_raw_data_ptr = NULL;
+       }
+       s_hengai_bp_raw_data_ptr = (int *)lv_mem_alloc(MMI_HENGAI_BP_RAW_DATA_SAMPLE_RATE * MMI_BP_MEASURE_TOTAL_COUNT * sizeof(int));
+       _lv_memset_00(s_hengai_bp_raw_data_ptr, sizeof(s_hengai_bp_raw_data_ptr));
+
+       _lv_memcpy(s_hengai_bp_raw_data_ptr, fr8012haq_blood_data_get(&s_hengai_bp_raw_data_len), sizeof(s_hengai_bp_raw_data_ptr));
+
+       printf("[@CHENG_DEBUG][%s][%d]: raw_data_len=%d\n", __FUNCTION__, __LINE__, s_hengai_bp_raw_data_len);
+}
+
+int * mmi_hengai_bp_raw_data_ptr_get(void)
+{
+       return s_hengai_bp_raw_data_ptr;
+}
+
+int mmi_hengai_bp_raw_data_len_get(void)
+{
+       return s_hengai_bp_raw_data_len;
+}
+
+void mmi_hengai_bp_raw_data_free(void)
+{
+       if(NULL != s_hengai_bp_raw_data_ptr)
+       {
+               lv_mem_free(s_hengai_bp_raw_data_ptr);
+               s_hengai_bp_raw_data_ptr = NULL;
+       }
+}
+
+
+static lv_obj_t * mmi_bp_screen_common_bottom_button_create(lv_obj_t * par, uint32_t text_id, lv_event_cb_t event_cb)
+{
+       lv_obj_t * imgbtn = lv_imgbtn_create(par, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+       lv_obj_set_event_cb(imgbtn, event_cb);
+
+       lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
+       lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
+       lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(btn_label, text_id);
+       lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
+
+       return imgbtn;
+}
+
+static lv_obj_t * mmi_bp_screen_common_left_button_create(lv_obj_t * par, int16_t x_offset, int16_t y_offset,lv_event_cb_t event_cb)
+{
+       lv_obj_t * imgbtn = lv_imgbtn_create(par, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_LEFT_ARROW);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_LEFT_ARROW);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_LEFT_MID, x_offset, y_offset);
+       lv_obj_set_event_cb(imgbtn, event_cb);
+
+       return imgbtn;
+}
+
+static lv_obj_t * mmi_bp_screen_common_right_button_create(lv_obj_t * par, int16_t x_offset, int16_t y_offset,lv_event_cb_t event_cb)
+{
+       lv_obj_t * imgbtn = lv_imgbtn_create(par, NULL);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_RIGHT_ARROW);
+       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_RIGHT_ARROW);
+       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_RIGHT_MID, x_offset, y_offset);
+       lv_obj_set_event_cb(imgbtn, event_cb);
 
+       return imgbtn;
+}
 
-lv_heng_ai_bp_obj_ext_t * mmi_heng_ai_bp_ext_get(void)
+static lv_heng_ai_bp_ext_t * mmi_heng_ai_bp_ext_get(void)
 {
     lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_HENG_AI_BP);
     if(activity_obj == NULL)
@@ -280,59 +338,37 @@ lv_heng_ai_bp_obj_ext_t * mmi_heng_ai_bp_ext_get(void)
        if(NULL == watch_obj) 
                return NULL;
        
-       lv_heng_ai_bp_obj_ext_t * ext = NULL;
+       lv_heng_ai_bp_ext_t * ext = NULL;
        ext = lv_obj_get_ext_attr(watch_obj);
        
        return ext;
 }
 
-static void mmi_heng_ai_blood_pressure_screen_prepare_destory(lv_obj_t * activity_obj)
+static void mmi_heng_ai_bp_screen_prepare_destory(lv_obj_t * activity_obj)
 {
-       HEALTH_MEASURE_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       
-       mmi_hengai_http_tcp_disconnect_msg(NULL);
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               
+       mmi_hengai_bp_raw_data_free();
        
-    watch_set_suspend_enable(true, ACT_ID_HENG_AI_BP, 0);
+    //watch_set_suspend_enable(true, ACT_ID_HENG_AI_BP, 0);
     lv_watch_png_cache_all_free();
        
-    //lv_obj_t * watch_obj = NULL;
-    //lv_watch_get_child_obj(act, lv_watch_obj_signal, &watch_obj);
-    //lv_obj_t * cont = lv_obj_get_child(watch_obj, NULL);
-
-       lv_heart_rate_obj_ext_t * ext = health_heart_rate_get_ext();
-    if(NULL != ext) 
-       {
-               if(NULL != ext->cycle_timer_id)
-               {
-                       Hal_Timer_Stop(ext->cycle_timer_id);
-                       ext->cycle_timer_id = NULL;
-               }
-               if(NULL != ext->gif_info)
-               {
-                       gif_close(ext->gif_info);
-                       ext->gif_info = NULL;
-               }
-               if(STATE_HEART_RATE_MEASURING == ext->measure_state)
-               {
-                       mmi_health_measure_interrupt();
-               }
+       mmi_heng_ai_bp_measure_screen_clean();
+       mmi_heng_ai_bp_calibrate_screen_clean();
 
-               HEALTH_MEASURE_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-       }
 }
 
-void mmi_heng_ai_blood_pressure_screen_clean(void)
+void mmi_heng_ai_bp_screen_clean(void)
 {
        lv_obj_t * activity_obj = lv_watch_get_activity_obj(ACT_ID_HENG_AI_BP);
        if(NULL != activity_obj)
        {
                printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               mmi_heng_ai_blood_pressure_screen_prepare_destory(NULL);
+               mmi_heng_ai_bp_screen_prepare_destory(NULL);
                lv_obj_del(activity_obj);
        }
 }
 
-
 lv_obj_t * mmi_heng_ai_bp_tileview_add_tile(lv_obj_t * tileview, uint16_t id)
 {
     lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview);
@@ -401,7 +437,7 @@ void mmi_heng_ai_bp_measure_screen_clean(void)
        }
 }
 
-void mmi_heng_ai_bp_measure_result_screen_event_cb(lv_obj_t * obj, lv_event_t e)
+void mmi_hengai_bp_measure_result_screen_event_cb(lv_obj_t * obj, lv_event_t e)
 {
        if(LV_EVENT_CLICKED != e)
                return;
@@ -412,8 +448,10 @@ void mmi_heng_ai_bp_measure_result_screen_event_cb(lv_obj_t * obj, lv_event_t e)
 
 
 // 0-ok; 1-high; 2-low; 3-fail
-void mmi_heng_ai_bp_measure_result_screen(uint8_t result)
+void mmi_hengai_bp_measure_result_screen(uint8_t result)
 {
+       mmi_hengai_bp_raw_data_free();
+       
        lv_heng_ai_bp_measure_ext_t * watch_ext = (lv_heng_ai_bp_measure_ext_t *)mmi_heng_ai_bp_measure_screen_ext_get();
        if(NULL == watch_ext)
                return;
@@ -433,12 +471,13 @@ void mmi_heng_ai_bp_measure_result_screen(uint8_t result)
                gif_close(watch_ext->gif_info);
                watch_ext->gif_info = NULL;
        }
+       watch_ext->is_watting_result = false;
        lv_obj_clean(watch_ext->cont);
 
-       uint32_t label_title_text_id[] = {WATCH_TEXT_ID_CALIBRATE_SUCCESS,
+       uint32_t label_title_text_id[] = {WATCH_TEXT_ID_MEASURE_SUCCESS,
                                                                                WATCH_TEXT_ID_BLOOD_PRESSURE_HIGH,
                                                                                WATCH_TEXT_ID_BLOOD_PRESSURE_LOW,
-                                                                               WATCH_TEXT_ID_CALIBRATE_FAILED};
+                                                                               WATCH_TEXT_ID_MEASURE_FAIL};
        
        lv_obj_t * label_title = lv_label_create(watch_ext->cont, NULL);
        lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
@@ -452,13 +491,13 @@ void mmi_heng_ai_bp_measure_result_screen(uint8_t result)
                lv_obj_t * img = lv_img_create(watch_ext->cont, NULL);
                lv_img_set_src(img, ICON_HENGAI_BP_ALERT);
                lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
-                                       
+
                lv_obj_t * label_prompt = lv_label_create(watch_ext->cont, NULL);
                lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
                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, 400);
-               lv_label_set_text_id(label_prompt, label_prompt_text_id);
+               lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_MEASURE_FAIL);
                lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
        }
        else
@@ -513,92 +552,136 @@ void mmi_heng_ai_bp_measure_result_screen(uint8_t result)
                lv_obj_set_click(label_time, false);
        }
        
-       lv_obj_t * imgbtn = lv_imgbtn_create(watch_ext->cont, NULL);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
-       lv_obj_set_event_cb(imgbtn, mmi_heng_ai_bp_measure_result_screen_event_cb);
+       mmi_bp_screen_common_bottom_button_create(watch_ext->cont, WATCH_TEXT_ID_OK, mmi_hengai_bp_measure_result_screen_event_cb);
+}
 
-       lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
-       lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
-       lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_OK);
-       lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
+void mmi_hengai_bp_measure_result_timeout(void * para)
+{
+       mmi_hengai_bp_measure_result_screen(3);
 }
 
-void mmi_heng_ai_bp_measure_result_timeout(void * para)
+void mmi_hengai_bp_measure_update_result(bool state, uint16_t bp_value_high, uint16_t bp_value_low, char * description)
 {
        lv_heng_ai_bp_measure_ext_t * watch_ext = (lv_heng_ai_bp_measure_ext_t *)mmi_heng_ai_bp_measure_screen_ext_get();
        if(NULL == watch_ext)
                return;
        
-       if(NULL != watch_ext->result_timer_id)
+       if(true != watch_ext->is_watting_result)
+               return;
+
+       if(true == state)
        {
-               Hal_Timer_Stop(watch_ext->result_timer_id);
-               watch_ext->result_timer_id = NULL;
+               s_bp_value_high = bp_value_high;
+               s_bp_value_low = bp_value_low;
+               if(NULL != description)
+               {
+
+               }
+               
+               mmi_hengai_bp_measure_result_screen(0);
+       }
+       else
+       {
+               mmi_hengai_bp_measure_result_screen(3);
+       }
+}
+
+void mmi_hengai_bp_measure_finish_screen(void)
+{
+       mmi_hsensor_close();
+       mmi_hengai_bp_measure_action_time_string_set(0);
+
+       lv_heng_ai_bp_measure_ext_t * watch_ext = (lv_heng_ai_bp_measure_ext_t *)mmi_heng_ai_bp_measure_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
+
+       if(NULL != watch_ext->measure_timer_id)
+       {
+               Hal_Timer_Stop(watch_ext->measure_timer_id);
+               watch_ext->measure_timer_id = NULL;
        }
        if(NULL != watch_ext->gif_info)
        {
                gif_close(watch_ext->gif_info);
                watch_ext->gif_info = NULL;
        }
+       watch_ext->is_watting_result = true;
+       lv_obj_clean(watch_ext->cont);
+       
+#if 1
+       gif_info_t * gif_info = gif_open(watch_ext->cont, ANIM_HENGAI_BP_WAITTING, 0);
+       if(NULL == gif_info)
+               return;
+       lv_obj_set_style_local_bg_color(gif_info->container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_align(gif_info->container, NULL, LV_ALIGN_CENTER, 0, 0);
+       watch_ext->gif_info = gif_info;
 
-       mmi_heng_ai_bp_measure_result_screen(3);
+       lv_obj_t * label_prompt = lv_label_create(gif_info->container, NULL);
+       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
+       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, 400);
+       lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_WAIT_RESULT);
+       lv_obj_align(label_prompt, NULL, LV_ALIGN_CENTER, 0, 0);
+#else
+       
+       lv_obj_t * label_prompt = lv_label_create(watch_ext->cont, NULL);
+       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
+       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, 400);
+       lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_WAIT_RESULT);
+       lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
+#endif
+       
+       watch_ext->result_timer_id = Hal_Timer_Start(MMI_BP_WAIT_RESULT_TIMEOUT, mmi_hengai_bp_measure_result_timeout, NULL, false);
 }
 
-void mmi_heng_ai_bp_measure_cycle_timeout(void * para)
+void mmi_hengai_bp_measure_cycle_timeout(void * para)
 {
        s_hengai_bp_measure_count++;
 
-       mmi_heng_ai_bp_raw_data_save();
-       
-       if(0 == (s_hengai_bp_measure_count % MMI_BP_MEASURE_SEND_DATA_COUNT)) // send raw data per 10s
+       if(MMI_BP_MEASURE_TOTAL_COUNT < s_hengai_bp_measure_count) // stop action when 60s
        {
-               mmi_heng_ai_bp_raw_data_send();
+               mmi_hengai_bp_raw_data_fill();
+               mmi_hengai_bp_measure_raw_data_send();
+               mmi_hengai_bp_measure_finish_screen();
        }
-       
-       if(MMI_BP_MEASURE_TOTAL_COUNT == s_hengai_bp_measure_count) // stop action when 60s
+       else
        {
-               // close sensor
-               mmi_close_sensor();
-               
                lv_heng_ai_bp_measure_ext_t * watch_ext = (lv_heng_ai_bp_measure_ext_t *)mmi_heng_ai_bp_measure_screen_ext_get();
                if(NULL == watch_ext)
                        return;
                
-               if(NULL != watch_ext->measure_timer_id)
-               {
-                       Hal_Timer_Stop(watch_ext->measure_timer_id);
-                       watch_ext->measure_timer_id = NULL;
-               }
-               watch_ext->result_timer_id = Hal_Timer_Start(MMI_BP_WAIT_RESULT_TIMEOUT, mmi_heng_ai_bp_measure_result_timeout, NULL, false);
+               lv_label_set_align(watch_ext->label_time, LV_LABEL_ALIGN_CENTER);
+               char time_str[16] = {0};
+               sprintf(time_str, "%02d:%02d/%02d:%02d", s_hengai_bp_measure_count / 60,
+                                                                                               s_hengai_bp_measure_count % 60,
+                                                                                               MMI_BP_MEASURE_TOTAL_COUNT / 60,
+                                                                                               MMI_BP_MEASURE_TOTAL_COUNT % 60);
+               lv_label_set_text(watch_ext->label_time, time_str);
+               lv_obj_align(watch_ext->label_time, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
        }
 }
 
-void mmi_heng_ai_bp_measure_start_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+void mmi_hengai_bp_measure_start_btn_event_cb(lv_obj_t * obj, lv_event_t e)
 {
        if(LV_EVENT_CLICKED != e)
                return;
 
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
        lv_heng_ai_bp_measure_ext_t * watch_ext = (lv_heng_ai_bp_measure_ext_t *)mmi_heng_ai_bp_measure_screen_ext_get();
        if(NULL == watch_ext)
                return;
 
-       if(NULL == watch_ext->tileview)
-               return;
-
-       lv_obj_t * watch_obj = lv_obj_get_parent(watch_ext->tileview);
-       lv_obj_del(watch_ext->tileview);
-       lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_HOR_RIGHT_HIDE);
-
-       lv_obj_t * cont = lv_cont_create(watch_obj, NULL);
-       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
-       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-       lv_obj_set_click(cont, false);
-       watch_ext->cont = cont;
+       lv_obj_set_hidden(watch_ext->cont, false);
+       lv_obj_set_hidden(watch_ext->cont_prompt_0, true);
+       lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
+       lv_obj_t * cont = watch_ext->cont;
        
        if(false == mmi_health_measure_wear_state_get())
        {
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                lv_obj_t * img = lv_img_create(cont, NULL);
                lv_img_set_src(img, ICON_HENGAI_BP_ALERT);
                lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 90);
@@ -612,45 +695,83 @@ void mmi_heng_ai_bp_measure_start_btn_event_cb(lv_obj_t * obj, lv_event_t e)
        }
        else
        {
-               mmi_open_sensor();
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               mmi_hsensor_bp_open();
+               mmi_hengai_bp_measure_action_time_string_set(1);
+
+               s_hengai_bp_measure_count = 0;
 
                gif_info_t * gif_info = gif_open(cont, ANIM_HENGAI_BP_MEASURE, 0);
                if(NULL == gif_info)
                        return;
+               lv_obj_set_style_local_bg_color(gif_info->container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
                lv_obj_align(gif_info->container, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
                watch_ext->gif_info = gif_info;
 
+               lv_obj_t * label_time = lv_label_create(cont, NULL);
+               lv_obj_add_style(label_time, LV_LABEL_PART_MAIN, &lv_watch_font36);
+               lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER);
+               char time_str[16] = {0};
+               sprintf(time_str, "%02d:%02d/%02d:%02d", s_hengai_bp_measure_count / 60,
+                                                                                               s_hengai_bp_measure_count % 60,
+                                                                                               MMI_BP_MEASURE_TOTAL_COUNT / 60,
+                                                                                               MMI_BP_MEASURE_TOTAL_COUNT % 60);
+               lv_label_set_text(label_time, time_str);
+               lv_obj_align(label_time, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
+               lv_obj_set_click(label_time, false);
+               watch_ext->label_time = label_time;
+
                lv_obj_t * label = lv_label_create(cont, NULL);
                lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font28);
                lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
                lv_label_set_text_id(label, WATCH_TEXT_ID_IN_MEASURE_PROMPT);
-               lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
+               lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 324 + 30);
                lv_obj_set_click(label, false);
 
                /* start timer (1 min) */
-               s_hengai_bp_measure_count = 0;
-               watch_ext->measure_timer_id = Hal_Timer_Start(1000, mmi_heng_ai_bp_measure_cycle_timeout, NULL, true);
+               watch_ext->measure_timer_id = Hal_Timer_Start(1000, mmi_hengai_bp_measure_cycle_timeout, NULL, true);
        }
 }
 
-lv_obj_t * mmi_heng_ai_bp_measure_tab_0(lv_obj_t * tileview, uint16_t id)
+void mmi_hengai_bp_measure_prompt_switch_event_cb(lv_obj_t * obj, lv_event_t e)
 {
-       lv_obj_t * tab = mmi_heng_ai_bp_tileview_add_tile(tileview, id);
-       if(NULL == tab)
-               return NULL;
+       if(LV_EVENT_CLICKED != e)
+               return;
+
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       lv_heng_ai_bp_measure_ext_t * watch_ext = (lv_heng_ai_bp_measure_ext_t *)mmi_heng_ai_bp_measure_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
        
-       lv_obj_t * label_title = lv_label_create(tab, NULL);
+       lv_obj_set_hidden(watch_ext->cont, true);
+       uint8_t free_num = lv_watch_get_free_num(obj);
+       if(0 == free_num)
+       {
+               lv_obj_set_hidden(watch_ext->cont_prompt_0, true);
+               lv_obj_set_hidden(watch_ext->cont_prompt_1, false);
+       }
+       else
+       {
+               lv_obj_set_hidden(watch_ext->cont_prompt_0, false);
+               lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
+       }
+}
+
+void mmi_hengai_bp_measure_prompt_0(lv_obj_t * cont)
+{      
+       lv_obj_t * label_title = lv_label_create(cont, NULL);
        lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
        lv_label_set_text_id(label_title, WATCH_TEXT_ID_MEASURE_PROMPT);
        lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
        lv_obj_set_click(label_title, false);
 
-       lv_obj_t * img = lv_img_create(tab, NULL);
+       lv_obj_t * img = lv_img_create(cont, NULL);
        lv_img_set_src(img, ICON_HENGAI_BP_PROMPT_0);
        lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
 
-       lv_obj_t * label_prompt = lv_label_create(tab, NULL);
+       lv_obj_t * label_prompt = lv_label_create(cont, NULL);
        lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
        lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
        lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_BREAK);
@@ -658,27 +779,26 @@ lv_obj_t * mmi_heng_ai_bp_measure_tab_0(lv_obj_t * tileview, uint16_t id)
        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, 292);
 
-       return tab;
+       lv_obj_t * imgbtn = mmi_bp_screen_common_right_button_create(cont, 0, 0, mmi_hengai_bp_measure_prompt_switch_event_cb);
+       lv_watch_set_free_num(imgbtn, 0);
+
+       mmi_bp_screen_common_bottom_button_create(cont, WATCH_TEXT_ID_START_MEASURE, mmi_hengai_bp_measure_start_btn_event_cb);
 }
 
-lv_obj_t * mmi_heng_ai_bp_measure_tab_1(lv_obj_t * tileview, uint16_t id)
-{
-       lv_obj_t * tab = mmi_heng_ai_bp_tileview_add_tile(tileview, id);
-       if(NULL == tab)
-               return NULL;
-       
-       lv_obj_t * label_title = lv_label_create(tab, NULL);
+void mmi_hengai_bp_measure_prompt_1(lv_obj_t * cont)
+{      
+       lv_obj_t * label_title = lv_label_create(cont, NULL);
        lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
        lv_label_set_text_id(label_title, WATCH_TEXT_ID_MEASURE_PROMPT);
        lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
        lv_obj_set_click(label_title, false);
 
-       lv_obj_t * img = lv_img_create(tab, NULL);
+       lv_obj_t * img = lv_img_create(cont, NULL);
        lv_img_set_src(img, ICON_HENGAI_BP_PROMPT_1);
        lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
 
-       lv_obj_t * label_prompt = lv_label_create(tab, NULL);
+       lv_obj_t * label_prompt = lv_label_create(cont, NULL);
        lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
        lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
        lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_BREAK);
@@ -686,69 +806,17 @@ lv_obj_t * mmi_heng_ai_bp_measure_tab_1(lv_obj_t * tileview, uint16_t id)
        lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_CALIBRATE_PROMPT_1);
        lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
 
-       lv_obj_t * imgbtn = lv_imgbtn_create(tab, NULL);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
-       lv_obj_set_event_cb(imgbtn, mmi_heng_ai_bp_measure_start_btn_event_cb);
-
-       lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
-       lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
-       lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_START_MEASURE);
-       lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
+       lv_obj_t * imgbtn = mmi_bp_screen_common_left_button_create(cont, 0, 0, mmi_hengai_bp_measure_prompt_switch_event_cb);
+       lv_watch_set_free_num(imgbtn, 1);
 
-       return tab;
+       mmi_bp_screen_common_bottom_button_create(cont, WATCH_TEXT_ID_START_MEASURE, mmi_hengai_bp_measure_start_btn_event_cb);
 }
 
-void mmi_heng_ai_bp_measure_screen_tileview_led(lv_obj_t * tileview)
+lv_obj_t * mmi_heng_ai_bp_measure_screen_create(lv_obj_t * activity_obj)
 {
-       lv_heng_ai_bp_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview);
-       if(NULL == ext)
-           return NULL;
-
-    if(NULL == ext->led_cont)
+    if(NULL == activity_obj) 
        {
-        ext->led_cont = lv_cont_create(tileview, NULL);
-        lv_obj_set_base_dir(ext->led_cont, LV_BIDI_DIR_LTR);
-        lv_cont_set_fit(ext->led_cont, LV_FIT_TIGHT);
-        lv_cont_set_layout(ext->led_cont, LV_LAYOUT_ROW_MID);
-        lv_obj_add_style(ext->led_cont, LV_CONT_PART_MAIN, &lv_watch_style_transp);
-        lv_obj_set_click(ext->led_cont, false);
-    }
-
-       uint8_t i = 0;
-    for(i = 0; i < 2; i++)
-       {
-        if(NULL == ext->led[i])
-               {
-            ext->led[i] = lv_led_create(ext->led_cont, NULL);
-        }
-               
-        lv_led_off(ext->led[i]);
-        lv_obj_set_size(ext->led[i], 6, 6);
-    }
-       
-       lv_coord_t x = -1, y = -1;
-       lv_tileview_get_tile_act(tileview, &x, &y);
-       lv_led_on(ext->led[x]);
-       lv_obj_set_size(ext->led[x], 10, 10);
-    lv_obj_set_pos(ext->led_cont, LV_HOR_RES * x + (LV_HOR_RES - lv_obj_get_width(ext->led_cont)) / 2, 100);
-}
-
-void mmi_heng_ai_bp_measure_screen_tileview_event_cb(lv_obj_t * tileview, lv_event_t e)
-{
-       if(LV_EVENT_VALUE_CHANGED != e)
-               return;
-
-       mmi_heng_ai_bp_measure_screen_tileview_led(tileview);
-}
-
-lv_obj_t * mmi_heng_ai_bp_measure_screen_create(lv_obj_t * activity_obj)
-{
-    if(NULL == activity_obj) 
-       {
-        lv_watch_activity_ext_t activity_ext = {0};
+        lv_watch_activity_ext_t activity_ext = {0};
 
                activity_ext.actId = ACT_ID_HENG_AI_BP_MEASURE;
                activity_ext.create = mmi_heng_ai_bp_measure_screen_create;
@@ -762,55 +830,42 @@ lv_obj_t * mmi_heng_ai_bp_measure_screen_create(lv_obj_t * activity_obj)
     LV_ASSERT_MEM(watch_obj);
        if(NULL == watch_obj)
                return NULL;
-       lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_NO);
+       lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_HOR_RIGHT_HIDE);
        lv_heng_ai_bp_measure_ext_t * watch_ext = lv_obj_allocate_ext_attr(watch_obj, sizeof(lv_heng_ai_bp_measure_ext_t));
-       if(NULL == ext)
+       if(NULL == watch_ext)
                return NULL;
-       watch_ext->tileview = NULL;
        watch_ext->cont = NULL;
+       watch_ext->cont_prompt_0 = NULL;
+       watch_ext->cont_prompt_1 = NULL;
        watch_ext->gif_info = NULL;
        watch_ext->measure_timer_id = NULL;
        watch_ext->result_timer_id = NULL;
-       
-       lv_obj_t * tileview = lv_tileview_create(watch_obj, NULL);
-       if(NULL == tileview)
-               return NULL;
-       lv_heng_ai_bp_tileview_ext_t * ext = lv_obj_allocate_ext_attr(tileview, sizeof(lv_heng_ai_bp_tileview_ext_t));
-       if(NULL == ext)
-               return NULL;
-       
-       watch_ext->tileview = tileview;
-       ext->tab_0 = NULL;
-       ext->tab_1 = NULL;
-       ext->tab_2 = NULL;
-       ext->led_cont= NULL;
-       ext->led[0] = NULL;
-       ext->led[1] = NULL;
-       ext->led[2] = NULL;
-       
-       lv_tileview_set_valid_positions(tileview, s_hengai_bp_valid_pos, 2);
-       lv_tileview_set_edge_flash(tileview, true);
-       lv_tileview_set_anim_time(tileview, 60);
-       lv_page_set_scrollbar_mode(tileview, LV_SCROLLBAR_MODE_OFF);
-       lv_obj_add_style(tileview, LV_TILEVIEW_PART_EDGE_FLASH, &lv_watch_cont_opa1);
-       ext->tileview = tileview;
-
-       ext->tab_0 = mmi_heng_ai_bp_measure_tab_0(tileview, 0);
-       LV_ASSERT_MEM(ext->tab_0);
-       if(NULL == ext->tab_0)
-               return NULL;
 
-       ext->tab_1 = mmi_heng_ai_bp_measure_tab_1(tileview, 1);
-       LV_ASSERT_MEM(ext->tab_1);
-       if(NULL == ext->tab_1)
-               return NULL;
+       lv_obj_t * cont = NULL;
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+    //lv_obj_add_style(cont, LV_CONT_PART_MAIN, &lv_style_transp_tight);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont = cont;
 
-       lv_tileview_set_tile_act(tileview, 0, 0, LV_ANIM_OFF);
-       lv_watch_obj_add_element(tileview);
-       lv_watch_obj_add_element(lv_page_get_scrl(tileview));
-       lv_obj_set_event_cb(tileview, mmi_heng_ai_bp_measure_screen_tileview_event_cb);
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont_prompt_0 = cont;
+       mmi_hengai_bp_measure_prompt_0(cont);
+       
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont_prompt_1 = cont;
+       mmi_hengai_bp_measure_prompt_1(cont);
 
-       mmi_heng_ai_bp_measure_screen_tileview_led(tileview);
+       lv_obj_set_hidden(watch_ext->cont, true);
+       lv_obj_set_hidden(watch_ext->cont_prompt_0, false);
+       lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
 
        //
        watch_set_suspend_enable(false, ACT_ID_HENG_AI_BP_MEASURE, 0);
@@ -851,7 +906,7 @@ lv_obj_t * mmi_heng_ai_bp_measure_mode_create(lv_obj_t * tileview, uint16_t id)
        lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
        lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_START_MEASURE);
+       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_MEASURE_PROMPT);
        lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
 
        return tab;
@@ -912,9 +967,150 @@ void mmi_heng_ai_bp_calibrate_screen_clean(void)
        }
 }
 
+void mmi_heng_ai_bp_calibrate_result_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+       if(LV_EVENT_CLICKED != e)
+               return;
+
+       mmi_heng_ai_bp_calibrate_screen_clean();        
+}
+
+void mmi_hengai_bp_calibrate_result_screen(bool result)
+{
+       mmi_hengai_bp_raw_data_free();
+       
+       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
+
+       // clean
+       if(NULL != watch_ext->measure_timer_id)
+       {
+               Hal_Timer_Stop(watch_ext->measure_timer_id);
+               watch_ext->measure_timer_id = NULL;
+       }
+       if(NULL != watch_ext->result_timer_id)
+       {
+               Hal_Timer_Stop(watch_ext->result_timer_id);
+               watch_ext->result_timer_id = NULL;
+       }
+       if(NULL != watch_ext->gif_info)
+       {
+               gif_close(watch_ext->gif_info);
+               watch_ext->gif_info = NULL;
+       }
+       watch_ext->is_watting_result = false;
+       lv_obj_clean(watch_ext->cont);
+
+       // display
+       uint32_t label_title_text_id[] = {WATCH_TEXT_ID_CALIBRATE_SUCCESS, WATCH_TEXT_ID_CALIBRATE_FAILED};
+       void * img_src_path[] = {ICON_HENGAI_BP_SUCCESS, ICON_HENGAI_BP_ALERT};
+       uint32_t label_prompt_text_id[] = {WATCH_TEXT_ID_BLOOD_PRESSURE_NORMAL_PROMPT, WATCH_TEXT_ID_BLOOD_PRESSURE_FAILED_PROMPT};
+       
+       lv_obj_t * label_title = lv_label_create(watch_ext->cont, NULL);
+       lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
+       lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(label_title, label_title_text_id[(result ? 0 : 1)]);
+       lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
+       lv_obj_set_click(label_title, false);
+       
+       lv_obj_t * img = lv_img_create(watch_ext->cont, NULL);
+       lv_img_set_src(img, img_src_path[(result ? 0 : 1)]);
+       lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
+                               
+       lv_obj_t * label_prompt = lv_label_create(watch_ext->cont, NULL);
+       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
+       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, 400);
+       lv_label_set_text_id(label_prompt, label_prompt_text_id[(result ? 0 : 1)]);
+       lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
+
+       mmi_bp_screen_common_bottom_button_create(watch_ext->cont, WATCH_TEXT_ID_OK, mmi_heng_ai_bp_calibrate_result_event_cb);
+}
+
+void mmi_hengai_bp_calibrate_result_timeout(void * para)
+{
+       mmi_hengai_bp_calibrate_result_screen(false);
+}
+
+void mmi_hengai_bp_calibrate_update_result(bool is_success)
+{
+       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
+
+       if(true != watch_ext->is_watting_result)
+               return;
+
+       if(is_success)
+       {
+               nv_watch_heng_ai_blood_pressure_t data = {0};
+
+               data.is_calibrated = 1;
+               mmi_hengai_blood_pressure_data_set(&data);
+       }
+       mmi_hengai_bp_calibrate_result_screen(is_success);
+}
+
+void mmi_hengai_bp_calibrate_finish_screen(void)
+{
+       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
+
+       lv_obj_clean(watch_ext->cont);
+       watch_ext->is_watting_result = true;
+
+#if 1
+       gif_info_t * gif_info = gif_open(watch_ext->cont, ANIM_HENGAI_BP_WAITTING, 0);
+       if(NULL == gif_info)
+               return;
+       lv_obj_set_style_local_bg_color(gif_info->container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_align(gif_info->container, NULL, LV_ALIGN_CENTER, 0, 0);
+       watch_ext->gif_info = gif_info;
+
+       lv_obj_t * label_prompt = lv_label_create(gif_info->container, NULL);
+       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
+       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, 400);
+       lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_WAIT_RESULT);
+       lv_obj_align(label_prompt, NULL, LV_ALIGN_CENTER, 0, 0);
+#else
+       lv_obj_t * label_prompt = lv_label_create(watch_ext->cont, NULL);
+       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
+       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, 400);
+       lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_WAIT_RESULT);
+       lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
+#endif
+
+       watch_ext->result_timer_id = Hal_Timer_Start(MMI_BP_WAIT_RESULT_TIMEOUT, mmi_hengai_bp_calibrate_result_timeout, NULL, false);
+}
+
+void mmi_hengai_bp_calibrate_end_input_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+       if(LV_EVENT_CLICKED != e)
+               return;
+
+       // send vaule
+       mmi_hengai_bp_calibrate_raw_data_send(s_hengai_bp_calibrate_times, s_bp_value_high, s_bp_value_low);
+       
+       if(1 == s_hengai_bp_calibrate_times)
+       {
+               // once again
+               mmi_heng_ai_bp_calibrate_start_screen();
+       }
+       else
+       {
+               mmi_hengai_bp_calibrate_finish_screen();
+       }
+}
+
 void mmi_bp_roller_get_optstr_from_num(uint16_t sel_value, char * stropt, uint32_t user_num)
 {
-/*
     uint8_t opt_display[5];
     uint8_t i, pos = 0;
     uint8_t min = 0;
@@ -923,7 +1119,7 @@ void mmi_bp_roller_get_optstr_from_num(uint16_t sel_value, char * stropt, uint32
        
     if(0 == user_num) // high
        {
-               min = 80
+               min = 80;
         max = 200;
         count = 121;
     }
@@ -946,7 +1142,6 @@ void mmi_bp_roller_get_optstr_from_num(uint16_t sel_value, char * stropt, uint32
         stropt[pos++] = 0x0A;
     }
     stropt [pos - 1] = 0;
-*/
 }
 
 void mmi_bp_roller_action(lv_obj_t * roller, lv_event_t event)
@@ -957,7 +1152,7 @@ void mmi_bp_roller_action(lv_obj_t * roller, lv_event_t event)
        uint32_t user_num = lv_watch_get_free_num(roller);
        uint16_t sel_value = 0;
        char sel_str[4] = {0};
-       char stropt[40] = {0};
+       char stropt[16] = {0};
        
        lv_roller_get_selected_str(roller, sel_str, 4);
        sel_value = atoi(sel_str);
@@ -976,16 +1171,15 @@ lv_obj_t * mmi_bp_roller_create(lv_obj_t * par, uint32_t user_num)
        //lv_obj_align(roller_cont, NULL, LV_ALIGN_IN_TOP_LEFT, 90, 140);
 
        lv_obj_t * roller = lv_roller_create(roller_cont, NULL);
-       lv_obj_add_style(roller, LV_ROLLER_PART_BG, &lv_watch_font36_gray);
-       lv_obj_set_style_local_text_line_space(roller, LV_ROLLER_PART_BG, LV_STATE_DEFAULT, 20);
+       lv_obj_add_style(roller, LV_ROLLER_PART_BG, &lv_watch_font28_gray); //&lv_watch_font36_gray);
+       lv_obj_set_style_local_text_line_space(roller, LV_ROLLER_PART_BG, LV_STATE_DEFAULT, 28); //36);
        lv_obj_set_style_local_bg_opa(roller, LV_ROLLER_PART_BG, LV_STATE_DEFAULT, LV_OPA_TRANSP);
        lv_obj_add_style(roller, LV_ROLLER_PART_SELECTED, &lv_watch_font60);
-       lv_obj_set_style_local_text_line_space(roller, LV_ROLLER_PART_SELECTED, LV_STATE_DEFAULT, 20);
+       lv_obj_set_style_local_text_line_space(roller, LV_ROLLER_PART_SELECTED, LV_STATE_DEFAULT, 60);
        lv_obj_set_style_local_bg_opa(roller, LV_ROLLER_PART_SELECTED, LV_STATE_DEFAULT, LV_OPA_TRANSP);
 
-
-       uint16_t sel_value = 0;
-       char stropt[40] = {0};
+       uint16_t sel_value = 90;
+       char stropt[16] = {0};
        
        mmi_bp_roller_get_optstr_from_num(sel_value, stropt, user_num);
 
@@ -1001,113 +1195,12 @@ lv_obj_t * mmi_bp_roller_create(lv_obj_t * par, uint32_t user_num)
        return roller_cont;
 }
 
-// 0-ok; 1-high; 2-low; 3-fail
-void mmi_heng_ai_bp_calibrate_result_screen(uint8_t result)
-{
-       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
-       if(NULL == watch_ext)
-               return;
-
-       // clean
-       if(NULL != watch_ext->measure_timer_id)
-       {
-               Hal_Timer_Stop(watch_ext->measure_timer_id);
-               watch_ext->measure_timer_id = NULL;
-       }
-       if(NULL != watch_ext->result_timer_id)
-       {
-               Hal_Timer_Stop(watch_ext->result_timer_id);
-               watch_ext->result_timer_id = NULL;
-       }
-       if(NULL != watch_ext->gif_info)
-       {
-               gif_close(watch_ext->gif_info);
-               watch_ext->gif_info = NULL;
-       }
-       lv_obj_clean(watch_ext->cont);
-
-       // display
-       uint32_t label_title_text_id[] = {WATCH_TEXT_ID_CALIBRATE_SUCCESS,
-                                                                               WATCH_TEXT_ID_BLOOD_PRESSURE_HIGH,
-                                                                               WATCH_TEXT_ID_BLOOD_PRESSURE_LOW,
-                                                                               WATCH_TEXT_ID_CALIBRATE_FAILED};
-       void * img_src_path[] = {ICON_HENGAI_BP_SUCCESS, ICON_HENGAI_BP_ALERT, ICON_HENGAI_BP_ALERT, ICON_HENGAI_BP_ALERT};
-       uint32_t label_prompt_text_id[] = {WATCH_TEXT_ID_BLOOD_PRESSURE_NORMAL_PROMPT,
-                                                                               WATCH_TEXT_ID_BLOOD_PRESSURE_HIGH_PROMPT,
-                                                                               WATCH_TEXT_ID_BLOOD_PRESSURE_LOW_PROMPT,
-                                                                               WATCH_TEXT_ID_BLOOD_PRESSURE_FAILED_PROMPT};
-       
-       lv_obj_t * label_title = lv_label_create(watch_ext->cont, NULL);
-       lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
-       lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(label_title, label_title_text_id[result]);
-       lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
-       lv_obj_set_click(label_title, false);
-       
-       lv_obj_t * img = lv_img_create(watch_ext->cont, NULL);
-       lv_img_set_src(img, img_src_path[result]);
-       lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
-                               
-       lv_obj_t * label_prompt = lv_label_create(watch_ext->cont, NULL);
-       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
-       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, 400);
-       lv_label_set_text_id(label_prompt, label_prompt_text_id[result]);
-       lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
-}
-
-void mmi_heng_ai_bp_calibrate_result_timeout(void * para)
-{
-       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
-       if(NULL == watch_ext)
-               return;
-       
-       if(NULL != watch_ext->result_timer_id)
-       {
-               Hal_Timer_Stop(watch_ext->result_timer_id);
-               watch_ext->result_timer_id = NULL;
-       }
-
-       mmi_heng_ai_bp_calibrate_result_screen(3);
-}
-
-void mmi_heng_ai_bp_calibrate_end_btn_event_cb(lv_obj_t * obj, lv_event_t e)
-{
-       if(LV_EVENT_CLICKED != e)
-               return;
-
-       // send vaule
-       mmi_heng_ai_bp_calibrate_input_value_send();
-       
-       if(1 == s_hengai_bp_calibrate_times)
-       {
-               // once again
-               mmi_heng_ai_bp_calibrate_start_screen();
-       }
-       else
-       {
-               // finish
-               lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
-               if(NULL == watch_ext)
-                       return;
-               
-               watch_ext->result_timer_id = Hal_Timer_Start(MMI_BP_WAIT_RESULT_TIMEOUT, mmi_heng_ai_bp_calibrate_result_timeout, NULL, false);
-       }
-}
-
-void mmi_heng_ai_bp_calibrate_end_screen(void)
-{
-       mmi_close_sensor();
-       
+void mmi_hengai_bp_calibrate_input_screen(void)
+{      
        lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
        if(NULL == watch_ext)
                return;
        
-       Hal_Timer_Stop(watch_ext->measure_timer_id);
-       watch_ext->measure_timer_id = NULL;
-       gif_close(watch_ext->gif_info);
-       watch_ext->gif_info = NULL;
        lv_obj_clean(watch_ext->cont);
 
        lv_obj_t * label_title = lv_label_create(watch_ext->cont, NULL);
@@ -1125,7 +1218,7 @@ void mmi_heng_ai_bp_calibrate_end_screen(void)
        lv_obj_set_click(label_0, false);
 
        lv_obj_t * roller_cont_0 = mmi_bp_roller_create(watch_ext->cont, 0);
-       lv_obj_align(roller_cont_0, NULL, LV_ALIGN_IN_TOP_LEFT, 90, 140);
+       lv_obj_align(roller_cont_0, NULL, LV_ALIGN_IN_TOP_LEFT, 96, 140);
 
        lv_obj_t * label_1 = lv_label_create(watch_ext->cont, NULL);
        lv_obj_add_style(label_1, LV_LABEL_PART_MAIN, &lv_watch_font24);
@@ -1135,36 +1228,69 @@ void mmi_heng_ai_bp_calibrate_end_screen(void)
        lv_obj_set_click(label_1, false);
 
        lv_obj_t * roller_cont_1 = mmi_bp_roller_create(watch_ext->cont, 1);
-       lv_obj_align(roller_cont_1, NULL, LV_ALIGN_IN_TOP_LEFT, 270, 140);
+       lv_obj_align(roller_cont_1, NULL, LV_ALIGN_IN_TOP_LEFT, 276, 140);
 
-       lv_obj_t * imgbtn = lv_imgbtn_create(watch_ext->cont, NULL);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
-       lv_obj_set_event_cb(imgbtn, mmi_heng_ai_bp_calibrate_end_btn_event_cb);
+       s_bp_value_high = 0;
+       s_bp_value_low = 0;
+       mmi_bp_screen_common_bottom_button_create(watch_ext->cont, WATCH_TEXT_ID_OK, mmi_hengai_bp_calibrate_end_input_event_cb);
+}
 
-       lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
-       lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
-       lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_OK);
-       lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
+void mmi_hengai_bp_calibrate_end_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+{
+       if(LV_EVENT_CLICKED != e)
+               return;
+
+       mmi_hengai_bp_calibrate_input_screen();
 }
 
-void mmi_heng_ai_bp_calibrate_cycle_timeout(void * para)
+void mmi_hengai_bp_calibrate_end_screen(void)
 {
-       mmi_heng_ai_bp_raw_data_save();
+       mmi_hsensor_close();
+       mmi_hengai_bp_measure_action_time_string_set(0);
        
-       s_hengai_bp_measure_count++;
+       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
        
-       if(0 == (s_hengai_bp_measure_count % MMI_BP_MEASURE_SEND_DATA_COUNT)) // send raw data per 10s
+       if(NULL != watch_ext->measure_timer_id)
        {
-               mmi_heng_ai_bp_raw_data_send();
+               Hal_Timer_Stop(watch_ext->measure_timer_id);
+               watch_ext->measure_timer_id = NULL;
        }
-       
-       if(MMI_BP_MEASURE_TOTAL_COUNT <= s_hengai_bp_measure_count) // stop action when 60s
+       if(NULL != watch_ext->gif_info)
+       {
+               gif_close(watch_ext->gif_info);
+               watch_ext->gif_info = NULL;
+       }
+       lv_obj_clean(watch_ext->cont);
+
+       lv_obj_t * label_title = lv_label_create(watch_ext->cont, NULL);
+       lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
+       lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
+       lv_label_set_text_id(label_title, WATCH_TEXT_ID_CALIBRATE_PROMPT);
+       lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
+       lv_obj_set_click(label_title, false);
+
+       lv_obj_t * label_prompt = lv_label_create(watch_ext->cont, NULL);
+       lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
+       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, 360); // 400);
+       lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_CALIBRATE_PROMPT_3);
+       lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 200); // 104);
+
+       mmi_bp_screen_common_bottom_button_create(watch_ext->cont, WATCH_TEXT_ID_OK, mmi_hengai_bp_calibrate_end_btn_event_cb);
+}
+
+void mmi_hengai_bp_calibrate_cycle_timeout(void * para)
+{
+       s_hengai_bp_measure_count++;
+               
+       if(MMI_BP_MEASURE_TOTAL_COUNT < s_hengai_bp_measure_count) // stop action when 60s
        {
                s_hengai_bp_calibrate_times++;
-               mmi_heng_ai_bp_calibrate_end_screen();          
+               mmi_hengai_bp_raw_data_fill();
+               mmi_hengai_bp_calibrate_end_screen();           
        }
 }
 
@@ -1190,11 +1316,20 @@ void mmi_heng_ai_bp_calibrate_start_screen(void)
        }
        else
        {
-               mmi_open_sensor();
+               mmi_hsensor_bp_open();
+               mmi_hengai_bp_measure_action_time_string_set(1);
                
+               lv_obj_t * label_title = lv_label_create(watch_ext->cont, NULL);
+               lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
+               lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
+               lv_label_set_text_id(label_title, WATCH_TEXT_ID_CALIBRATING);
+               lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
+               lv_obj_set_click(label_title, false);
+
                gif_info_t * gif_info = gif_open(watch_ext->cont, ANIM_HENGAI_BP_CALIBRATE, 0);
                if(NULL == gif_info)
                        return;
+               lv_obj_set_style_local_bg_color(gif_info->container, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
                lv_obj_align(gif_info->container, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
                watch_ext->gif_info = gif_info;
 
@@ -1205,13 +1340,20 @@ void mmi_heng_ai_bp_calibrate_start_screen(void)
                lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
                lv_obj_set_click(label, false);
 
+               label = lv_label_create(watch_ext->cont, NULL);
+               lv_obj_add_style(label, LV_LABEL_PART_MAIN, &lv_watch_font28);
+               lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+               lv_label_set_text_id(label, WATCH_TEXT_ID_NEED_ONE_MINUTE);
+               lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 348);
+               lv_obj_set_click(label, false);
+
                /* start timer (1 min) */
                s_hengai_bp_measure_count = 0;
-               watch_ext->measure_timer_id = Hal_Timer_Start(1000, mmi_heng_ai_bp_calibrate_cycle_timeout, NULL, true);
+               watch_ext->measure_timer_id = Hal_Timer_Start(1000, mmi_hengai_bp_calibrate_cycle_timeout, NULL, true);
        }
 }
 
-void mmi_heng_ai_bp_calibrate_start_btn_event_cb(lv_obj_t * obj, lv_event_t e)
+void mmi_hengai_bp_calibrate_start_btn_event_cb(lv_obj_t * obj, lv_event_t e)
 {
        if(LV_EVENT_CLICKED != e)
                return;
@@ -1222,40 +1364,64 @@ void mmi_heng_ai_bp_calibrate_start_btn_event_cb(lv_obj_t * obj, lv_event_t e)
        if(NULL == watch_ext)
                return;
 
-       if(NULL == watch_ext->tileview)
-               return;
-
-       lv_obj_t * watch_obj = lv_obj_get_parent(watch_ext->tileview);
-       lv_obj_del(watch_ext->tileview);
-       lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_HOR_RIGHT_HIDE);
-
-       lv_obj_t * cont = lv_cont_create(watch_obj, NULL);
-       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
-       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-       lv_obj_set_click(cont, false);
-       watch_ext->cont = cont;
+       lv_obj_set_hidden(watch_ext->cont, false);
+       lv_obj_set_hidden(watch_ext->cont_prompt_0, true);
+       lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
+       lv_obj_set_hidden(watch_ext->cont_prompt_2, true);
+       //lv_obj_del(watch_ext->cont_prompt_0);
+       //lv_obj_del(watch_ext->cont_prompt_1);
+       //lv_obj_del(watch_ext->cont_prompt_2);
        
        mmi_heng_ai_bp_calibrate_start_screen();
 }
 
-lv_obj_t * mmi_heng_ai_bp_calibrate_tab_0(lv_obj_t * tileview, uint16_t id)
+void mmi_hengai_bp_calibrate_prompt_switch_event_cb(lv_obj_t * obj, lv_event_t e)
 {
-       lv_obj_t * tab = mmi_heng_ai_bp_tileview_add_tile(tileview, id);
-       if(NULL == tab)
-               return NULL;
+       if(LV_EVENT_CLICKED != e)
+               return;
+
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       lv_heng_ai_bp_calibrate_ext_t * watch_ext = (lv_heng_ai_bp_calibrate_ext_t *)mmi_heng_ai_bp_calibrate_screen_ext_get();
+       if(NULL == watch_ext)
+               return;
        
-       lv_obj_t * label_title = lv_label_create(tab, NULL);
+       lv_obj_set_hidden(watch_ext->cont, true);
+       uint8_t free_num = lv_watch_get_free_num(obj);
+       if((0 == free_num) || (3 == free_num))
+       {
+               lv_obj_set_hidden(watch_ext->cont_prompt_0, true);
+               lv_obj_set_hidden(watch_ext->cont_prompt_1, false);
+               lv_obj_set_hidden(watch_ext->cont_prompt_2, true);
+       }
+       else if(1 == free_num)
+       {
+               lv_obj_set_hidden(watch_ext->cont_prompt_0, false);
+               lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
+               lv_obj_set_hidden(watch_ext->cont_prompt_2, true);
+       }
+       else if(2 == free_num)
+       {
+               lv_obj_set_hidden(watch_ext->cont_prompt_0, true);
+               lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
+               lv_obj_set_hidden(watch_ext->cont_prompt_2, false);
+       }
+}
+
+void mmi_hengai_bp_calibrate_prompt_0(lv_obj_t * cont)
+{      
+       lv_obj_t * label_title = lv_label_create(cont, NULL);
        lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
        lv_label_set_text_id(label_title, WATCH_TEXT_ID_CALIBRATE_PROMPT);
        lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
        lv_obj_set_click(label_title, false);
 
-       lv_obj_t * img = lv_img_create(tab, NULL);
+       lv_obj_t * img = lv_img_create(cont, NULL);
        lv_img_set_src(img, ICON_HENGAI_BP_PROMPT_0);
        lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
 
-       lv_obj_t * label_prompt = lv_label_create(tab, NULL);
+       lv_obj_t * label_prompt = lv_label_create(cont, NULL);
        lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
        lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
        lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_BREAK);
@@ -1263,27 +1429,26 @@ lv_obj_t * mmi_heng_ai_bp_calibrate_tab_0(lv_obj_t * tileview, uint16_t id)
        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, 292);
 
-       return tab;
+       lv_obj_t * imgbtn = mmi_bp_screen_common_right_button_create(cont, 0, 0, mmi_hengai_bp_calibrate_prompt_switch_event_cb);
+       lv_watch_set_free_num(imgbtn, 0);
+
+       mmi_bp_screen_common_bottom_button_create(cont, WATCH_TEXT_ID_START_CALIBRATE, mmi_hengai_bp_calibrate_start_btn_event_cb);
 }
 
-lv_obj_t * mmi_heng_ai_bp_calibrate_tab_1(lv_obj_t * tileview, uint16_t id)
-{
-       lv_obj_t * tab = mmi_heng_ai_bp_tileview_add_tile(tileview, id);
-       if(NULL == tab)
-               return NULL;
-       
-       lv_obj_t * label_title = lv_label_create(tab, NULL);
+void mmi_hengai_bp_calibrate_prompt_1(lv_obj_t * cont)
+{      
+       lv_obj_t * label_title = lv_label_create(cont, NULL);
        lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
        lv_label_set_text_id(label_title, WATCH_TEXT_ID_CALIBRATE_PROMPT);
        lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
        lv_obj_set_click(label_title, false);
 
-       lv_obj_t * img = lv_img_create(tab, NULL);
+       lv_obj_t * img = lv_img_create(cont, NULL);
        lv_img_set_src(img, ICON_HENGAI_BP_PROMPT_1);
        lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
 
-       lv_obj_t * label_prompt = lv_label_create(tab, NULL);
+       lv_obj_t * label_prompt = lv_label_create(cont, NULL);
        lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
        lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
        lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_BREAK);
@@ -1291,23 +1456,26 @@ lv_obj_t * mmi_heng_ai_bp_calibrate_tab_1(lv_obj_t * tileview, uint16_t id)
        lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_CALIBRATE_PROMPT_1);
        lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 292);
 
-       return tab;
+       lv_obj_t * imgbtn = NULL;
+       imgbtn = mmi_bp_screen_common_left_button_create(cont, 0, 0, mmi_hengai_bp_calibrate_prompt_switch_event_cb);
+       lv_watch_set_free_num(imgbtn, 1);
+       
+       imgbtn = mmi_bp_screen_common_right_button_create(cont, 0, 0, mmi_hengai_bp_calibrate_prompt_switch_event_cb);
+       lv_watch_set_free_num(imgbtn, 2);
+
+       mmi_bp_screen_common_bottom_button_create(cont, WATCH_TEXT_ID_START_CALIBRATE, mmi_hengai_bp_calibrate_start_btn_event_cb);
 }
 
-lv_obj_t * mmi_heng_ai_bp_calibrate_tab_2(lv_obj_t * tileview, uint16_t id)
-{
-       lv_obj_t * tab = mmi_heng_ai_bp_tileview_add_tile(tileview, id);
-       if(NULL == tab)
-               return NULL;
-       
-       lv_obj_t * label_title = lv_label_create(tab, NULL);
+void mmi_hengai_bp_calibrate_prompt_2(lv_obj_t * cont)
+{      
+       lv_obj_t * label_title = lv_label_create(cont, NULL);
        lv_obj_add_style(label_title, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(label_title, LV_LABEL_ALIGN_CENTER);
        lv_label_set_text_id(label_title, WATCH_TEXT_ID_CALIBRATE_PROMPT);
        lv_obj_align(label_title, NULL, LV_ALIGN_IN_TOP_MID, 0, 48);
        lv_obj_set_click(label_title, false);
 
-       lv_obj_t * label_prompt = lv_label_create(tab, NULL);
+       lv_obj_t * label_prompt = lv_label_create(cont, NULL);
        lv_obj_add_style(label_prompt, LV_LABEL_PART_MAIN, &lv_watch_font28);
        lv_label_set_align(label_prompt, LV_LABEL_ALIGN_CENTER);
        lv_label_set_long_mode(label_prompt, LV_LABEL_LONG_BREAK);
@@ -1315,62 +1483,10 @@ lv_obj_t * mmi_heng_ai_bp_calibrate_tab_2(lv_obj_t * tileview, uint16_t id)
        lv_label_set_text_id(label_prompt, WATCH_TEXT_ID_CALIBRATE_PROMPT_2);
        lv_obj_align(label_prompt, NULL, LV_ALIGN_IN_TOP_MID, 0, 104);
 
-       lv_obj_t * imgbtn = lv_imgbtn_create(tab, NULL);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, ICON_HENGAI_BP_BOTTOM_BTN_BG);
-       lv_obj_align(imgbtn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
-       lv_obj_set_event_cb(imgbtn, mmi_heng_ai_bp_calibrate_start_btn_event_cb);
-
-       lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
-       lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
-       lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_START_CALIBRATE);
-       lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
-
-       return tab;
-}
-
-void mmi_heng_ai_bp_calibrate_screen_tileview_led(lv_obj_t * tileview)
-{
-       lv_heng_ai_bp_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview);
-       if(NULL == ext)
-               return NULL;
-
-       if(NULL == ext->led_cont)
-       {
-               ext->led_cont = lv_cont_create(tileview, NULL);
-               lv_obj_set_base_dir(ext->led_cont, LV_BIDI_DIR_LTR);
-               lv_cont_set_fit(ext->led_cont, LV_FIT_TIGHT);
-               lv_cont_set_layout(ext->led_cont, LV_LAYOUT_ROW_MID);
-               lv_obj_add_style(ext->led_cont, LV_CONT_PART_MAIN, &lv_watch_style_transp);
-               lv_obj_set_click(ext->led_cont, false);
-       }
-
-       uint8_t i = 0;
-       for(i = 0; i < MMI_HENGAI_BP_TAB_COUNT; i++)
-       {
-               if(NULL == ext->led[i])
-               {
-                       ext->led[i] = lv_led_create(ext->led_cont, NULL);
-               }
-
-               lv_led_off(ext->led[i]);
-               lv_obj_set_size(ext->led[i], 6, 6);
-       }
-
-       lv_coord_t x = -1, y = -1;
-       lv_tileview_get_tile_act(tileview, &x, &y);
-       lv_led_on(ext->led[x]);
-       lv_obj_set_size(ext->led[x], 10, 10);
-       lv_obj_set_pos(ext->led_cont, LV_HOR_RES * x + (LV_HOR_RES - lv_obj_get_width(ext->led_cont)) / 2, 100);
-}
- 
-void mmi_heng_ai_bp_calibrate_screen_tileview_event_cb(lv_obj_t * tileview, lv_event_t e)
-{
-       if(LV_EVENT_VALUE_CHANGED != e)
-               return;
-
-       mmi_heng_ai_bp_calibrate_screen_tileview_led(tileview);
+       lv_obj_t * imgbtn = mmi_bp_screen_common_left_button_create(cont, 0, 0, mmi_hengai_bp_calibrate_prompt_switch_event_cb);
+       lv_watch_set_free_num(imgbtn, 3);
+       
+       mmi_bp_screen_common_bottom_button_create(cont, WATCH_TEXT_ID_START_CALIBRATE, mmi_hengai_bp_calibrate_start_btn_event_cb);
 }
 
 lv_obj_t * mmi_heng_ai_bp_calibrate_screen_create(lv_obj_t * activity_obj)
@@ -1391,60 +1507,51 @@ lv_obj_t * mmi_heng_ai_bp_calibrate_screen_create(lv_obj_t * activity_obj)
     LV_ASSERT_MEM(watch_obj);
        if(NULL == watch_obj)
                return NULL;
-       lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_NO);
+       lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_HOR_RIGHT_HIDE);
        lv_heng_ai_bp_calibrate_ext_t * watch_ext = lv_obj_allocate_ext_attr(watch_obj, sizeof(lv_heng_ai_bp_calibrate_ext_t));
-       if(NULL == ext)
+       if(NULL == watch_ext)
                return NULL;
-       watch_ext->tileview = NULL;
        watch_ext->cont = NULL;
+       watch_ext->cont_prompt_0 = NULL;
+       watch_ext->cont_prompt_1 = NULL;
+       watch_ext->cont_prompt_2 = NULL;
        watch_ext->gif_info = NULL;
        watch_ext->measure_timer_id = NULL;
        watch_ext->result_timer_id = NULL;
        
-       lv_obj_t * tileview = lv_tileview_create(watch_obj, NULL);
-       if(NULL == tileview)
-               return NULL;
-       lv_heng_ai_bp_tileview_ext_t * ext = lv_obj_allocate_ext_attr(tileview, sizeof(lv_heng_ai_bp_tileview_ext_t));
-       if(NULL == ext)
-               return NULL;
+       lv_obj_t * cont = NULL;
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+       //lv_obj_add_style(cont, LV_CONT_PART_MAIN, &lv_style_transp_tight);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont = cont;
        
-       watch_ext->tileview = tileview;
-       ext->tab_0 = NULL;
-       ext->tab_1 = NULL;
-       ext->tab_2 = NULL;
-       ext->led_cont= NULL;
-       ext->led[0] = NULL;
-       ext->led[1] = NULL;
-       ext->led[2] = NULL;
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont_prompt_0 = cont;
+       mmi_hengai_bp_calibrate_prompt_0(cont);
        
-       lv_tileview_set_valid_positions(tileview, s_hengai_bp_valid_pos, MMI_HENGAI_BP_TAB_COUNT);
-       lv_tileview_set_edge_flash(tileview, true);
-       lv_tileview_set_anim_time(tileview, 60);
-       lv_page_set_scrollbar_mode(tileview, LV_SCROLLBAR_MODE_OFF);
-       lv_obj_add_style(tileview, LV_TILEVIEW_PART_EDGE_FLASH, &lv_watch_cont_opa1);
-       ext->tileview = tileview;
-
-       ext->tab_0 = mmi_heng_ai_bp_calibrate_tab_0(tileview, 0);
-       LV_ASSERT_MEM(ext->tab_0);
-       if(NULL == ext->tab_0)
-               return NULL;
-
-       ext->tab_1 = mmi_heng_ai_bp_calibrate_tab_1(tileview, 1);
-       LV_ASSERT_MEM(ext->tab_1);
-       if(NULL == ext->tab_1)
-               return NULL;
-
-       ext->tab_2 = mmi_heng_ai_bp_calibrate_tab_2(tileview, 2);
-       LV_ASSERT_MEM(ext->tab_2);
-       if(NULL == ext->tab_2)
-               return NULL;
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont_prompt_1 = cont;
+       mmi_hengai_bp_calibrate_prompt_1(cont);
 
-       lv_tileview_set_tile_act(tileview, 0, 0, LV_ANIM_OFF);
-       lv_watch_obj_add_element(tileview);
-       lv_watch_obj_add_element(lv_page_get_scrl(tileview));
-       lv_obj_set_event_cb(tileview, mmi_heng_ai_bp_calibrate_screen_tileview_event_cb);
+       cont = lv_cont_create(watch_obj, NULL);
+       lv_obj_set_size(cont, LV_HOR_RES, LV_VER_RES);
+       lv_obj_set_style_local_bg_color(cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
+       lv_obj_set_click(cont, false);
+       watch_ext->cont_prompt_2 = cont;
+       mmi_hengai_bp_calibrate_prompt_2(cont);
 
-       mmi_heng_ai_bp_calibrate_screen_tileview_led(tileview);
+       lv_obj_set_hidden(watch_ext->cont, true);
+       lv_obj_set_hidden(watch_ext->cont_prompt_0, false);
+       lv_obj_set_hidden(watch_ext->cont_prompt_1, true);
+       lv_obj_set_hidden(watch_ext->cont_prompt_2, true);
 
        //
        watch_set_suspend_enable(false, ACT_ID_HENG_AI_BP_CALIBRATE, 0);
@@ -1491,6 +1598,7 @@ lv_obj_t * mmi_heng_ai_bp_calibration_mode_create(lv_obj_t * tileview, uint16_t
 }
 
 
+//
 void mmi_heng_ai_bp_attempt_mode_btn_event_cb(lv_obj_t * obj, lv_event_t e)
 {
        if(LV_EVENT_CLICKED != e)
@@ -1525,7 +1633,7 @@ lv_obj_t * mmi_heng_ai_bp_attempt_mode_create(lv_obj_t * tileview, uint16_t id)
        lv_obj_t * btn_label = lv_label_create(imgbtn, NULL);
        lv_obj_add_style(btn_label, LV_LABEL_PART_MAIN, &lv_watch_font32);
        lv_label_set_align(btn_label, LV_LABEL_ALIGN_CENTER);
-       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_START_MEASURE);
+       lv_label_set_text_id(btn_label, WATCH_TEXT_ID_MEASURE_PROMPT);
        lv_obj_align(btn_label, NULL, LV_ALIGN_CENTER, 0, 0);
 
        return tab;
@@ -1534,7 +1642,8 @@ lv_obj_t * mmi_heng_ai_bp_attempt_mode_create(lv_obj_t * tileview, uint16_t id)
 
 void mmi_heng_ai_bp_tileview_led(lv_obj_t * tileview)
 {
-       lv_heng_ai_bp_obj_ext_t * ext = mmi_heng_ai_bp_ext_get();
+#if 0
+       lv_heng_ai_bp_ext_t * ext = mmi_heng_ai_bp_ext_get();
        if(NULL == ext)
            return NULL;
 
@@ -1569,6 +1678,7 @@ void mmi_heng_ai_bp_tileview_led(lv_obj_t * tileview)
        
     lv_obj_set_pos(ext->led_cont, LV_HOR_RES * x + (LV_HOR_RES - lv_obj_get_width(ext->led_cont)) / 2,
                                        LV_VER_RES - lv_obj_get_width(ext->led_cont) - 10);
+#endif
 }
 
 void mmi_heng_ai_bp_tileview_event_cb(lv_obj_t * tileview, lv_event_t e)
@@ -1576,18 +1686,18 @@ void mmi_heng_ai_bp_tileview_event_cb(lv_obj_t * tileview, lv_event_t e)
        if(LV_EVENT_VALUE_CHANGED != e)
                return;
 
-       mmi_heng_ai_bp_tileview_led(tileview);
+       //mmi_heng_ai_bp_tileview_led(tileview);
 }
 
-lv_obj_t * mmi_heng_ai_blood_pressure_screen_create(lv_obj_t * activity_obj)
+lv_obj_t * mmi_heng_ai_bp_screen_create(lv_obj_t * activity_obj)
 {
     if(NULL == activity_obj) 
        {
         lv_watch_activity_ext_t activity_ext = {0};
                
         activity_ext.actId = ACT_ID_HENG_AI_BP;
-        activity_ext.create = mmi_heng_ai_blood_pressure_screen_create;
-        activity_ext.prepare_destory = mmi_heng_ai_blood_pressure_screen_prepare_destory;
+        activity_ext.create = mmi_heng_ai_bp_screen_create;
+        activity_ext.prepare_destory = mmi_heng_ai_bp_screen_prepare_destory;
                
         activity_obj = lv_watch_creat_activity_obj(&activity_ext);
         LV_ASSERT_MEM(activity_obj);
@@ -1599,6 +1709,7 @@ lv_obj_t * mmi_heng_ai_blood_pressure_screen_create(lv_obj_t * activity_obj)
     if(NULL == watch_obj)
         return NULL;
 
+#if 0
     if(false == watch_modem_sim_present_check_req())
     {
                lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_HOR_RIGHT_HIDE);
@@ -1650,10 +1761,11 @@ lv_obj_t * mmi_heng_ai_blood_pressure_screen_create(lv_obj_t * activity_obj)
                lv_obj_set_click(label_1, false);
        }
        else
+#endif
        {
                lv_watch_obj_set_anim_mode(watch_obj, LV_WATCH_ANIM_NO);
                
-               lv_heng_ai_bp_obj_ext_t * ext = lv_obj_allocate_ext_attr(watch_obj, sizeof(lv_heng_ai_bp_obj_ext_t));
+               lv_heng_ai_bp_ext_t * ext = lv_obj_allocate_ext_attr(watch_obj, sizeof(lv_heng_ai_bp_ext_t));
            if(NULL == ext)
                return NULL;
 
@@ -1690,88 +1802,81 @@ lv_obj_t * mmi_heng_ai_blood_pressure_screen_create(lv_obj_t * activity_obj)
                if(NULL == ext->tab_attempt_mode)
                        return NULL;
 
-               if(1 == s_hengai_bp_calibrated)
+               if(1 == mmi_hengai_bp_is_calibrated())
                    lv_tileview_set_tile_act(tileview, 1, 0, LV_ANIM_OFF);
                else
                    lv_tileview_set_tile_act(tileview, 0, 0, LV_ANIM_OFF);
                
            lv_watch_obj_add_element(tileview);
            lv_watch_obj_add_element(lv_page_get_scrl(tileview));
-               lv_obj_set_event_cb(tileview, mmi_heng_ai_bp_tileview_event_cb);
+               //lv_obj_set_event_cb(tileview, mmi_heng_ai_bp_tileview_event_cb);
 
-               mmi_heng_ai_bp_tileview_led(tileview);
+               //mmi_heng_ai_bp_tileview_led(tileview);
        }
 
        return watch_obj;
 }
-/*
-{      
-       lv_obj_t * img = lv_img_create(cont, NULL);
-       lv_img_set_src(img, ICON_HEART_RATE_MEASURE_FAIL);
-    lv_obj_align(img, NULL, LV_ALIGN_IN_TOP_MID, 0, HEART_MEASURE_IMAGE_Y);
-       lv_obj_set_hidden(img, true);
-       ext->img = img;
-
-       lv_obj_t * label_info = lv_label_create(cont, NULL);
-    //lv_obj_set_size(label_info, LV_HOR_RES, 30);
-       lv_obj_add_style(label_info, LV_LABEL_PART_MAIN, &lv_watch_font20);
-       lv_label_set_text_id(label_info, WATCH_TEXT_ID_MEASURING);
-    //lv_label_set_align(label_info, LV_LABEL_ALIGN_CENTER);
-    lv_obj_align(label_info, cont, LV_ALIGN_IN_TOP_MID, 0, HEART_LABEL_INFO_Y);
-    lv_obj_set_click(label_info, false);
-       ext->label_info = label_info;
-
-       lv_obj_t * label_value = lv_label_create(cont, NULL);
-    //lv_obj_set_size(label_value, LV_HOR_RES, 40);
-       lv_obj_add_style(label_value, LV_LABEL_PART_MAIN, &lv_watch_font40);
-       lv_label_set_text(label_value, ext->heart_rate);
-    //lv_label_set_align(label_value, LV_LABEL_ALIGN_CENTER);
-    lv_obj_align(label_value, cont, LV_ALIGN_IN_TOP_MID, 0, HEART_LABEL_VALUE_Y);
-       lv_obj_set_click(label_value, false);
-       ext->label_value = label_value;
 
-       if(false == mmi_health_measure_wear_state_get())
-       {
-               ext->measure_state = STATE_HEART_RATE_MEASURE_FAIL;
-       }
-       else
-       {
-               mmi_health_measure_ui_measure_start(MMI_HEALTH_MEASURE_HEART);
+void mmi_heng_ai_blood_pressure_create_event_cb(lv_obj_t * btn, lv_event_t e)
+{
+    if(LV_EVENT_CLICKED == e) 
+       {               
+        lv_obj_t * obj = mmi_heng_ai_bp_screen_create(NULL);
+        LV_ASSERT_MEM(obj);
+    }
+}
 
-               lv_obj_t * gif_cont = lv_cont_create(cont, NULL);
-               lv_obj_set_size(gif_cont, LV_HOR_RES, 100);
-               lv_obj_set_style_local_bg_color(gif_cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
-               lv_obj_align(gif_cont, cont, LV_ALIGN_IN_TOP_MID, 0, HEART_MEASURE_IMAGE_Y);
-               ext->gif_cont = gif_cont;
 
-               ext->gif_info = gif_open(gif_cont, ANIM_HEART_RATE_MEASURING, 0);
-               if(!ext->gif_info) 
-               {
-                       HEALTH_MEASURE_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: gif open fail\n", __FUNCTION__, __LINE__);
-               }
-               
-               ext->cycle_timer_id = Hal_Timer_Start(HEALTH_HEART_MEASURE_CYCLE, health_heart_rate_measure_cycle_timeout, NULL, TRUE);
+
+
+
+static void * __s_debug_timer_id = NULL;
+//TIMER_ID measure_timer_id;
+
+void __debug_timer_start(void);
+
+void __debug_timer_cb(void * param)
+{
+       char temp_buff[128] = {0};
        
-               ext->measure_state = STATE_HEART_RATE_MEASURING;
-               watch_set_suspend_enable(false, ACT_ID_HENG_AI_BP, 0);
-       }
+       //»ñÈ¡48×Ö½ÚaslccÂëµÄÊ®Áù½øÖÆÑªÑ¹Êý¾Ýµ½blood_buf£¬×¢Òâ:blood_buf³¤¶ÈÒª´óÓÚµÈÓÚ48*2×Ö½Ú
+       //void fr8012haq_blood_data_get(char *blood_buf)
+       fr8012haq_blood_data_get(temp_buff);
        
-       health_heart_rate_display_update();
+       printf("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, temp_buff);
+       printf("[@CHENG_DEBUG][%d]: %s\n", __LINE__, temp_buff + 31);
+       printf("[@CHENG_DEBUG][%d]: %s\n", __LINE__, temp_buff + 63);
 
-    return watch_obj;
+       __debug_timer_start();
 }
-*/
 
-void mmi_heng_ai_blood_pressure_create_event_cb(lv_obj_t * btn, lv_event_t e)
+void __debug_timer_start(void)
 {
-    (void)btn;
-    if(LV_EVENT_CLICKED == e) 
+       if(NULL == __s_debug_timer_id)
+               uos_timer_create(&__s_debug_timer_id);
+       else
+               uos_timer_stop(__s_debug_timer_id);
+
+       uos_timer_start(__s_debug_timer_id, MS_TO_TICKS(1000), 0, __debug_timer_cb, NULL);
+}
+
+void __debug_stop(void)
+{
+       mmi_hsensor_close();
+
+       if(NULL != __s_debug_timer_id)
        {
-               mmi_hengai_http_tcp_connect_msg(NULL);
-               
-        lv_obj_t * obj = mmi_heng_ai_blood_pressure_screen_create(NULL);
-        LV_ASSERT_MEM(obj);
-    }
+               uos_timer_stop(__s_debug_timer_id);
+               uos_timer_delete(__s_debug_timer_id);
+               __s_debug_timer_id = NULL;
+       }
+}
+
+void __debug_start(void)
+{
+       mmi_hsensor_bp_open();
+
+       __debug_timer_start();
 }
 
 #endif
index 9489dbd..720f372 100644 (file)
@@ -21,8 +21,11 @@ extern "C" {
 #define MMI_HENGAI_BP_TAB_COUNT (3)
 
 #define MMI_BP_MEASURE_TOTAL_COUNT     (60) // times
-#define MMI_BP_MEASURE_SEND_DATA_COUNT (10) // times
-#define MMI_BP_WAIT_RESULT_TIMEOUT     (1000 * 5) // ms
+
+#define MMI_BP_WAIT_RESULT_TIMEOUT     (1000 * 10) // ms
+
+#define MMI_HENGAI_BP_RAW_DATA_SAMPLE_RATE     (81)
+
 
 
 
@@ -43,36 +46,31 @@ typedef struct
 {
     lv_watch_obj_ext_t lv_watch_obj;
     /*New data for this type */
-       lv_obj_t * tileview;
        lv_obj_t * cont;
+       lv_obj_t * cont_prompt_0;
+       lv_obj_t * cont_prompt_1;
        gif_info_t * gif_info;
+       lv_obj_t * label_time;
     TIMER_ID measure_timer_id;
        TIMER_ID result_timer_id;
+       bool is_watting_result;
 } lv_heng_ai_bp_measure_ext_t;
 
 
-
 typedef struct
 {
     lv_watch_obj_ext_t lv_watch_obj;
     /*New data for this type */
-       lv_obj_t * tileview;
        lv_obj_t * cont;
+       lv_obj_t * cont_prompt_0;
+       lv_obj_t * cont_prompt_1;
+       lv_obj_t * cont_prompt_2;
        gif_info_t * gif_info;
     TIMER_ID measure_timer_id;
        TIMER_ID result_timer_id;
+       bool is_watting_result;
 } lv_heng_ai_bp_calibrate_ext_t;
 
-typedef struct
-{
-    lv_watch_obj_ext_t lv_watch_obj;
-    /*New data for this type */
-    lv_obj_t * tab_0;
-    lv_obj_t * tab_1;
-       lv_obj_t * tab_2;
-       lv_obj_t * led_cont;
-       lv_obj_t * led[MMI_HENGAI_BP_TAB_COUNT];
-} lv_heng_ai_bp_tileview_ext_t;
 
 
 
@@ -82,22 +80,19 @@ typedef struct
 
 
 
-typedef struct
-{
-       MMI_HENG_AI_WARNING_TYPE_E type;
-       MMI_HENG_AI_WARNING_STATE_E state;
-       void * prompt_str;
-} mmi_heng_ai_warning_info_s;
+void mmi_hengai_blood_pressure_nv_read(void);
 
-typedef struct 
-{
-    lv_watch_obj_ext_t lv_watch_obj;
-    /*New data for this type */
-    TIMER_ID timer_id;
-} lv_heng_ai_warning_obj_ext_t;
+#if 0
+uint8_t mmi_hengai_bp_is_activated(void);
+char * mmi_hengai_bp_req_code_get(void);
+void mmi_hengai_bp_req_code_set(char * req_code);
+char * mmi_hengai_bp_act_code_get(void);
+void mmi_hengai_bp_act_code_set(char * act_code);
+void mmi_hengai_bp_activated_finish(void);
+#endif
 
+uint8_t mmi_hengai_bp_is_measuring(void);
 
-void mmi_heng_ai_warning_info_set(uint8_t type_value, uint8_t state_value, char * unicode_description);
 
 
 #endif
index 0f70f15..23275ec 100644 (file)
 
 #include "lv_watch.h"
 
-#ifdef __MMI_CUSTOM_HENG_AI__
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
 
-#define MMI_HENGAI_HTTP_R_TASK_PRIORITY 221
-#define MMI_HENGAI_HTTP_S_TASK_PRIORITY 221
 
-#define MMI_HENGAI_HTTP_R_TASK_STACK_SIZE (8 * 1024)
-#define MMI_HENGAI_HTTP_S_TASK_STACK_SIZE (4 * 1024)
-
-static TASK_HANDLE * s_hengai_http_r_task_id = NULL;
-static TASK_HANDLE * s_hengai_http_s_task_id = NULL;
+#include "hal/dm/cJSON.h"
+#include "hal/dm/libhttpclient.h"
 
-static mmi_hengai_http_tcp_info_t s_hengai_http_tcp_info = {0};
 
+static struct http_client * s_hengai_http_client = NULL;
+static struct http_client_list * s_hengai_http_client_list_header = NULL;
+static uint8_t s_hengai_http_post_try_count = 0;
+static char * s_hengai_http_revceive_buf = NULL;
 
-void mmi_hengai_http_r_task_msg_send(MMI_HENGAI_HTTP_TCP_MSG_ID_E msg_id, void * param)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id);
-       
-       if(NULL != s_hengai_http_r_task_id)
-       {
-               if((64 - 1) < Hal_Get_Message_Count(s_hengai_http_r_task_id))
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: msg queue full\n",__FUNCTION__,__LINE__);
-                       return;
-               }
-               
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               
-        mmi_hengai_http_task_msg_t * msg = Hal_Mem_Alloc(sizeof(mmi_hengai_http_task_msg_t));
-               msg->cmd_type = msg_id;
-               msg->cmd_param = param;
-       
-        Hal_Send_Message((TASK_ID)s_hengai_http_r_task_id, (void *)msg);
-    }
-}
+static char * response_data = NULL;
+static int response_len = 0;
 
-void mmi_hengai_http_tcp_connect_msg(void * param)
+/*
+data: the data is received http context data
+len: the length of http context data 
+num: the http response header "Content-Length" value
+cbdata: user private data
+*/
+static void response_cb(char * data, int len, int num, void *cbdata)
 {
-       mmi_hengai_http_r_task_msg_send(MMI_HENGAI_HTTP_TCP_MSG_CONNECT, param);
-}
+       char * temp;
 
-void mmi_hengai_http_tcp_reconnect_msg(void * param)
-{
-       mmi_hengai_http_r_task_msg_send(MMI_HENGAI_HTTP_TCP_MSG_RECONNECT, param);
-}
+       printf("[@CHENG_DEBUG][%s][%d]: data_len=%d\n", __FUNCTION__, __LINE__, len);
 
-void mmi_hengai_http_tcp_disconnect_msg(void * param)
-{
-       mmi_hengai_http_r_task_msg_send(MMI_HENGAI_HTTP_TCP_MSG_DISCONNECT, param);
-}
+       temp = (void*)malloc(response_len + len);
+       if (!temp) {
+        printf("Malloc failed...\n");
+               return;
+       }
+       memset(temp, 0, response_len + len);
+       if (response_data) {
+               memcpy(temp, response_data, response_len);
+               free(response_data);
+       }
+       memcpy(&temp[response_len], data, len);
+       response_data = temp;
+       response_len += len;
 
-void mmi_hengai_http_tcp_read_msg(void * param)
-{
-       mmi_hengai_http_r_task_msg_send(MMI_HENGAI_HTTP_TCP_MSG_READ, param);
+       printf("[@CHENG_DEBUG][%s][%d]: response_len=%d\n", __FUNCTION__, __LINE__, response_len);
 }
 
-static void mmi_hengai_http_socket_callback(int sfd, int event, unsigned int len)
+void mmi_hengai_http_post_resource_free(void)
 {
-       printf("[@CHENG_DEBUG][%s][%d]: sfd=%d, event=0x%x, len=%d\n",__FUNCTION__, __LINE__, sfd, event, len);
-
-       switch (event)
+    if(NULL != s_hengai_http_client_list_header)
        {
-               case NETCONN_EVT_CONNECTED:
-                       printf("[@CHENG_DEBUG][%s][%d]: socket connected\n",__FUNCTION__,__LINE__);
-                       break;
-
-               case NETCONN_EVT_CLOSE_NORMAL:
-                       printf("[@CHENG_DEBUG][%s][%d]: socket close normal\n",__FUNCTION__,__LINE__);
-                       break;
-
-               case NETCONN_EVT_RCVPLUS:
-                       printf("[@CHENG_DEBUG][%s][%d]: socket rcv plus\n",__FUNCTION__,__LINE__);
-                       ValSetDataTransFlag(1);
-                       if(len > 0)
-                       {
-                mmi_hengai_http_socket_fd_t * data_info = (mmi_hengai_http_socket_fd_t *)Hal_Mem_Alloc(sizeof(mmi_hengai_http_socket_fd_t));
-                data_info->socket_fd = sfd;
-                               data_info->len = len;
-                               mmi_hengai_http_tcp_read_msg(data_info);
-                       }
-                       break;
-
-               case NETCONN_EVT_RCVMINUS:
-                       printf("dt rcv minus event\n");
-                       break;
-
-               case NETCONN_EVT_SENDPLUS:
-                       ValSetDataTransFlag(1);
-                       printf("[@CHENG_DEBUG][%s][%d]: socket send plus\n",__FUNCTION__,__LINE__);
-                       break;
-
-               case NETCONN_EVT_SENDACKED:
-                       printf("[@CHENG_DEBUG][%s][%d]: socket send ack\n",__FUNCTION__,__LINE__);
-                       break;
-
-               case NETCONN_EVT_ERROR_RST:
-               case NETCONN_EVT_ERROR_ABRT:
-               case NETCONN_EVT_CLOSE_WAIT:
-                       ValSetDataTransFlag(1);
-                       printf("dt socket error or close event = %02x\n",event);
-                       //printf("LH reconnect\n");
-            //if(Hal_Get_Message_Count((TASK_ID)modem_tcp_task_id) < UOS_TCP_TASK_MSG_QSIZE)
-               //{
-               //      send_task_msg_tcp_reconnect(NULL);
-                       //}
-                       break;
-
-               default:
-                       printf("dt other event\n");
-                       break;
+        http_client_list_destroy(s_hengai_http_client_list_header);
+        s_hengai_http_client_list_header = NULL;
        }
-}
-
-void mmi_hengai_http_tcp_connect(void * param)
-{      
-       int res = -1;
-    if(FALSE == watch_modem_sim_present_check_req())
+       
+    if(NULL != s_hengai_http_client)
     {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-        goto go_reconnect;
+        http_client_shutdown(s_hengai_http_client);
+        s_hengai_http_client = NULL;
     }
-               
-       if(s_hengai_http_tcp_info.first_connect_flag == false)
-       {
-               s_hengai_http_tcp_info.first_connect_flag = true;
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-       }
        
-       if(s_hengai_http_tcp_info.connect_flag == true)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               return;
-       }
-
-       if(s_hengai_http_tcp_info.connecting_flag)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               return;
-       }
-       else
-       {
-               s_hengai_http_tcp_info.connecting_flag = true;
-       }
-
-       res = ValNetworkSocketInit_with_callback(NULL, MMI_HENGAI_HTTP_IP_ADDRESS, MMI_HENGAI_HTTP_IP_PORT, (socket_callback)mmi_hengai_http_socket_callback);
-       printf("[@CHENG_DEBUG][%s][%d]: socket init connect res = %d\n",__FUNCTION__,__LINE__, res);
-
-go_reconnect : 
-       if(res < 0)
-       {
-               int relink_time = 0;
-               int randnum = 0;
-               unsigned int time = 0;
-               
-               Hal_Rtc_Gettime_Count(&time);
-               srand(time);
-               randnum = rand() % 50 + 10;
-               relink_time = randnum * 1000 / 5;
-               
-               uos_timer_stop(s_hengai_http_tcp_info.relink_timer);
-               uos_timer_start(s_hengai_http_tcp_info.relink_timer, relink_time,
-                                               0, (void (*)(uint32_t))mmi_hengai_http_tcp_reconnect_msg, NULL);
-               printf("reconnect time = %d\n",(relink_time / 1000 * 5));
-       }
-       else
-       {
-               s_hengai_http_tcp_info.sock_fd = res;
-               mmi_hengai_http_tcp_connected(param);
-       }
-}
-
-void mmi_hengai_http_tcp_connected(void *param)
-{
-       printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
+    if (response_data) 
+        free(response_data);
        
-       s_hengai_http_tcp_info.connect_flag = true;
-       s_hengai_http_tcp_info.connecting_flag = false;
+       response_data = NULL;
+       response_len = 0;
 }
 
-void mmi_hengai_http_tcp_disconnect(void *param)
+int mmi_hengai_http_post_json_data(char * url, char * post_data, char * token)
 {
-       if(s_hengai_http_tcp_info.relink_timer != NULL)
+    int response_code= 0;
+    int ret = 0;
+    struct http_client_list * header = NULL;
+    if (s_hengai_http_client != NULL)
+        return -2;
+    
+    s_hengai_http_client = http_client_init();
+    http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_URL, url);    /*set URL:support http/https and ip4/ip6*/
+       http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_HTTP1_0, 0);              /*"0" is HTTP 1.1, "1" is HTTP 1.0*/
+    http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_RESPONSECB, response_cb);     /*response callback*/
+    //http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_RESPONSECB_DATA, private_data);           /*set user private data,*/
+    http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_METHOD, HTTPCLIENT_REQUEST_POST);  /*set method,support GET/POST/PUT*/
+    http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_POSTDATA, post_data);          /*post data is http context*/
+    http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_POSTLENGTH, strlen(post_data));           /*http context length*/
+
+       if(NULL != token)
        {
-               uos_timer_stop(s_hengai_http_tcp_info.relink_timer);
-               //s_hengai_http_tcp_info.relink_timer = NULL;
+               char temp_str[64] = {0};
+               sprintf(temp_str, "token: %s\r\n", token);
+               s_hengai_http_client_list_header = http_client_list_append(s_hengai_http_client_list_header, temp_str);
        }
+       // "dc5aed59e2fce3060cd1118b41b19552"
+       s_hengai_http_client_list_header = http_client_list_append(s_hengai_http_client_list_header, "Content-Type: application/json\r\n");
+    s_hengai_http_client_list_header = http_client_list_append(s_hengai_http_client_list_header, "Accept: */*\r\n");
+    http_client_setopt(s_hengai_http_client, HTTPCLIENT_OPT_HTTPHEADER, s_hengai_http_client_list_header);
        
-       s_hengai_http_tcp_info.reconnect_count = 5;
-       s_hengai_http_tcp_info.connect_flag = false;
-       s_hengai_http_tcp_info.first_connect_flag = false;
-       s_hengai_http_tcp_info.connecting_flag = false;
-
-       printf("[@CHENG_DEBUG][%s][%d]: sock_fd=%d\n",__FUNCTION__,__LINE__, s_hengai_http_tcp_info.sock_fd);
-       if(s_hengai_http_tcp_info.sock_fd > 0)
+    http_client_getinfo(s_hengai_http_client, HTTPCLIENT_GETINFO_TCP_STATE, &response_code);
+    if(response_code != HTTP_TCP_ESTABLISHED)
        {
-               int ret = ValSocketClose(s_hengai_http_tcp_info.sock_fd);
-               s_hengai_http_tcp_info.sock_fd = -1;
-       }
-}
-
-void mmi_hengai_http_tcp_reconnect(void *param)
-{
-    if(false == watch_modem_sim_present_check_req())
-    {
-       return;
+        printf("http tcp not connecting\n");
+        ret = -1;
+        goto EXIT;
     }
-
-       mmi_hengai_http_tcp_disconnect(NULL);
-
-       long reconnect_time = (5 * 1000) / 5;
-       s_hengai_http_tcp_info.reconnect_count--;
-       if(s_hengai_http_tcp_info.reconnect_count < 0)
-       {
-               s_hengai_http_tcp_info.reconnect_count = 5;
-       }
-       else
-       {
-               reconnect_time = 10 * 1000 / 5;
-       }
        
-       uos_timer_stop(s_hengai_http_tcp_info.relink_timer);
-       uos_timer_start(s_hengai_http_tcp_info.relink_timer, reconnect_time , 0, (void (*)(uint32_t))mmi_hengai_http_tcp_connect_msg, NULL);
-}
-
-void mmi_hengai_http_tcp_read_data(void *param)
-{      
-       mmi_hengai_http_socket_fd_t * data_info = (mmi_hengai_http_socket_fd_t *)param;
-       if((NULL == data_info) || (data_info->socket_fd < 0))
+    response_code = http_client_perform(s_hengai_http_client);    /*execute http send and recv*/
+    if(response_code != HTTP_CLIENT_OK)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               return;
+        printf("http perform have some wrong=%d\n", response_code);
+        ret = -3;
+        goto EXIT;
        }
-
-       int recv_ret = -1;
-       int recv_len = 0;
-       char * recv_buf = (char *)Hal_Mem_Alloc(HENGAI_HTTP_RECEIVE_BUFF_LEN);
-       if(NULL == recv_buf)
+       
+    http_client_getinfo(s_hengai_http_client, HTTPCLIENT_GETINFO_RESPONSE_CODE, &response_code);
+    if (response_code != 200 && response_code != 204)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: recv_buf alloc fail\n",__FUNCTION__,__LINE__);
-               return;
-       }
-       Hal_Mem_Set(recv_buf , 0x00, HENGAI_HTTP_RECEIVE_BUFF_LEN);
-       recv_ret = ValRecvEx(data_info->socket_fd, HENGAI_HTTP_SOCKET_REV_TIMEOUT, recv_buf, HENGAI_HTTP_RECEIVE_BUFF_LEN, &recv_len);
-       printf("[@CHENG_DEBUG][%s][%d]: ret=%d,len=%d,buf=0x%x\n", __FUNCTION__, __LINE__, recv_ret, recv_len, recv_buf);
-       //printf("[@CHENG_DEBUG][%d]: str=%s\n", __LINE__, recv_buf);
-       if(0 <= recv_ret)
+        printf("response is not 'HTTP OK'=%d\n", response_code);
+    }
+       
+       if(NULL != s_hengai_http_revceive_buf)
        {
-               mmi_hengai_http_data_receive(recv_buf, recv_len);
+               lv_mem_free(s_hengai_http_revceive_buf);
+               s_hengai_http_revceive_buf = NULL;
        }
+       s_hengai_http_revceive_buf = lv_mem_alloc(response_len + 1);
+       _lv_memset_00(s_hengai_http_revceive_buf, response_len + 1);
+       _lv_memcpy(s_hengai_http_revceive_buf, response_data, response_len);
+       printf("[@CHENG_DEBUG][%s][%d]: data_len=%d\n", __FUNCTION__, __LINE__, response_len);
 
-       if(NULL != recv_buf)
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: recv_buf free\n",__FUNCTION__,__LINE__);
-               Hal_Mem_Free(recv_buf);
-               recv_buf = NULL;
-       }
+EXIT:
+       mmi_hengai_http_post_resource_free();
+       
+    return ret;
 }
 
-static void mm_hengai_http_r_task_entry(void * para)
+int mmi_hengai_http_post_data(char * url, char * post_data, char * token)
 {
-    while(s_hengai_http_r_task_id == NULL)
-       {
-        uos_sleep(10);
-    }
-
-    while(1)
+       int ret_value = 0;
+       
+       s_hengai_http_post_try_count = 0;
+       
+       while(1)
        {
-        // receive message
-        mmi_hengai_http_task_msg_t * msg = (mmi_hengai_http_task_msg_t *)Hal_Receive_Message((TASK_ID)s_hengai_http_r_task_id, TRUE);
-               MMI_HENGAI_HTTP_TCP_MSG_ID_E msg_id = msg->cmd_type;
-               void * msg_param = msg->cmd_param;
+               s_hengai_http_post_try_count++;
 
-               printf("[@CHENG_DEBUG][%s][%d]: msg_id=%d\n",__FUNCTION__,__LINE__, msg_id);
-               switch(msg_id)
+               int ret = mmi_hengai_http_post_json_data(url, post_data, token);
+               printf("[@CHENG_DEBUG][%s][%d]: ret=%d\n", __FUNCTION__, __LINE__, ret);
+               if(0 == ret)
                {
-                       case MMI_HENGAI_HTTP_TCP_MSG_CONNECT:
-                               mmi_hengai_http_tcp_connect(msg_param);
-                               break;
-       
-                       case MMI_HENGAI_HTTP_TCP_MSG_CONNECTED:
-                               mmi_hengai_http_tcp_connected(msg_param);
-                               break;
-       
-                       case MMI_HENGAI_HTTP_TCP_MSG_DISCONNECT:
-                               mmi_hengai_http_tcp_disconnect(msg_param);
-                               break;
-       
-                       case MMI_HENGAI_HTTP_TCP_MSG_RECONNECT:
-                               mmi_hengai_http_tcp_reconnect(msg_param);
-                               break;
-       
-                       case MMI_HENGAI_HTTP_TCP_MSG_READ:
-                               mmi_hengai_http_tcp_read_data(msg_param);
+                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                       ret_value = 0;
+                       break;
+               }
+               else
+               {
+                       if(HENGAI_HTTP_POST_TRY_COUNT_MAX <= s_hengai_http_post_try_count)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               mmi_hengai_http_post_resource_free();
+                               ret_value = -1;
                                break;
+                       }
                        
-                       default:
-                               break;
+                       uos_sleep(10);
                }
-               
-        Hal_Mem_Free(msg->cmd_param);
-        Hal_Mem_Free(msg);
-    }
-}
+       }
 
-static void mm_hengai_http_r_task_init(void)
-{
-       s_hengai_http_r_task_id = uos_create_task(mm_hengai_http_r_task_entry,
-                                                                                               NULL,
-                                                                                               64,
-                                                                                               MMI_HENGAI_HTTP_R_TASK_STACK_SIZE,
-                                                                                               MMI_HENGAI_HTTP_R_TASK_PRIORITY,
-                                                                                               "mm_hengai_http_r_task");
-
-       printf("[@CHENG_DEBUG][%s][%d]: task_id=0x%x\n",__FUNCTION__,__LINE__, s_hengai_http_r_task_id);
+       return ret_value;
 }
 
 
-// send task
-void mm_hengai_http_s_task_msg_send(MMI_AI_TALK_ACTION_CMD_E action_cmd)
+// measure data
+void mmi_hengai_bp_measure_raw_data_send(void)
 {
-       if(NULL != s_hengai_http_s_task_id)
+       char imei[16 + 1] = {0};
+       app_adp_get_imei_req(imei);
+
+       char * begin_time_str = mmi_hengai_bp_measure_action_time_string_get(1);
+       char * end_time_str = mmi_hengai_bp_measure_action_time_string_get(0);
+       char * token = "dc5aed59e2fce3060cd1118b41b19552";
+       //int test_number_array[] = {1012744,864594,698914,532908,402542,317532,235462,168856,142664,109818,42654};
+       
+       cJSON * json_send = cJSON_CreateObject();
+       cJSON_AddItemToObject(json_send, "app_key", cJSON_CreateString(HENGAI_HTTP_POST_APP_KEY));
+       cJSON_AddItemToObject(json_send, "mac", cJSON_CreateString(imei));
+       cJSON_AddItemToObject(json_send, "begin_time", cJSON_CreateString(begin_time_str));
+       cJSON_AddItemToObject(json_send, "end_time", cJSON_CreateString(end_time_str));
+       cJSON_AddItemToObject(json_send, "pulse_wave", cJSON_CreateIntArray(mmi_hengai_bp_raw_data_ptr_get(), mmi_hengai_bp_raw_data_len_get()));//cJSON_CreateString("HENGAI"));
+       cJSON_AddItemToObject(json_send, "sample_rate", cJSON_CreateNumber(MMI_HENGAI_BP_RAW_DATA_SAMPLE_RATE));
+       char * post_data = cJSON_Print(json_send);
+       cJSON_Delete(json_send);
+       json_send = NULL;
+
+       char url[256] = {0};
+       char * url_suffix = "/health/bp/measurement";
+       sprintf(url, "%s%s", HENGAI_HTTP_POST_URL_COMMON_PREFIX, url_suffix);
+       int ret = mmi_hengai_http_post_data(url, post_data, token);
+       if(0 == ret)
        {
-        mmi_hengai_http_task_msg_t * msg = Hal_Mem_Alloc(sizeof(mmi_hengai_http_task_msg_t));
-               msg->cmd_type = action_cmd;
-               msg->cmd_param = NULL;
+               printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, strlen(s_hengai_http_revceive_buf));
+               printf("[@CHENG_DEBUG][%d]: %s\n", __LINE__, s_hengai_http_revceive_buf);
+               printf("[@CHENG_DEBUG][%d]: %s\n", __LINE__, s_hengai_http_revceive_buf + 63);
                
-        Hal_Send_Message((TASK_ID)s_hengai_http_s_task_id, (void *)msg);
-    }
-       else
+               cJSON * json_recv = cJSON_Parse(s_hengai_http_revceive_buf);
+               if(NULL != json_recv)
+               {
+                       if(cJSON_GetIntValue(cJSON_GetObjectItem(json_recv, "status")))
+                       {
+                               // true
+                               printf("[@CHENG_DEBUG][%s][%d]: true\n", __FUNCTION__, __LINE__);
+                               
+                               cJSON * json_data = cJSON_GetObjectItem(json_recv, "data");
+                               uint16_t bp_value_high = cJSON_GetIntValue(cJSON_GetObjectItem(json_data, "sbp"));
+                               uint16_t bp_value_low = cJSON_GetIntValue(cJSON_GetObjectItem(json_data, "dbp"));
+                               char * description = cJSON_GetStringValue(cJSON_GetObjectItem(json_data, "description"));
+
+                               // update
+                               mmi_hengai_bp_measure_update_result(true, bp_value_high, bp_value_low, description);
+                       }
+                       else
+                       {
+                               // false
+                               printf("[@CHENG_DEBUG][%s][%d]: fail\n", __FUNCTION__, __LINE__);
+                               // update
+                               mmi_hengai_bp_measure_update_result(false, 0, 0, NULL);
+                       }
+               }
+               else
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+               }
+               
+               if(NULL != json_recv)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+                       cJSON_Delete(json_recv);
+                       json_recv = NULL;
+               }
+       }
+
+       if(NULL != s_hengai_http_revceive_buf)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__, __LINE__);
-               mm_hengai_http_send_space_free(action_cmd);
+               lv_mem_free(s_hengai_http_revceive_buf);
+               s_hengai_http_revceive_buf = NULL;
        }
 }
 
-static void mm_hengai_http_s_task_handle(void *param)
+// calibrate mode
+void mmi_hengai_bp_calibrate_model_send(void)
 {
-       MMI_AI_TALK_ACTION_CMD_E action_cmd = ((mmi_hengai_http_task_msg_t *)param)->cmd_type;
+       char * token = "dc5aed59e2fce3060cd1118b41b19552";
+       char imei[16 + 1] = {0};
+       app_adp_get_imei_req(imei);
        
-       if((false == watch_modem_sim_present_check_req())
-               || (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
-               )
+       cJSON * json_send = cJSON_CreateObject();
+       cJSON_AddItemToObject(json_send, "app_key", cJSON_CreateString(HENGAI_HTTP_POST_APP_KEY));
+       cJSON_AddItemToObject(json_send, "mac", cJSON_CreateString(imei));
+       char * post_data = cJSON_Print(json_send);
+       cJSON_Delete(json_send);
+       json_send = NULL;
+
+       char url[256] = {0};
+       char * url_suffix = "/health/bp/model";
+       sprintf(url, "%s%s", HENGAI_HTTP_POST_URL_COMMON_PREFIX, url_suffix);
+       int ret = mmi_hengai_http_post_data(url, post_data, token);
+       if(0 == ret)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n",__FUNCTION__,__LINE__);
-               mm_hengai_http_send_space_free(action_cmd);
-               return;
+               printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, strlen(s_hengai_http_revceive_buf));
+               printf("[@CHENG_DEBUG][%d]: %s\n", __LINE__, s_hengai_http_revceive_buf);
+               
+               cJSON * json_recv = cJSON_Parse(s_hengai_http_revceive_buf);
+               if(NULL != json_recv)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: json file\n", __FUNCTION__, __LINE__);
+                       
+                       bool status_value = cJSON_GetIntValue(cJSON_GetObjectItem(json_recv, "status"));
+                       mmi_hengai_bp_calibrate_update_result(status_value);
+               }
+               else
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+               }
+               
+               if(NULL != json_recv)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+                       cJSON_Delete(json_recv);
+                       json_recv = NULL;
+               }
        }
 
-       unsigned char * send_buff = (unsigned char *)mm_hengai_http_send_space_ptr_get(action_cmd);
-       int send_size = mm_hengai_http_send_space_size_get(action_cmd);
-       printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, send_size);
-       printf("[@CHENG_DEBUG][%d]: str=%s\n", __LINE__, send_buff);
+       if(NULL != s_hengai_http_revceive_buf)
+       {
+               lv_mem_free(s_hengai_http_revceive_buf);
+               s_hengai_http_revceive_buf = NULL;
+       }
+}
+
+void mmi_hengai_bp_calibrate_raw_data_send(uint8_t calibrate_times, uint16_t bp_value_high, uint16_t bp_value_low)
+{
+       char * token = "dc5aed59e2fce3060cd1118b41b19552";
+       char imei[16 + 1] = {0};
+       app_adp_get_imei_req(imei);
+
+       char * begin_time_str = mmi_hengai_bp_measure_action_time_string_get(1);
+       char * end_time_str = mmi_hengai_bp_measure_action_time_string_get(0);
        
-       if((NULL != send_buff) && (0 < send_size))
+       cJSON * json_send = cJSON_CreateObject();
+       cJSON_AddItemToObject(json_send, "app_key", cJSON_CreateString(HENGAI_HTTP_POST_APP_KEY));
+       cJSON_AddItemToObject(json_send, "mac", cJSON_CreateString(imei));
+       cJSON_AddItemToObject(json_send, "begin_time", cJSON_CreateString(begin_time_str));
+       cJSON_AddItemToObject(json_send, "end_time", cJSON_CreateString(end_time_str));
+       cJSON_AddItemToObject(json_send, "pulse_wave", cJSON_CreateString("HENGAI"));
+       cJSON_AddItemToObject(json_send, "sample_rate", cJSON_CreateNumber(MMI_HENGAI_BP_RAW_DATA_SAMPLE_RATE));
+       cJSON_AddItemToObject(json_send, "sbp", cJSON_CreateNumber(bp_value_high));
+       cJSON_AddItemToObject(json_send, "dbp", cJSON_CreateNumber(bp_value_low));
+       char * post_data = cJSON_Print(json_send);
+       cJSON_Delete(json_send);
+       json_send = NULL;
+
+       char url[256] = {0};
+       char * url_suffix = "/health/bp/calibration";
+       sprintf(url, "%s%s", HENGAI_HTTP_POST_URL_COMMON_PREFIX, url_suffix);
+       int ret = mmi_hengai_http_post_data(url, post_data, token);
+       if(0 == ret)
        {
-               int sockfd = s_hengai_http_tcp_info.sock_fd;
+               printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, strlen(s_hengai_http_revceive_buf));
+               printf("[@CHENG_DEBUG][%d]: %s\n", __LINE__, s_hengai_http_revceive_buf);
                
-               if(sockfd > 0)
+               cJSON * json_recv = cJSON_Parse(s_hengai_http_revceive_buf);
+               if(NULL != json_recv)
                {
-                       int ret = -1;
-                       ret = ValSend(sockfd, HENGAI_HTTP_SOCKET_REV_TIMEOUT, send_buff, send_size);
-                       printf("[@CHENG_DEBUG][%s][%d]: sock_fd=%d,ret=%d\n", __FUNCTION__, __LINE__, sockfd, ret);
-                       if(ret < 0)
+                       printf("[@CHENG_DEBUG][%s][%d]: json file\n", __FUNCTION__, __LINE__);
+                       
+                       if(cJSON_GetIntValue(cJSON_GetObjectItem(json_recv, "status")))
+                       {
+                               // true
+                               if(2 <= calibrate_times)
+                               {
+                                       mmi_hengai_bp_calibrate_model_send();
+                               }
+                       }
+                       else
                        {
-                               printf("[@CHENG_DEBUG][%s][%d]: ValSend fail\n", __FUNCTION__, __LINE__);
+                               // false
+                               printf("[@CHENG_DEBUG][%s][%d]: fail\n", __FUNCTION__, __LINE__);
                        }
                }
                else
                {
-                       printf("[@CHENG_DEBUG][%s][%d]: sock_fd=%d\n", __FUNCTION__, __LINE__, sockfd);
-                       mmi_hengai_http_tcp_reconnect_msg(NULL);
+                       printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+               }
+               
+               if(NULL != json_recv)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+                       cJSON_Delete(json_recv);
+                       json_recv = NULL;
                }
        }
-       
-       mm_hengai_http_send_space_free(action_cmd);
-}
-
-static void mm_hengai_http_s_task_entry(void *param)
-{
-    while(NULL == s_hengai_http_s_task_id)
-    {
-        uos_sleep(10);
-    }
-       
-    while(1)
-    {
-        mmi_hengai_http_task_msg_t * msg = (mmi_hengai_http_task_msg_t *)Hal_Receive_Message((TASK_ID)s_hengai_http_s_task_id, TRUE);
-        if(!msg)
-            continue;
 
-               mm_hengai_http_s_task_handle((void *)msg);
-        Hal_Mem_Free(msg);
-    }
+       if(NULL != s_hengai_http_revceive_buf)
+       {
+               lv_mem_free(s_hengai_http_revceive_buf);
+               s_hengai_http_revceive_buf = NULL;
+       }
 }
 
-static void mm_hengai_http_s_task_init(void)
-{
-       s_hengai_http_s_task_id = uos_create_task(mm_hengai_http_s_task_entry, 
-                                                                                               NULL, 
-                                                                                               64, 
-                                                                                               MMI_HENGAI_HTTP_S_TASK_STACK_SIZE, 
-                                                                                               MMI_HENGAI_HTTP_S_TASK_PRIORITY, 
-                                                                                               "mm_hengai_http_s_task");
-
-       printf("[@CHENG_DEBUG][%s][%d]: task_id=0x%x\n",__FUNCTION__,__LINE__, s_hengai_http_s_task_id);
-}
 
-void mmi_hengai_http_tcp_info_init(void)
+#if 0
+void mmi_hengai_bp_activation_feedback(void)
 {
-       s_hengai_http_tcp_info.sock_fd = -1;
-       s_hengai_http_tcp_info.connect_flag = false;
-       s_hengai_http_tcp_info.connecting_flag = false;
-       s_hengai_http_tcp_info.first_connect_flag = false;
-       s_hengai_http_tcp_info.reconnect_count = 5;
+       char * post_data = NULL;
+       cJSON * json_send = NULL;
+       char imei[16 + 1] = {0};
+       app_adp_get_imei_req(imei);
        
-       if(NULL != s_hengai_http_tcp_info.relink_timer)
+       json_send = cJSON_CreateObject();
+       cJSON_AddItemToObject(json_send, "app_key", cJSON_CreateString(HENGAI_HTTP_POST_APP_KEY));
+       cJSON_AddItemToObject(json_send, "firm", cJSON_CreateString("HENGAI"));
+       cJSON_AddItemToObject(json_send, "mac", cJSON_CreateString(imei));
+       post_data = cJSON_Print(json_send);
+       cJSON_Delete(json_send);
+       json_send = NULL;
+
+       char url[256] = {0};
+       char * url_suffix = "/sinklib/activation/feedback";
+       sprintf(url, "%s%s", HENGAI_HTTP_POST_URL_COMMON_PREFIX, url_suffix);
+       int ret = mmi_hengai_http_post_data(url, post_data);
+       if(0 == ret)
        {
-               uos_timer_stop(s_hengai_http_tcp_info.relink_timer);
-               uos_timer_delete(s_hengai_http_tcp_info.relink_timer);
-               s_hengai_http_tcp_info.relink_timer = NULL;
+               cJSON * json_recv = NULL;
+               
+               json_recv = cJSON_Parse(s_hengai_http_revceive_buf);
+               if(NULL != json_recv)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: json file\n", __FUNCTION__, __LINE__);
+                       
+                       if(cJSON_GetIntValue(cJSON_GetObjectItem(json_recv, "status")))
+                       {
+                               // true
+                               mmi_hengai_bp_activated_finish();
+                       }
+                       else
+                       {
+                               // false
+                       }
+               }
+               else
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+               }
+               
+               if(NULL != json_recv)
+               {
+                       printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+                       cJSON_Delete(json_recv);
+                       json_recv = NULL;
+               }
        }
-       uos_timer_create(&s_hengai_http_tcp_info.relink_timer);
-}
 
-void mm_hengai_http_task_init(void)
-{
-    if(false == watch_modem_sim_present_check_req()
-               //|| (MMI_MODEM_SIGNAL_BAR_0 == watch_modem_get_signal_bar_req())
-               )
+       if(NULL != s_hengai_http_revceive_buf)
        {
-               return;
+               lv_mem_free(s_hengai_http_revceive_buf);
+               s_hengai_http_revceive_buf = NULL;
        }
-       
-       mmi_hengai_http_tcp_info_init();
-       mm_hengai_http_r_task_init();
-       mm_hengai_http_s_task_init();
 }
 
-
-
-#include "hal/dm/cJSON.h"
-
-void mmi_hengai_http_data_receive(char * recv_buf, int recv_len)
+void mmi_hengai_bp_activation_check_action(void)
 {
-       cJSON * json_root = NULL;
-
-       json_root = cJSON_Parse(recv_buf);
-       if(NULL != json_root)
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       if(0 == mmi_hengai_bp_is_activated())
        {
-               printf("[@CHENG_DEBUG][%s][%d]: json file\n", __FUNCTION__, __LINE__);
+               char * post_data = NULL;
+               cJSON * json_send = NULL;
+               char * req_code = mmi_hengai_bp_req_code_get();
+               char imei[16 + 1] = {0};
+               app_adp_get_imei_req(imei);
                
+               json_send = cJSON_CreateObject();
+               cJSON_AddItemToObject(json_send, "app_key", cJSON_CreateString(HENGAI_HTTP_POST_APP_KEY));
+               cJSON_AddItemToObject(json_send, "name", cJSON_CreateString("Z5_HA_K18"));
+               cJSON_AddItemToObject(json_send, "firm", cJSON_CreateString("HENGAI"));
+               cJSON_AddItemToObject(json_send, "mac", cJSON_CreateString(imei));
+               cJSON_AddItemToObject(json_send, "model", cJSON_CreateString("RH303"));
+               cJSON_AddItemToObject(json_send, "sensor", cJSON_CreateString("VP60"));
+               cJSON_AddItemToObject(json_send, "sinklib_version", cJSON_CreateString("v0.3.0.072522"));
+               cJSON_AddItemToObject(json_send, "request_code", cJSON_CreateString(req_code));
+               post_data = cJSON_Print(json_send);
+               cJSON_Delete(json_send);
+               json_send = NULL;
+
+               char url[256] = {0};
+               char * url_suffix = "/sinklib/activation";
+               sprintf(url, "%s%s", HENGAI_HTTP_POST_URL_COMMON_PREFIX, url_suffix);
+               int ret = mmi_hengai_http_post_data(url, post_data);
+               if(0 == ret)
+               {
+                       cJSON * json_recv = NULL;
+                       
+                       json_recv = cJSON_Parse(s_hengai_http_revceive_buf);
+                       if(NULL != json_recv)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: json file\n", __FUNCTION__, __LINE__);
+                               
+                               // true
+                               if(cJSON_GetIntValue(cJSON_GetObjectItem(json_recv, "status")))
+                               {
+                                       cJSON * json_data = cJSON_GetObjectItem(json_recv, "data");
+                                       char * act_code = cJSON_GetStringValue(cJSON_GetObjectItem(json_data, "activation_code"));
+                                               
+                                       mmi_hengai_bp_act_code_set(act_code);
+
+                                       // »ñµÃÁ˼¤»îÂ룬·¢Ë͸øÏ³Á¿â£¬²¢µÃµ½ÕýÈ··µ»ØºóÇëÇó
+                                       // if()
+                                       {
+                                               mmi_hengai_bp_activation_feedback();
+                                       }
+                               }
+                               else // false
+                               {
+
+                               }
+                       }
+                       else
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+                       }
+                       
+                       if(NULL != json_recv)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+                               cJSON_Delete(json_recv);
+                               json_recv = NULL;
+                       }
+               }
                
+               if(NULL != s_hengai_http_revceive_buf)
+               {
+                       lv_mem_free(s_hengai_http_revceive_buf);
+                       s_hengai_http_revceive_buf = NULL;
+               }
        }
-       else
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
-       }
+}
+#endif
 
-       if(NULL != json_root)
+
+void mmi_hengai_algorithm_interface_login_action(void)
+{
+       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       //if(0 == mmi_hengai_bp_is_activated())
        {
-               printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
-               cJSON_Delete(json_root);
-               json_root = NULL;
+               cJSON * json_send = json_send = cJSON_CreateObject();
+               cJSON_AddItemToObject(json_send, "app_key", cJSON_CreateString(HENGAI_HTTP_POST_APP_KEY));
+               cJSON_AddItemToObject(json_send, "account_type", cJSON_CreateNumber(0));
+               cJSON_AddItemToObject(json_send, "account", cJSON_CreateString("18912345678"));
+               cJSON_AddItemToObject(json_send, "name", cJSON_CreateString("18912345678"));
+               cJSON_AddItemToObject(json_send, "password", cJSON_CreateString("123456"));
+               cJSON_AddItemToObject(json_send, "gender", cJSON_CreateNumber(3));
+               cJSON_AddItemToObject(json_send, "birthday", cJSON_CreateString("2000-10-01"));
+               cJSON_AddItemToObject(json_send, "height", cJSON_CreateNumber(180));
+               cJSON_AddItemToObject(json_send, "weight", cJSON_CreateNumber(80));
+               char * post_data = cJSON_Print(json_send);
+               cJSON_Delete(json_send);
+               json_send = NULL;
+
+               char url[256] = {0};
+               char * url_suffix = "/entrance/user/login";
+               sprintf(url, "%s%s", HENGAI_HTTP_POST_URL_COMMON_PREFIX, url_suffix);
+               int ret = mmi_hengai_http_post_data(url, post_data, NULL);
+               if(0 == ret)
+               {
+                       cJSON * json_recv = cJSON_Parse(s_hengai_http_revceive_buf);
+                       if(NULL != json_recv)
+                       {
+                               if(cJSON_GetIntValue(cJSON_GetObjectItem(json_recv, "status")))
+                               {
+                                       printf("[@CHENG_DEBUG][%s][%d]: true\n", __FUNCTION__, __LINE__);
+                                       
+                                       cJSON * json_data = cJSON_GetObjectItem(json_recv, "data");
+                                       char * token = cJSON_GetStringValue(cJSON_GetObjectItem(json_data, "token"));
+                                       // save token
+                                       
+                               }
+                               else
+                               {
+                                       printf("[@CHENG_DEBUG][%s][%d]: false\n", __FUNCTION__, __LINE__);
+                               }
+                       }
+                       else
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: not json file\n", __FUNCTION__, __LINE__);
+                       }
+                       
+                       if(NULL != json_recv)
+                       {
+                               printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
+                               cJSON_Delete(json_recv);
+                               json_recv = NULL;
+                       }
+               }
+               
+               if(NULL != s_hengai_http_revceive_buf)
+               {
+                       lv_mem_free(s_hengai_http_revceive_buf);
+                       s_hengai_http_revceive_buf = NULL;
+               }
        }
 }
 
+
 #endif
 
 
index 18982b0..5d02a11 100644 (file)
@@ -16,66 +16,38 @@ extern "C" {
 #include "../../../lv_ex_conf.h"
 #endif
 
-#ifdef __MMI_CUSTOM_HENG_AI__
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
 
-// http://test.aicaring.com/
 
+// ½Ó¿Úǰ׺£º
+// Õýʽǰ׺£ºhttp://api.aicaring.com/api/v0
+// Õýʽapp_key£ºÔÝÎÞ
+// ²âÊÔǰ׺£ºhttp://test.aicaring.com/api/v0
+// ²âÊÔapp_key£º5d3ef21f0cbf966505c3d5137740be77
 
-#include "../../../../product/craneg_modem/cust/fit/inc/sdknet.h"
 
 
-#define MMI_HENGAI_HTTP_IP_ADDRESS             ("ability.raisound.com") // http://test.aicaring.com/
-#define MMI_HENGAI_HTTP_IP_PORT                (8899)
+// #include "../../../../product/craneg_modem/cust/fit/inc/sdknet.h"
 
-#define HENGAI_HTTP_SOCKET_SEND_TIMEOUT  3
-#define HENGAI_HTTP_SOCKET_REV_TIMEOUT  3
+#if 0
+#define HENGAI_HTTP_POST_URL_COMMON_PREFIX     ("http://api.aicaring.com/api/v0")
+#define HENGAI_HTTP_POST_APP_KEY       ("5d3ef21f0cbf966505c3d5137740be77")
+#else
+#define HENGAI_HTTP_POST_URL_COMMON_PREFIX     ("http://test.aicaring.com/api/v0")
+#define HENGAI_HTTP_POST_APP_KEY       ("5d3ef21f0cbf966505c3d5137740be77")
+#endif
 
-#define HENGAI_HTTP_RECEIVE_BUFF_LEN  (1024 * 2)
 
+#define HENGAI_HTTP_POST_TRY_COUNT_MAX  (3)
 
-typedef enum
-{
-       MMI_HENGAI_HTTP_TCP_MSG_ID_START,
-   
-    MMI_HENGAI_HTTP_TCP_MSG_CONNECT,
-    MMI_HENGAI_HTTP_TCP_MSG_CONNECTED,
-    MMI_HENGAI_HTTP_TCP_MSG_DISCONNECT,
-    MMI_HENGAI_HTTP_TCP_MSG_RECONNECT,
-    MMI_HENGAI_HTTP_TCP_MSG_SEND,
-    MMI_HENGAI_HTTP_TCP_MSG_READ,
-    
-    MMI_HENGAI_HTTP_TCP_MSG_ID_END
-}MMI_HENGAI_HTTP_TCP_MSG_ID_E;
 
 
-typedef struct {
-       signed long sock_fd;
-       unsigned char connect_flag;
-       unsigned char connecting_flag;
-       unsigned char first_connect_flag;
-       char reconnect_count;
-       
-       void *relink_timer;
-}mmi_hengai_http_tcp_info_t;
 
 
-typedef struct
-{
-       uint16_t cmd_type;
-       void * cmd_param;
-}mmi_hengai_http_task_msg_t;
 
-typedef struct
-{
-       int socket_fd;
-       int len;
-} mmi_hengai_http_socket_fd_t;
 
 
 
-void mmi_hengai_http_tcp_connect_msg(void * param);
-void mmi_hengai_http_tcp_disconnect_msg(void * param);
-void mm_hengai_http_task_init(void);
 
 
 
index f48dfc1..6f373b7 100644 (file)
@@ -41,6 +41,12 @@ void mmi_hsensor_spo2_open(void)
        mmi_hsensor_spo2_measure_start();
 }
 
+void mmi_hsensor_bp_open(void)
+{
+       HEALTH_MEASURE_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       mmi_hsensor_bp_measure_start();
+}
+
 bool mmi_hsensor_is_open(void)
 {
        return true;
@@ -778,6 +784,13 @@ bool mmi_health_measure_timed_measure_start(MMI_HEALTH_MEASURE_TYPE_E measure_ty
        
        if(NULL != lv_watch_get_activity_obj(ACT_ID_FACTORY_MODE_TEST))
                return false;
+
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+       if(mmi_hengai_bp_is_measuring())
+       {
+               return false;
+       }
+#endif
        
        if(MMI_HEALTH_MEASURE_STATE_UI == s_health_measure_run_data.measure_state
                || MMI_HEALTH_MEASURE_STATE_APP == s_health_measure_run_data.measure_state
@@ -814,6 +827,13 @@ void mmi_health_measure_app_measure_start(MMI_HEALTH_MEASURE_TYPE_E measure_type
        {
                return;
        }
+
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+       if(mmi_hengai_bp_is_measuring())
+       {
+               return;
+       }
+#endif
        
        if(MMI_HEALTH_MEASURE_STATE_TIMED == s_health_measure_run_data.measure_state)
        {
index 8f6451e..f77fbce 100644 (file)
@@ -136,6 +136,9 @@ static void mmi_data_init_after_watch_create(void)
 #ifdef __MMI_SEDENTARY_REMIND_SUPPORT__
        mmi_sedentary_remind_mission_power_on_check();
 #endif
+#ifdef __MMI_CUSTOM_HENG_AI_BLOOD_PRESSURE__
+       mmi_hengai_blood_pressure_nv_read();
+#endif
 
 
 
index 5f45560..d55d832 100644 (file)
@@ -1018,9 +1018,13 @@ LV_IMG_DECLARE(img_poweron_logo);
 #define ICON_HENGAI_BP_PROMPT_0           "R:/png/custom_function/ICON_HENGAI_BP_PROMPT_0.png"
 #define ICON_HENGAI_BP_PROMPT_1           "R:/png/custom_function/ICON_HENGAI_BP_PROMPT_1.png"
 
-#define ANIM_HENGAI_BP_MEASURE                                 "R:/gif/ANIM_HENGAI_BP_MEASURE.gif"
-#define ANIM_HENGAI_BP_CALIBRATE                                       "R:/gif/ANIM_HENGAI_BP_CALIBRATE.gif"
-#define ANIM_HENGAI_BP_ATTEMPT                                 "R:/gif/ANIM_HENGAI_BP_ATTEMPT.gif"
+#define ICON_HENGAI_BP_LEFT_ARROW           "R:/png/custom_function/ICON_HENGAI_BP_LEFT_ARROW.png"
+#define ICON_HENGAI_BP_RIGHT_ARROW           "R:/png/custom_function/ICON_HENGAI_BP_RIGHT_ARROW.png"
+
+#define ANIM_HENGAI_BP_MEASURE                                 "R:/gif/custom_function/ANIM_HENGAI_BP_MEASURE.gif"
+#define ANIM_HENGAI_BP_CALIBRATE                                       "R:/gif/custom_function/ANIM_HENGAI_BP_CALIBRATE.gif"
+#define ANIM_HENGAI_BP_ATTEMPT                                 "R:/gif/custom_function/ANIM_HENGAI_BP_ATTEMPT.gif"
+#define ANIM_HENGAI_BP_WAITTING                                        "R:/gif/custom_function/ANIM_HENGAI_BP_WAITTING.gif"
 
 #endif