增加心率数据的nextday清空以及UI更新
authorCaisking <3449750381@qq.com>
Thu, 5 Sep 2024 07:18:32 +0000 (15:18 +0800)
committerCaisking <3449750381@qq.com>
Thu, 5 Sep 2024 07:18:32 +0000 (15:18 +0800)
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp

index 2cd4a2d..b2e7676 100644 (file)
@@ -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};
index 6f1ba90..491904d 100644 (file)
@@ -152,9 +152,9 @@ extern "C"
             void Heart_Result(void);\r
 \r
             void Heart_Control(HeartState state, HeartCheck check);\r
-            void ReInit();\r
-\r
+            void ClearDisplayData();\r
             void Heart_Update_View(void);\r
+            void CleanAllData(void);\r
 \r
         private:\r
             HealthAllDatas healthDatas;\r
index 23f1239..e5b6efb 100644 (file)
@@ -57,6 +57,7 @@ namespace OHOS
         void Init_data_Chart();\r
         void Update_data_Chart(int serialIndex);\r
         void UpdataChart();\r
+        void CleanAllDataView();\r
 \r
     private:\r
         typedef struct\r
@@ -79,6 +80,7 @@ namespace OHOS
         void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
         int32_t HeartRateDataProc(void);\r
         void HeartbeatImageAnimator(void);\r
+        void SetDataTopAndBottom();\r
 \r
     private:\r
         Point heartRateData[HEART_AVE_NUM];\r
index 21c199a..cb9a40f 100644 (file)
@@ -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()
     {
index 09528ef..e87e4b6 100644 (file)
@@ -20,6 +20,7 @@
 #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
@@ -32,6 +33,7 @@ extern "C"
 #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
@@ -53,7 +55,8 @@ extern "C"
         .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
@@ -94,78 +97,64 @@ extern "C"
         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
@@ -351,78 +340,14 @@ namespace OHOS
     {\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
@@ -459,46 +384,39 @@ namespace OHOS
 \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
@@ -573,8 +491,8 @@ namespace OHOS
     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
@@ -598,11 +516,12 @@ namespace OHOS
             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
@@ -656,8 +575,8 @@ namespace OHOS
         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
@@ -722,26 +641,33 @@ namespace OHOS
 \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
@@ -753,17 +679,25 @@ namespace OHOS
         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
@@ -781,4 +715,19 @@ namespace OHOS
             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
index 4dce87c..2a4757c 100644 (file)
@@ -13,6 +13,7 @@
 #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
@@ -234,27 +235,6 @@ namespace OHOS
 \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
@@ -392,7 +372,7 @@ namespace OHOS
         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
@@ -431,32 +411,69 @@ namespace OHOS
     }\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
@@ -758,22 +775,13 @@ namespace OHOS
         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
@@ -874,80 +882,62 @@ namespace OHOS
     {\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