From c69116c195270d56ebeb30e51c487a45e08947c1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Thu, 5 Sep 2024 08:03:11 +0000 Subject: [PATCH] Merge #877 into sdk602patch0626 from refs/changes/877/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/877/head: (15 commits squashed) - #455运动准备界面,运动名称往上移一点,所有的运动界面都这样 - #475设置-跟换表盘 开关按钮太大,全是黑色背景没有区分框 - #414手表,睡眠,作息时间,时间字体颜色需要变更为一致 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - 修复nextday的消息发送 - 修改心率周期检测频率为30min - 取消多余的遥控拍照的资源释放 - 修复省电模式的电池框资源路径 - 增加血氧数据的nextday清空以及UI更新 - 增加心率血氧 健康数据的nextday清空接口 - 删除applist的心率值的notify 统一由model管理 - 增加心率数据的nextday清空以及UI更新 - nextday进行睡眠数据,心率数据,血氧数据管理更新 - 心率增加0数据传递,报0显示“--“ - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 Signed-off-by: Caisking <3449750381@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/877 --- .../src/AlarmClockTimerConfig.cpp | 38 ++- .../bloodoxygen/include/BloodOxygenModel.h | 10 +- .../bloodoxygen/src/BloodOxygenModel.cpp | 23 +- .../bloodoxygen/src/BloodResultView.cpp | 6 +- .../nativeui/heart_blood/BloodCardView.cpp | 3 + .../health_service/health_service.cpp | 33 +- .../heartrate/include/HeartChartPresenter.h | 3 - .../heartrate/include/HeartChartView.h | 3 +- .../nativeui/heartrate/include/HeartModel.h | 4 +- .../heartrate/include/HeartRateView.h | 2 + .../heartrate/src/HeartChartPresenter.cpp | 29 +- .../nativeui/heartrate/src/HeartChartView.cpp | 44 ++- .../nativeui/heartrate/src/HeartModel.cpp | 283 +++++++----------- .../nativeui/heartrate/src/HeartRateView.cpp | 146 +++++---- .../nativeui/saveele/src/SaveBatView.cpp | 2 +- .../nativeui/sleep/src/SleepModel.cpp | 1 + .../takephotos/src/TakephotosView.cpp | 18 +- .../msg_center/src/msg_center_customer.cpp | 36 ++- .../peripheral/config/include/ConfigModel.h | 2 +- .../drivers/peripheral/ppg/hx3695/hx3695.c | 23 +- 20 files changed, 356 insertions(+), 353 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp index d1cd281b1..73056b053 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp @@ -305,6 +305,7 @@ extern "C" static void AlarmCallBackProcA(void) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcA"); + AlarmClockEventData unuse; AlarmTimerEventPublish(TOPIC_EVENT_ALARM_RING, unuse); } @@ -313,20 +314,31 @@ extern "C" static void AlarmCallBackProcB(void) { AlarmClockEventData unuse; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB"); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse)); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AlarmCallBackProcB invoked"); +#if 0 + // 记录当前时间 + time_t now = time(nullptr); + struct tm *localTime = localtime(&now); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current time - Hour: %d, Minute: %d", localTime->tm_hour, localTime->tm_min); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Posting next day update event"); + + // GraphicService::GetInstance()->PostGraphicEvent( + // std::bind(AlarmTimerEventPublish, TOPIC_EVENT_NEXTDAY_UPDATE, unuse)); +#endif + AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse); - // AlarmTimerEventPublish(TOPIC_EVENT_NEXTDAY_UPDATE, unuse); - SetZeroAlarm(); + SetZeroAlarm(); // 重置闹钟 } static void on_time_CallBackProc(void) { AlarmClockEventData unuse; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "on_time_CallBackProc invoked"); + GraphicService::GetInstance()->PostGraphicEvent( std::bind(AlarmTimerEventPublish, TOPIC_EVENT_ON_TIME, unuse)); + + // AlarmTimerEventPublish(TOPIC_EVENT_ON_TIME, unuse); } void AlarmScan(void *arg) @@ -335,15 +347,21 @@ extern "C" int32_t ret = AlarmGetCurrentTimeInfo(&curTime); if (ret != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get current time info, error code: %d", ret); return; } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Scanning alarms - Current time: %02d:%02d:%02d", + curTime.tm_hour, curTime.tm_min, curTime.tm_sec); + if (g_alarmCtrA.state == ALARM_STATUS_RUNNING) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm A"); if ((g_alarmCtrA.callback != nullptr) && (g_alarmCtrA.info.hour == curTime.tm_hour) && (g_alarmCtrA.info.minute == curTime.tm_min)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm A triggered"); g_alarmCtrA.callback(); g_alarmCtrA.state = ALARM_STATUS_CREATED; } @@ -351,19 +369,23 @@ extern "C" if (g_alarmCtrB.state == ALARM_STATUS_RUNNING) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking Alarm B"); if ((g_alarmCtrB.callback != NULL) && - (g_alarmCtrB.info.week == curTime.tm_wday) && + // (g_alarmCtrB.info.week == curTime.tm_wday) && (g_alarmCtrB.info.hour == curTime.tm_hour) && (g_alarmCtrB.info.minute == curTime.tm_min) && (g_alarmCtrB.info.second == curTime.tm_sec)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Alarm B triggered"); g_alarmCtrB.state = ALARM_STATUS_CREATED; - g_alarmCtrB.callback(); // 由于只有callback中SetZeroAlarm会设置state为ALARM_STATUS_RUNNING , 所以必须把state=ALARM_STATUS_CREATED提前,或者干脆删除。 + g_alarmCtrB.callback(); } } + // 未绑定状态下,以下操作不进行 if (OHOS::ConfigModel::GetInstance()->get_configData_bool(OHOS::ConfigModel::CONFIGMODEL_ITEM_FIRSTTIMESTART)) return; + // 整点回调 if (curTime.tm_min == 0 && curTime.tm_sec == 0) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h index e43dcd1e0..339f0c05d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h @@ -1,4 +1,10 @@ /*** + * @Date: 2024-04-15 10:55:58 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-09-05 14:58:21 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h + */ +/*** * @Date: 2024-04-15 10:55:58 * @LastEditors: Caisking 3449750381@qq.com * @LastEditTime: 2024-07-31 10:38:26 @@ -52,10 +58,10 @@ namespace OHOS void Blood_Result(void); void Blood_Control(BloodState state); - void ReInit(); + void ClearDisplayData(); + void CleanAllData(); private: - uint16_t displayspo2; uint16_t currentspo2; uint32_t timestamp_ms; diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp index 14b7171ac..1f7cc56ce 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp @@ -13,6 +13,8 @@ extern "C" errcode_t uapi_get_timestamp_ms(uint32_t *tm); #include "AppViewIDs.h" #include "NativeAbility.h" #include "battery_hal.h" +#include "heart_blood/BloodCardView.h" +#include "MainViewSample.h" #define MAX_UNWARE_COUNT 10 #define MAX_VALID_SPO2_COUNT 30 @@ -46,8 +48,8 @@ namespace OHOS return &instance; } /* ---------------------------------- 状态检测 ---------------------------------- */ - // 重新初始化 - void BloodOxygenModel::ReInit() + + void BloodOxygenModel::ClearDisplayData() { currentspo2 = 0; timestamp_ms = 0; @@ -232,7 +234,6 @@ namespace OHOS } // 更新SPO2数据 - void BloodOxygenModel::UpSPO2data(uint8_t spo2) { displayspo2 = spo2; @@ -266,4 +267,20 @@ namespace OHOS Blood_Stop(); } } + + // 更新血氧数据 + void BloodOxygenModel::CleanAllData(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!"); + if (MainViewSample::GetInstance() != nullptr && BloodCardView::GetInstance() != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面血氧卡片"); + BloodCardView::GetInstance()->UpSPO2Text(); + } + if (BloodResultView::GetInstance() != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量血氧卡片"); + BloodResultView::GetInstance()->UpSPO2Text(); + } + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp index e59bdab3b..97fe087c0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp @@ -1,11 +1,10 @@ -/*** +/*** * @Date: 2024-04-15 10:55:58 * @LastEditors: Caisking 3449750381@qq.com * @LastEditTime: 2024-07-31 14:36:25 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.cpp */ - #include "common/image_cache_manager.h" #include "ui_resource_image.h" #include @@ -48,6 +47,9 @@ namespace OHOS /* -------------------------------------------------------------------------- */ void BloodResultView::UpSPO2Text() { + if (bloodLabel == nullptr || timeLabel == nullptr) + return; + // 更新血氧数据 uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data(); if (spo2 != 0) // 判断是否为默认数据 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/BloodCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/BloodCardView.cpp index 8959d10a6..d10167b33 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/BloodCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/BloodCardView.cpp @@ -42,6 +42,9 @@ namespace OHOS /* -------------------------------------------------------------------------- */ void BloodCardView::UpSPO2Text() { + if (bloodLabel == nullptr || timeLabel == nullptr) + return; + // 更新血氧数据 uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data(); if (spo2 != 0) // 判断是否为默认数据 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp index c8760f731..6d9550e4f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp @@ -368,24 +368,10 @@ namespace OHOS // 清空健康数据 bool HealthService::CleanHealthData() { - HeartRateData heartdata; - heartdata.Heart = 0; - heartdata.timestamp = 0; - BloodOxygenData blooddata; - blooddata.SPO2 = 0; - blooddata.timestamp = 0; - if (!UpdateHealthData(heartdata)) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData heartdata is error"); - return false; - } - if (!UpdateHealthData(blooddata)) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData blooddata is error"); - return false; - } - HeartModel::GetInstance()->ReInit(); - BloodOxygenModel::GetInstance()->ReInit(); + ClearHourlyHeartRates(); + HeartModel::GetInstance()->ClearDisplayData(); + BloodOxygenModel::GetInstance()->ClearDisplayData(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData is ok"); return true; } @@ -449,9 +435,8 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************"); } - // 如果不是同一天,清空文件内容 + // 如果不是同一天,关闭文件 file.close(); - SaveDailyHeartRate(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Not same-day data"); return false; // 不是同一天 @@ -503,13 +488,13 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate); // 确保 hour 在有效范围内,并且心率不是异常值(例如负值) - if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负 + if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负 并且 小时不能为24 { dailyHeartRates[hour] = heartRate; - } - // 记录目前更新时间点 - currenthour = hour; + // 记录目前更新时间点 + currenthour = hour; + } } uint16_t HealthService::GetHourlyHeartRate(uint16_t hour) 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 876166b71..06e5c187a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h @@ -23,7 +23,6 @@ namespace OHOS class HeartChartView; class HeartChartPresenter : public Presenter, - public ModelListenerSample, public UIView::OnClickListener, public UIView::OnDragListener, public RootView::OnKeyActListener, @@ -37,8 +36,6 @@ 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/HeartChartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h index 2cd4a2ddb..b2e7676b4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h @@ -1,4 +1,4 @@ -/*** +/*** * @Date: 2024-08-15 18:38:49 * @LastEditors: Caisking 3449750381@qq.com * @LastEditTime: 2024-08-26 15:17:07 @@ -60,6 +60,7 @@ namespace OHOS void UpdateShowHeart(void); void Update_data_Chart(int serialIndex); + void CleanAllDataView(); private: UILabelExt *CurrentHeartText{nullptr}; 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 6f1ba90d7..491904d1b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -152,9 +152,9 @@ extern "C" void Heart_Result(void); void Heart_Control(HeartState state, HeartCheck check); - void ReInit(); - + void ClearDisplayData(); void Heart_Update_View(void); + void CleanAllData(void); private: HealthAllDatas healthDatas; diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h index 23f1239ee..e5b6efb81 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h @@ -57,6 +57,7 @@ namespace OHOS void Init_data_Chart(); void Update_data_Chart(int serialIndex); void UpdataChart(); + void CleanAllDataView(); private: typedef struct @@ -79,6 +80,7 @@ namespace OHOS void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume); int32_t HeartRateDataProc(void); void HeartbeatImageAnimator(void); + void SetDataTopAndBottom(); private: Point heartRateData[HEART_AVE_NUM]; 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 660633818..5643d3506 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-08-15 18:39:25 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-09-03 21:04:56 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp + */ /* * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. * Description: HeartChartPresenter.cpp @@ -28,7 +34,6 @@ namespace OHOS g_pHeartChartPresenter = this; display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime(); display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮 - ResetTickTimer(); #ifdef MEM_CHECK MemCheck::GetInstance()->EnableLeakCheck(true); #endif @@ -94,28 +99,6 @@ namespace OHOS return true; } - void HeartChartPresenter::OnTickEvent() - { - // 更新显示心率数据 - HeartChartView::GetInstance()->UpdateShowHeart(); -#if 0 - /*该界面一直在检测 不需要做超时 具有无效数标志*/ - 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(); - startTime = 0; // 重置 - - } -#endif - } - void HeartChartPresenter::ResetTickTimer(void) - { - startTime = osKernelGetTick2ms(); - } // 增加按键事件 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 21c199a54..cb9a40f65 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp @@ -1,3 +1,9 @@ +/*** + * @Date: 2024-08-15 18:39:02 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-09-05 14:36:17 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp + */ /*** * @Date: 2024-04-15 10:55:58 * @LastEditors: Caisking 3449750381@qq.com @@ -114,30 +120,30 @@ namespace OHOS { // 获取当前心率 uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata(); - std::string heartrateStr = std::to_string(heart_); + std::string heartrateStr = (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_)); // 更新当前心率显示 - if (CurrentHeartText != nullptr && heart_ != 0) + if (CurrentHeartText != nullptr) { CurrentHeartText->SetText(heartrateStr.c_str()); } // 获取最大心率 uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata(); - std::string heartmaxStr = std::to_string(heartmax_); + std::string heartmaxStr = (heartmax_ == 0) ? "--" : (heartmax_ < 50 ? "--" : std::to_string(heartmax_)); // 更新最大心率显示 - if (MaxHeartText != nullptr && heartmax_ != 0) + if (MaxHeartText != nullptr) { MaxHeartText->SetText(heartmaxStr.c_str()); } // 获取最小心率 uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata(); - std::string heartminStr = std::to_string(heartmin_); + std::string heartminStr = (heartmin_ == 0) ? "--" : (heartmin_ < 50 ? "--" : std::to_string(heartmin_)); // 更新最小心率显示 - if (MinHeartText != nullptr && heartmin_ != 0) + if (MinHeartText != nullptr) { MinHeartText->SetText(heartminStr.c_str()); } @@ -165,6 +171,32 @@ namespace OHOS heartchart->AddDataSerial(heartSerial); heartchart->Invalidate(); } + void HeartChartView::CleanAllDataView() + { + if (heartchart == nullptr || MaxHeartText == nullptr || MinHeartText == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail"); + return; + } + for (int serialIndex = 0; serialIndex < 24; serialIndex++) + { + heartdata[serialIndex].x = serialIndex; + heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); + } + + /*清空原数据*/ + heartSerial->ClearData(); + heartSerial->AddPoints(heartdata, 24); + heartSerial->SetLineColor(Color::Red()); + heartSerial->SetFillColor(Color::Red()); + heartSerial->EnableGradient(true); + + heartchart->AddDataSerial(heartSerial); + heartchart->RefreshChart(); + + /*更新最大最小值*/ + SetDataTopAndBottom(); + } /*设置最大最小数据*/ void HeartChartView::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 09528efd5..e87e4b6fb 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -20,6 +20,7 @@ #include "custom_runtime.h" #include #include +#include #include "ui_service.h" #include "battery_hal.h" @@ -32,6 +33,7 @@ extern "C" #define MAX_UNWEAR_COUNT 30 #define MAX_VALID_HRS_COUNT 40 #define MAX_DISVALID_HRS_COUNT 70 +#define MIN_DISPLAY_HEART 60 #define HEARTTEST 1 //[0 开启测试 1 关闭] /* 佩戴检测结果 */ @@ -53,7 +55,8 @@ extern "C" .args = nullptr, .Notify = Notify, }; - + static void ProcessHeartRateUpdate(Request *request); + static void RefreshHeartData(); void HeartDataSubscribeTopic(Topic topic) { BroadcastApi *broadcastApi = nullptr; @@ -94,78 +97,64 @@ extern "C" UNUSED(args); UNUSED(topic); - /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/ - if (uapi_dev_runtime_get_train_status() == 1) - return; - - if (request == nullptr) + // 训练过程中不需要判断数据准确性,不需要存储心率数据 + if (uapi_dev_runtime_get_train_status() == 1 || request == NULL) { return; } - if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) - { -#if 0 - int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo *)request->data, request->len); - if (rets != EOK) - { - free(heartInfo); - heartInfo = nullptr; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s heartRateData fail! ret = %d", rets); - return; - } -#endif - uint16_t preheart = *reinterpret_cast(request->data); - // 筛选出正常数据 - if (preheart > HEART_RATE_LIMIT_LOWER && preheart <= HEART_RATE_LIMIT_UPPER) - { - uint16_t index_ = HeartModel::GetInstance()->GetIndex(); - HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas)); - if (heartInfo == nullptr) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail"); - return; - } - heartInfo->index = index_; - heartInfo->maxX = index_; - heartInfo->minX = index_; - heartInfo->perSec = preheart; - heartInfo->rest = preheart; - heartInfo->maxValue = preheart; - heartInfo->minValue = preheart; - /* - 暂时屏蔽主界面动态曲线 - heartInfo->value[index_].x = index_; - heartInfo->value[index_].y = preheart; - index_++; - if (index_ == HEART_ALL_POINTS) - { - index_ = 0; - } - HeartModel::GetInstance()->SetIndex(index_); - */ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart); - OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); - free(heartInfo); - heartInfo = nullptr; - } - } - /* Nextday 刷新*/ - if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE) - { - OHOS::HeartModel::GetInstance()->ClearHeartData(); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance())); - } - /* UTCTIME 刷新*/ - if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE) + + switch (request->msgId) { - OHOS::HeartModel::GetInstance()->ClearHeartData(); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance())); + case TOPIC_EVENT_HEARTRATE_UPDATA: + // ProcessHeartRateUpdate(request); + break; + + case TOPIC_EVENT_NEXTDAY_UPDATE: + case TOPIC_EVENT_UTCTIME_UPDATE: + RefreshHeartData(); + break; + + case TOPIC_EVENT_WEARSTATE_UPDATE: + break; + + default: + break; } - if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE) + } + + static void ProcessHeartRateUpdate(Request *request) + { + uint16_t preheart = *reinterpret_cast(request->data); + + // 直接处理心率数据,不进行筛选 + uint16_t index_ = HeartModel::GetInstance()->GetIndex(); + HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas)); + if (heartInfo == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail"); + return; } + + heartInfo->index = index_; + heartInfo->maxX = index_; + heartInfo->minX = index_; + heartInfo->perSec = preheart; + heartInfo->rest = preheart; + /*最大最小值不为0*/ + heartInfo->maxValue = preheart; + heartInfo->minValue = preheart; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart); + OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); + + free(heartInfo); // 释放内存 + heartInfo = nullptr; + } + + static void RefreshHeartData() + { + OHOS::HeartModel::GetInstance()->ClearHeartData(); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance())); } #ifdef __cplusplus @@ -351,78 +340,14 @@ namespace OHOS { uint16_t perSecHeartRate = 0; uint16_t restHeartRate = 0; -#if 0 - // 使用随机数生成模拟数据 - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_int_distribution<> heartRateDist(50, 100); - - heartInfo->perSec = heartRateDist(gen); - heartInfo->rest = heartRateDist(gen); - heartInfo->maxValue = heartRateDist(gen); - heartInfo->minValue = heartRateDist(gen); - heartInfo->minX = 1; - heartInfo->maxX = 10; - // heartInfo->index = 0; - heartInfo->value[heartInfo->index].x = 0; - heartInfo->value[heartInfo->index].y = heartRateDist(gen); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " heartRateData: %d %d %d %d %d %d %d %d ", - heartInfo->perSec, heartInfo->rest, heartInfo->maxValue, heartInfo->minValue, heartInfo->minX, heartInfo->index, heartInfo->value[0].x, heartInfo->value[0].y); -#endif // 每秒心率 perSecHeartRate = heartInfo->perSec; - if (perSecHeartRate > HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER) + if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER) { healthDatas.heartRatePerSec = perSecHeartRate; } - // 静息心率 - restHeartRate = heartInfo->rest; - if (restHeartRate > HEART_RATE_LIMIT_LOWER && restHeartRate <= HEART_RATE_LIMIT_UPPER) - { - healthDatas.heartRateRest = restHeartRate; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateRest:%d ", healthDatas.heartRateRest); - } - HandleMinHeart(heartInfo->minX, heartInfo->minValue); - HandleMaxHeart(heartInfo->maxX, heartInfo->maxValue); - // 平均心率 - uint16_t count = aveCount + heartInfo->index; - if (aveCount < HEART_AVE_NUM) - { - for (int i = aveCount; i < count; i++) - { - if (healthDatas.heartRateMin.x != heartInfo->value[i - aveCount].x && healthDatas.heartRateMax.x != heartInfo->value[i - aveCount].x) - { - healthDatas.heartRateAvg[aveCount].x = heartInfo->value[i - aveCount].x; - healthDatas.heartRateAvg[aveCount].y = heartInfo->value[i - aveCount].y; - aveCount++; - } - } - } - - for (int i = 0; i < aveCount - 1; i++) - { - if (healthDatas.heartRateAvg[i].x == healthDatas.heartRateAvg[i + 1].x) - { - if (healthDatas.heartRateAvg[i].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i].y != healthDatas.heartRateMax.y) - { - for (int j = i; j < aveCount - 1; j++) - { - healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1]; - } - aveCount--; - } - else if (healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMax.y) - { - for (int j = i + 1; j < aveCount - 1; j++) - { - healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1]; - } - aveCount--; - } - } - } GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); } @@ -459,46 +384,39 @@ namespace OHOS void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate) { - UNUSED(rest); - Point *rateData; - int len = GetAveHeartRateCount(); - rateData = GetAveHeartRate(); - uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId(); + /*主界面刷新心率*/ if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) { MainClockView::GetInstance()->RefreshHeartRate(perSec); } - - if (IndoorWalkPreparedView::GetInstance() != nullptr) - { - IndoorWalkPreparedView::GetInstance()->RefreshHeartbeatData(perSec); - } - if (IndoorWalkPresenter::GetInstance() != nullptr) - { - IndoorWalkPresenter::GetInstance()->ModifiesHeartRate(perSec); - } - + /*心率卡片刷新心率数据*/ if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) { if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) { - HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len); - // HeartRateView::GetInstance()->RefreshElectrocardiogram(); HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); - HeartRateView::GetInstance()->RefreshRestHeartRate(rest); } } + /*applist心率刷新心率数据*/ + if (HeartChartView::GetInstance() != nullptr) + { + HeartChartView::GetInstance()->UpdateShowHeart(); + } } /* ---------------------------------- 状态检测 ---------------------------------- */ // 重新初始化 - void HeartModel::ReInit() + void HeartModel::ClearDisplayData() { + /*显示的心率数据清空*/ currentheart = 0; timestamp_ms = 0; + displayheart = 0; + displayheart_max = 0; // 显示最大心率 + displayheart_min = 0; // 显示最小心率 } // 获取心率数据 uint16_t HeartModel::GetHeartdata() @@ -573,8 +491,8 @@ namespace OHOS void HeartModel::Heart_Start() { displayheart = 0; - displayheart_max = 0; // 显示最大心率 - displayheart_min = 0; // 显示最小心率 + // displayheart_max = 0; // 显示最大心率 [每次检测进行清除] + // displayheart_min = 0; // 显示最小心率 [每次检测进行清除] SetResult(HeartResult::NOT_TESTED); // 重置检测 // 进行初始化操作 @@ -598,11 +516,12 @@ namespace OHOS if (heartresult_ == HeartResult::SUCCESS) { Heart_Save(); - /*通知进行UI更新*/ - SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0); + /*更新曲线*/ + GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); } /*关闭被动检测*/ Heart_Control(HeartState::End, HeartCheck::PASSIVITY); + return; } if (sensorstate) @@ -656,8 +575,8 @@ namespace OHOS case HeartResult::SUCCESS: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功"); Heart_Save(); - /*通知进行UI更新*/ - SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0); + /*更新曲线*/ + GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); break; case HeartResult::NOT_WORN: // 未佩戴状态 @@ -722,26 +641,33 @@ namespace OHOS void HeartModel::UpHeartdata(uint16_t heart) { - /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/ + // 如果处于训练模式,提前返回 if (uapi_dev_runtime_get_train_status() == 1) return; displayheart = heart; - // 处理有效与无效计数 + // 更新心率和计数器 if (displayheart != 0) { - currentheart = displayheart; // 更新 currentheart + currentheart = displayheart; // 更新当前心率 valid_counter_++; // 增加有效计数器 disvalid_counter_ = 0; // 清空无效计数器 - if (displayheart_max == 0 || displayheart_min == 0) + + // 更新最大和最小心率 + displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max); + + // 确保最小心率的第一次赋值大于50 + if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART) + { + displayheart_min = displayheart; // 初始化最小心率 + } + else { - displayheart_min = displayheart_max = displayheart; + displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART) + ? displayheart + : displayheart_min; } - if (displayheart_max < displayheart) - displayheart_max = displayheart; - if (displayheart_min > displayheart) - displayheart_min = displayheart; } else { @@ -753,17 +679,25 @@ namespace OHOS if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_); - SetResult(HeartResult::INVALID_DATA); // 无效数达标 + SetResult(HeartResult::INVALID_DATA); // 标记为无效数据 Heart_Stop(); + return; } // 检查有效计数器是否达标 if (valid_counter_ >= MAX_VALID_HRS_COUNT) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart); - SetResult(HeartResult::SUCCESS); // 成功检测 + SetResult(HeartResult::SUCCESS); // 标记为成功检测 Heart_Stop(); + return; } + + // 刷新心率显示 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[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)); } void HeartModel::Heart_Update_View(void) @@ -781,4 +715,19 @@ namespace OHOS HeartChartView::GetInstance()->Update_data_Chart(hour); } } + + void HeartModel::CleanAllData(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!"); + if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片"); + HeartRateView::GetInstance()->CleanAllDataView(); + } + if (HeartChartView::GetInstance() != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片"); + HeartChartView::GetInstance()->CleanAllDataView(); + } + } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp index 4dce87c36..2a4757ca0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp @@ -13,6 +13,7 @@ #include "ui_resource_image.h" #include "common/image_cache_manager.h" #include "heart_blood/health_service/health_service.h" +#include "string.h" #define HEART_DATA_TEST 0 namespace OHOS { @@ -234,27 +235,6 @@ namespace OHOS return OHOS_SUCCESS; } -#if 0 - std::vector HeartRateView::simulateHeartRateData() - { - std::vector heartRateData; - const int HEART_RATE_MIN = 60; // 心率下限 - const int HEART_RATE_MAX = 100; // 心率上限 - - // 用于生成随机数的种子 - std::srand(std::time(0)); - - for (int i = 0; i < 24; ++i) - { // 模拟24小时 - Point dataPoint; - dataPoint.x = i; // 小时数 - dataPoint.y = HEART_RATE_MIN + (std::rand() % (HEART_RATE_MAX - HEART_RATE_MIN + 1)); // 随机生成心率值 - heartRateData.push_back(dataPoint); - } - - return heartRateData; - } -#endif int32_t HeartRateView::HeartRateDataProc(void) { int32_t i, ret; @@ -392,7 +372,7 @@ namespace OHOS heartYAxis.SetDataRange(0, 220); heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); - //heartchart->SetGradientOpacity(60, 0); + // heartchart->SetGradientOpacity(60, 0); heartchart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA); Add(heartchart); } @@ -431,32 +411,69 @@ namespace OHOS } void HeartRateView::Update_data_Chart(int serialIndex) { - if (heartchart == nullptr) + if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex); return; } /*清空原数据*/ - // heartchart->DeleteDataSerial(heartSerial); heartSerial->ClearData(); heartdata[serialIndex].x = serialIndex; heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); - for (int i = 0; i < 24; i++) + heartSerial->AddPoints(heartdata, 24); + heartSerial->SetLineColor(Color::Red()); + heartSerial->SetFillColor(Color::Red()); + heartSerial->EnableGradient(true); + + heartchart->AddDataSerial(heartSerial); + heartchart->RefreshChart(); + } + void HeartRateView::CleanAllDataView() + { + if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanAllDataView fail"); + return; + } + for (int serialIndex = 0; serialIndex < 24; serialIndex++) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d %d", i, heartdata[i].y); + heartdata[serialIndex].x = serialIndex; + heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); } + /*清空原数据*/ + heartSerial->ClearData(); heartSerial->AddPoints(heartdata, 24); heartSerial->SetLineColor(Color::Red()); heartSerial->SetFillColor(Color::Red()); heartSerial->EnableGradient(true); heartchart->AddDataSerial(heartSerial); - // heartchart->Invalidate(); heartchart->RefreshChart(); + + /*更新最大最小值*/ + SetDataTopAndBottom(); + } + /*设置最大最小数据*/ + void HeartRateView::SetDataTopAndBottom() + { + int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax(); + int MinHeart = HeartModel::GetInstance()->GetHeartRateMin(); + + if (topRate != nullptr) + { + topRate->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() : "--"); + } + + if (bottomRate != nullptr) + { + bottomRate->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str() : "--"); + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart, MinHeart); } void HeartRateView::InsertTopAndBottomRateImage(void) { @@ -758,22 +775,13 @@ namespace OHOS uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount(); SetHeartRateData(rateData, sizeof(Point) * len); // 展示最大,最小,最近一次心率 - uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax(); - uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin(); - uint16_t perRate = HeartModel::GetInstance()->GetHeartdata(); - RefreshElectrocardiogram(); - if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER) - { - RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax()); - } - if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER) - { - RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin()); - } - if (perRate > 0 && perRate < HEART_RATE_LIMIT_UPPER) - { - HeartModel::GetInstance()->SetHeartRatePerSec(perRate); - } + uint16_t maxRate = HeartModel::GetInstance()->GetShowMaxHeartdata(); + uint16_t minRate = HeartModel::GetInstance()->GetShowMinHeartdata(); + uint16_t perRate = HeartModel::GetInstance()->GetShowHeartdata(); + + RefreshHeartRateMax(maxRate); + RefreshHeartRateMin(minRate); + HeartModel::GetInstance()->SetHeartRatePerSec(perRate); } // 刷新心率曲线 @@ -874,80 +882,62 @@ namespace OHOS { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView %d", value); - char heartRate[NUM_4] = "--"; - int32_t ret = 0; - if (ratePerSec == nullptr) { return; } - HeartbeatImageAnimatorStart(); // 界面创建实现动画跳动 - if (value == 0) + + // 判断心率值,并设置文本 + if (value == 0 || value < 50) { ratePerSec->SetText("--"); - // HeartbeatImageAnimatorStop(); - return; - } - // HeartbeatImageAnimatorStart(); - if (value > NUM_99) - { - ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); } else { - ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); - } - if (ret > EOK) - { - ratePerSec->SetText(heartRate); + std::string ratePerSecStr = std::to_string(value); + ratePerSec->SetText(ratePerSecStr.c_str()); } } // 刷新最大心率 void HeartRateView::RefreshHeartRateMax(uint16_t max) { - char top[NUM_4] = "--"; - int32_t ret = 0; - maxRate = (maxRate >= max) ? maxRate : max; if (topRate == nullptr) { return; } - if (maxRate <= HEART_RATE_LIMIT_LOWER) + + // 设置刷新文本 + if (max >= HEART_RATE_LIMIT_UPPER || max < 60) { topRate->SetText("--"); - return; } - ret = sprintf_s(top, sizeof(top), "%u", maxRate); - if (ret > EOK) + else { - topRate->SetText(top); + std::string topRateStr = std::to_string(max); + topRate->SetText(topRateStr.c_str()); } } // 刷新最小心率 void HeartRateView::RefreshHeartRateMin(uint16_t min) { - char bottom[NUM_4] = "--"; - int32_t ret = 0; - - minRate = (minRate <= min) ? minRate : min; if (bottomRate == nullptr) { return; } - if (minRate >= HEART_RATE_LIMIT_UPPER) + + // 设置刷新文本 + if (min >= HEART_RATE_LIMIT_UPPER || min < 60) { bottomRate->SetText("--"); - return; } - ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate); - if (ret > EOK) + else { - bottomRate->SetText(bottom); + std::string bottomRateStr = std::to_string(min); + bottomRate->SetText(bottomRateStr.c_str()); } } - // 刷新静息心率 void HeartRateView::RefreshRestHeartRate(uint16_t value) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp b/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp index 579f7de82..8649db8a3 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/saveele/src/SaveBatView.cpp @@ -23,7 +23,7 @@ extern "C" std::string Cnweekday[] = {"周天", "周一", "周二", "周三", "周四", "周五", "周六"}; -static constexpr const char *WHITE_BATTERY = "/user/res/Battery/Battery-E.bin"; +static constexpr const char *WHITE_BATTERY = "/user/res/Battery/Battery_White.bin"; static constexpr const char *SAVE_BUTTON = "/user/res/Save_Ele/finger.bin"; static constexpr const char *BACK_BUTTON = "/user/res/Save_Ele/finger2.bin"; static constexpr const char *SAVE_WATHCH = "/user/res/Save_Ele/wathch.bin"; diff --git a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp index 38fa102a5..d8e6d548e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/sleep/src/SleepModel.cpp @@ -378,6 +378,7 @@ namespace OHOS void SleepModel::UpdateSleepView() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "睡眠数据更新"); SleepControlView *p_SleepControlView = SleepControlView::GetInstance(); if (p_SleepControlView != nullptr) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp b/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp index e998433ce..79eea0918 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp @@ -29,13 +29,19 @@ namespace OHOS TakephotosView::~TakephotosView() { // DeInit(); - creamAnimator->Stop(); - smileAnimator->Stop(); - FreeImageInfoArray(creamimageInfos, creambasePath.c_str(), 50); - FreeImageInfoArray(smileimageInfos, smilebasePath.c_str(), 50); - ReleaseImageAnimatorSource(creamimageAnimatorInfo, 50); + PopupPhoto staust = TakephotosModel::GetInstance()->GetPopStaust(); + if (staust == PopupPhoto::CreamPopup) + { + creamAnimator->Stop(); + FreeImageInfoArray(creamimageInfos, creambasePath.c_str(), 50); + } + else + { + smileAnimator->Stop(); + FreeImageInfoArray(smileimageInfos, smilebasePath.c_str(), 50); + } ReleaseImageAnimatorSource(smileimageAnimatorInfo, 50); - + ReleaseImageAnimatorSource(creamimageAnimatorInfo, 50); UIViewGroup *tmpGroup = dynamic_cast(container_); UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup); diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index ac5d03121..552fdfb06 100644 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -493,27 +493,35 @@ static uint8_t fall_asleep_state_num = 0; #endif /*NextDay*/ -void MsgCenterNotifyNextDayProc(const Topic topic, Request* req) +void MsgCenterNotifyNextDayProc(const Topic topic, Request *req) { unused(topic); - unused(req); - + unused(req); AlarmClockModel::GetInstance()->NextDayNotify(); -#ifdef FD230 day_timestamp = 0; - - if(!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP)) +#ifdef FD230 + printf("******nextday is begin******\r\n"); + /* ----------------------------------- 睡眠相关 ----------------------------------- */ + if (!ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP)) { - //未设置睡眠监控 nextday进行清除睡眠数据。 + // 未设置睡眠监控 nextday进行清除睡眠数据。 SleepModel::GetInstance().DeleteSleepData(); + // 通知UI更新 + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance())); } - - // 清空当日的心率曲线数据 - HealthService::GetInstance()->ClearHourlyHeartRates(); - HealthService::GetInstance()->SaveDailyHeartRate(); - - //午夜清除运动数据 - do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA,NULL); + /* ---------------------------------- 健康数据相关 ---------------------------------- */ + // 清空当日的心率血氧数据 + HealthService::GetInstance()->CleanHealthData(); + // 通知UI更新 + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance())); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::BloodOxygenModel::CleanAllData, OHOS::BloodOxygenModel::GetInstance())); + /* --------------------------------- 每日目标相关 --------------------------------- */ + // 午夜清除运动数据 + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_RESET_DAILY_DATA, NULL); + printf("******nextday is end******\r\n"); #endif } diff --git a/code/sdk/drivers/peripheral/config/include/ConfigModel.h b/code/sdk/drivers/peripheral/config/include/ConfigModel.h index fae6fa092..162c261b0 100644 --- a/code/sdk/drivers/peripheral/config/include/ConfigModel.h +++ b/code/sdk/drivers/peripheral/config/include/ConfigModel.h @@ -327,7 +327,7 @@ namespace OHOS {ConfigDataType::DATATYPE_INT, "traningauto", "0" },//CONFIGMODEL_ITEM_TRANING_AUTO,//开启关闭自动获取实时数据 {ConfigDataType::DATATYPE_INT, "traningheart", "190" },//CONFIGMODEL_ITEM_TRAINING_HEART_MAX//训练最高心率 //心率相关 - {ConfigDataType::DATATYPE_INT, "heartrate_freq", "15" },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率 + {ConfigDataType::DATATYPE_INT, "heartrate_freq", "30" },// CONFIGMODEL_ITEM_HEARTRATE_DETECTED//心率周期检测频率 {ConfigDataType::DATATYPE_INT, "heartrate_remind", "0"},// CONFIGMODEL_ITEM_HEARTRATE_REMIND//提醒开关 {ConfigDataType::DATATYPE_INT, "heartrate_threshold_value", "0"},// CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE//心率值 diff --git a/code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c b/code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c index ef80e512a..67484b953 100644 --- a/code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c +++ b/code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c @@ -2708,16 +2708,7 @@ static void get_avg_hrs(int32_t hrs) } avg_hrs = (sum_hrs - max_hrs - min_hrs) / (hrs_num - 2); //PRINT("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs); - hx3695_msg_callback_t func = hx3695_get_send_msg_callback_func(); - if(func != NULL) - { - hrsresult.lastesthrs = avg_hrs; - func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t)); - if(uapi_get_cywee_static_state()) - { - func(HX3695_MSG_TYPE_STATIC_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t)); - } - } + hrsresult.lastesthrs = avg_hrs; if(hrs_mode_state) { cywee_data = hrsresult.lastesthrs; @@ -2894,20 +2885,28 @@ void hx3695_hrs_ppg_Int_handle(void) if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living == MSG_LIVING_TRUE) { - if(hrsresult.lastesthrs > 50) + if(hrsresult.lastesthrs > 60 || hrsresult.lastesthrs == 0) get_avg_hrs(hrsresult.lastesthrs); hrsresult.wearstatus = MSG_HRS_WEAR; } else { hrsresult.wearstatus = MSG_HRS_NO_WEAR; + hrsresult.lastesthrs = 0; } hx3695_msg_callback_t func = hx3695_get_send_msg_callback_func(); if(func != NULL) { - func(HX3695_MSG_TYPE_WEARSTAT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t)); + PRINT("hrsresult.lastesthrs : %d \n",hrsresult.lastesthrs); + func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t)); + if(uapi_get_cywee_static_state()) + { + func(HX3695_MSG_TYPE_STATIC_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t)); + } + func(HX3695_MSG_TYPE_WEARSTAT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t)); } + //PRINT("hx3695 data_cnt: %d, hr_living: %d, hr_living_qu: %d, hr_living_std: %d, hr_result:%d \r\n", //alg_results.data_cnt, hrsresult.hr_living, hrsresult.hr_living_qu, hrsresult.hr_living_std, hrsresult.lastesthrs); -- 2.17.1