心率:修改心率检测增加最多60秒长亮屏。测量出来正常息屏。 1193/1
authorCaisking <3449750381@qq.com>
Tue, 15 Oct 2024 10:59:34 +0000 (18:59 +0800)
committerCaisking <3449750381@qq.com>
Tue, 15 Oct 2024 10:59:34 +0000 (18:59 +0800)
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp

index 94cbc63..466a2a2 100644 (file)
@@ -155,6 +155,10 @@ public:
   void handleLowHeartRate();\r
   void handleHighHeartRate();\r
 \r
+  void heart_start_screen60s_timer(uint32_t interval = 30 * 1000);\r
+  void heart_stop_screen60s_timer();\r
+  void reset_heart_screen60s_timer_time();\r
+\r
 private:\r
   HealthAllDatas healthDatas;\r
   uint16_t pretime{0};\r
@@ -169,12 +173,13 @@ private:
   bool wearStatus{true};\r
   uint16_t index_ = 0;\r
 \r
-  uint16_t displayheart = 0;         // 显示心率\r
-  uint16_t currentheart = 0;         // 保存心率\r
+  uint16_t displayheart = 0;     // 显示心率\r
+  uint16_t currentheart = 0;     // 保存心率\r
   uint16_t displayheart_max = 0; // 显示最大心率\r
   uint16_t displayheart_min = 0; // 显示最小心率\r
 \r
-  uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+  uint32\r
+      timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
 \r
   bool initstatus = true;\r
   bool heartstate = false;\r
index 2c2570c..ecbcc88 100644 (file)
@@ -32,8 +32,6 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartPresenter::HeartChartPresenter");
         g_pHeartChartPresenter = this;
-        display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
-        display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
 #ifdef MEM_CHECK
         MemCheck::GetInstance()->EnableLeakCheck(true);
 #endif
@@ -41,7 +39,6 @@ namespace OHOS
 
     HeartChartPresenter::~HeartChartPresenter()
     {
-        display_api->set_screen_auto_off_timeout(display_time); // 恢复
         g_pHeartChartPresenter = nullptr;
 #ifdef MEM_CHECK
         MemCheck::GetInstance()->EnableLeakCheck(false);
index b199a4e..b42dca9 100644 (file)
 #include "heartrate/include/HeartRateView.h"\r
 #include "heartrate/include/HeartResultPresenter.h"\r
 \r
+#include "ConfigModel.h"\r
 #include "DialModelHeartRate.h"\r
 #include "custom_runtime.h"\r
 #include "custom_utils.h"\r
 #include "health_service.h"\r
 #include "ppg_service.h"\r
+#include "settings/include/SettingModel.h"\r
+#include "uiservice/include/ui_service.h"\r
+#include "wearable_log.h"\r
 #include <algorithm>\r
+#include <bleEvent.h>\r
+#include <cmsis_os.h>\r
+#include <cmsis_os2.h>\r
+#include <custom_utils.h>\r
 #include <iostream>\r
 #include <memory>\r
+#include <ohos_types.h>\r
 #include <random>\r
+#include <service/graphic_service.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <sys/stat.h>\r
+#include <unistd.h>\r
 \r
 #include "battery_hal.h"\r
 #include "ui_service.h"\r
@@ -397,6 +412,10 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
     send_ppg_cmd_msg(md);\r
     heartstate = false;\r
+    if (checkstate == HeartCheck::CARDCHECK) {\r
+      //重置传感器状态\r
+      sensorstate = false;\r
+    }\r
     // 复原检测状态\r
     checkstate = HeartCheck::RESTSTSTE;\r
   } else if (state == HeartState::Start && heartstate == false) {\r
@@ -429,7 +448,12 @@ void HeartModel::Heart_Start(HeartCheck check) {
     sensorstate = true;\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测");\r
     // 设置runtime\r
-    uapi_dev_runtime_set_heartrate_detect_status(1);\r
+    if (uapi_dev_runtime_get_heartrate_detect_status() == 0) {\r
+      uapi_dev_runtime_set_heartrate_detect_status(1);\r
+      ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);\r
+      // 主动检测的亮屏60s\r
+      heart_start_screen60s_timer();\r
+    }\r
   }\r
 }\r
 \r
@@ -456,11 +480,21 @@ void HeartModel::Heart_Stop() {
     return;\r
   }\r
 \r
+  // 恢复正常亮屏\r
+  HeartModel::GetInstance()->heart_stop_screen60s_timer();\r
+  // 取消常亮屏\r
+  ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);\r
+\r
   //设置runtime\r
   uapi_dev_runtime_set_heartrate_detect_status(0);\r
 \r
-  sensorstate = false;\r
   Heart_Result(); // 处理结果\r
