From a70acf575287828baa0a99197092aca14c95d5eb Mon Sep 17 00:00:00 2001 From: Caisking Date: Mon, 14 Jul 2025 18:24:35 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E5=BF=83=E7=8E=87=E7=9A=84?= =?utf8?q?=E6=95=B0=E6=8D=AE=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/heartrate/include/HeartModel.h | 4 + .../nativeui/heartrate/src/HeartModel.cpp | 100 +++++++++++++++--- 2 files changed, 89 insertions(+), 15 deletions(-) diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/include/HeartModel.h index 316ba179e..37f1d266c 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/include/HeartModel.h @@ -160,6 +160,10 @@ public: void heart_stop_screen60s_timer(); void reset_heart_screen60s_timer_time(); + void heart_data_timer(uint32_t interval = 1000); + void heart_stop_data_timer(); + + private: HealthAllDatas healthDatas; uint16_t pretime{0}; diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp index 838b1b012..830eb5355 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/heartrate/src/HeartModel.cpp @@ -17,9 +17,12 @@ #include "custom_utils.h" #include "heart_blood/health_service/health_service.h" +#include #ifdef SUPPORT_PPG_SERVICE +#include "ppg_hal.h" #include "ppg_service.h" + #endif #include "settings/include/SettingModel.h" @@ -49,7 +52,6 @@ #include "languagecode/LanguageInit.h" #include "ui_service.h" - #include #ifdef __cplusplus @@ -62,6 +64,8 @@ extern "C" { #define MIN_DISPLAY_HEART 50 //最新心率 #define DISPLAY_COUNT 0 #define HEARTTEST 1 //[0 开启测试 1 关闭] +#define KEEP_SCREEN_ON_HEART 1 +#define HEART_TIMER_DATA 1 /*佩戴检测结果*/ enum { @@ -425,9 +429,8 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { #ifdef SUPPORT_PPG_SERVICE uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST; errcode_t ret = send_ppg_cmd_msg(md); - if(ret != ERRCODE_SUCC) - { - send_ppg_cmd_msg(md); + if (ret != ERRCODE_SUCC) { + send_ppg_cmd_msg(md); } #endif heartstate = false; @@ -468,7 +471,6 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { uapi_save_runtime_log(RUNTIME_LOG_HEART_MEASURE); } } - } // 开始检测 void HeartModel::Heart_Start(HeartCheck check) { @@ -478,7 +480,7 @@ void HeartModel::Heart_Start(HeartCheck check) { Heart_Control(HeartState::Start, check); // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭 sensorstate = true; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "开始心率检测"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测"); // 设置runtime if (uapi_dev_runtime_get_heartrate_detect_status() == 0) { uapi_dev_runtime_set_heartrate_detect_status(1); @@ -486,6 +488,7 @@ void HeartModel::Heart_Start(HeartCheck check) { // 主动检测的亮屏60s heart_start_screen60s_timer(); } + heart_data_timer(); // 开始检测 } } @@ -494,10 +497,8 @@ void HeartModel::Heart_Stop() { valid_counter_ = 0; disvalid_counter_ = 0; unwear_counter_ = 0; - // display_counter_ = 0; 取消再次检测的--操作 - // displayheart = 0; - // ScreenTurnOff(); //恢复正常亮屏 + heart_stop_data_timer(); //关闭数据获取 /*主界面卡片检测 或者 被动检测*/ if (checkstate == HeartCheck::PASSIVITY) { @@ -527,7 +528,7 @@ void HeartModel::Heart_Stop() { sensorstate = false; uapi_dev_runtime_set_heartrate_detect_status(0); } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "本次心率检测结束"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束"); } } // 保存检测数据 @@ -632,10 +633,9 @@ void HeartModel::handleHeartResult() { } //进行日志打印与界面切换 void HeartModel::logAndChangeSlice(HeartResult result) { - const char *resultMsg = - (result == HeartResult::NOT_WORN) - ? "未佩戴状态" - : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据"; + const char *resultMsg = (result == HeartResult::NOT_WORN) ? "未佩戴状态" + : (result == HeartResult::TIMEOUT) ? "超时" + : "无效数据"; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg); uapi_set_screen_on_api(); // 亮屏 //需要先判断界面 心率卡片界面 @@ -924,10 +924,11 @@ std::string HeartModel::GetCheckString() { return check_string; // Return the final string } +#if KEEP_SCREEN_ON_HEART +/////////////////////////////////////////亮屏定时器//////////////////////////////////////////// // 声明定时器变量 static osTimerId_t g_screen60s_timer = nullptr; static uint16_t SCREEN_60S_TIME = 60; - static void heart_start_screen60s_timer_callbackProc(int data) { WEARABLE_LOGD( WEARABLE_LOG_MODULE_APP, @@ -1011,5 +1012,74 @@ void HeartModel::reset_heart_screen60s_timer_time() { heart_start_screen60s_timer(); // 开启定时器 } } +#endif +////////////////////////////////////////////////////////////////////////////////// +#if HEART_TIMER_DATA +// 声明定时器变量 +static osTimerId_t g_data_timer = nullptr; +static void heart_data_callbackProc(int data) { + //更新佩戴 + uint8_t wear = 1; +#ifdef SUPPORT_PPG_SERVICE + wear = ppg_get_wear_status(); + wear = 1;//暂时屏蔽 + // printf("heart_data_callbackProc::wear = %d\n", wear); +#endif + if (wear == 0) { + OHOS::HeartModel::GetInstance()->SetWearStatus(); + } + //更新心率 + uint8_t hrs = 0; +#ifdef SUPPORT_PPG_SERVICE + hrs = ppg_get_hrs(); + printf("heart_data_callbackProc::hrs = %d\n", hrs); +#endif + OHOS::HeartModel::GetInstance()->UpHeartdata(hrs); +} +static void heart_data_timer_callback(int data) { + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(heart_data_callbackProc, data)); +} +void HeartModel::heart_data_timer(uint32_t interval) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "HeartModel::heart_start_screen60s_timer"); + if (g_data_timer != nullptr) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Timer already exists!!"); + return; + } + g_data_timer = osTimerNew((osTimerFunc_t)heart_data_timer_callback, + osTimerPeriodic, nullptr, nullptr); + if (g_data_timer == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!"); + return; + } + int tick = osMs2Tick(interval); + osStatus_t ret = osTimerStart(g_data_timer, tick); + if (ret != osOK) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", + ret); + if (g_data_timer != nullptr) { + ret = osTimerDelete(g_data_timer); + } + g_data_timer = nullptr; + return; + } +} +void HeartModel::heart_stop_data_timer(void) { + // 检查定时器是否存在 + if (g_data_timer != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "HeartModel::heart_stop_screen60s_timer"); + osTimerStop(g_data_timer); + // 删除定时器并置为 nullptr + osStatus_t ret = osTimerDelete(g_data_timer); + if (ret != osOK) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "osTimerDelete failed, ret = %lx!!", ret); + } + g_data_timer = nullptr; + } +} +#endif } // namespace OHOS -- 2.17.1