优化主界面心率卡片;优化心率刷新
authorCaisking <3449750381@qq.com>
Mon, 19 Aug 2024 11:20:05 +0000 (19:20 +0800)
committerCaisking <3449750381@qq.com>
Mon, 19 Aug 2024 11:20:05 +0000 (19:20 +0800)
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h
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/src/HeartChartView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp

index 530bd00..c8760f7 100644 (file)
@@ -473,6 +473,7 @@ namespace OHOS
 
         for (int i = 0; i < MAX_HOURS; ++i)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate:: Time is %d Heart is %d", i, dailyHeartRates[i]);
             if (!outFile.write(reinterpret_cast<const char *>(&dailyHeartRates[i]), sizeof(dailyHeartRates[i]))) // 保存心率值
             {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to write heart rate data.");
@@ -497,7 +498,7 @@ namespace OHOS
         struct tm *timeInfo = localtime(&timestamp); // 使用 localtime 获取本地时间
 
         // 提取小时
-        uint8_t hour = static_cast<uint8_t>(timeInfo->tm_hour);
+        uint16_t hour = static_cast<uint16_t>(timeInfo->tm_hour);
 
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate);
 
@@ -511,7 +512,7 @@ namespace OHOS
         currenthour = hour;
     }
 
-    uint8_t HealthService::GetHourlyHeartRate(uint8_t hour)
+    uint16_t HealthService::GetHourlyHeartRate(uint16_t hour)
     {
         // 返回指定小时的心率
         if (hour < MAX_HOURS)
@@ -521,9 +522,9 @@ namespace OHOS
         return 0; // 或者返回一个异常值
     }
 
-    uint8_t HealthService::GetCurrentHour()
+    uint16_t HealthService::GetCurrentHour()
     {
         // 返回目前小时
-        return currenthour; 
+        return currenthour;
     }
 }
index 6760b23..cd72638 100644 (file)
@@ -108,16 +108,16 @@ namespace OHOS
         bool SaveDailyHeartRate();
         bool LoadDailyHeartRate();
         void UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate);
-        uint8_t GetHourlyHeartRate(uint8_t hour);
+        uint16_t GetHourlyHeartRate(uint16_t hour);
         void ClearHourlyHeartRates();
-        uint8_t GetCurrentHour();
+        uint16_t GetCurrentHour();
 
     private:
         static const int MAX_HOURS = 24;
         uint16_t dailyHeartRates[MAX_HOURS]; // 使用数组来存储心率值
         HealthState healthState_;
         time_t lastLoadTime; // 记录最后加载的时间
-        uint8_t currenthour = 0;
+        uint16_t currenthour = 0;
     };
 }
 #endif // HEALTH_MODEL_H
\ No newline at end of file
index ce0ba66..ec5f27c 100644 (file)
@@ -45,7 +45,6 @@ namespace OHOS
         static HeartChartView *GetInstance(void);
 
         UIImageAnimatorView *GetImageAnimator(void);
-        void UpdateShowHeart(void);
 
         bool HeartViewInit();
         void InitChartView(void);
@@ -53,6 +52,9 @@ namespace OHOS
         void SetDataTopAndBottom();
         void HeartImageAnimator();
 
+        void UpdateShowHeart(void);
+        void Update_data_Chart(int serialIndex);
+
     private:
         UILabelExt *CurrentHeartText{nullptr};
         UILabelExt *MaxHeartText{nullptr};
index 66f0359..6f1ba90 100644 (file)
@@ -134,6 +134,8 @@ extern "C"
             void UpHeartdata(uint16_t heart);\r
             uint16_t GetHeartdata();\r
             uint16_t GetShowHeartdata();\r
+            uint16_t GetShowMaxHeartdata();\r
+            uint16_t GetShowMinHeartdata();\r
 \r
             uint16_t GetIndex();\r
             void SetIndex(uint16_t index);\r
