From 9232d14721038590325e130af8f013cb1a78cefd Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Tue, 15 Oct 2024 18:59:34 +0800 Subject: [PATCH] =?utf8?q?=E5=BF=83=E7=8E=87=EF=BC=9A=E4=BF=AE=E6=94=B9?= =?utf8?q?=E5=BF=83=E7=8E=87=E6=A3=80=E6=B5=8B=E5=A2=9E=E5=8A=A0=E6=9C=80?= =?utf8?q?=E5=A4=9A60=E7=A7=92=E9=95=BF=E4=BA=AE=E5=B1=8F=E3=80=82?= =?utf8?q?=E6=B5=8B=E9=87=8F=E5=87=BA=E6=9D=A5=E6=AD=A3=E5=B8=B8=E6=81=AF?= =?utf8?q?=E5=B1=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/heartrate/include/HeartModel.h | 11 +- .../heartrate/src/HeartChartPresenter.cpp | 3 - .../nativeui/heartrate/src/HeartModel.cpp | 127 +++++++++++++++++- .../nativeui/main/src/MainPresenterSample.cpp | 7 +- 4 files changed, 134 insertions(+), 14 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index 94cbc63f0..466a2a2fc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -155,6 +155,10 @@ public: void handleLowHeartRate(); void handleHighHeartRate(); + void heart_start_screen60s_timer(uint32_t interval = 30 * 1000); + void heart_stop_screen60s_timer(); + void reset_heart_screen60s_timer_time(); + private: HealthAllDatas healthDatas; uint16_t pretime{0}; @@ -169,12 +173,13 @@ private: bool wearStatus{true}; uint16_t index_ = 0; - uint16_t displayheart = 0; // 显示心率 - uint16_t currentheart = 0; // 保存心率 + uint16_t displayheart = 0; // 显示心率 + uint16_t currentheart = 0; // 保存心率 uint16_t displayheart_max = 0; // 显示最大心率 uint16_t displayheart_min = 0; // 显示最小心率 - uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) + uint32 + timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) bool initstatus = true; bool heartstate = false; diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp index 2c2570c20..ecbcc8840 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp @@ -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); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index b199a4e6f..b42dca9ed 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -11,15 +11,30 @@ #include "heartrate/include/HeartRateView.h" #include "heartrate/include/HeartResultPresenter.h" +#include "ConfigModel.h" #include "DialModelHeartRate.h" #include "custom_runtime.h" #include "custom_utils.h" #include "health_service.h" #include "ppg_service.h" +#include "settings/include/SettingModel.h" +#include "uiservice/include/ui_service.h" +#include "wearable_log.h" #include +#include +#include +#include +#include #include #include +#include #include +#include +#include +#include +#include +#include +#include #include "battery_hal.h" #include "ui_service.h" @@ -397,6 +412,10 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST; send_ppg_cmd_msg(md); heartstate = false; + if (checkstate == HeartCheck::CARDCHECK) { + //重置传感器状态 + sensorstate = false; + } // 复原检测状态 checkstate = HeartCheck::RESTSTSTE; } else if (state == HeartState::Start && heartstate == false) { @@ -429,7 +448,12 @@ void HeartModel::Heart_Start(HeartCheck check) { sensorstate = true; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测"); // 设置runtime - uapi_dev_runtime_set_heartrate_detect_status(1); + if (uapi_dev_runtime_get_heartrate_detect_status() == 0) { + uapi_dev_runtime_set_heartrate_detect_status(1); + ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); + // 主动检测的亮屏60s + heart_start_screen60s_timer(); + } } } @@ -456,11 +480,21 @@ void HeartModel::Heart_Stop() { return; } + // 恢复正常亮屏 + HeartModel::GetInstance()->heart_stop_screen60s_timer(); + // 取消常亮屏 + ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); + //设置runtime uapi_dev_runtime_set_heartrate_detect_status(0); - sensorstate = false; Heart_Result(); // 处理结果 + + //为了防止主界面卡片一直重复开传感器 + if (checkstate != HeartCheck::CARDCHECK) { + //重置传感器状态 + sensorstate = false; + } WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束"); } // 保存检测数据 @@ -787,4 +821,93 @@ std::string HeartModel::GetCheckString() { check_string.c_str()); // 打印最终检测结果 return check_string; } + +// 声明定时器变量 +static osTimerId_t g_screen60s_timer = nullptr; +static uint16_t SCREEN_60S_TIME = 60; + +static void heart_start_screen60s_timer_callbackProc(int data) { + WEARABLE_LOGE( + WEARABLE_LOG_MODULE_APP, + "HeartModel::heart_start_screen60s_timer_callbackProc,time = %d", + SCREEN_60S_TIME); + SCREEN_60S_TIME -= 30; + WEARABLE_LOGE( + WEARABLE_LOG_MODULE_APP, + "HeartModel::heart_start_screen60s_timer_callbackProc,time = %d", + SCREEN_60S_TIME); + if (SCREEN_60S_TIME <= 0) { + // 60s后息屏停止定时 + HeartModel::GetInstance()->heart_stop_screen60s_timer(); + // 取消常亮屏 + ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_stop_screen60s_timer"); + } +} +static void heart_start_screen60s_timer_callback(int data) { + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(heart_start_screen60s_timer_callbackProc, data)); +} +void HeartModel::heart_start_screen60s_timer(uint32_t interval) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "HeartModel::heart_start_screen60s_timer"); + /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 + * ------------------------- */ + if (g_screen60s_timer != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!"); + return; + } + /* --------------------------------- 2.创建定时器 + * -------------------------------- */ + g_screen60s_timer = + osTimerNew((osTimerFunc_t)heart_start_screen60s_timer_callback, + osTimerPeriodic, nullptr, nullptr); + // 检查定时器创建是否成功 + if (g_screen60s_timer == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!"); + return; + } + /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 + * ---------------------------- */ + int tick = osMs2Tick(interval); + /* --------------------------------- 4.启动定时器 + * -------------------------------- */ + osStatus_t ret = osTimerStart(g_screen60s_timer, tick); + /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 + * nullptr -------------------- */ + if (ret != osOK) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", + ret); + if (g_screen60s_timer != nullptr) { + ret = osTimerDelete(g_screen60s_timer); + } + g_screen60s_timer = nullptr; + return; + } +} +void HeartModel::heart_stop_screen60s_timer(void) { + // 检查定时器是否存在 + if (g_screen60s_timer != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "HeartModel::heart_stop_screen60s_timer"); + osTimerStop(g_screen60s_timer); + // 删除定时器并置为 nullptr + osStatus_t ret = osTimerDelete(g_screen60s_timer); + if (ret != osOK) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "osTimerDelete failed, ret = %lx!!", ret); + } + g_screen60s_timer = nullptr; + SCREEN_60S_TIME = 60; + } +} +void HeartModel::reset_heart_screen60s_timer_time() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reset_heart_screen60s_timer_time"); + SCREEN_60S_TIME = 60; + if (nullptr == g_screen60s_timer) { + ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 重新常亮屏 + heart_start_screen60s_timer(); // 开启定时器 + } +} + } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp index 0f86863a0..4afa7868e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp @@ -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); //主动检测心率 } // 从睡眠卡片跳转到其他卡片时切换到睡眠卡片主界面 -- 2.17.1