#include "custom_runtime.h"\r
#include <iostream>\r
#include <memory>\r
+#include <algorithm>\r
\r
#include "ui_service.h"\r
#include "battery_hal.h"\r
#define MAX_UNWEAR_COUNT 30\r
#define MAX_VALID_HRS_COUNT 40\r
#define MAX_DISVALID_HRS_COUNT 70\r
+#define MIN_DISPLAY_HEART 60\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
\r
/* 佩戴检测结果 */\r
.args = nullptr,\r
.Notify = Notify,\r
};\r
-\r
+ static void ProcessHeartRateUpdate(Request *request);\r
+ static void RefreshHeartData();\r
void HeartDataSubscribeTopic(Topic topic)\r
{\r
BroadcastApi *broadcastApi = nullptr;\r
UNUSED(args);\r
UNUSED(topic);\r
\r
- /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
- if (uapi_dev_runtime_get_train_status() == 1)\r
- return;\r
-\r
- if (request == nullptr)\r
+ // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
+ if (uapi_dev_runtime_get_train_status() == 1 || request == NULL)\r
{\r
return;\r
}\r
- if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA)\r
- {\r
-#if 0\r
- int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo *)request->data, request->len);\r
- if (rets != EOK)\r
- {\r
- free(heartInfo);\r
- heartInfo = nullptr;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s heartRateData fail! ret = %d", rets);\r
- return;\r
- }\r
-#endif\r
- uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
- // 筛选出正常数据\r
- if (preheart > HEART_RATE_LIMIT_LOWER && preheart <= HEART_RATE_LIMIT_UPPER)\r
- {\r
- uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
- HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
- if (heartInfo == nullptr)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
- return;\r
- }\r
- heartInfo->index = index_;\r
- heartInfo->maxX = index_;\r
- heartInfo->minX = index_;\r
- heartInfo->perSec = preheart;\r
- heartInfo->rest = preheart;\r
- heartInfo->maxValue = preheart;\r
- heartInfo->minValue = preheart;\r
- /*\r
- 暂时屏蔽主界面动态曲线\r
- heartInfo->value[index_].x = index_;\r
- heartInfo->value[index_].y = preheart;\r
- index_++;\r
- if (index_ == HEART_ALL_POINTS)\r
- {\r
- index_ = 0;\r
- }\r
- HeartModel::GetInstance()->SetIndex(index_);\r
- */\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
- OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
- free(heartInfo);\r
- heartInfo = nullptr;\r
- }\r
- }\r
- /* Nextday 刷新*/\r
- if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE)\r
- {\r
- OHOS::HeartModel::GetInstance()->ClearHeartData();\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
- }\r
- /* UTCTIME 刷新*/\r
- if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE)\r
+\r
+ switch (request->msgId)\r
{\r
- OHOS::HeartModel::GetInstance()->ClearHeartData();\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
+ case TOPIC_EVENT_HEARTRATE_UPDATA:\r
+ // ProcessHeartRateUpdate(request);\r
+ break;\r
+\r
+ case TOPIC_EVENT_NEXTDAY_UPDATE:\r
+ case TOPIC_EVENT_UTCTIME_UPDATE:\r
+ RefreshHeartData();\r
+ break;\r
+\r
+ case TOPIC_EVENT_WEARSTATE_UPDATE:\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
- if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE)\r
+ }\r
+\r
+ static void ProcessHeartRateUpdate(Request *request)\r
+ {\r
+ uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
+\r
+ // 直接处理心率数据,不进行筛选\r
+ uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
+ HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
+ if (heartInfo == NULL)\r
{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
+ return;\r
}\r
+\r
+ heartInfo->index = index_;\r
+ heartInfo->maxX = index_;\r
+ heartInfo->minX = index_;\r
+ heartInfo->perSec = preheart;\r
+ heartInfo->rest = preheart;\r
+ /*最大最小值不为0*/\r
+ heartInfo->maxValue = preheart;\r
+ heartInfo->minValue = preheart;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
+ OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
+\r
+ free(heartInfo); // 释放内存\r
+ heartInfo = nullptr;\r
+ }\r
+\r
+ static void RefreshHeartData()\r
+ {\r
+ OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
}\r
\r
#ifdef __cplusplus\r
{\r
uint16_t perSecHeartRate = 0;\r
uint16_t restHeartRate = 0;\r
-#if 0\r
- // 使用随机数生成模拟数据\r
- std::random_device rd;\r
- std::mt19937 gen(rd());\r
- std::uniform_int_distribution<> heartRateDist(50, 100);\r
-\r
- heartInfo->perSec = heartRateDist(gen);\r
- heartInfo->rest = heartRateDist(gen);\r
- heartInfo->maxValue = heartRateDist(gen);\r
- heartInfo->minValue = heartRateDist(gen);\r
- heartInfo->minX = 1;\r
- heartInfo->maxX = 10;\r
- // heartInfo->index = 0;\r
- heartInfo->value[heartInfo->index].x = 0;\r
- heartInfo->value[heartInfo->index].y = heartRateDist(gen);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " heartRateData: %d %d %d %d %d %d %d %d ",\r
- heartInfo->perSec, heartInfo->rest, heartInfo->maxValue, heartInfo->minValue, heartInfo->minX, heartInfo->index, heartInfo->value[0].x, heartInfo->value[0].y);\r
\r
-#endif\r
// 每秒心率\r
perSecHeartRate = heartInfo->perSec;\r
- if (perSecHeartRate > HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
+ if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
{\r
healthDatas.heartRatePerSec = perSecHeartRate;\r
}\r
\r
- // 静息心率\r
- restHeartRate = heartInfo->rest;\r
- if (restHeartRate > HEART_RATE_LIMIT_LOWER && restHeartRate <= HEART_RATE_LIMIT_UPPER)\r
- {\r
- healthDatas.heartRateRest = restHeartRate;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateRest:%d ", healthDatas.heartRateRest);\r
- }\r
- HandleMinHeart(heartInfo->minX, heartInfo->minValue);\r
- HandleMaxHeart(heartInfo->maxX, heartInfo->maxValue);\r
- // 平均心率\r
- uint16_t count = aveCount + heartInfo->index;\r
- if (aveCount < HEART_AVE_NUM)\r
- {\r
- for (int i = aveCount; i < count; i++)\r
- {\r
- if (healthDatas.heartRateMin.x != heartInfo->value[i - aveCount].x && healthDatas.heartRateMax.x != heartInfo->value[i - aveCount].x)\r
- {\r
- healthDatas.heartRateAvg[aveCount].x = heartInfo->value[i - aveCount].x;\r
- healthDatas.heartRateAvg[aveCount].y = heartInfo->value[i - aveCount].y;\r
- aveCount++;\r
- }\r
- }\r
- }\r
-\r
- for (int i = 0; i < aveCount - 1; i++)\r
- {\r
- if (healthDatas.heartRateAvg[i].x == healthDatas.heartRateAvg[i + 1].x)\r
- {\r
- if (healthDatas.heartRateAvg[i].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i].y != healthDatas.heartRateMax.y)\r
- {\r
- for (int j = i; j < aveCount - 1; j++)\r
- {\r
- healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1];\r
- }\r
- aveCount--;\r
- }\r
- else if (healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMax.y)\r
- {\r
- for (int j = i + 1; j < aveCount - 1; j++)\r
- {\r
- healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1];\r
- }\r
- aveCount--;\r
- }\r
- }\r
- }\r
GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
}\r
\r
void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate)\r
{\r
- UNUSED(rest);\r
- Point *rateData;\r
- int len = GetAveHeartRateCount();\r
- rateData = GetAveHeartRate();\r
-\r
uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
+ /*主界面刷新心率*/\r
if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr)\r
{\r
MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
}\r
-\r
- if (IndoorWalkPreparedView::GetInstance() != nullptr)\r
- {\r
- IndoorWalkPreparedView::GetInstance()->RefreshHeartbeatData(perSec);\r
- }\r
- if (IndoorWalkPresenter::GetInstance() != nullptr)\r
- {\r
- IndoorWalkPresenter::GetInstance()->ModifiesHeartRate(perSec);\r
- }\r
-\r
+ /*心率卡片刷新心率数据*/\r
if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
{\r
if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
{\r
- HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len);\r
- // HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
- HeartRateView::GetInstance()->RefreshRestHeartRate(rest);\r
}\r
}\r
+ /*applist心率刷新心率数据*/\r
+ if (HeartChartView::GetInstance() != nullptr)\r
+ {\r
+ HeartChartView::GetInstance()->UpdateShowHeart();\r
+ }\r
}\r
/* ---------------------------------- 状态检测 ---------------------------------- */\r
\r
// 重新初始化\r
- void HeartModel::ReInit()\r
+ void HeartModel::ClearDisplayData()\r
{\r
+ /*显示的心率数据清空*/\r
currentheart = 0;\r
timestamp_ms = 0;\r
+ displayheart = 0;\r
+ displayheart_max = 0; // 显示最大心率\r
+ displayheart_min = 0; // 显示最小心率\r
}\r
// 获取心率数据\r
uint16_t HeartModel::GetHeartdata()\r
void HeartModel::Heart_Start()\r
{\r
displayheart = 0;\r
- displayheart_max = 0; // 显示最大心率\r
- displayheart_min = 0; // 显示最小心率\r
+ // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
+ // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
\r
SetResult(HeartResult::NOT_TESTED); // 重置检测\r
// 进行初始化操作\r
if (heartresult_ == HeartResult::SUCCESS)\r
{\r
Heart_Save();\r
- /*通知进行UI更新*/\r
- SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
+ /*更新曲线*/\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
}\r
/*关闭被动检测*/\r
Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
+ return;\r
}\r
\r
if (sensorstate)\r
case HeartResult::SUCCESS:\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
Heart_Save();\r
- /*通知进行UI更新*/\r
- SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
+ /*更新曲线*/\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
break;\r
\r
case HeartResult::NOT_WORN: // 未佩戴状态\r
\r
void HeartModel::UpHeartdata(uint16_t heart)\r
{\r
- /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
+ // 如果处于训练模式,提前返回\r
if (uapi_dev_runtime_get_train_status() == 1)\r
return;\r
\r
displayheart = heart;\r
\r
- // 处理有效与无效计数\r
+ // 更新心率和计数器\r
if (displayheart != 0)\r
{\r
- currentheart = displayheart; // 更新 currentheart\r
+ currentheart = displayheart; // 更新当前心率\r
valid_counter_++; // 增加有效计数器\r
disvalid_counter_ = 0; // 清空无效计数器\r
- if (displayheart_max == 0 || displayheart_min == 0)\r
+\r
+ // 更新最大和最小心率\r
+ displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max);\r
+\r
+ // 确保最小心率的第一次赋值大于50\r
+ if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART)\r
+ {\r
+ displayheart_min = displayheart; // 初始化最小心率\r
+ }\r
+ else\r
{\r
- displayheart_min = displayheart_max = displayheart;\r
+ displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
+ ? displayheart\r
+ : displayheart_min;\r
}\r
- if (displayheart_max < displayheart)\r
- displayheart_max = displayheart;\r
- if (displayheart_min > displayheart)\r
- displayheart_min = displayheart;\r
}\r
else\r
{\r
if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
- SetResult(HeartResult::INVALID_DATA); // æ\97 æ\95\88æ\95°è¾¾æ \87\r
+ SetResult(HeartResult::INVALID_DATA); // æ \87记为æ\97 æ\95\88æ\95°æ\8d®\r
Heart_Stop();\r
+ return;\r
}\r
\r
// 检查有效计数器是否达标\r
if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
- SetResult(HeartResult::SUCCESS); // 成功检测\r
+ SetResult(HeartResult::SUCCESS); // æ \87记为æ\88\90å\8a\9fæ£\80æµ\8b\r
Heart_Stop();\r
+ return;\r
}\r
+\r
+ // 刷新心率显示\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[heart data update displayheart %d displayheart_max %d displayheart_min %d]", displayheart,\r
+ displayheart_max, displayheart_min);\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+ displayheart, 0, displayheart_max, displayheart_min));\r
}\r
\r
void HeartModel::Heart_Update_View(void)\r
HeartChartView::GetInstance()->Update_data_Chart(hour);\r
}\r
}\r
+\r
+ void HeartModel::CleanAllData(void)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
+ if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
+ HeartRateView::GetInstance()->CleanAllDataView();\r
+ }\r
+ if (HeartChartView::GetInstance() != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+ HeartChartView::GetInstance()->CleanAllDataView();\r
+ }\r
+ }\r
}\r
#include "ui_resource_image.h"\r
#include "common/image_cache_manager.h"\r
#include "heart_blood/health_service/health_service.h"\r
+#include "string.h"\r
#define HEART_DATA_TEST 0\r
namespace OHOS\r
{\r
\r
return OHOS_SUCCESS;\r
}\r
-#if 0\r
- std::vector<Point> HeartRateView::simulateHeartRateData()\r
- {\r
- std::vector<Point> heartRateData;\r
- const int HEART_RATE_MIN = 60; // 心率下限\r
- const int HEART_RATE_MAX = 100; // 心率上限\r
-\r
- // 用于生成随机数的种子\r
- std::srand(std::time(0));\r
-\r
- for (int i = 0; i < 24; ++i)\r
- { // 模拟24小时\r
- Point dataPoint;\r
- dataPoint.x = i; // 小时数\r
- dataPoint.y = HEART_RATE_MIN + (std::rand() % (HEART_RATE_MAX - HEART_RATE_MIN + 1)); // 随机生成心率值\r
- heartRateData.push_back(dataPoint);\r
- }\r
-\r
- return heartRateData;\r
- }\r
-#endif\r
int32_t HeartRateView::HeartRateDataProc(void)\r
{\r
int32_t i, ret;\r
heartYAxis.SetDataRange(0, 220);\r
heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
\r
- //heartchart->SetGradientOpacity(60, 0);\r
+ // heartchart->SetGradientOpacity(60, 0);\r
heartchart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
Add(heartchart);\r
}\r
}\r
void HeartRateView::Update_data_Chart(int serialIndex)\r
{\r
- if (heartchart == nullptr)\r
+ if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);\r
return;\r
}\r
\r
/*清空原数据*/\r
- // heartchart->DeleteDataSerial(heartSerial);\r
heartSerial->ClearData();\r
\r
heartdata[serialIndex].x = serialIndex;\r
heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
\r
- for (int i = 0; i < 24; i++)\r
+ heartSerial->AddPoints(heartdata, 24);\r
+ heartSerial->SetLineColor(Color::Red());\r
+ heartSerial->SetFillColor(Color::Red());\r
+ heartSerial->EnableGradient(true);\r
+\r
+ heartchart->AddDataSerial(heartSerial);\r
+ heartchart->RefreshChart();\r
+ }\r
+ void HeartRateView::CleanAllDataView()\r
+ {\r
+ if (heartchart == nullptr || topRate == nullptr || bottomRate == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanAllDataView fail");\r
+ return;\r
+ }\r
+ for (int serialIndex = 0; serialIndex < 24; serialIndex++)\r
{\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d %d", i, heartdata[i].y);\r
+ heartdata[serialIndex].x = serialIndex;\r
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
}\r
\r
+ /*清空原数据*/\r
+ heartSerial->ClearData();\r
heartSerial->AddPoints(heartdata, 24);\r
heartSerial->SetLineColor(Color::Red());\r
heartSerial->SetFillColor(Color::Red());\r
heartSerial->EnableGradient(true);\r
\r
heartchart->AddDataSerial(heartSerial);\r
- // heartchart->Invalidate();\r
heartchart->RefreshChart();\r
+\r
+ /*更新最大最小值*/\r
+ SetDataTopAndBottom();\r
+ }\r
+ /*设置最大最小数据*/\r
+ void HeartRateView::SetDataTopAndBottom()\r
+ {\r
+ int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax();\r
+ int MinHeart = HeartModel::GetInstance()->GetHeartRateMin();\r
+\r
+ if (topRate != nullptr)\r
+ {\r
+ topRate->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() : "--");\r
+ }\r
+\r
+ if (bottomRate != nullptr)\r
+ {\r
+ bottomRate->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str() : "--");\r
+ }\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart, MinHeart);\r
}\r
void HeartRateView::InsertTopAndBottomRateImage(void)\r
{\r
uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount();\r
SetHeartRateData(rateData, sizeof(Point) * len);\r
// 展示最大,最小,最近一次心率\r
- uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax();\r
- uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin();\r
- uint16_t perRate = HeartModel::GetInstance()->GetHeartdata();\r
- RefreshElectrocardiogram();\r
- if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER)\r
- {\r
- RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax());\r
- }\r
- if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER)\r
- {\r
- RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin());\r
- }\r
- if (perRate > 0 && perRate < HEART_RATE_LIMIT_UPPER)\r
- {\r
- HeartModel::GetInstance()->SetHeartRatePerSec(perRate);\r
- }\r
+ uint16_t maxRate = HeartModel::GetInstance()->GetShowMaxHeartdata();\r
+ uint16_t minRate = HeartModel::GetInstance()->GetShowMinHeartdata();\r
+ uint16_t perRate = HeartModel::GetInstance()->GetShowHeartdata();\r
+\r
+ RefreshHeartRateMax(maxRate);\r
+ RefreshHeartRateMin(minRate);\r
+ HeartModel::GetInstance()->SetHeartRatePerSec(perRate);\r
}\r
\r
// 刷新心率曲线\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView %d", value);\r
\r
- char heartRate[NUM_4] = "--";\r
- int32_t ret = 0;\r
-\r
if (ratePerSec == nullptr)\r
{\r
return;\r
}\r
- HeartbeatImageAnimatorStart(); // 界面创建实现动画跳动\r
- if (value == 0)\r
+\r
+ // 判断心率值,并设置文本\r
+ if (value == 0 || value < 50)\r
{\r
ratePerSec->SetText("--");\r
- // HeartbeatImageAnimatorStop();\r
- return;\r
- }\r
- // HeartbeatImageAnimatorStart();\r
- if (value > NUM_99)\r
- {\r
- ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
}\r
else\r
{\r
- ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
- }\r
- if (ret > EOK)\r
- {\r
- ratePerSec->SetText(heartRate);\r
+ std::string ratePerSecStr = std::to_string(value);\r
+ ratePerSec->SetText(ratePerSecStr.c_str());\r
}\r
}\r
\r
// 刷新最大心率\r
void HeartRateView::RefreshHeartRateMax(uint16_t max)\r
{\r
- char top[NUM_4] = "--";\r
- int32_t ret = 0;\r
- maxRate = (maxRate >= max) ? maxRate : max;\r
if (topRate == nullptr)\r
{\r
return;\r
}\r
- if (maxRate <= HEART_RATE_LIMIT_LOWER)\r
+\r
+ // 设置刷新文本\r
+ if (max >= HEART_RATE_LIMIT_UPPER || max < 60)\r
{\r
topRate->SetText("--");\r
- return;\r
}\r
- ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
- if (ret > EOK)\r
+ else\r
{\r
- topRate->SetText(top);\r
+ std::string topRateStr = std::to_string(max);\r
+ topRate->SetText(topRateStr.c_str());\r
}\r
}\r
\r
// 刷新最小心率\r
void HeartRateView::RefreshHeartRateMin(uint16_t min)\r
{\r
- char bottom[NUM_4] = "--";\r
- int32_t ret = 0;\r
-\r
- minRate = (minRate <= min) ? minRate : min;\r
if (bottomRate == nullptr)\r
{\r
return;\r
}\r
- if (minRate >= HEART_RATE_LIMIT_UPPER)\r
+\r
+ // 设置刷新文本\r
+ if (min >= HEART_RATE_LIMIT_UPPER || min < 60)\r
{\r
bottomRate->SetText("--");\r
- return;\r
}\r
- ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
- if (ret > EOK)\r
+ else\r
{\r
- bottomRate->SetText(bottom);\r
+ std::string bottomRateStr = std::to_string(min);\r
+ bottomRate->SetText(bottomRateStr.c_str());\r
}\r
}\r
-\r
// 刷新静息心率\r
void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
{\r