@@ -168,9 +170,12 @@ extern "C"
             bool wearStatus{true};\r
             uint16_t index_ = 0;\r
 \r
-            uint16_t displayheart; // 显示心率\r
-            uint16_t currentheart; // 保存心率\r
-            uint32 timestamp_ms;   // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+            uint16_t displayheart;     // 显示心率\r
+            uint16_t currentheart;     // 保存心率\r
+            uint16_t displayheart_max; // 显示最大心率\r
+            uint16_t displayheart_min; // 显示最小心率\r
+\r
+            uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
 \r
             bool initstatus = true;\r
             bool heartstate = false;\r
index 8e7bce4..e2623c8 100644 (file)
@@ -79,13 +79,58 @@ namespace OHOS
     {
         return g_pHeartCheckView;
     }
-    /*更新显示数据*/
+
+    /* 更新显示数据 */
     void HeartChartView::UpdateShowHeart()
     {
+        // 获取当前心率
         uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
         std::string heartrateStr = std::to_string(heart_);
+
+        // 更新当前心率显示
         if (CurrentHeartText != nullptr && heart_ != 0)
+        {
             CurrentHeartText->SetText(heartrateStr.c_str());
+        }
+
+        // 获取最大心率
+        uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
+        std::string heartmaxStr = std::to_string(heartmax_);
+
+        // 更新最大心率显示
+        if (MaxHeartText != nullptr && heartmax_ != 0)
+        {
+            MaxHeartText->SetText(heartmaxStr.c_str());
+        }
+
+        // 获取最小心率
+        uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
+        std::string heartminStr = std::to_string(heartmin_);
+
+        // 更新最小心率显示
+        if (MinHeartText != nullptr && heartmin_ != 0)
+        {
+            MinHeartText->SetText(heartminStr.c_str());
+        }
+    }
+    void HeartChartView::Update_data_Chart(int serialIndex)
+    {
+        if (heartchart == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);
+            return;
+        }
+
+        heartdata[serialIndex].x = serialIndex;
+        heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+
+        heartSerial->AddPoints(heartdata, 24);
+        heartSerial->SetLineColor(Color::Red());
+        heartSerial->SetFillColor(Color::Red());
+        heartSerial->EnableGradient(true);
+
+        heartchart->AddDataSerial(heartSerial);
+        heartchart->Invalidate();
     }
     /*设置最大最小数据*/
     void HeartChartView::SetDataTopAndBottom()
index 092e9e6..3c11ef4 100644 (file)
@@ -8,6 +8,7 @@
 #include "heartrate/include/HeartRateView.h"\r
 #include "heartrate/include/HeartDetectionPresenter.h"\r
 #include "heartrate/include/HeartResultPresenter.h"\r
+#include "heartrate/include/HeartChartView.h"\r
 #include "DialModelHeartRate.h"\r
 \r
 #include <iostream>\r
@@ -20,7 +21,6 @@
 #include <iostream>\r
 #include <memory>\r
 \r
-#include "heartrate/include/HeartRateView.h"\r
 #include "ui_service.h"\r
 #include "battery_hal.h"\r
 \r
@@ -149,17 +149,21 @@ extern "C"
                 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
             OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+            GraphicService::GetInstance()->PostGraphicEvent(\r
+                std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
         }\r
-        if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE)\r
-        {\r
-        }\r
+        if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE){}\r
     }\r
 \r
 #ifdef __cplusplus\r
@@ -504,7 +508,14 @@ namespace OHOS
     {\r
         return displayheart;\r
     }\r
