增加心率的数据服务 1959/2 1959/head 1967/target/1
authorCaisking <Casiking@zhihuishixun.com>
Mon, 14 Jul 2025 10:24:35 +0000 (18:24 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Mon, 14 Jul 2025 10:24:35 +0000 (18:24 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp

index 316ba17..37f1d26 100644 (file)
@@ -160,6 +160,10 @@ public:
   void heart_stop_screen60s_timer();\r
   void reset_heart_screen60s_timer_time();\r
 \r
+  void heart_data_timer(uint32_t interval = 1000);\r
+  void heart_stop_data_timer();\r
+\r
+\r
 private:\r
   HealthAllDatas healthDatas;\r
   uint16_t pretime{0};\r
index 838b1b0..830eb53 100644 (file)
 #include "custom_utils.h"\r
 \r
 #include "heart_blood/health_service/health_service.h"\r
+#include <cstdint>\r
 \r
 #ifdef SUPPORT_PPG_SERVICE\r
+#include "ppg_hal.h"\r
 #include "ppg_service.h"\r
+\r
 #endif\r
 \r
 #include "settings/include/SettingModel.h"\r
@@ -49,7 +52,6 @@
 #include "languagecode/LanguageInit.h"\r
 #include "ui_service.h"\r
 \r
-\r
 #include <custom_save_runtime.h>\r
 \r
 #ifdef __cplusplus\r
@@ -62,6 +64,8 @@ extern "C" {
 #define MIN_DISPLAY_HEART 50      //最新心率\r
 #define DISPLAY_COUNT 0\r
 #define HEARTTEST 1 //[0 开启测试 1 关闭]\r
+#define KEEP_SCREEN_ON_HEART 1\r
+#define HEART_TIMER_DATA 1\r
 \r
 /*佩戴检测结果*/\r
 enum {\r
@@ -425,9 +429,8 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
 #ifdef SUPPORT_PPG_SERVICE\r
     uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
     errcode_t ret = send_ppg_cmd_msg(md);\r
-    if(ret != ERRCODE_SUCC)\r
-    {\r
-        send_ppg_cmd_msg(md);\r
+    if (ret != ERRCODE_SUCC) {\r
+      send_ppg_cmd_msg(md);\r
     }\r
 #endif\r
     heartstate = false;\r
@@ -468,7 +471,6 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
       uapi_save_runtime_log(RUNTIME_LOG_HEART_MEASURE);\r
     }\r
   }\r
-\r
 }\r
 // 开始检测\r
 void HeartModel::Heart_Start(HeartCheck check) {\r
@@ -478,7 +480,7 @@ void HeartModel::Heart_Start(HeartCheck check) {
     Heart_Control(HeartState::Start, check);\r
     // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭\r
     sensorstate = true;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "开始心率检测");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测");\r
     // 设置runtime\r
     if (uapi_dev_runtime_get_heartrate_detect_status() == 0) {\r
       uapi_dev_runtime_set_heartrate_detect_status(1);\r
@@ -486,6 +488,7 @@ void HeartModel::Heart_Start(HeartCheck check) {
       // 主动检测的亮屏60s\r
       heart_start_screen60s_timer();\r
     }\r
+    heart_data_timer(); // 开始检测\r
   }\r
 }\r
 \r
@@ -494,10 +497,8 @@ void HeartModel::Heart_Stop() {
   valid_counter_ = 0;\r
   disvalid_counter_ = 0;\r
   unwear_counter_ = 0;\r
-  // display_counter_ = 0; 取消再次检测的--操作\r
-  // displayheart = 0;\r
 \r
-  // ScreenTurnOff(); //恢复正常亮屏\r
+  heart_stop_data_timer(); //关闭数据获取\r
 \r
   /*主界面卡片检测 或者 被动检测*/\r
   if (checkstate == HeartCheck::PASSIVITY) {\r
@@ -527,7 +528,7 @@ void HeartModel::Heart_Stop() {
       sensorstate = false;\r
       uapi_dev_runtime_set_heartrate_detect_status(0);\r
     }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
   }\r
 }\r
 // 保存检测数据\r
@@ -632,10 +633,9 @@ void HeartModel::handleHeartResult() {
 }\r
 //进行日志打印与界面切换\r
 void HeartModel::logAndChangeSlice(HeartResult result) {\r
-  const char *resultMsg =\r
-      (result == HeartResult::NOT_WORN)\r
-          ? "未佩戴状态"\r
-          : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据";\r
+  const char *resultMsg = (result == HeartResult::NOT_WORN)  ? "未佩戴状态"\r
+                          : (result == HeartResult::TIMEOUT) ? "超时"\r
+                                                             : "无效数据";\r
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg);\r
   uapi_set_screen_on_api(); // 亮屏\r
   //需要先判断界面 心率卡片界面\r
@@ -924,10 +924,11 @@ std::string HeartModel::GetCheckString() {
   return check_string; // Return the final string\r
 }\r
 \r
+#if KEEP_SCREEN_ON_HEART\r
+/////////////////////////////////////////亮屏定时器////////////////////////////////////////////\r
 // 声明定时器变量\r
 static osTimerId_t g_screen60s_timer = nullptr;\r
 static uint16_t SCREEN_60S_TIME = 60;\r
-\r
 static void heart_start_screen60s_timer_callbackProc(int data) {\r
   WEARABLE_LOGD(\r
       WEARABLE_LOG_MODULE_APP,\r
@@ -1011,5 +1012,74 @@ void HeartModel::reset_heart_screen60s_timer_time() {
     heart_start_screen60s_timer();            // 开启定时器\r
   }\r
 }\r
+#endif\r
+//////////////////////////////////////////////////////////////////////////////////\r
+#if HEART_TIMER_DATA\r
+// 声明定时器变量\r
+static osTimerId_t g_data_timer = nullptr;\r
 \r
+static void heart_data_callbackProc(int data) {\r
+  //更新佩戴\r
+  uint8_t wear = 1;\r
+#ifdef SUPPORT_PPG_SERVICE\r
+  wear = ppg_get_wear_status(); \r
+  wear = 1;//暂时屏蔽\r
+  // printf("heart_data_callbackProc::wear = %d\n", wear);\r
+#endif\r
+  if (wear == 0) {\r
+    OHOS::HeartModel::GetInstance()->SetWearStatus();\r
+  }\r
+  //更新心率\r
+  uint8_t hrs = 0;\r
+#ifdef SUPPORT_PPG_SERVICE\r
+  hrs = ppg_get_hrs();\r
+  printf("heart_data_callbackProc::hrs = %d\n", hrs);\r
+#endif\r
+  OHOS::HeartModel::GetInstance()->UpHeartdata(hrs);\r
+}\r
+static void heart_data_timer_callback(int data) {\r
+  GraphicService::GetInstance()->PostGraphicEvent(\r
+      std::bind(heart_data_callbackProc, data));\r
+}\r
+void HeartModel::heart_data_timer(uint32_t interval) {\r
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+                "HeartModel::heart_start_screen60s_timer");\r
+  if (g_data_timer != nullptr) {\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");\r
+    return;\r
+  }\r
+  g_data_timer = osTimerNew((osTimerFunc_t)heart_data_timer_callback,\r
+                            osTimerPeriodic, nullptr, nullptr);\r
+  if (g_data_timer == nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");\r
+    return;\r
+  }\r
+  int tick = osMs2Tick(interval);\r
+  osStatus_t ret = osTimerStart(g_data_timer, tick);\r
+  if (ret != osOK) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!",\r
+                  ret);\r
+    if (g_data_timer != nullptr) {\r
+      ret = osTimerDelete(g_data_timer);\r
+    }\r
+    g_data_timer = nullptr;\r
+    return;\r
+  }\r
+}\r
+void HeartModel::heart_stop_data_timer(void) {\r
+  // 检查定时器是否存在\r
+  if (g_data_timer != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "HeartModel::heart_stop_screen60s_timer");\r
+    osTimerStop(g_data_timer);\r
+    // 删除定时器并置为 nullptr\r
+    osStatus_t ret = osTimerDelete(g_data_timer);\r
+    if (ret != osOK) {\r
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                    "osTimerDelete failed, ret = %lx!!", ret);\r
+    }\r
+    g_data_timer = nullptr;\r
+  }\r
+}\r
+#endif\r
 } // namespace OHOS\r