+\r
+  //为了防止主界面卡片一直重复开传感器\r
+  if (checkstate != HeartCheck::CARDCHECK) {\r
+    //重置传感器状态\r
+    sensorstate = false;\r
+  }\r
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
 }\r
 // 保存检测数据\r
@@ -787,4 +821,93 @@ std::string HeartModel::GetCheckString() {
                 check_string.c_str()); // 打印最终检测结果\r
   return check_string;\r
 }\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_LOGE(\r
+      WEARABLE_LOG_MODULE_APP,\r
+      "HeartModel::heart_start_screen60s_timer_callbackProc,time = %d",\r
+      SCREEN_60S_TIME);\r
+  SCREEN_60S_TIME -= 30;\r
+  WEARABLE_LOGE(\r
+      WEARABLE_LOG_MODULE_APP,\r
+      "HeartModel::heart_start_screen60s_timer_callbackProc,time = %d",\r
+      SCREEN_60S_TIME);\r
+  if (SCREEN_60S_TIME <= 0) {\r
+    // 60s后息屏停止定时\r
+    HeartModel::GetInstance()->heart_stop_screen60s_timer();\r
+    // 取消常亮屏\r
+    ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_stop_screen60s_timer");\r
+  }\r
+}\r
+static void heart_start_screen60s_timer_callback(int data) {\r
+  GraphicService::GetInstance()->PostGraphicEvent(\r
+      std::bind(heart_start_screen60s_timer_callbackProc, data));\r
+}\r
+void HeartModel::heart_start_screen60s_timer(uint32_t interval) {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                "HeartModel::heart_start_screen60s_timer");\r
+  /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回\r
+   * ------------------------- */\r
+  if (g_screen60s_timer != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");\r
+    return;\r
+  }\r
+  /* --------------------------------- 2.创建定时器\r
+   * -------------------------------- */\r
+  g_screen60s_timer =\r
+      osTimerNew((osTimerFunc_t)heart_start_screen60s_timer_callback,\r
+                 osTimerPeriodic, nullptr, nullptr);\r
+  // 检查定时器创建是否成功\r
+  if (g_screen60s_timer == nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");\r
+    return;\r
+  }\r
+  /* ----------------------------- 3.将毫秒转换为系统时钟节拍数\r
+   * ---------------------------- */\r
+  int tick = osMs2Tick(interval);\r
+  /* --------------------------------- 4.启动定时器\r
+   * -------------------------------- */\r
+  osStatus_t ret = osTimerStart(g_screen60s_timer, tick);\r
+  /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为\r
+   * nullptr -------------------- */\r
+  if (ret != osOK) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!",\r
+                  ret);\r
+    if (g_screen60s_timer != nullptr) {\r
+      ret = osTimerDelete(g_screen60s_timer);\r
+    }\r
+    g_screen60s_timer = nullptr;\r
+    return;\r
+  }\r
+}\r
+void HeartModel::heart_stop_screen60s_timer(void) {\r
+  // 检查定时器是否存在\r
+  if (g_screen60s_timer != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "HeartModel::heart_stop_screen60s_timer");\r
+    osTimerStop(g_screen60s_timer);\r
+    // 删除定时器并置为 nullptr\r
+    osStatus_t ret = osTimerDelete(g_screen60s_timer);\r
+    if (ret != osOK) {\r
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                    "osTimerDelete failed, ret = %lx!!", ret);\r
+    }\r
+    g_screen60s_timer = nullptr;\r
+    SCREEN_60S_TIME = 60;\r
+  }\r
+}\r
+void HeartModel::reset_heart_screen60s_timer_time() {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reset_heart_screen60s_timer_time");\r
+  SCREEN_60S_TIME = 60;\r
+  if (nullptr == g_screen60s_timer) {\r
+    ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 重新常亮屏\r
+    heart_start_screen60s_timer();            // 开启定时器\r
+  }\r
+}\r
+\r
 } // namespace OHOS\r
index 0f86863..4afa786 100644 (file)
@@ -71,13 +71,8 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");
         g_pMainPresenterSample = nullptr;
         /*从主界面退出,关闭心率检测*/
-#if HEART_RATE_CHECK_TIMEOUT
       HeartModel::GetInstance()->Heart_Control(HeartState::End,
                                                HeartCheck::CARDCHECK);
-#else
-      HeartModel::GetInstance()->Heart_Control(HeartState::End,
-                                               HeartCheck::INITIATIVE);
-#endif
     }
 
     MainPresenterSample *MainPresenterSample::GetInstance(void)
@@ -386,7 +381,7 @@ namespace OHOS
         {
             LogCardTransition(previousCardId, currentCardId);
             HeartModel::GetInstance()->Heart_Stop();
-            HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); //主动检测心率
+            HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::CARDCHECK); //主动检测心率
         }
 
         // 从睡眠卡片跳转到其他卡片时切换到睡眠卡片主界面