-\r
+    uint16_t HeartModel::GetShowMaxHeartdata()\r
+    {\r
+        return displayheart_max;\r
+    }\r
+    uint16_t HeartModel::GetShowMinHeartdata()\r
+    {\r
+        return displayheart_min;\r
+    }\r
     uint32_t HeartModel::GetCheckTime()\r
     {\r
         return timestamp_ms;\r
@@ -560,7 +571,10 @@ namespace OHOS
     void HeartModel::Heart_Start()\r
     {\r
         displayheart = 0;\r
-        SetResult(HeartResult::NOT_TESTED); // 成功检测\r
+        displayheart_max = 0; // 显示最大心率\r
+        displayheart_min = 0; // 显示最小心率\r
+\r
+        SetResult(HeartResult::NOT_TESTED); // 重置检测\r
         // 进行初始化操作\r
         if (!sensorstate)\r
         {\r
@@ -718,6 +732,14 @@ namespace OHOS
             currentheart = displayheart; // 更新 currentheart\r
             valid_counter_++;            // 增加有效计数器\r
             disvalid_counter_ = 0;       // 清空无效计数器\r
+            if (displayheart_max == 0 || displayheart_min == 0)\r
+            {\r
+                displayheart_min = displayheart_max = displayheart;\r
+            }\r
+            if (displayheart_max < displayheart)\r
+                displayheart_max = displayheart;\r
+            if (displayheart_min > displayheart)\r
+                displayheart_min = displayheart;\r
         }\r
         else\r
         {\r
@@ -744,14 +766,16 @@ namespace OHOS
 \r
     void HeartModel::Heart_Update_View(void)\r
     {\r
-        if (HeartRateView::GetInstance())\r
+        int hour = HealthService::GetInstance()->GetCurrentHour();\r
+        if (HeartRateView::GetInstance() != nullptr)\r
         {\r
-            int hour = HealthService::GetInstance()->GetCurrentHour();\r
-            if (HeartRateView::GetInstance() != nullptr)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");\r
-                HeartRateView::GetInstance()->Update_data_Chart(hour);\r
-            }\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");\r
+            HeartRateView::GetInstance()->Update_data_Chart(hour);\r
+        }\r
+        if (HeartChartView::GetInstance() != nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+            HeartChartView::GetInstance()->Update_data_Chart(hour);\r
         }\r
     }\r
 }\r
index 083fdce..258c3a6 100644 (file)
@@ -309,23 +309,12 @@ namespace OHOS
         LabelInfo bottomLabel = {HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH,\r
                                  BOTTOM_TEXT_HEIGHT};\r
 \r
-        LabelInfo restRateLabel = {REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH,\r
-                                   REST_HEART_RATE_HEIGHT};\r
-        LabelInfo restRateTextLabel1 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1,\r
-                                        REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1};\r
-        LabelInfo restRateTextLabel2 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2,\r
-                                        REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2};\r
-\r
         topRate = new UILabel();\r
         bottomRate = new UILabel();\r
         ratePerSec = new UILabel();\r
         ratePerSecText = new UILabel();\r
-        restRate = new UILabel();\r
-        restRateText1 = new UILabel();\r
-        restRateText2 = new UILabel();\r
 \r
-        if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr ||\r
-            restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr)\r
+        if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail");\r
         }\r
@@ -342,14 +331,6 @@ namespace OHOS
         SetLabel(bottomRate, bottomLabel);\r
         topRate->SetText("--");\r
         bottomRate->SetText("--");\r
-\r
-        // 静息心率\r
-        SetLabel(restRate, restRateLabel);\r
-        SetLabel(restRateText1, restRateTextLabel1);\r
-        SetLabel(restRateText2, restRateTextLabel2);\r
-        restRateText1->SetText("静息");\r
-        restRate->SetText("--");\r
-        restRateText2->SetText("次/分");\r
     }\r
 \r
     void HeartRateView::HeartRateCoordinate(void)\r
@@ -475,6 +456,9 @@ namespace OHOS
             return;\r
         }\r
 \r
+        /*清空原数据*/\r
+        heartchart->DeleteDataSerial(heartSerial);\r
+\r
         heartdata[serialIndex].x = serialIndex;\r
         heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
 \r