From ed24ce682eaf29540bbddda54cd3ed5e847140c6 Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Fri, 20 Sep 2024 20:57:28 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E5=BF=83=E7=8E=87=E7=9A=84?= =?utf8?q?=E5=88=B7=E6=96=B0=E9=85=8D=E7=BD=AE=EF=BC=9B=E9=98=B2=E6=AD=A2?= =?utf8?q?=E5=9C=A8=E5=90=8E=E5=8F=B0=E8=BF=9B=E8=A1=8CUI=E5=88=B7?= =?utf8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../heartrate/include/HeartChartPresenter.h | 3 + .../nativeui/heartrate/include/HeartModel.h | 3 +- .../heartrate/src/HeartChartPresenter.cpp | 20 +++ .../nativeui/heartrate/src/HeartChartView.cpp | 10 +- .../nativeui/heartrate/src/HeartModel.cpp | 139 ++++++++---------- 5 files changed, 93 insertions(+), 82 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h index 06e5c187a..876166b71 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h @@ -23,6 +23,7 @@ namespace OHOS class HeartChartView; class HeartChartPresenter : public Presenter, + public ModelListenerSample, public UIView::OnClickListener, public UIView::OnDragListener, public RootView::OnKeyActListener, @@ -36,6 +37,8 @@ namespace OHOS void OnStart() override; void OnResume() override; void OnStop() override; + void OnTickEvent() override; + void Notify() override {} bool OnClick(UIView &view, const ClickEvent &event) override; bool OnDrag(UIView &view, const DragEvent &event) override; bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 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 4827a8abc..c67d3600b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -112,8 +112,7 @@ public: Point *GetMaximumHeartRate(void); void Init(void); void HeartRatePros(HeartDatas *heartInfo); - void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, - uint16_t minRate); + void RefreshHeartRateScreen(); void ClearHeartData(void); void HandleMaxHeart(uint16_t coord, uint16_t value); void HandleMinHeart(uint16_t coord, uint16_t value); 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 5643d3506..49219fbee 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp @@ -99,6 +99,26 @@ namespace OHOS return true; } + void HeartChartPresenter::OnTickEvent() + { + // 更新显示心率数据 + if(HeartChartView::GetInstance() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::GetInstance()==nullptr"); + return; + } + + HeartChartView::GetInstance()->UpdateShowHeart(); + uint64_t current_time = osKernelGetTick2ms(); + if ((startTime != 0) && (current_time - startTime >= HEART_KEEP_TIME)) + { + // 超时处理 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 HEART_KEEP_TIME: %lld", current_time - startTime); + HeartModel::GetInstance()->SetResult(HeartResult::TIMEOUT); + HeartModel::GetInstance()->Heart_Stop(); + } + } + // 增加按键事件 bool HeartChartPresenter::OnKeyAct(UIView &view, const KeyEvent &event) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp index 145cb4d55..7f4725118 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp @@ -224,7 +224,6 @@ void HeartChartView::UpdateShowHeart() { uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata(); std::string heartrateStr = (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_)); - // 更新当前心率显示 if (displayheart_ != nullptr) { displayheart_->SetText(heartrateStr.c_str()); @@ -258,7 +257,6 @@ void HeartChartView::Update_data_Chart(int serialIndex) { //更新最大最小值 SetDataTopAndBottom(); - } void HeartChartView::CleanAllDataView() { if (heartchart == nullptr || maxheart_ == nullptr || minheart_ == nullptr) { @@ -286,8 +284,8 @@ void HeartChartView::CleanAllDataView() { } /*设置最大最小数据*/ void HeartChartView::SetDataTopAndBottom() { - int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax(); - int MinHeart = HeartModel::GetInstance()->GetHeartRateMin(); + int MaxHeart = HeartModel::GetInstance()->GetShowMaxHeartdata(); + int MinHeart = HeartModel::GetInstance()->GetShowMinHeartdata(); if (maxheart_ != nullptr) { maxheart_->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() @@ -562,7 +560,7 @@ UIViewGroup *HeartChartView::GetchartGroup() { } HeartImageAnimator(); //暂时屏蔽 InitChartView(); - UpdateChartConfig(); + // UpdateChartConfig(); SetDataChart(); SetLastHeart(); SetDataTopAndBottom(); @@ -585,7 +583,7 @@ void HeartChartView::OnStart() { HeartImageAnimator(); InitChartView(); - UpdateChartConfig(); + // UpdateChartConfig(); SetDataChart(); SetLastHeart(); SetDataTopAndBottom(); 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 8966addd0..7e8631435 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -34,7 +34,7 @@ extern "C" { #define MIN_DISPLAY_HEART 60 #define HEARTTEST 1 //[0 开启测试 1 关闭] -/* 佩戴检测结果 */ +/*佩戴检测结果*/ enum { SENSOR_WEAR_ON = 0, SENSOR_WEAR_OFF, @@ -68,8 +68,8 @@ void HeartDataSubscribeTopic(Topic topic) { } int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, - "HeartSubscribeTopic ret = %d, topic = %u", ret, topic); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret=%d,topic=%u", + ret, topic); broadcastApi->Release((IUnknown *)broadcastApi); } @@ -101,6 +101,9 @@ static void Notify(void *args, const Topic topic, Request *request) { switch (request->msgId) { case TOPIC_EVENT_HEARTRATE_UPDATA: + // 主界面刷新 + GraphicService::GetInstance()->PostGraphicEvent(std::bind( + &HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance())); // ProcessHeartRateUpdate(request); break; @@ -136,8 +139,8 @@ static void ProcessHeartRateUpdate(Request *request) { /*最大最小值不为0*/ heartInfo->maxValue = preheart; heartInfo->minValue = preheart; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", - heartInfo->index, preheart); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData=%d%d", heartInfo->index, + preheart); OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); free(heartInfo); // 释放内存 @@ -177,10 +180,11 @@ void HeartModel::ClearHeartData(void) { HeartRateView::GetInstance()->ClearElectrocardiogram(); } SetAveHeartRateCount(0); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - healthDatas.heartRatePerSec, healthDatas.heartRateRest, - healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); + // GraphicService::GetInstance()->PostGraphicEvent( + // std::bind(&HeartModel::RefreshHeartRateScreen, + // HeartModel::GetInstance(), + // healthDatas.heartRatePerSec,healthDatas.heartRateRest, + // healthDatas.heartRateMax.y,healthDatas.heartRateMin.y)); } HeartModel::HeartModel() { @@ -199,7 +203,7 @@ HeartModel::HeartModel() { currentheart = 0; timestamp_ms = 0; } - //配置动态数组 + // 配置动态数组 SetArrayData(); } @@ -309,10 +313,11 @@ void HeartModel::HeartRatePros(HeartDatas *heartInfo) { healthDatas.heartRatePerSec = perSecHeartRate; } - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - healthDatas.heartRatePerSec, healthDatas.heartRateRest, - healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); + // GraphicService::GetInstance()->PostGraphicEvent( + // std::bind(&HeartModel::RefreshHeartRateScreen, + // HeartModel::GetInstance(), + // healthDatas.heartRatePerSec,healthDatas.heartRateRest, + // healthDatas.heartRateMax.y,healthDatas.heartRateMin.y)); } uint16_t HeartModel::GetAveHeartRateCount(void) { return aveCount; } @@ -336,31 +341,20 @@ void HeartModel::SetHeartRatePerSec(uint32 sec) { void HeartModel::SetAveHeartRateCount(uint16_t value) { aveCount = value; } -void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, - uint16_t maxRate, uint16_t minRate) { - uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId(); - /*主界面刷新心率*/ - if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) { - MainClockView::GetInstance()->RefreshHeartRate(perSec); - } - /*心率卡片刷新心率数据*/ +void HeartModel::RefreshHeartRateScreen() { if (MainViewSample::GetInstance() != nullptr && - HeartRateView::GetInstance() != nullptr) { + HeartChartView::GetInstance() != nullptr) { if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) { - HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); - HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); - HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "HeartChartView::GetInstance() start"); + HeartChartView::GetInstance()->UpdateShowHeart(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "HeartChartView::GetInstance() end"); } } - /*applist心率刷新心率数据*/ - if (HeartChartView::GetInstance() != nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::GetInstance() start"); - HeartChartView::GetInstance()->UpdateShowHeart(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::GetInstance() end"); - } } -/* ---------------------------------- 状态检测 - * ---------------------------------- */ +/*----------------------------------状态检测 + *----------------------------------*/ // 重新初始化 void HeartModel::ClearDisplayData() { @@ -414,11 +408,11 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { // 开始检测 void HeartModel::Heart_Start() { displayheart = 0; - // displayheart_max = 0; // 显示最大心率 [每次检测进行清除] - // displayheart_min = 0; // 显示最小心率 [每次检测进行清除] + // displayheart_max=0;// 显示最大心率 [每次检测进行清除] + // displayheart_min=0;// 显示最小心率 [每次检测进行清除] SetResult(HeartResult::NOT_TESTED); // 重置检测 - // 进行初始化操作 + // 进行初始化操作 if (!sensorstate) { Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); sensorstate = true; @@ -446,7 +440,7 @@ void HeartModel::Heart_Stop() { } if (sensorstate) { - // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 + // Heart_Control(HeartState::End,HeartCheck::INITIATIVE);主动检测心率 // 不需要关闭 sensorstate = false; Heart_Result(); // 处理结果 @@ -460,8 +454,8 @@ void HeartModel::Heart_Save() { SetCheckTime(data.timestamp); HealthService::GetInstance()->UpdateHealthData(data); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", - currentheart, data.timestamp); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld", currentheart, + data.timestamp); } // 显示检测结果// 显示检测结果 @@ -481,24 +475,22 @@ void HeartModel::Heart_Result() { currentheart != 0) { // 当前心率低于阈值 heartresult_ = HeartResult::LOW_RESULT; - WEARABLE_LOGE( - WEARABLE_LOG_MODULE_APP, - "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", - currentheart, ThresholdValue); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d", + currentheart, ThresholdValue); } else if (ThresholdState == 1 && currentheart > ThresholdValue) { // 当前心率高于阈值 heartresult_ = HeartResult::HIGH_RESULT; - WEARABLE_LOGE( - WEARABLE_LOG_MODULE_APP, - "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", - currentheart, ThresholdValue); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d", + currentheart, ThresholdValue); } } // 根据结果进行处理 switch (heartresult_) { case HeartResult::SUCCESS: - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:成功"); Heart_Save(); /*更新曲线*/ GraphicService::GetInstance()->PostGraphicEvent( @@ -508,7 +500,7 @@ void HeartModel::Heart_Result() { case HeartResult::NOT_WORN: // 未佩戴状态 case HeartResult::TIMEOUT: // 超时情况 case HeartResult::INVALID_DATA: // 无效数据情况 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", heartresult_ == HeartResult::NOT_WORN ? "未佩戴状态" : heartresult_ == HeartResult::TIMEOUT ? "超时" @@ -518,7 +510,7 @@ void HeartModel::Heart_Result() { case HeartResult::LOW_RESULT: // 低心率结果处理 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况"); HealthState lowHealthState; lowHealthState.checkType = BLOOD_CHECK; lowHealthState.resultStatus = LOW; @@ -529,7 +521,7 @@ void HeartModel::Heart_Result() { case HeartResult::HIGH_RESULT: // 高心率结果处理 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况"); HealthState highHealthState; highHealthState.checkType = BLOOD_CHECK; highHealthState.resultStatus = HIGH; @@ -539,7 +531,7 @@ void HeartModel::Heart_Result() { break; default: - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:未知状态"); break; } } @@ -557,8 +549,7 @@ void HeartModel::SetWearStatus(int32_t wear) { // 检查是否达到了最大未佩戴计数限制 if (unwear_counter_ >= MAX_UNWEAR_COUNT) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "检测结果: 未佩戴计数最大 unwear_counter: %d", - unwear_counter_); + "检测结果:未佩戴计数最大 unwear_counter:%d", unwear_counter_); SetResult(HeartResult::NOT_WORN); Heart_Stop(); } @@ -598,8 +589,7 @@ void HeartModel::UpHeartdata(uint16_t heart) { // 检查无效计数器是否达标 if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "检测结果: 无效数达标 disvalid_counter: %d", - disvalid_counter_); + "检测结果:无效数达标 disvalid_counter:%d", disvalid_counter_); SetResult(HeartResult::INVALID_DATA); // 标记为无效数据 Heart_Stop(); return; @@ -608,7 +598,7 @@ void HeartModel::UpHeartdata(uint16_t heart) { // 检查有效计数器是否达标 if (valid_counter_ >= MAX_VALID_HRS_COUNT) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "检测结果: 成功 valid_counter: %d currentheart: %d", + "检测结果:成功 valid_counter:%d currentheart:%d", valid_counter_, currentheart); SetResult(HeartResult::SUCCESS); // 标记为成功检测 Heart_Stop(); @@ -617,13 +607,14 @@ void HeartModel::UpHeartdata(uint16_t heart) { // 刷新心率显示 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "[heart data update displayheart %d displayheart_max %d " - "displayheart_min %d]", + "[heart data update displayheart%d displayheart_max%d " + "displayheart_min%d]", displayheart, displayheart_max, displayheart_min); - - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - displayheart, 0, displayheart_max, displayheart_min)); + + // GraphicService::GetInstance()->PostGraphicEvent( + // std::bind(&HeartModel::RefreshHeartRateScreen, + // HeartModel::GetInstance(), + // displayheart)); } void HeartModel::Heart_Update_View(void) { @@ -652,8 +643,8 @@ void HeartModel::CleanAllData(void) { } } -//配置5个动态心率数据 -//最大 最小 +// 配置5个动态心率数据 +// 最大 最小 void HeartModel::SetArrayData() { // 如果没有进行心率检测,则默认为0-220 if (displayheart_max == 0 || displayheart_min == 0) { @@ -688,11 +679,11 @@ void HeartModel::SetArrayData() { // 打印动态心率数据 for (int i = 0; i < 5; i++) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dynamic_heartrate[%d] = %d", i, + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dynamic_heartrate[%d]=%d", i, dynamic_heartrate[i]); } } -//获取动态心率配置数组 +// 获取动态心率配置数组 uint16_t *HeartModel::GetArrayData() { return dynamic_heartrate; } // 获取检测字符串 @@ -703,7 +694,7 @@ std::string HeartModel::GetCheckString() { // 获取检测数据 if (currentheart == 0) { check_string = "暂无检测数据"; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测数据: %s", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测数据:%s", check_string.c_str()); // 打印无检测数据信息 return check_string; // 直接返回,无需继续处理 } @@ -720,7 +711,7 @@ std::string HeartModel::GetCheckString() { // 检查时间戳是否有效 if (timestamp_ms == 0) { check_string = std::to_string(currentheart) + " " + "时间戳无效,无法检测"; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间戳无效,无法检测: %s", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间戳无效,无法检测:%s", check_string.c_str()); return check_string; // 直接返回,无需继续处理 } @@ -730,11 +721,11 @@ std::string HeartModel::GetCheckString() { uint32_t diff_min = diff / 60; // 计算分钟差 uint32_t diff_hour = diff_min / 60; // 计算小时差 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前时间: %d, 上次检测时间: %d", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前时间:%d,上次检测时间:%d", currentTime, timestamp_ms); // 打印时间信息 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "时间差 (秒): %d, 时间差 (分钟): %d, 时间差 (小时): %d", diff, - diff_min, diff_hour); // 打印时间差信息 + "时间差(秒):%d,时间差(分钟):%d,时间差(小时):%d", diff, diff_min, + diff_hour); // 打印时间差信息 // 根据时间差生成检测字符串 if (diff_min < 1) { @@ -746,7 +737,7 @@ std::string HeartModel::GetCheckString() { check_string = std::to_string(currentheart) + "次/分 " + "超过一个小时前"; } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s", check_string.c_str()); // 打印最终检测结果 return check_string; } -- 2.17.1