Merge #704 into sdk602patch0626 from refs/changes/704/head 705/target/1
author袁清梦 <3449750381@qq.com>
Fri, 16 Aug 2024 01:38:14 +0000 (01:38 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Fri, 16 Aug 2024 01:38:14 +0000 (01:38 +0000)
Code review from 袁清梦

* refs/changes/704/head: (7 commits squashed)

  - 更新主界面心率卡片UI

  - 增加当日历史心率数据处理

  - 同步心率UI资源文件更新

  - 更新多国语言脚本 实现自动copy

  - ● 修改卡片管理样式与figma保持一致纵向
    ● 增加卡片管理表冠控制
    ● 增加卡片管理滑动条效果

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

Signed-off-by: Caisking <3449750381@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/704
20 files changed:
code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_image.h
code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/add_card/src/AddCardView.cpp
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/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp
code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp
code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h
code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp
code/sdk/application/wearable/nativeapp/nativeui/heartrate/src/HeartRateView.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/MainCard/heart.bin
code/sdk/drivers/peripheral/utils/custom_utils.c
tools/image_converter_tool/test/hert/heart/BOTTOM.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart/COOR.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart/TOP.png [new file with mode: 0644]
tools/language_tool/make_language.sh
tools/language_tool/多国语言工具脚本.md

index bc18a57..778ca39 100644 (file)
@@ -13,9 +13,9 @@ namespace OHOS
     static const int DIR_MASK = 0xfff00000;
     static const int PNG_MASK = 0x000fffff;
 
-    static const int HEART_HEARTRATECOOR = 0x100001;
-    static const int HEART_HEARTRATE_BOTTOM = 0x100002;
-    static const int HEART_HEARTRATE_TOP = 0x100003;
+    static const int HEART_RATE_BOTTOM = 0x100001;
+    static const int HEART_RATE_COOR = 0x100002;
+    static const int HEART_RATE_TOP = 0x100003;
     /* -------------------------------------------------------------------------- */
     static const int PLAYER_BACKGROUND = 0x200001;            // 音乐背景
     static const int PLAYER_BLUETOOTH_COLOR = 0x200002;       // 蓝牙图标蓝色图片
index 893e4cc..e2281cf 100644 (file)
@@ -51,8 +51,9 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardPresenter::OnDrag");
         UNUSED(view);
-        /*从下自上 回退*/
-        if ((event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP))
+        /*回退*/
+        if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&
+            (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY()))))
         {
             // 回退
             NativeAbility::GetInstance().Back();
index ab0f02f..8a51d62 100644 (file)
@@ -11,7 +11,7 @@
 
 namespace OHOS
 {
-    AddCardView::AddCardView() : contentList_(UIList::HORIZONTAL)
+    AddCardView::AddCardView()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCardView::AddCardView");
     }
@@ -112,7 +112,12 @@ namespace OHOS
         contentList_.SetMaxScrollDistance(1000);
         contentList_.SetLoopState(true);
         contentList_.SetAdapter(addCardAdapter_);
+
         contentList_.SetVisible(true);
+        contentList_.SetRotateFactor(1.0);
+        contentList_.RequestFocus();
+        contentList_.SetYScrollBarVisible(true); // 设置滑动滚动条
+
         container_->Add(&contentList_);
     }
 
index 415f895..530bd00 100644 (file)
 #include "bloodoxygen/include/BloodOxygenModel.h"
 namespace OHOS
 {
+    extern "C"
+    {
+        void save_heart_data()
+        {
+            printf("save_heart_data\r\n");
+            OHOS::HealthService::GetInstance()->SaveDailyHeartRate();
+            return;
+        }
+    }
 
     static HealthService *g_pHealthService = nullptr;
     /*获取日期*/
@@ -337,6 +346,10 @@ namespace OHOS
         outFile.close();
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok");
 
+        // 写入文件到当天历史数据
+        UpdateHourlyHeartRate(data.timestamp, data.Heart);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok");
+
         /* 存储bin文件[协议使用] */
         std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
         FILE *fp = fopen(binFilePath.c_str(), "ab+");
@@ -385,4 +398,132 @@ namespace OHOS
     {
         healthState_ = healthState;
     }
-}
\ No newline at end of file
+    /* ------------------------------- 心率当天历史数据处理 ------------------------------ */
+    static constexpr const char *HEART_DATA_PATH = "/user/userdata/health/heart_history.bin";
+    bool HealthService::LoadDailyHeartRate()
+    {
+        // 初始化心率数组为 0
+        ClearHourlyHeartRates();
+
+        // 获取当前时间
+        time_t currentTime = time(nullptr);
+        tm *currentTm = localtime(&currentTime);
+
+        // 检查是否为同一天
+        std::ifstream file(HEART_DATA_PATH, std::ios::binary);
+        if (!file.is_open())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Unable to open heart rate data file for reading");
+            return false; // 文件打开失败
+        }
+
+        // 读取时间戳
+        file.read(reinterpret_cast<char *>(&lastLoadTime), sizeof(lastLoadTime));
+
+        // 检查是否为同一天
+        if (lastLoadTime != 0) // 确保 lastLoadTime 有效
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************");
+            tm *lastTm = localtime(&lastLoadTime);
+            if (currentTm->tm_year == lastTm->tm_year &&
+                currentTm->tm_yday == lastTm->tm_yday)
+            {
+                // 如果是同一天,直接读取心率数据
+                for (int i = 0; i < MAX_HOURS; ++i)
+                {
+                    uint16_t heartRate;
+                    if (!file.read(reinterpret_cast<char *>(&heartRate), sizeof(heartRate))) // 读取心率
+                    {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to read heart rate data.");
+                        file.close();
+                        return false; // 读取失败
+                    }
+                    dailyHeartRates[i] = heartRate;
+
+                    // 打印心率数据
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Hour %d: Heart Rate %d", i, heartRate);
+                }
+                file.close();
+                return true; // 成功读取
+            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "************************************************");
+        }
+
+        // 如果不是同一天,清空文件内容
+        file.close();
+        SaveDailyHeartRate();
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Not same-day data");
+        return false; // 不是同一天
+    }
+
+    bool HealthService::SaveDailyHeartRate()
+    {
+        // 判断文件是否存在 不存在即创建 并打开以输出模式
+        std::ofstream outFile(HEART_DATA_PATH, std::ios::trunc);
+        if (!outFile.is_open())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Unable to open heart rate data file for reading");
+            return false; // 文件打开失败
+        }
+
+        // 存储一个时间戳最前面
+        time_t currentTime = time(nullptr);
+        outFile.write(reinterpret_cast<const char *>(&currentTime), sizeof(currentTime));
+
+        for (int i = 0; i < MAX_HOURS; ++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.");
+                outFile.close();
+                return false; // 写入失败
+            }
+        }
+        outFile.close();
+        return true; // 成功保存
+    }
+    void HealthService::ClearHourlyHeartRates()
+    {
+        // 清空心率数据,将数组置为 0
+        for (int i = 0; i < MAX_HOURS; ++i)
+        {
+            dailyHeartRates[i] = 0;
+        }
+    }
+    void HealthService::UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate)
+    {
+        // 将时间戳转换为 tm 结构体
+        struct tm *timeInfo = localtime(&timestamp); // 使用 localtime 获取本地时间
+
+        // 提取小时
+        uint8_t hour = static_cast<uint8_t>(timeInfo->tm_hour);
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate);
+
+        // 确保 hour 在有效范围内,并且心率不是异常值(例如负值)
+        if (hour < MAX_HOURS && heartRate > 0) // 心率不应为负
+        {
+            dailyHeartRates[hour] = heartRate;
+        }
+
+        // 记录目前更新时间点
+        currenthour = hour;
+    }
+
+    uint8_t HealthService::GetHourlyHeartRate(uint8_t hour)
+    {
+        // 返回指定小时的心率
+        if (hour < MAX_HOURS)
+        {
+            return dailyHeartRates[hour]; // 默认为 0 如果未更新
+        }
+        return 0; // 或者返回一个异常值
+    }
+
+    uint8_t HealthService::GetCurrentHour()
+    {
+        // 返回目前小时
+        return currenthour; 
+    }
+}
index a48df95..6760b23 100644 (file)
@@ -10,6 +10,9 @@
 
 #include "stdio.h"
 #include "string"
+#include <fstream>
+#include <ctime>
+#include <cstdint>
 
 #define HEART_MAX_POINTS 360
 namespace OHOS
@@ -92,11 +95,29 @@ namespace OHOS
         bool UpdateJsonData(uint8_t type);  // 更新json
         bool CleanHealthData();
 
+        /*健康状态*/
         HealthState GetHealthCurrent();
         void SetHealthCurrent(HealthState healthState);
 
+        /*
+            当天24个小时的心率处理
+            -心率数组 每个小时存储最新的值 但是没有小时只有一个值
+            -开机读取
+            -关机存储
+        */
+        bool SaveDailyHeartRate();
+        bool LoadDailyHeartRate();
+        void UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate);
+        uint8_t GetHourlyHeartRate(uint8_t hour);
+        void ClearHourlyHeartRates();
+        uint8_t GetCurrentHour();
+
     private:
+        static const int MAX_HOURS = 24;
+        uint16_t dailyHeartRates[MAX_HOURS]; // 使用数组来存储心率值
         HealthState healthState_;
+        time_t lastLoadTime; // 记录最后加载的时间
+        uint8_t currenthour = 0;
     };
 }
 #endif // HEALTH_MODEL_H
\ No newline at end of file
index 5a453a3..66f0359 100644 (file)
@@ -152,6 +152,8 @@ extern "C"
             void Heart_Control(HeartState state, HeartCheck check);\r
             void ReInit();\r
 \r
+            void Heart_Update_View(void);\r
+\r
         private:\r
             HealthAllDatas healthDatas;\r
             uint16_t pretime{0};\r
index de7245c..23f1239 100644 (file)
@@ -17,7 +17,8 @@
 #include "components/ui_card_page.h"\r
 #include "HeartModel.h"\r
 \r
-namespace OHOS {\r
+namespace OHOS\r
+{\r
 #define HEART_AVE_NUM 360\r
 #define HEART_RATE_LIMIT_UPPER 200\r
 #define HEART_RATE_LIMIT_LOWER 0\r
@@ -32,76 +33,86 @@ namespace OHOS {
 #define NUM_16 16\r
 #define NUM_99 99\r
 \r
-class HeartRateView : public UICardPage {\r
-public:\r
-    HeartRateView();\r
-    ~HeartRateView() override;\r
-    static HeartRateView *GetInstance(void);\r
+    class HeartRateView : public UICardPage\r
+    {\r
+    public:\r
+        HeartRateView();\r
+        ~HeartRateView() override;\r
+        static HeartRateView *GetInstance(void);\r
 \r
-    bool InitView(void);\r
-    void PreLoad(void) override;\r
-    void UnLoad(void) override;\r
-    int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线\r
-    void RefreshElectrocardiogram(void); // 刷新心率曲线\r
-    void ClearElectrocardiogram(void); // 清空心率曲线\r
-    void RefreshHeartRatePerSec(uint16_t value); // 刷新每秒心率\r
-    void RefreshHeartRateMax(uint16_t max); // 刷新心率最大值\r
-    void RefreshHeartRateMin(uint16_t min); // 刷新心率最小值\r
-    void RefreshRestHeartRate(uint16_t value); // 刷新静息心率\r
-    void HeartbeatImageAnimatorStart(void); // 心形动画启动\r
-    void HeartbeatImageAnimatorStop(void); // 心形动画停止\r
-    void InitRefreshInterface(void);\r
+        bool InitView(void);\r
+        void PreLoad(void) override;\r
+        void UnLoad(void) override;\r
+        int32_t SetHeartRateData(Point *rateData, uint32 rateDataSize); // 设置心率数据,用于画心率曲线\r
+        void RefreshElectrocardiogram(void);                            // 刷新心率曲线\r
+        void ClearElectrocardiogram(void);                              // 清空心率曲线\r
+        void RefreshHeartRatePerSec(uint16_t value);                    // 刷新每秒心率\r
+        void RefreshHeartRateMax(uint16_t max);                         // 刷新心率最大值\r
+        void RefreshHeartRateMin(uint16_t min);                         // 刷新心率最小值\r
+        void RefreshRestHeartRate(uint16_t value);                      // 刷新静息心率\r
+        void HeartbeatImageAnimatorStart(void);                         // 心形动画启动\r
+        void HeartbeatImageAnimatorStop(void);                          // 心形动画停止\r
+        void InitRefreshInterface(void);\r
+        void InitChartTest(void);\r
+        void Init_data_Chart();\r
+        void Update_data_Chart(int serialIndex);\r
+        void UpdataChart();\r
 \r
-private:\r
-    typedef struct {\r
-        uint8_t fontSize;\r
-        int16 x;\r
-        int16 y;\r
-        int16 width;\r
-        int16 height;\r
-    } LabelInfo;\r
+    private:\r
+        typedef struct\r
+        {\r
+            uint8_t fontSize;\r
+            int16 x;\r
+            int16 y;\r
+            int16 width;\r
+            int16 height;\r
+        } LabelInfo;\r
 \r
-    int32_t InitHeartRateData(void);\r
-    void SetLabel(UILabel *label, LabelInfo labelInfo);\r
-    void HeartRateLabelDisplay(void);\r
-    void HeartRateCoordinate(void);\r
-    void HeartRateElectrocardiogram(void);\r
-    void InsertTopAndBottomRateImage(void);\r
-    void UpdataTopAndBottomRate(void);\r
-    void ElectrocardiogramOnePoint(Point *rateData, uint16_t index);\r
-    void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
-    int32_t HeartRateDataProc(void);\r
-    void HeartbeatImageAnimator(void);\r
+        int32_t InitHeartRateData(void);\r
+        void SetLabel(UILabel *label, LabelInfo labelInfo);\r
+        void HeartRateLabelDisplay(void);\r
+        void HeartRateCoordinate(void);\r
+        void HeartRateElectrocardiogram(void);\r
+        void InsertTopAndBottomRateImage(void);\r
+        void UpdataTopAndBottomRate(void);\r
+        void ElectrocardiogramOnePoint(Point *rateData, uint16_t index);\r
+        void ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume);\r
+        int32_t HeartRateDataProc(void);\r
+        void HeartbeatImageAnimator(void);\r
 \r
-private:\r
-    Point heartRateData[HEART_AVE_NUM];\r
-    Point rateDataTmp[HEART_AVE_NUM];\r
+    private:\r
+        Point heartRateData[HEART_AVE_NUM];\r
+        Point rateDataTmp[HEART_AVE_NUM];\r
 \r
-    void PreLoadHeartRateImageRes(void);\r
-    void UnLoadHeartRateImageRes(void);\r
-    bool viewiInitStatus{false};\r
-    bool resLoadStatus{false};\r
-    UIChartPolyline *chart{nullptr};\r
-    uint16_t dataNume; // 心率曲线记录数据总个数\r
-    uint16_t currIndex; // 当前已显示心率曲线心率个数\r
-    UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr};\r
-    UIChartDataSerial *dataTopAndbottom{nullptr};\r
-    UIImageView *imageViewTop{nullptr};\r
-    UIImageView *imageViewBottom{nullptr};\r
-    uint16_t serialIndex;\r
-    UIImageAnimatorView *imageAnimator{nullptr};\r
-    UIImageView *imageViewCoordinate{nullptr};\r
+        void PreLoadHeartRateImageRes(void);\r
+        void UnLoadHeartRateImageRes(void);\r
+        bool viewiInitStatus{false};\r
+        bool resLoadStatus{false};\r
+        UIChartPolyline *chart{nullptr};\r
+        uint16_t dataNume;  // 心率曲线记录数据总个数\r
+        uint16_t currIndex; // 当前已显示心率曲线心率个数\r
+        UIChartDataSerial *dataSerial[HEART_AVE_NUM]{nullptr};\r
+        UIChartDataSerial *dataTopAndbottom{nullptr};\r
+        UIImageView *imageViewTop{nullptr};\r
+        UIImageView *imageViewBottom{nullptr};\r
+        uint16_t serialIndex;\r
+        UIImageAnimatorView *imageAnimator{nullptr};\r
+        UIImageView *imageViewCoordinate{nullptr};\r
 \r
-    UILabel *topRate{nullptr};\r
-    UILabel *bottomRate{nullptr};\r
-    UILabel *ratePerSec{nullptr};\r
-    UILabel *ratePerSecText{nullptr};\r
-    UILabel *restRate{nullptr};\r
-    UILabel *restRateText1{nullptr};\r
-    UILabel *restRateText2{nullptr};\r
+        UILabel *topRate{nullptr};\r
+        UILabel *bottomRate{nullptr};\r
+        UILabel *ratePerSec{nullptr};\r
+        UILabel *ratePerSecText{nullptr};\r
+        UILabel *restRate{nullptr};\r
+        UILabel *restRateText1{nullptr};\r
+        UILabel *restRateText2{nullptr};\r
 \r
-    uint16_t maxRate;\r
-    uint16_t minRate;\r
-};\r
+        uint16_t maxRate;\r
+        uint16_t minRate;\r
+\r
+        Point heartdata[24];\r
+        UIChartDataSerial *heartSerial{nullptr};\r
+        UIChartPolyline *heartchart = nullptr;\r
+    };\r
 } // namespace OHOS\r
 #endif // HEART_RATE_VIEW_H\r
index a9b991c..42dac0d 100644 (file)
@@ -20,6 +20,9 @@
 #include <iostream>\r
 #include <memory>\r
 \r
+#include "heartrate/include/HeartRateView.h"\r
+#include "ui_service.h"\r
+\r
 #ifdef __cplusplus\r
 extern "C"\r
 {\r
@@ -198,6 +201,8 @@ namespace OHOS
         /*初始化读取文件*/\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
         HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
+        /*初始化历史文件*/\r
+        HealthService::GetInstance()->LoadDailyHeartRate();\r
         if (data != nullptr)\r
         {\r
             currentheart = data->Heart;\r
@@ -472,7 +477,7 @@ namespace OHOS
             if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
             {\r
                 HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len);\r
-                HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
+                // HeartRateView::GetInstance()->RefreshElectrocardiogram();\r
                 HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
                 HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
                 HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
@@ -568,6 +573,8 @@ namespace OHOS
             if (heartresult_ == HeartResult::SUCCESS)\r
             {\r
                 Heart_Save();\r
+                /*通知进行UI更新*/\r
+                SendMsgToUIService(UI_UPDATE_HEARTRATE_DATA, 0, nullptr, 0);\r
             }\r
             /*关闭被动检测*/\r
             Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
@@ -589,7 +596,7 @@ namespace OHOS
         SetCheckTime(data.timestamp);\r
         HealthService::GetInstance()->UpdateHealthData(data);\r
 \r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentheart, data.timestamp);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", currentheart, data.timestamp);\r
     }\r
 \r
     // 显示检测结果// 显示检测结果\r
@@ -724,4 +731,17 @@ namespace OHOS
             Heart_Stop();\r
         }\r
     }\r
+\r
+    void HeartModel::Heart_Update_View(void)\r
+    {\r
+        if (HeartRateView::GetInstance())\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
+        }\r
+    }\r
 }\r
index a027ab0..083fdce 100644 (file)
 #include "ScreenModels.h"\r
 #include "ui_resource_image.h"\r
 #include "common/image_cache_manager.h"\r
-\r
+#include "heart_blood/health_service/health_service.h"\r
+#define HEART_DATA_TEST 0\r
 namespace OHOS\r
 {\r
     static HeartRateView *g_pHeartRateView = nullptr;\r
 \r
 // 背景坐标图形\r
-#define ACT_IMAGE_X 0                               // 图片坐标起点\r
-#define ACT_IMAGE_Y 115                             // 图片坐标起点\r
-#define ACT_IMAGE_COOR_X 45                         // 200刻度线到最左端的像素点\r
+#define ACT_IMAGE_X 38                              // 图片坐标起点\r
+#define ACT_IMAGE_Y 130                             // 图片坐标起点\r
+#define ACT_IMAGE_COOR_X 80                         // 200刻度线到最左端的像素点\r
 #define ACT_IMAGE_COOR_Y 145                        // 200刻度线到顶端的像素点\r
 #define ACT_IMAGE_COOR_PIXELS 160                   // 实际背景坐标0到200心率值的实际像素点\r
 #define ACT_IMAGE_COOR_VALUE HEART_RATE_LIMIT_UPPER // 图片刻度表示的心率范围\r
-#define ACT_IMAGE_COOR_WIDTH 454\r
-#define ACT_IMAGE_COOR_HEIGHT 220\r
+#define ACT_IMAGE_COOR_WIDTH 390\r
+#define ACT_IMAGE_COOR_HEIGHT 200\r
 \r
 // 心电图坐标适配\r
 #define COORDINATE_VALUE 5 // 余量\r
@@ -39,8 +40,8 @@ namespace OHOS
 // 心形心跳\r
 #define HEARTBEAT_IMAGE_WIDTH 92\r
 #define HEARTBEAT_IMAGE_HEIGHT 92\r
-#define HEARTBEAT_IMAGE_X 130\r
-#define HEARTBEAT_IMAGE_Y 25\r
+#define HEARTBEAT_IMAGE_X 105\r
+#define HEARTBEAT_IMAGE_Y 50\r
 #define HEARTBEAT_IMAGE_NUM 19\r
 #define HEARTBEAT_DELAY 50\r
 \r
@@ -90,10 +91,10 @@ namespace OHOS
 #define REST_HEART_TEXT_HEIGHT2 (REST_HEART_TEXT_FONT_SIZE + 5)\r
 \r
 // 每秒心率\r
-#define PERSEC_HEART_RATE_FONT_SIZE 45\r
-#define PERSEC_HEART_RATE_X 225\r
-#define PERSEC_HEART_RATE_Y 55\r
-#define PERSEC_HEART_RATE_WIDTH 90\r
+#define PERSEC_HEART_RATE_FONT_SIZE 60\r
+#define PERSEC_HEART_RATE_X 202\r
+#define PERSEC_HEART_RATE_Y 62\r
+#define PERSEC_HEART_RATE_WIDTH 102\r
 #define PERSEC_HEART_RATE_HEIGHT (PERSEC_HEART_RATE_FONT_SIZE + 5)\r
 \r
 #define PERSEC_HEART_TEXT_FONT_SIZE 30\r
@@ -157,6 +158,10 @@ namespace OHOS
                 delete dataSerial[i];\r
                 dataSerial[i] = nullptr;\r
             }\r
+            heartchart->ClearDataSerial();\r
+            delete heartSerial;\r
+            heartSerial = nullptr;\r
+            delete heartchart;\r
             delete chart;\r
             chart = nullptr;\r
             delete imageViewTop;\r
@@ -229,7 +234,27 @@ 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
@@ -250,7 +275,7 @@ namespace OHOS
         }\r
 \r
         dataNume = 0;\r
-        for (i = 0; i < HEART_AVE_NUM; i++)\r
+        for (i = 0; i < HEART_AVE_NUM; i += 15) // 每跨过15个点代表一个小时\r
         {\r
             if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 &&\r
                 datain[i].y <= HEART_RATE_LIMIT_UPPER)\r
@@ -260,6 +285,7 @@ namespace OHOS
                 dataNume++;\r
             }\r
         }\r
+\r
         return OHOS_SUCCESS;\r
     }\r
 \r
@@ -308,6 +334,7 @@ namespace OHOS
         SetLabel(ratePerSec, PerSecLabel);\r
         SetLabel(ratePerSecText, PerSecTextLabel);\r
         ratePerSec->SetText("--");\r
+        ratePerSec->SetFont(GILROY_BOLD_FONT, PERSEC_HEART_RATE_FONT_SIZE);\r
         ratePerSecText->SetText("次/分");\r
 \r
         // 最高最低心率\r
@@ -361,9 +388,105 @@ namespace OHOS
         xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
         yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
         chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
+        chart->SetVisible(false); // 设置不可见\r
         Add(chart);\r
     }\r
+    void HeartRateView::InitChartTest(void)\r
+    {\r
+        if (heartchart == nullptr)\r
+        {\r
+            heartchart = new UIChartPolyline();\r
+        }\r
+        heartchart->SetPosition(95, 178);\r
+        heartchart->Resize(320, 110);\r
+        heartchart->SetViewId("uiChart");\r
+        heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+\r
+        UIXAxis &heartXAxis = heartchart->GetXAxis();\r
+        UIYAxis &heartYAxis = heartchart->GetYAxis();\r
+        heartXAxis.SetMarkNum(1);\r
+        heartXAxis.SetDataRange(0, 24);\r
+        heartXAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+        // heartXAxis.SetLineColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+        heartYAxis.SetMarkNum(1);\r
+        heartYAxis.SetDataRange(0, 220);\r
+        heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+        // heartYAxis.SetLineColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff));\r
+\r
+        heartchart->SetGradientOpacity(0, 0);\r
+\r
+        Add(heartchart);\r
+    }\r
+    void HeartRateView::Init_data_Chart()\r
+    {\r
+        if (heartchart == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init_data_Chart new chart fail");\r
+            return;\r
+        }\r
+        heartSerial = new UIChartDataSerial();\r
+        heartSerial->SetMaxDataCount(24);\r
+#if HEART_DATA_TEST\r
+        Point temp[] = {\r
+            {0, 150}, {1, 250}, {2, 170}, {3, 0}, {4, 140}, {5, 190}, {6, 100}, {7, 40}, {8, 10}, {9, 100}, {10, 60}, {11, 20}, {12, 150}, {13, 250}, {14, 170}, {15, 140}, {16, 78}, {17, 80}, {18, 100}, {19, 20}, {20, 100}, {21, 100}, {22, 100}, {23, 100}};\r
+        std::copy(std::begin(temp), std::end(temp), heartdata);\r
+#else\r
+        for (int serialIndex = 0; serialIndex < 24; serialIndex++)\r
+        {\r
+            heartdata[serialIndex].x = serialIndex;\r
+            heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
+        }\r
+#endif\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
+    }\r
+    void HeartRateView::Update_data_Chart(int serialIndex)\r
+    {\r
+#if HEART_DATA_TEST\r
+        Point tmp[NUM_2];\r
+        if (chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM)\r
+        {\r
+            return;\r
+        }\r
+        heartSerial[serialIndex] = new UIChartDataSerial();\r
+        heartdata[serialIndex].x = serialIndex;\r
+        heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
+\r
+        tmp[0].x = tmp[1].x = heartdata[serialIndex].x;\r
+        tmp[0].y = tmp[1].y = heartdata[serialIndex].y;\r
+\r
+        heartSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点\r
+        heartSerial[serialIndex]->AddPoints(tmp, NUM_2);\r
+        heartSerial[serialIndex]->SetLineColor(Color::Red());\r
+        heartSerial[serialIndex]->SetFillColor(Color::Red());\r
+        heartSerial[serialIndex]->EnableGradient(true);\r
+\r
+        heartchart->AddDataSerial(heartSerial[serialIndex]);\r
+        heartchart->Invalidate();\r
+#else\r
+        if (heartchart == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);\r
+            return;\r
+        }\r
+\r
+        heartdata[serialIndex].x = serialIndex;\r
+        heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
+\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
+#endif\r
+    }\r
     void HeartRateView::InsertTopAndBottomRateImage(void)\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start");\r
@@ -449,7 +572,6 @@ namespace OHOS
             minRate = (minRate <= bottom) ? minRate : bottom;\r
         }\r
     }\r
-\r
     void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index)\r
     {\r
         Point tmp[NUM_2];\r
@@ -596,10 +718,12 @@ namespace OHOS
         HeartRateLabelDisplay();\r
         HeartbeatImageAnimator();\r
         HeartRateCoordinate();\r
+        InitChartTest();\r
+        Init_data_Chart();\r
         InsertTopAndBottomRateImage();\r
         HeartRateElectrocardiogram();\r
         UpdataTopAndBottomRate();\r
-        HeartbeatImageAnimatorStop();\r
+        // HeartbeatImageAnimatorStop(); 进入界面进行 动画播放\r
         InitRefreshInterface();\r
         return true;\r
     }\r
@@ -610,9 +734,10 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoadHeartRateImageRes");\r
         if (!resLoadStatus)\r
         {\r
-            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP);\r
-            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM);\r
-            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR);\r
+            /*心率背景图*/\r
+            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_RATE_TOP);\r
+            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_RATE_BOTTOM);\r
+            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_RATE_COOR);\r
             resLoadStatus = true;\r
         }\r
     }\r
@@ -628,9 +753,9 @@ namespace OHOS
             imageViewBottom->SetSrc(img);\r
             imageViewCoordinate->SetSrc(img);\r
             // ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES);\r
-            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATE_TOP, HEART_IAMGES);\r
-            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATE_BOTTOM, HEART_IAMGES);\r
-            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_HEARTRATECOOR, HEART_IAMGES);\r
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_TOP, HEART_IAMGES);\r
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_BOTTOM, HEART_IAMGES);\r
+            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_COOR, HEART_IAMGES);\r
             resLoadStatus = false;\r
         }\r
     }\r
@@ -885,6 +1010,7 @@ namespace OHOS
             }\r
         }\r
     }\r
+\r
 #if 0\r
 #ifdef __cplusplus\r
     extern "C"\r
index 33fa873..adb0195 100644 (file)
@@ -1,3 +1,9 @@
+/*** 
+ * @Date: 2024-08-12 10:11:33
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-13 16:58:23
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/screensetting/src/ScreenModels.cpp
+ */
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-08-05 15:20:03
@@ -67,11 +73,11 @@ bool ScreenModels::LoadAppImages(std::string file, UIImageView *view, uint32_t r
 
 void ScreenModels::PreLoadAppimages(void)
 {
-    LoadAppMultiImages(PLAYER_IAMGES, PLAYER_BACKGROUND, PLAYER_UP_66);
     //LoadAppMultiImages(CLOCK_IAMGES, CLOCK_CLOCK0, CLOCK_SECOND);
+    LoadAppMultiImages(PLAYER_IAMGES, PLAYER_BACKGROUND, PLAYER_UP_66);
     LoadAppMultiImages(COMPASS_IAMGES, COMPASS_COMPASS0, COMPASS_COMPASS2);
     LoadAppMultiImages(DROPDOWN_IAMGES, DROPDOWN_BLUETOOTHCONNECTED, DROPDOWN_SETTING);
-    LoadAppMultiImages(HEART_IAMGES, HEART_HEARTRATECOOR, HEART_HEARTRATE_TOP);
+    LoadAppMultiImages(HEART_IAMGES, HEART_RATE_BOTTOM, HEART_RATE_TOP);
     LoadAppMultiImages(BLOOD_IAMGES, BLOODOXYGEN_BACKGOUND, BLOODOXYGEN_BACKGOUND);
     LoadAppMultiImages(TRAINING_IAMGES, TRAINING_BOUTTONGROUND, TRAINING_WALKING_BIG);
     // LoadAppMultiImages(MESSAGE_IAMGES, MESSAGE_MESSAGE, MESSAGE_WECHAT);
index 5abb0e1..1caba98 100644 (file)
@@ -1,7 +1,7 @@
 /*** 
  * @Date: 2024-07-12 19:25:33
  * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-25 10:22:03
+ * @LastEditTime: 2024-08-15 14:39:51
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/uiservice/include/ui_service.h
  */
 /*
@@ -76,6 +76,7 @@ typedef enum {
     UI_UPDATE_WEATHER_DATA,     //天气数据更新
     UI_UPDATE_SLEEP_DATA,       //更新睡眠数据
     UI_UPDATE_MESSAGE_DATA,     //更新消息数据
+    UI_UPDATE_HEARTRATE_DATA,   //更新心率曲线
 
     UI_AI_JUMP_TO_RESULT_VIEW,  //跳转到返回结果视图
     UI_AI_JUMP_TO_LISTENING_VIEW,//跳转到AI聆听界面     
index 72d2dd6..daaf2fe 100644 (file)
@@ -24,6 +24,7 @@
 #include "player/include/PlayersModel.h"
 #include "sleep/include/SleepModel.h"
 #include "message/include/MessageModel.h"
+#include "heartrate/include/HeartModel.h"
 #include "aivoice/include/AiVoiceModel.h"
 #include "weather/include/WeatherModel.h"
 #include "uiservice/include/ui_service.h"
@@ -50,179 +51,186 @@ extern "C" errcode_t uapi_pm_add_sleep_veto(pm_id_t veto_id);
 extern "C" errcode_t uapi_pm_remove_sleep_veto(pm_id_t veto_id);
 
 #ifdef __cplusplus
-extern "C" {
+extern "C"
+{
 #endif
 
-static const char *GetServiceName(Service *service);
-static BOOL ServiceInitialize(Service *service, Identity identity);
-static TaskConfig GetServiceTaskConfig(Service *service);
-static BOOL ServiceMessageHandle(Service *service, Request *request);
-static void ServiceMsgProcess(Request *request);
-static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen);
-
-static UiService g_uiService = {
-    .GetName = GetServiceName,
-    .Initialize = ServiceInitialize,
-    .MessageHandle = ServiceMessageHandle,
-    .GetTaskConfig = GetServiceTaskConfig,
-    DEFAULT_IUNKNOWN_ENTRY_BEGIN,
-    .SendMsg = SendMsg,
-    DEFAULT_IUNKNOWN_ENTRY_END,
-    .identity = { -1, -1, nullptr },
-};
-
-const int DATA_DIST_STACK_SIZE = 0xC00;
-const int DATA_DIST_MAIL_LENGTH = 10;
-const int BYTE_OFFSET = 8;
-static uint32_t g_interval = 5;
+    static const char *GetServiceName(Service *service);
+    static BOOL ServiceInitialize(Service *service, Identity identity);
+    static TaskConfig GetServiceTaskConfig(Service *service);
+    static BOOL ServiceMessageHandle(Service *service, Request *request);
+    static void ServiceMsgProcess(Request *request);
+    static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen);
+
+    static UiService g_uiService = {
+        .GetName = GetServiceName,
+        .Initialize = ServiceInitialize,
+        .MessageHandle = ServiceMessageHandle,
+        .GetTaskConfig = GetServiceTaskConfig,
+        DEFAULT_IUNKNOWN_ENTRY_BEGIN,
+        .SendMsg = SendMsg,
+        DEFAULT_IUNKNOWN_ENTRY_END,
+        .identity = {-1, -1, nullptr},
+    };
+
+    const int DATA_DIST_STACK_SIZE = 0xC00;
+    const int DATA_DIST_MAIL_LENGTH = 10;
+    const int BYTE_OFFSET = 8;
+    static uint32_t g_interval = 5;
+
+    /* -------------------------------------------------------------------------- */
+    // 消息处理程序的函数指针类型
+    typedef void (*MsgHandlerFunc)(Request *);
+    // 定义一个结构来保存消息处理程序
+    typedef struct
+    {
+        int msgId;
+        MsgHandlerFunc handler;
+    } MsgHandlerEntry;
+
+    // 消息处理程序的函数原型
+    static void HandleJSInstallSuccess(Request *request);
+    static void HandleJSUninstallSuccess(Request *request);
+    static void HandlePhoneConnected(Request *request);
+    static void HandlePhoneDisconnected(Request *request);
+    static void HandleEarphoneConnected(Request *request);
+    static void HandleEarphoneDisconnected(Request *request);
+    static void HandleBluetoothConnected(Request *request);
+    static void HandleBluetoothDisconnected(Request *request);
+    static void HandleAddSleepVeto(Request *request);
+    static void HandleRemoveSleepVeto(Request *request);
+    static void HandleUpdateScreenDuration(Request *request);
+    static void HandleUpdateRaiseToBrightness(Request *request);
+    static void HandleUpdateBrightnessValue(Request *request);
+    static void HandleUpdateWeatherData(Request *request);
+    static void HandleUpdateSystemVolume(Request *request);
+    static void HandleUpdateCallVolume(Request *request);
+    static void HandleUpdateVibrationMode(Request *request);
+    static void HandleUpdateSilentMode(Request *request);
+    static void HandleUpdateDontDisturbMode(Request *request);
+    static void HandleUpdateMusicPlayerList(Request *request);
+    static void HandleAiJumpToResultView(Request *request);
+    static void HandleAiJumpToListeningMessage(Request *request);
+    static void HandleUpdateUserQuestionStr(Request *request);
+    static void HandleUpdateAIAnswerStr(Request *request);
+    static void HandleWatchFirstPaired(Request *request);
+    static void HandleUpdateOBUMessage(Request *request);
+    static void HandleUpdateSleep(Request *request);
+    static void HandleUpdateMessage(Request *request);
+    static void HandleUpdateHeartRate(Request *request);
+
+    // 消息处理程序项数组(每个消息类型对应一个处理函数,函数名以 Handle 开头)
+    MsgHandlerEntry msgHandlers[] = {
+        {JS_INSTALL_SUCESS_TO_UI, HandleJSInstallSuccess},
+        {JS_UNINSTALL_SUCESS_TO_UI, HandleJSUninstallSuccess},
+        {PHONE_CONNECTED_TO_UI, HandlePhoneConnected},
+        {PHONE_DISCONNECTED_TO_UI, HandlePhoneDisconnected},
+        {EARPHONE_CONNECTED_TO_UI, HandleEarphoneConnected},
+        {EARPHONE_DISCONNECTED_TO_UI, HandleEarphoneDisconnected},
+        {BT_CONNECTED_TO_UI, HandleBluetoothConnected},
+        {BT_DISCONNECTED_TO_UI, HandleBluetoothDisconnected},
+        {UI_ADD_SLEEP_VETO, HandleAddSleepVeto},
+        {UI_RM_SLEEP_VETO, HandleRemoveSleepVeto},
+        {UI_UPDATE_SCREEN_DURATION, HandleUpdateScreenDuration},
+        {UI_UPDATE_RAISETOBRIGHTNESS, HandleUpdateRaiseToBrightness},
+        {UI_UPDATE_BRIGHTNESS_VALUE, HandleUpdateBrightnessValue},
+        {UI_UPDATE_WEATHER_DATA, HandleUpdateWeatherData},
+        {UI_UPDATE_SYSTEM_VOLUME, HandleUpdateSystemVolume},
+        {UI_UPDATE_CALL_VOLUME, HandleUpdateCallVolume},
+        {UI_UPDATE_VIBRATION_MODE, HandleUpdateVibrationMode},
+        {UI_UPDATE_SILENT_MODE, HandleUpdateSilentMode},
+        {UI_UPDATE_DNOTDISTURB_MODE, HandleUpdateDontDisturbMode},
+        {UI_UPDATE_MUSIC_PLAYER_LIST, HandleUpdateMusicPlayerList},
+        {UI_AI_JUMP_TO_RESULT_VIEW, HandleAiJumpToResultView},
+        {UI_UPDATE_USER_QUESTION_STR, HandleUpdateUserQuestionStr},
+        {UI_UPDATE_AI_ANSWER_STR, HandleUpdateAIAnswerStr},
+        {UI_HAND_WATCH_FIRST_PAIRED, HandleWatchFirstPaired},
+        {UI_UPDATE_OBU_MESSAGE, HandleUpdateOBUMessage},
+        {UI_AI_JUMP_TO_LISTENING_VIEW, HandleAiJumpToListeningMessage},
+
+        {UI_UPDATE_SLEEP_DATA, HandleUpdateSleep},
+        {UI_UPDATE_MESSAGE_DATA, HandleUpdateMessage},
+        {UI_UPDATE_HEARTRATE_DATA, HandleUpdateHeartRate},
 
-/* -------------------------------------------------------------------------- */
-// 消息处理程序的函数指针类型
-typedef  void (*MsgHandlerFunc)(Request *);
-// 定义一个结构来保存消息处理程序
-typedef struct
-{
-    int msgId;
-    MsgHandlerFunc handler;
-} MsgHandlerEntry;
-
-// 消息处理程序的函数原型
-static void HandleJSInstallSuccess(Request *request);
-static void HandleJSUninstallSuccess(Request *request);
-static void HandlePhoneConnected(Request *request);
-static void HandlePhoneDisconnected(Request *request);
-static void HandleEarphoneConnected(Request *request);
-static void HandleEarphoneDisconnected(Request *request);
-static void HandleBluetoothConnected(Request *request);
-static void HandleBluetoothDisconnected(Request *request);
-static void HandleAddSleepVeto(Request *request);
-static void HandleRemoveSleepVeto(Request *request);
-static void HandleUpdateScreenDuration(Request *request);
-static void HandleUpdateRaiseToBrightness(Request *request);
-static void HandleUpdateBrightnessValue(Request *request);
-static void HandleUpdateWeatherData(Request *request);
-static void HandleUpdateSystemVolume(Request *request);
-static void HandleUpdateCallVolume(Request *request);
-static void HandleUpdateVibrationMode(Request *request);
-static void HandleUpdateSilentMode(Request *request);
-static void HandleUpdateDontDisturbMode(Request *request);
-static void HandleUpdateMusicPlayerList(Request *request);
-static void HandleAiJumpToResultView(Request *request);
-static void HandleAiJumpToListeningMessage(Request *request);
-static void HandleUpdateUserQuestionStr(Request *request);
-static void HandleUpdateAIAnswerStr(Request *request);
-static void HandleWatchFirstPaired(Request *request);
-static void HandleUpdateOBUMessage(Request *request);
-static void HandleUpdateSleep(Request *request);
-static void HandleUpdateMessage(Request *request);
-
-
-// 消息处理程序项数组(每个消息类型对应一个处理函数,函数名以 Handle 开头)
-MsgHandlerEntry msgHandlers[] = {
-    {JS_INSTALL_SUCESS_TO_UI, HandleJSInstallSuccess},
-    {JS_UNINSTALL_SUCESS_TO_UI, HandleJSUninstallSuccess},
-    {PHONE_CONNECTED_TO_UI, HandlePhoneConnected},
-    {PHONE_DISCONNECTED_TO_UI, HandlePhoneDisconnected},
-    {EARPHONE_CONNECTED_TO_UI, HandleEarphoneConnected},
-    {EARPHONE_DISCONNECTED_TO_UI, HandleEarphoneDisconnected},
-    {BT_CONNECTED_TO_UI, HandleBluetoothConnected},
-    {BT_DISCONNECTED_TO_UI, HandleBluetoothDisconnected},
-    {UI_ADD_SLEEP_VETO, HandleAddSleepVeto},
-    {UI_RM_SLEEP_VETO, HandleRemoveSleepVeto},
-    {UI_UPDATE_SCREEN_DURATION, HandleUpdateScreenDuration},
-    {UI_UPDATE_RAISETOBRIGHTNESS, HandleUpdateRaiseToBrightness},
-    {UI_UPDATE_BRIGHTNESS_VALUE, HandleUpdateBrightnessValue},
-    {UI_UPDATE_WEATHER_DATA, HandleUpdateWeatherData},
-    {UI_UPDATE_SYSTEM_VOLUME, HandleUpdateSystemVolume},
-    {UI_UPDATE_CALL_VOLUME, HandleUpdateCallVolume},
-    {UI_UPDATE_VIBRATION_MODE, HandleUpdateVibrationMode},
-    {UI_UPDATE_SILENT_MODE, HandleUpdateSilentMode},
-    {UI_UPDATE_DNOTDISTURB_MODE,HandleUpdateDontDisturbMode},
-    {UI_UPDATE_MUSIC_PLAYER_LIST,HandleUpdateMusicPlayerList},
-    {UI_AI_JUMP_TO_RESULT_VIEW, HandleAiJumpToResultView},
-    {UI_UPDATE_USER_QUESTION_STR,HandleUpdateUserQuestionStr},
-    {UI_UPDATE_AI_ANSWER_STR, HandleUpdateAIAnswerStr},
-    {UI_HAND_WATCH_FIRST_PAIRED,HandleWatchFirstPaired},
-    {UI_UPDATE_OBU_MESSAGE,HandleUpdateOBUMessage},
-    {UI_AI_JUMP_TO_LISTENING_VIEW,HandleAiJumpToListeningMessage},
-
-    {UI_UPDATE_SLEEP_DATA, HandleUpdateSleep},
-    {UI_UPDATE_MESSAGE_DATA, HandleUpdateMessage},
     };
-/* -------------------------------------------------------------------------- */
-void ScreenTurnOn(int32_t timeout)
-{
-    if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1) {
-        return;
-    }
+    /* -------------------------------------------------------------------------- */
+    void ScreenTurnOn(int32_t timeout)
+    {
+        if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1)
+        {
+            return;
+        }
 #if defined(SUPPORT_POWER_MANAGER)
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] timeout = %d", timeout);
-    g_interval = get_back_to_home_interval();
-    set_back_to_home_interval(0xFFFFFFFF);
-    const power_display_svr_api_t *display_api = power_display_svr_get_api();
-    if (display_api->get_screen_state() != SCREEN_ON) {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] turn_on_screen");
-        display_api->turn_on_screen();
-    }
-    display_api->set_screen_set_keepon_timeout(timeout);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] timeout = %d", timeout);
+        g_interval = get_back_to_home_interval();
+        set_back_to_home_interval(0xFFFFFFFF);
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        if (display_api->get_screen_state() != SCREEN_ON)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurn] turn_on_screen");
+            display_api->turn_on_screen();
+        }
+        display_api->set_screen_set_keepon_timeout(timeout);
 #endif
-    return;
-}
-
-void ScreenTurnOff(void)
-{
-    if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1) {
         return;
     }
+
+    void ScreenTurnOff(void)
+    {
+        if (OHOS::HealthModel::GetInstance()->GetBriScrStatus() == 1)
+        {
+            return;
+        }
 #if defined(SUPPORT_POWER_MANAGER)
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurnOff] timeout auto");
-    set_back_to_home_interval(g_interval);
-    const power_display_svr_api_t *display_api = power_display_svr_get_api();
-    display_api->set_screen_set_keepon_timeout(0);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScreenTurnOff] timeout auto");
+        set_back_to_home_interval(g_interval);
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        display_api->set_screen_set_keepon_timeout(0);
 #endif
-    return;
-}
+        return;
+    }
 
-void ScreenOffEnable(int32_t enable)
-{
+    void ScreenOffEnable(int32_t enable)
+    {
 #if defined(SUPPORT_POWER_MANAGER)
-    const power_display_svr_api_t *display_api = power_display_svr_get_api();
-    display_api->set_auto_timeout_function(enable);
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        display_api->set_auto_timeout_function(enable);
 #endif
-}
-
-static void Init()
-{
-    SamgrLite *sm = SAMGR_GetInstance();
-    BOOL result = sm->RegisterService((Service *)&g_uiService);
-    sm->RegisterDefaultFeatureApi(UI_SERVICE, GET_IUNKNOWN(g_uiService));
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService starts %s", result ? "successfully" : "unsuccessfully");
-}
+    }
 
-SYSEX_SERVICE_INIT_PRI(Init, 2);
+    static void Init()
+    {
+        SamgrLite *sm = SAMGR_GetInstance();
+        BOOL result = sm->RegisterService((Service *)&g_uiService);
+        sm->RegisterDefaultFeatureApi(UI_SERVICE, GET_IUNKNOWN(g_uiService));
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService starts %s", result ? "successfully" : "unsuccessfully");
+    }
 
-const char *GetServiceName(Service *service)
-{
-    (void)service;
-    return UI_SERVICE;
-}
+    SYSEX_SERVICE_INIT_PRI(Init, 2);
 
-BOOL ServiceInitialize(Service *service, Identity identity)
-{
-    if (service == nullptr) {
-        return FALSE;
+    const char *GetServiceName(Service *service)
+    {
+        (void)service;
+        return UI_SERVICE;
     }
-    UiService *uiService = reinterpret_cast<UiService *>(service);
-    uiService->identity = identity;
 
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService init serviceId = %d, featureId = %d, queueId = %d",
-                  identity.serviceId, identity.featureId, identity.queueId);
-    return TRUE;
-}
+    BOOL ServiceInitialize(Service *service, Identity identity)
+    {
+        if (service == nullptr)
+        {
+            return FALSE;
+        }
+        UiService *uiService = reinterpret_cast<UiService *>(service);
+        uiService->identity = identity;
 
-void ServiceMsgProcess(Request *request)
-{
-    #if 0
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_UI_SERVICE, "UiService init serviceId = %d, featureId = %d, queueId = %d",
+                      identity.serviceId, identity.featureId, identity.queueId);
+        return TRUE;
+    }
+
+    void ServiceMsgProcess(Request *request)
+    {
+#if 0
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "UiServiceMsgId = %d",request->msgId);
     switch (request->msgId) {
         case JS_INSTALL_SUCESS_TO_UI:
@@ -275,331 +283,345 @@ void ServiceMsgProcess(Request *request)
                 std::bind(&OHOS::DisplayBrightnessModel::UpdateBrightnessValueOfSlider, OHOS::DisplayBrightnessModel::GetInstance()));
             break;
     }
-    #endif
-    /* -------------------------------------------------------------------------- */
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "UiServiceMsgId = %d",request->msgId);
-    for (int i = 0; i < MAX_NUM_HANDLER; ++i)
+#endif
+        /* -------------------------------------------------------------------------- */
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "UiServiceMsgId = %d", request->msgId);
+        for (int i = 0; i < MAX_NUM_HANDLER; ++i)
+        {
+            if (msgHandlers[i].msgId == request->msgId)
+            {
+                msgHandlers[i].handler(request);
+                break;
+            }
+        }
+        /* -------------------------------------------------------------------------- */
+    }
+
+    BOOL ServiceMessageHandle(Service *service, Request *request)
     {
-        if (msgHandlers[i].msgId == request->msgId)
+        (void)service;
+        if (request == nullptr)
         {
-            msgHandlers[i].handler(request);
-            break;
+            return FALSE;
         }
+
+        ServiceMsgProcess(request);
+        return TRUE;
     }
-    /* -------------------------------------------------------------------------- */
-}
 
-BOOL ServiceMessageHandle(Service *service, Request *request)
-{
-    (void)service;
-    if (request == nullptr) {
-        return FALSE;
+    TaskConfig GetServiceTaskConfig(Service *service)
+    {
+        (void)service;
+        TaskConfig config = {LEVEL_HIGH, PRI_NORMAL, DATA_DIST_STACK_SIZE, DATA_DIST_MAIL_LENGTH, SINGLE_TASK};
+        return config;
     }
 
-    ServiceMsgProcess(request);
-    return TRUE;
-}
+    // 发送msg
+    static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen)
+    {
+        int32_t ret;
+        void *sendData = nullptr;
+        if (dataLen > 0)
+        {
+            sendData = malloc(dataLen);
+            if (sendData == nullptr)
+            {
+                return FALSE;
+            }
+            ret = memcpy_s(sendData, dataLen, data, dataLen);
+            if (ret != EOK)
+            {
+                free(sendData);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uiservice sendMsg memcpy_s fail! ret = %d", ret);
+                return FALSE;
+            }
+        }
 
-TaskConfig GetServiceTaskConfig(Service *service)
-{
-    (void)service;
-    TaskConfig config = {LEVEL_HIGH, PRI_NORMAL, DATA_DIST_STACK_SIZE, DATA_DIST_MAIL_LENGTH, SINGLE_TASK};
-    return config;
-}
+        Request request = {
+            .msgId = msgId,
+            .len = dataLen,
+            .msgValue = msgValue,
+            .data = sendData,
+        };
 
-//发送msg
-static int32_t SendMsg(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen)
-{
-    int32_t ret;
-    void *sendData = nullptr;
-    if (dataLen > 0) {
-        sendData = malloc(dataLen);
-        if (sendData == nullptr) {
-            return FALSE;
-        }
-        ret = memcpy_s(sendData, dataLen, data, dataLen);
-        if (ret != EOK) {
-            free(sendData);
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uiservice sendMsg memcpy_s fail! ret = %d", ret);
+        ret = SAMGR_SendRequest(IUNKNOWN_GetIdentity(GET_IUNKNOWN(g_uiService)), &request, nullptr);
+        if (ret != 0)
+        {
+            if (sendData != nullptr)
+            {
+                free(sendData);
+            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "SendMsg failed ret = %d ", ret);
             return FALSE;
         }
-    }
 
-    Request request = {
-        .msgId = msgId,
-        .len = dataLen,
-        .msgValue = msgValue,
-        .data = sendData,
-    };
+        return TRUE;
+    }
 
-    ret = SAMGR_SendRequest(IUNKNOWN_GetIdentity(GET_IUNKNOWN(g_uiService)), &request, nullptr);
-    if (ret != 0) {
-        if (sendData != nullptr) {
-            free(sendData);
+    // 发送msg给ui服务
+    void SendMsgToUIService(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen)
+    {
+        UiServiceFeatureApi *comApi = nullptr;
+        IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(UI_SERVICE);
+        if (iUnknown == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "GetDefaultFeatureApi failed");
+            return;
         }
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "SendMsg failed ret = %d ", ret);
-        return FALSE;
+        int result = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)&comApi);
+        if (result != 0 || comApi == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "QueryInterface comApi failed");
+            return;
+        }
+        comApi->SendMsg(msgId, msgValue, data, dataLen);
+        comApi->Release((IUnknown *)comApi);
     }
 
-    return TRUE;
-}
-
-//发送msg给ui服务
-void SendMsgToUIService(int32_t msgId, uint32_t msgValue, void *data, int32_t dataLen)
-{
-    UiServiceFeatureApi *comApi = nullptr;
-    IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(UI_SERVICE);
-    if (iUnknown == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "GetDefaultFeatureApi failed");
-        return;
-    }
-    int result = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)&comApi);
-    if (result != 0 || comApi == nullptr) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "QueryInterface comApi failed");
-        return;
+    /* -------------------------------------------------------------------------- */
+    void HandleJSInstallSuccess(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s",
+                      request->msgId, ((BundleData *)request->data)->bundleName);
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance()));
     }
-    comApi->SendMsg(msgId, msgValue, data, dataLen);
-    comApi->Release((IUnknown *)comApi);
-}
-
-/* -------------------------------------------------------------------------- */
-void HandleJSInstallSuccess(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s",
-                          request->msgId, ((BundleData *)request->data)->bundleName);
-            GraphicService::GetInstance()->PostGraphicEvent(
-                std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance()));
-}
 
-void HandleJSUninstallSuccess(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s",
-                          request->msgId, ((BundleData *)request->data)->bundleName);
-            GraphicService::GetInstance()->PostGraphicEvent(
-                std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance()));
-}
+    void HandleJSUninstallSuccess(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "bms msg_id = %d bundleName = %s",
+                      request->msgId, ((BundleData *)request->data)->bundleName);
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::ApplistModel::ApplistUpdate, &OHOS::ApplistModel::GetInstance()));
+    }
 
-//处理手机连接成功
-void HandlePhoneConnected(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneConnectStatus");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true));
-}
+    // 处理手机连接成功
+    void HandlePhoneConnected(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneConnectStatus");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true));
+    }
 
-//处理手机断开连接
-void HandlePhoneDisconnected(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneDisconnected");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false));
-}
+    // 处理手机断开连接
+    void HandlePhoneDisconnected(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandlePhoneDisconnected");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SettingModel::UpdatePhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false));
+    }
 
-//处理耳机连接成功
-void HandleEarphoneConnected(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true));
-}
+    // 处理耳机连接成功
+    void HandleEarphoneConnected(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), true));
+    }
 
-//处理耳机断开连接
-void HandleEarphoneDisconnected(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false));
-}
+    // 处理耳机断开连接
+    void HandleEarphoneDisconnected(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleEarphoneConnected");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SettingModel::UpdateEarPhoneConnectStatus, &OHOS::SettingModel::GetInstance(), false));
+    }
 
-//处理蓝牙连接成功
-void HandleBluetoothConnected(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothConnected");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), true));
-}
+    // 处理蓝牙连接成功
+    void HandleBluetoothConnected(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothConnected");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), true));
+    }
 
-//处理蓝牙断开连接
-void HandleBluetoothDisconnected(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothDisconnected");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), false));
-}
+    // 处理蓝牙断开连接
+    void HandleBluetoothDisconnected(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleBluetoothDisconnected");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SettingModel::UpdateBlueToothConnectStatus, &OHOS::SettingModel::GetInstance(), false));
+    }
 
-// void HandleScreenTurnOn(Request *request)
-// {
-//     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOn");
-//     ScreenTurnOn(request);
-// }
-
-// void HandleScreenTurnOff(Request *request)
-// {
-//     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOff");
-//     ScreenTurnOff(request);
-// }
-
-// void HandleScreenOffEnable(Request *request)
-// {
-//     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenOffEnable");
-//     ScreenOffEnable(request);
-// }
-
-void HandleAddSleepVeto(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAddSleepVeto");
-    uapi_pm_add_sleep_veto(PM_ID_SCREEN);
-}
+    // void HandleScreenTurnOn(Request *request)
+    // {
+    //     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOn");
+    //     ScreenTurnOn(request);
+    // }
+
+    // void HandleScreenTurnOff(Request *request)
+    // {
+    //     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenTurnOff");
+    //     ScreenTurnOff(request);
+    // }
+
+    // void HandleScreenOffEnable(Request *request)
+    // {
+    //     WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleScreenOffEnable");
+    //     ScreenOffEnable(request);
+    // }
+
+    void HandleAddSleepVeto(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAddSleepVeto");
+        uapi_pm_add_sleep_veto(PM_ID_SCREEN);
+    }
 
-void HandleRemoveSleepVeto(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleRemoveSleepVeto");
-    uapi_pm_remove_sleep_veto(PM_ID_SCREEN);
-}
+    void HandleRemoveSleepVeto(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleRemoveSleepVeto");
+        uapi_pm_remove_sleep_veto(PM_ID_SCREEN);
+    }
 
-//处理更新选择的亮屏时长标签内容
-void HandleUpdateScreenDuration(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateScreenDuration");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::DisplayBrightnessModel::UpdateSelectScreenDurationLabel, OHOS::DisplayBrightnessModel::GetInstance()));
-}
+    // 处理更新选择的亮屏时长标签内容
+    void HandleUpdateScreenDuration(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateScreenDuration");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::DisplayBrightnessModel::UpdateSelectScreenDurationLabel, OHOS::DisplayBrightnessModel::GetInstance()));
+    }
 
-//处理更新抬腕亮屏按钮状态
-void HandleUpdateRaiseToBrightness(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateRaiseToBrightness");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::DisplayBrightnessModel::UpdateRaiseToBrightnessCheckBoxButtonStatus, OHOS::DisplayBrightnessModel::GetInstance()));
-}
+    // 处理更新抬腕亮屏按钮状态
+    void HandleUpdateRaiseToBrightness(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateRaiseToBrightness");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::DisplayBrightnessModel::UpdateRaiseToBrightnessCheckBoxButtonStatus, OHOS::DisplayBrightnessModel::GetInstance()));
+    }
 
-//处理更新亮度条的亮度值值
-void HandleUpdateBrightnessValue(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateBrightnessValue");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::DisplayBrightnessModel::UpdateBrightnessValueOfSlider, OHOS::DisplayBrightnessModel::GetInstance()));
-}
+    // 处理更新亮度条的亮度值值
+    void HandleUpdateBrightnessValue(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateBrightnessValue");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::DisplayBrightnessModel::UpdateBrightnessValueOfSlider, OHOS::DisplayBrightnessModel::GetInstance()));
+    }
 
-//处理更新天气数据
-static void HandleUpdateWeatherData(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateWeatherData");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::WeatherModel::UpdateMainWeatherData, &OHOS::WeatherModel::GetInstance()));
-}
+    // 处理更新天气数据
+    static void HandleUpdateWeatherData(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateWeatherData");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::WeatherModel::UpdateMainWeatherData, &OHOS::WeatherModel::GetInstance()));
+    }
 
-//处理更新系统音量
-void HandleUpdateSystemVolume(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSystemVolume");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SoundAndVibrationModel::UpdateSystemVolume, OHOS::SoundAndVibrationModel::GetInstance()));
-}
+    // 处理更新系统音量
+    void HandleUpdateSystemVolume(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSystemVolume");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SoundAndVibrationModel::UpdateSystemVolume, OHOS::SoundAndVibrationModel::GetInstance()));
+    }
 
-//处理更新通话音量
-void HandleUpdateCallVolume(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateCallVolume");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SoundAndVibrationModel::UpdateCallVolume, OHOS::SoundAndVibrationModel::GetInstance()));
-}
+    // 处理更新通话音量
+    void HandleUpdateCallVolume(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateCallVolume");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SoundAndVibrationModel::UpdateCallVolume, OHOS::SoundAndVibrationModel::GetInstance()));
+    }
 
-//处理更新震动模式
-void HandleUpdateVibrationMode(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateVibrationMode");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SoundAndVibrationModel::UpdateVibrationModePickerSelectIndex, OHOS::SoundAndVibrationModel::GetInstance()));
-}
+    // 处理更新震动模式
+    void HandleUpdateVibrationMode(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateVibrationMode");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SoundAndVibrationModel::UpdateVibrationModePickerSelectIndex, OHOS::SoundAndVibrationModel::GetInstance()));
+    }
 
-//处理更新静音模式
-void HandleUpdateSilentMode(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSilentMode");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SoundAndVibrationModel::UpdateSilentModeSwitch, OHOS::SoundAndVibrationModel::GetInstance()));
-}
+    // 处理更新静音模式
+    void HandleUpdateSilentMode(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSilentMode");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SoundAndVibrationModel::UpdateSilentModeSwitch, OHOS::SoundAndVibrationModel::GetInstance()));
+    }
 
-//处理更新勿扰模式
-void HandleUpdateDontDisturbMode(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateDontDisturbMode");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::DnotDisturbModel::UpdateDoNotDisturbMode, &OHOS::DnotDisturbModel::GetInstance()));
-}
+    // 处理更新勿扰模式
+    void HandleUpdateDontDisturbMode(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateDontDisturbMode");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::DnotDisturbModel::UpdateDoNotDisturbMode, &OHOS::DnotDisturbModel::GetInstance()));
+    }
 
-//处理更新音乐列表
-void HandleUpdateMusicPlayerList(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMusicPlayerList");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::PlayersModel::UpdateMusicPlayerList, OHOS::PlayersModel::GetInstance()));
-}
+    // 处理更新音乐列表
+    void HandleUpdateMusicPlayerList(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMusicPlayerList");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::PlayersModel::UpdateMusicPlayerList, OHOS::PlayersModel::GetInstance()));
+    }
 
-//处理Ai回应的用户数据
-void HandleAiJumpToResultView(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToResultView");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::AiVoiceModel::ChangeToReturnResultTextView, &OHOS::AiVoiceModel::GetInstance()));
-}
+    // 处理Ai回应的用户数据
+    void HandleAiJumpToResultView(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToResultView");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::AiVoiceModel::ChangeToReturnResultTextView, &OHOS::AiVoiceModel::GetInstance()));
+    }
 
-//处理更新用户问题字符串
-void HandleUpdateUserQuestionStr(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateUserQuestionStr");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::AiVoiceModel::UpdateUserQuestionStr, &OHOS::AiVoiceModel::GetInstance()));
-}
+    // 处理更新用户问题字符串
+    void HandleUpdateUserQuestionStr(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateUserQuestionStr");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::AiVoiceModel::UpdateUserQuestionStr, &OHOS::AiVoiceModel::GetInstance()));
+    }
 
-//处理更新AI答案字符串
-void HandleUpdateAIAnswerStr(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateAIAnswerStr");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::AiVoiceModel::UpdateAiAnswerStr, &OHOS::AiVoiceModel::GetInstance()));
-}
+    // 处理更新AI答案字符串
+    void HandleUpdateAIAnswerStr(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateAIAnswerStr");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::AiVoiceModel::UpdateAiAnswerStr, &OHOS::AiVoiceModel::GetInstance()));
+    }
 
-//处理手表第一次启动用来跳转主界面的
-void HandleWatchFirstPaired(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleWatchFirstPaired");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::RebootAndShutdownModel::HandFirstTimeStartJumpToMainView, &OHOS::RebootAndShutdownModel::GetInstance()));
-}
+    // 处理手表第一次启动用来跳转主界面的
+    void HandleWatchFirstPaired(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleWatchFirstPaired");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::RebootAndShutdownModel::HandFirstTimeStartJumpToMainView, &OHOS::RebootAndShutdownModel::GetInstance()));
+    }
 
-//处理更新OBU Message
-void HandleUpdateOBUMessage(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateOBUMessage");
-    // GraphicService::GetInstance()->PostGraphicEvent(
-    //     std::bind(&OHOS::OBUMessageModel::UpdateOBUMessageViewData, &OHOS::OBUMessageModel::GetInstance()));
-}
+    // 处理更新OBU Message
+    void HandleUpdateOBUMessage(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateOBUMessage");
+        // GraphicService::GetInstance()->PostGraphicEvent(
+        //     std::bind(&OHOS::OBUMessageModel::UpdateOBUMessageViewData, &OHOS::OBUMessageModel::GetInstance()));
+    }
 
-//处理更新查询AI模型是否连接成功的状态
-void HandleAiJumpToListeningMessage(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToListeningMessage");
-    bool state = *((bool*)request->data);
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::AiVoiceModel::ChangeToAIVoiceListeningView, &OHOS::AiVoiceModel::GetInstance(),state));
-}
+    // 处理更新查询AI模型是否连接成功的状态
+    void HandleAiJumpToListeningMessage(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToListeningMessage");
+        bool state = *((bool *)request->data);
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::AiVoiceModel::ChangeToAIVoiceListeningView, &OHOS::AiVoiceModel::GetInstance(), state));
+    }
 
-//更新睡眠数据
-void HandleUpdateSleep(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSleep");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance()));
-}
-//更新消息数据
-void HandleUpdateMessage(Request *request)
-{
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMessage");
-    GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::MessageModel::UpdateMessageView, &OHOS::MessageModel::GetInstance()));
-}
+    // 更新睡眠数据
+    void HandleUpdateSleep(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateSleep");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::SleepModel::UpdateSleepView, &OHOS::SleepModel::GetInstance()));
+    }
+    // 更新消息数据
+    void HandleUpdateMessage(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMessage");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::MessageModel::UpdateMessageView, &OHOS::MessageModel::GetInstance()));
+    }
+    void HandleUpdateHeartRate(Request *request)
+    {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleUpdateMessage");
+        GraphicService::GetInstance()->PostGraphicEvent(
+            std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));
+    }
 /* -------------------------------------------------------------------------- */
 #ifdef __cplusplus
 }
index 8c96435..0d1144e 100755 (executable)
@@ -1,9 +1,10 @@
 /*\r
+\r
  * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
  * Description: heartRate view\r
  * Author:\r
  * Create: 2021-07-26\r
- */\r
+   */\r
 \r
 #include <securec.h>\r
 #include "HeartRateView.h"\r
 #include "ScreenModels.h"\r
 #include "ui_resource_image.h"\r
 #include "common/image_cache_manager.h"\r
-\r
-namespace OHOS {\r
-static HeartRateView *g_pHeartRateView = nullptr;\r
+#define HEART_DATA_TEST 1\r
+namespace OHOS\r
+{\r
+    static HeartRateView *g_pHeartRateView = nullptr;\r
 \r
 // 背景坐标图形\r
-#define ACT_IMAGE_X 0                               // 图片坐标起点\r
-#define ACT_IMAGE_Y 115                             // 图片坐标起点\r
-#define ACT_IMAGE_COOR_X 45                         // 200刻度线到最左端的像素点\r
+#define ACT_IMAGE_X 38                              // 图片坐标起点\r
+#define ACT_IMAGE_Y 130                             // 图片坐标起点\r
+#define ACT_IMAGE_COOR_X 80                         // 200刻度线到最左端的像素点\r
 #define ACT_IMAGE_COOR_Y 145                        // 200刻度线到顶端的像素点\r
 #define ACT_IMAGE_COOR_PIXELS 160                   // 实际背景坐标0到200心率值的实际像素点\r
 #define ACT_IMAGE_COOR_VALUE HEART_RATE_LIMIT_UPPER // 图片刻度表示的心率范围\r
-#define ACT_IMAGE_COOR_WIDTH 454\r
-#define ACT_IMAGE_COOR_HEIGHT 220\r
+#define ACT_IMAGE_COOR_WIDTH 390\r
+#define ACT_IMAGE_COOR_HEIGHT 200\r
 \r
 // 心电图坐标适配\r
 #define COORDINATE_VALUE 5 // 余量\r
@@ -38,8 +40,8 @@ static HeartRateView *g_pHeartRateView = nullptr;
 // 心形心跳\r
 #define HEARTBEAT_IMAGE_WIDTH 92\r
 #define HEARTBEAT_IMAGE_HEIGHT 92\r
-#define HEARTBEAT_IMAGE_X 130\r
-#define HEARTBEAT_IMAGE_Y 25\r
+#define HEARTBEAT_IMAGE_X 105\r
+#define HEARTBEAT_IMAGE_Y 50\r
 #define HEARTBEAT_IMAGE_NUM 19\r
 #define HEARTBEAT_DELAY 50\r
 \r
@@ -89,10 +91,10 @@ static HeartRateView *g_pHeartRateView = nullptr;
 #define REST_HEART_TEXT_HEIGHT2 (REST_HEART_TEXT_FONT_SIZE + 5)\r
 \r
 // 每秒心率\r
-#define PERSEC_HEART_RATE_FONT_SIZE 45\r
-#define PERSEC_HEART_RATE_X 225\r
-#define PERSEC_HEART_RATE_Y 55\r
-#define PERSEC_HEART_RATE_WIDTH 90\r
+#define PERSEC_HEART_RATE_FONT_SIZE 60\r
+#define PERSEC_HEART_RATE_X 202\r
+#define PERSEC_HEART_RATE_Y 62\r
+#define PERSEC_HEART_RATE_WIDTH 102\r
 #define PERSEC_HEART_RATE_HEIGHT (PERSEC_HEART_RATE_FONT_SIZE + 5)\r
 \r
 #define PERSEC_HEART_TEXT_FONT_SIZE 30\r
@@ -101,686 +103,898 @@ static HeartRateView *g_pHeartRateView = nullptr;
 #define PERSEC_HEART_TEXT_WIDTH 75\r
 #define PERSEC_HEART_TEXT_HEIGHT (PERSEC_HEART_TEXT_FONT_SIZE + 5)\r
 \r
-// 心跳image\r
-static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
-    {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-\r
-    {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-    {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT,\r
-        IMG_SRC_FILE_PATH},\r
-};\r
-\r
-HeartRateView::HeartRateView()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView");\r
-    dataNume = 0;\r
-    currIndex = 0;\r
-    serialIndex = 0;\r
-    maxRate = 0;\r
-    minRate = HEART_RATE_LIMIT_UPPER;\r
-    InitHeartRateData();\r
-    SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
-\r
-    g_pHeartRateView = this;\r
-}\r
-\r
-HeartRateView::~HeartRateView()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView");\r
-    if (viewiInitStatus) {\r
-        int32_t i;\r
-        RemoveAll();\r
-        delete imageViewCoordinate;\r
-        imageViewCoordinate = nullptr;\r
-\r
-        chart->ClearDataSerial();\r
-        for (i = 0; i < HEART_AVE_NUM; i++) {\r
-            delete dataSerial[i];\r
-            dataSerial[i] = nullptr;\r
-        }\r
-        delete chart;\r
-        chart = nullptr;\r
-        delete imageViewTop;\r
-        imageViewTop = nullptr;\r
-        delete imageViewBottom;\r
-        imageViewBottom = nullptr;\r
-        delete dataTopAndbottom;\r
-        dataTopAndbottom = nullptr;\r
-        imageAnimator->Stop();\r
-        delete imageAnimator;\r
-        imageAnimator = nullptr;\r
-        delete topRate;\r
-        topRate = nullptr;\r
-        delete bottomRate;\r
-        bottomRate = nullptr;\r
-        delete ratePerSec;\r
-        ratePerSec = nullptr;\r
-        delete ratePerSecText;\r
-        ratePerSecText = nullptr;\r
-        delete restRate;\r
-        restRate = nullptr;\r
-        delete restRateText1;\r
-        restRateText1 = nullptr;\r
-        delete restRateText2;\r
-        restRateText2 = nullptr;\r
-    }\r
-    g_pHeartRateView = nullptr;\r
-}\r
-\r
-HeartRateView *HeartRateView::GetInstance(void)\r
-{\r
-    return g_pHeartRateView;\r
-}\r
-\r
-int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值\r
-{\r
-    heartRateData[0].x = INVALID_HEART_VALUE;\r
-    heartRateData[0].y = INVALID_HEART_VALUE;\r
-\r
-    int32_t ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM);\r
-    if (ret != 0) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret);\r
-    }\r
-    return ret;\r
-}\r
-\r
-int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize)\r
-{\r
-    if (rateData == nullptr) {\r
-        return OHOS_FAILURE;\r
-    }\r
-\r
-    if (rateDataSize > sizeof(Point) * HEART_AVE_NUM) {\r
-        rateDataSize = sizeof(Point) * HEART_AVE_NUM;\r
-    }\r
-    InitHeartRateData();\r
-    int32_t ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize);\r
-    if (ret != EOK) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret);\r
-        return OHOS_FAILURE;\r
-    }\r
-    return OHOS_SUCCESS;\r
-}\r
-\r
-\r
-int32_t HeartRateView::HeartRateDataProc(void)\r
-{\r
-    Point datain[HEART_AVE_NUM];\r
-    int32_t ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM);\r
-    if (ret != EOK) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret);\r
-        return OHOS_FAILURE;\r
-    }\r
-\r
-    ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值\r
-    if (ret != EOK) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret);\r
-        return OHOS_FAILURE;\r
-    }\r
-\r
-    dataNume = 0;\r
-    for (int32_t i = 0; i < HEART_AVE_NUM; i++) {\r
-        if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 &&\r
-            datain[i].y <= HEART_RATE_LIMIT_UPPER) {\r
-            rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE;\r
-            rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE;\r
-            dataNume++;\r
-        }\r
-    }\r
-    return OHOS_SUCCESS;\r
-}\r
-\r
-void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo)\r
-{\r
-    label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize);\r
-    label->SetPosition(labelInfo.x, labelInfo.y);\r
-    label->Resize(labelInfo.width, labelInfo.height);\r
-    label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    Add(label);\r
-}\r
-\r
-void HeartRateView::HeartRateLabelDisplay(void)\r
-{\r
-    LabelInfo PerSecLabel = { PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y,\r
-                              PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT };\r
-    LabelInfo PerSecTextLabel = { PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y,\r
-                                  PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT };\r
-\r
-    LabelInfo topLabel = { HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT };\r
-    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
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail");\r
-    }\r
-\r
-    // 实时心率\r
-    SetLabel(ratePerSec, PerSecLabel);\r
-    SetLabel(ratePerSecText, PerSecTextLabel);\r
-    ratePerSec->SetText("--");\r
-    ratePerSecText->SetText("次/分");\r
-\r
-    // 最高最低心率\r
-    SetLabel(topRate, topLabel);\r
-    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
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start");\r
-    // 坐标图片\r
-    imageViewCoordinate = new UIImageView();\r
-    if (imageViewCoordinate == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail");\r
-        return;\r
-    }\r
-    imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y);\r
-    imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH);\r
-    imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT);\r
-    Add(imageViewCoordinate);\r
-\r
-    //  心电图坐标适配\r
-    chart = new UIChartPolyline();\r
-    if (chart == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail");\r
-        return;\r
-    }\r
-    chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
-    chart->SetWidth(COORDINATE_WIDTH);\r
-    chart->SetHeight(COORDINATE_HEIGHT);\r
-    chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
-    chart->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
-    chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width\r
-\r
-    UIXAxis &xAxis = chart->GetXAxis();\r
-    UIYAxis &yAxis = chart->GetYAxis();\r
-    xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数\r
-    yAxis.SetDataRange(0, COORDINATE_HEIGHT);\r
-    xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
-    yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
-    chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
-    Add(chart);\r
-}\r
-\r
-void HeartRateView::InsertTopAndBottomRateImage(void)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start");\r
-    imageViewTop = new UIImageView();\r
-    imageViewBottom = new UIImageView();\r
-    if (imageViewTop == nullptr || imageViewBottom == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail");\r
-        return;\r
-    }\r
-    imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y);\r
-    imageViewTop->SetWidth(TOP_IMAGE_WIDTH);\r
-    imageViewTop->SetHeight(TOP_IMAGE_HEIGHT);\r
-    Add(imageViewTop);\r
-    imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y);\r
-    imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH);\r
-    imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT);\r
-    Add(imageViewBottom);\r
-}\r
-\r
-void HeartRateView::UpdataTopAndBottomRate(void)\r
-{\r
-    if (chart == nullptr) {\r
-        return;\r
-    }\r
-    if (dataTopAndbottom != nullptr) {\r
-        chart->DeleteDataSerial(dataTopAndbottom);\r
-        delete dataTopAndbottom;\r
-        dataTopAndbottom = nullptr;\r
-    }\r
-    dataTopAndbottom = new UIChartDataSerial();\r
-    if (dataTopAndbottom == nullptr) {\r
-        return;\r
-    }\r
-    if (dataNume != 1) {\r
-        dataTopAndbottom->SetMaxDataCount(dataNume);        // number of data points\r
-        dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points\r
-    } else {\r
-        Point tmp[NUM_2];\r
-        tmp[0].x = tmp[1].x = rateDataTmp[0].x;\r
-        tmp[0].y = tmp[1].y = rateDataTmp[0].y;\r
-        dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points\r
-        dataTopAndbottom->AddPoints(tmp, NUM_2);  // number of data points\r
-    }\r
-    dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明\r
-    chart->AddDataSerial(dataTopAndbottom);\r
-    chart->Invalidate();\r
-\r
-    UIChartDataSerial::PointStyle pointStyle;\r
-    // 最低心跳\r
-    dataTopAndbottom->EnableBottomPoint(true);\r
-    pointStyle.radius = BOTTOM_RADIUS; // Inner radius\r
-    pointStyle.fillColor = Color::Gray();\r
-    pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width\r
-    pointStyle.strokeColor = Color::Black();\r
-    dataTopAndbottom->SetBottomPointStyle(pointStyle);\r
-    chart->Invalidate();\r
-\r
-    uint16_t bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
-    // 最高心跳\r
-    dataTopAndbottom->EnableTopPoint(true);\r
-    pointStyle.fillColor = Color::Red();\r
-    pointStyle.radius = TOP_RADIUS; // Inner radius\r
-    pointStyle.strokeColor = Color::Black();\r
-    pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width\r
-    dataTopAndbottom->SetTopPointStyle(pointStyle);\r
-    chart->Invalidate();\r
-\r
-    uint16_t top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
-    if (top <= HEART_RATE_LIMIT_UPPER) {\r
-        maxRate = (maxRate >= top) ? maxRate : top;\r
-    }\r
-    if (bottom != 0) {\r
-        minRate = (minRate <= bottom) ? minRate : bottom;\r
-    }\r
-}\r
-\r
-void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index)\r
-{\r
-    Point tmp[NUM_2];\r
-\r
-    if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) {\r
-        return;\r
-    }\r
-\r
-    tmp[0].x = tmp[1].x = rateData[index].x;\r
-    tmp[0].y = tmp[1].y = rateData[index].y;\r
-\r
-    dataSerial[serialIndex] = new UIChartDataSerial();\r
-    if (dataSerial[serialIndex] == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex);\r
-        serialIndex++;\r
-        return;\r
-    }\r
-\r
-    dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点\r
-    dataSerial[serialIndex]->AddPoints(tmp, NUM_2);\r
-    dataSerial[serialIndex]->SetLineColor(Color::Red());\r
-    dataSerial[serialIndex]->SetFillColor(Color::Red());\r
-    dataSerial[serialIndex]->EnableGradient(true);\r
-\r
-    chart->AddDataSerial(dataSerial[serialIndex]);\r
-    chart->Invalidate();\r
-    serialIndex++;\r
-}\r
-\r
-void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume)\r
-{\r
-    uint16_t i = 0;\r
-    uint16_t j = 0;\r
-    uint16_t tmp = 1;\r
-    if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM) {\r
-        return;\r
-    }\r
-\r
-    while (i < rateDataNume) {\r
-        while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4)) { // 15分钟对应的秒数\r
-            tmp++;\r
-            j++;\r
-        }\r
-        if (tmp == 1) {\r
-            ElectrocardiogramOnePoint(rateData, i);\r
-        } else {\r
-            if (serialIndex >= HEART_AVE_NUM) {\r
-                return;\r
-            }\r
-            if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0) {\r
-                dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points\r
-                chart->Invalidate();\r
-            } else {\r
-                dataSerial[serialIndex] = new UIChartDataSerial();\r
-                if (dataSerial[serialIndex] == nullptr) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex);\r
-                    serialIndex++;\r
-                    return;\r
-                }\r
-\r
-                dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points\r
-                dataSerial[serialIndex]->AddPoints(rateData + i, tmp);   // number of data points\r
-                dataSerial[serialIndex]->SetLineColor(Color::Red());\r
-                dataSerial[serialIndex]->SetFillColor(Color::Red());\r
-                dataSerial[serialIndex]->EnableGradient(true);\r
-\r
-                chart->AddDataSerial(dataSerial[serialIndex]);\r
-                chart->Invalidate();\r
-                serialIndex++;\r
-            }\r
-        }\r
-        i += tmp;\r
-        j = i;\r
-        tmp = 1;\r
-    }\r
-}\r
-\r
-void HeartRateView::HeartRateElectrocardiogram(void)\r
-{\r
-    if (dataNume == 0) {\r
-        return;\r
-    }\r
-    serialIndex = 0;\r
-    if (dataNume != 1) {\r
-        ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点\r
-    } else {\r
-        ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点\r
-    }\r
-    currIndex = dataNume;\r
-}\r
-\r
-void HeartRateView::HeartbeatImageAnimator()\r
-{\r
-    imageAnimator = new UIImageAnimatorView();\r
-    if (imageAnimator == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail");\r
-        return;\r
-    }\r
-    imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT);\r
-    imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY);\r
-    imageAnimator->SetRepeat(true);\r
-    Add(imageAnimator);\r
-    imageAnimator->Start();\r
-}\r
-\r
-void HeartRateView::HeartbeatImageAnimatorStart(void)\r
-{\r
-    if (imageAnimator != nullptr) {\r
-        imageAnimator->Start();\r
-    }\r
-}\r
-\r
-void HeartRateView::HeartbeatImageAnimatorStop(void)\r
-{\r
-    if (imageAnimator != nullptr) {\r
-        imageAnimator->Stop();\r
-    }\r
-}\r
-\r
-bool HeartRateView::InitView(void)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitView");\r
-    HeartRateDataProc();\r
-    HeartRateLabelDisplay();\r
-    HeartbeatImageAnimator();\r
-    HeartRateCoordinate();\r
-    InsertTopAndBottomRateImage();\r
-    HeartRateElectrocardiogram();\r
-    UpdataTopAndBottomRate();\r
-    HeartbeatImageAnimatorStop();\r
-    InitRefreshInterface();\r
-    return true;\r
-}\r
-\r
-void HeartRateView::PreLoad(void)\r
-{\r
-    if (!viewiInitStatus) {\r
-        if (InitView()) {\r
-            viewiInitStatus = true;\r
-        }\r
-    }\r
-\r
-    if (!resLoadStatus) {\r
-        ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP);\r
-        ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM);\r
-        ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR);\r
-        resLoadStatus = true;\r
-    }\r
-}\r
-\r
-void HeartRateView::UnLoad(void)\r
-{\r
-    if (resLoadStatus) {\r
-        ImageInfo* img = nullptr;\r
-        imageViewTop->SetSrc(img);\r
-        imageViewBottom->SetSrc(img);\r
-        imageViewCoordinate->SetSrc(img);\r
-        ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES);\r
-        resLoadStatus = false;\r
-    }\r
-}\r
-\r
-void HeartRateView::InitRefreshInterface(void)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface");\r
-\r
-    Point *rateData = HeartModel::GetInstance()->GetAveHeartRate();\r
-    uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount();\r
-    SetHeartRateData(rateData, sizeof(Point) * len);\r
-    uint16_t maxHeartRate = HeartModel::GetInstance()->GetHeartRateMax();\r
-    uint16_t minHeartRate = HeartModel::GetInstance()->GetHeartRateMin();\r
-    RefreshElectrocardiogram();\r
-    if (maxHeartRate > 0 && maxHeartRate < HEART_RATE_LIMIT_UPPER) {\r
-        RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax());\r
-    }\r
-    if (minHeartRate > 0 && minHeartRate < HEART_RATE_LIMIT_UPPER) {\r
-        RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin());\r
-    }\r
-}\r
-\r
-// 刷新心率曲线\r
-void HeartRateView::RefreshElectrocardiogram(void)\r
-{\r
-    int32_t ret = HeartRateDataProc();\r
-    if (ret != OHOS_SUCCESS) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail");\r
-        return;\r
-    }\r
-    Point *rate = rateDataTmp;\r
-\r
-    if (chart == nullptr) {\r
-        return;\r
-    }\r
-\r
-    if (currIndex >= HEART_AVE_NUM) {\r
-        currIndex = HEART_AVE_NUM;\r
-    }\r
-    if (dataNume > currIndex) {\r
-        uint16_t tmp = dataNume - currIndex;\r
-        if (currIndex > 0) {\r
-            rate += (currIndex - 1);\r
-            tmp += 1;\r
-        }\r
-        ElectrocardiogramMultiPoint(rate, tmp);\r
-        currIndex = dataNume;\r
-    } else if (dataNume == currIndex) { // 当前点平均心率刷新\r
-        if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr) {\r
-            Point modPoint;\r
-            modPoint.x = rate[currIndex - 1].x;\r
-            modPoint.y = rate[currIndex - 1].y;\r
-\r
-            uint16_t count = dataSerial[serialIndex - 1]->GetDataCount();\r
-            dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint);\r
-            chart->Invalidate();\r
-        }\r
-    } else {\r
-        return;\r
-    }\r
-    UpdataTopAndBottomRate(); // 最高、最低心率\r
-}\r
-\r
-// 清空心率曲线\r
-void HeartRateView::ClearElectrocardiogram(void)\r
-{\r
-    int32_t i;\r
-    dataNume = 0;\r
-    currIndex = 0;\r
-    maxRate = 0;\r
-    minRate = HEART_RATE_LIMIT_UPPER;\r
-    InitHeartRateData();\r
-\r
-    if (chart == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr");\r
-        return;\r
-    }\r
-\r
-    if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr) {\r
-        ratePerSec->SetText("--");\r
-        topRate->SetText("--");\r
-        bottomRate->SetText("--");\r
-        restRate->SetText("--");\r
-    }\r
-\r
-    chart->DeleteDataSerial(dataTopAndbottom);\r
-    delete dataTopAndbottom;\r
-    dataTopAndbottom = nullptr;\r
-    for (i = 0; i < serialIndex; i++) {\r
-        delete dataSerial[i];\r
-        dataSerial[i] = nullptr;\r
-    }\r
-    chart->ClearDataSerial();\r
-\r
-    serialIndex = 0;\r
-    chart->Invalidate();\r
-}\r
-\r
-// 刷新每秒上报的心率\r
-void HeartRateView::RefreshHeartRatePerSec(uint16_t value)\r
-{\r
-    char heartRate[NUM_4] = "--";\r
-    int32_t ret = 0;\r
-\r
-    if (ratePerSec == nullptr) {\r
-        return;\r
-    }\r
-\r
-    if (value == 0) {\r
-        ratePerSec->SetText("--");\r
-        HeartbeatImageAnimatorStop();\r
-        return;\r
-    }\r
-    HeartbeatImageAnimatorStart();\r
-    if (value > NUM_99) {\r
-        ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
-    } else {\r
-        ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
-    }\r
-    if (ret > EOK) {\r
-        ratePerSec->SetText(heartRate);\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
-        return;\r
-    }\r
-    if (maxRate <= HEART_RATE_LIMIT_LOWER) {\r
-        topRate->SetText("--");\r
-        return;\r
-    }\r
-    ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
-    if (ret > EOK) {\r
-        topRate->SetText(top);\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
-        return;\r
-    }\r
-    if (minRate >= HEART_RATE_LIMIT_UPPER) {\r
-        bottomRate->SetText("--");\r
-        return;\r
-    }\r
-    ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
-    if (ret > EOK) {\r
-        bottomRate->SetText(bottom);\r
-    }\r
-}\r
-\r
-// 刷新静息心率\r
-void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
-{\r
-    char heartRate[NUM_4] = "--";\r
-    int32_t ret = 0;\r
-\r
-    if (restRate == nullptr) {\r
-        return;\r
-    }\r
-\r
-    if (value == 0 || value == (uint16_t)0xFFFF) { // 无效值\r
-        restRate->SetText("--");\r
-    } else {\r
-        if (value > NUM_99) {\r
-            ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value);\r
-        } else {\r
-            ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value);\r
-        }\r
-\r
-        if (ret > EOK) {\r
-            restRate->SetText(heartRate);\r
-        }\r
-    }\r
-}\r
-} // namespace OHOS\r
+​    // 心跳image\r
+​    static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
+​        {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+\r
+​        {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​        {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
+​    };\r
+\r
+​    HeartRateView::HeartRateView()\r
+​    {\r
+​        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView");\r
+​        dataNume = 0;\r
+​        currIndex = 0;\r
+​        serialIndex = 0;\r
+​        maxRate = 0;\r
+​        minRate = HEART_RATE_LIMIT_UPPER;\r
+​        InitHeartRateData();\r
+​        SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);\r
+\r
+​        g_pHeartRateView = this;\r
+​    }\r
+\r
+​    HeartRateView::~HeartRateView()\r
+​    {\r
+​        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView");\r
+​        if (viewiInitStatus == true)\r
+​        {\r
+​            int32_t i;\r
+​            RemoveAll();\r
+​            UnLoadHeartRateImageRes();\r
+​            delete imageViewCoordinate;\r
+​            imageViewCoordinate = nullptr;\r
+\r
+​            chart->ClearDataSerial();\r
+​            for (i = 0; i < HEART_AVE_NUM; i++)\r
+​            {\r
+​                delete dataSerial[i];\r
+​                dataSerial[i] = nullptr;\r
+​            }\r
+​            delete chart;\r
+​            chart = nullptr;\r
+​            delete imageViewTop;\r
+​            imageViewTop = nullptr;\r
+​            delete imageViewBottom;\r
+​            imageViewBottom = nullptr;\r
+​            delete dataTopAndbottom;\r
+​            dataTopAndbottom = nullptr;\r
+​            imageAnimator->Stop();\r
+​            delete imageAnimator;\r
+​            imageAnimator = nullptr;\r
+​            delete topRate;\r
+​            topRate = nullptr;\r
+​            delete bottomRate;\r
+​            bottomRate = nullptr;\r
+​            delete ratePerSec;\r
+​            ratePerSec = nullptr;\r
+​            delete ratePerSecText;\r
+​            ratePerSecText = nullptr;\r
+​            delete restRate;\r
+​            restRate = nullptr;\r
+​            delete restRateText1;\r
+​            restRateText1 = nullptr;\r
+​            delete restRateText2;\r
+​            restRateText2 = nullptr;\r
+​        }\r
+​        g_pHeartRateView = nullptr;\r
+​    }\r
+\r
+​    HeartRateView *HeartRateView::GetInstance(void)\r
+​    {\r
+​        return g_pHeartRateView;\r
+​    }\r
+\r
+​    int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值\r
+​    {\r
+​        int32_t ret;\r
+\r
+​        heartRateData[0].x = INVALID_HEART_VALUE;\r
+​        heartRateData[0].y = INVALID_HEART_VALUE;\r
+\r
+​        ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM);\r
+​        if (ret != 0)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret);\r
+​        }\r
+​        return ret;\r
+​    }\r
+\r
+​    int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize)\r
+​    {\r
+​        int ret;\r
+\r
+​        if (rateData == nullptr)\r
+​        {\r
+​            return OHOS_FAILURE;\r
+​        }\r
+\r
+​        if (rateDataSize > sizeof(Point) * HEART_AVE_NUM)\r
+​        {\r
+​            rateDataSize = sizeof(Point) * HEART_AVE_NUM;\r
+​        }\r
+​        InitHeartRateData();\r
+​        ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize);\r
+​        if (ret != EOK)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret);\r
+​            return OHOS_FAILURE;\r
+​        }\r
+\r
+​        return OHOS_SUCCESS;\r
+​    }\r
+​    int32_t HeartRateView::HeartRateDataProc(void)\r
+​    {\r
+​        int32_t i, ret;\r
+​        Point datain[HEART_AVE_NUM];\r
+​        ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM);\r
+​        if (ret != EOK)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret);\r
+​            return OHOS_FAILURE;\r
+​        }\r
+\r
+​        ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值\r
+​        if (ret != EOK)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret);\r
+​            return OHOS_FAILURE;\r
+​        }\r
+\r
+​        dataNume = 0;\r
+​        for (i = 0; i < HEART_AVE_NUM; i += 15) // 每跨过15个点代表一个小时\r
+​        {\r
+​            if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 &&\r
+​                datain[i].y <= HEART_RATE_LIMIT_UPPER)\r
+​            {\r
+​                rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE;\r
+​                rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE;\r
+​                dataNume++;\r
+​            }\r
+​        }\r
+​        return OHOS_SUCCESS;\r
+​    }\r
+​    void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo)\r
+​    {\r
+​        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize);\r
+​        label->SetPosition(labelInfo.x, labelInfo.y);\r
+​        label->Resize(labelInfo.width, labelInfo.height);\r
+​        label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
+​        Add(label);\r
+​    }\r
+\r
+​    void HeartRateView::HeartRateLabelDisplay(void)\r
+​    {\r
+​        LabelInfo PerSecLabel = {PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y,\r
+​                                 PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT};\r
+​        LabelInfo PerSecTextLabel = {PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y,\r
+​                                     PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT};\r
+\r
+​        LabelInfo topLabel = {HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT};\r
+​        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
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail");\r
+​        }\r
+\r
+​        // 实时心率\r
+​        SetLabel(ratePerSec, PerSecLabel);\r
+​        SetLabel(ratePerSecText, PerSecTextLabel);\r
+​        ratePerSec->SetText("--");\r
+​        ratePerSec->SetFont(GILROY_BOLD_FONT, PERSEC_HEART_RATE_FONT_SIZE);\r
+​        ratePerSecText->SetText("次/分");\r
+\r
+​        // 最高最低心率\r
+​        SetLabel(topRate, topLabel);\r
+​        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
+​    {\r
+​        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start");\r
+​        // 坐标图片\r
+​        imageViewCoordinate = new UIImageView();\r
+​        if (imageViewCoordinate == nullptr)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail");\r
+​            return;\r
+​        }\r
+​        imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y);\r
+​        imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH);\r
+​        imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT);\r
+​        Add(imageViewCoordinate);\r
+\r
+​        //  心电图坐标适配\r
+​        chart = new UIChartPolyline();\r
+​        if (chart == nullptr)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail");\r
+​            return;\r
+​        }\r
+​        chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y);\r
+​        chart->SetWidth(COORDINATE_WIDTH);\r
+​        chart->SetHeight(COORDINATE_HEIGHT);\r
+​        chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+​        chart->SetStyle(STYLE_BACKGROUND_OPA, 0);\r
+​        chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width\r
+\r
+​        UIXAxis &xAxis = chart->GetXAxis();\r
+​        UIYAxis &yAxis = chart->GetYAxis();\r
+​        xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数\r
+​        yAxis.SetDataRange(0, COORDINATE_HEIGHT);\r
+​        xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+​        yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));\r
+​        chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA);\r
+\r
+\r
+​        // Point pointArray[5] = {{0, 200}, {1, 70}, {2, 80}, {3, 70}, {4, 43}};\r
+​        // dataSerial->AddPoints(pointArray, 5);\r
+​        // chart->AddDataSerial(dataSerial);\r
+\r
+​        Add(chart);\r
+​    }\r
+\r
+​    void HeartRateView::InsertTopAndBottomRateImage(void)\r
+​    {\r
+​        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start");\r
+​        imageViewTop = new UIImageView();\r
+​        imageViewBottom = new UIImageView();\r
+​        if (imageViewTop == nullptr || imageViewBottom == nullptr)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail");\r
+​            return;\r
+​        }\r
+​        imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y);\r
+​        imageViewTop->SetWidth(TOP_IMAGE_WIDTH);\r
+​        imageViewTop->SetHeight(TOP_IMAGE_HEIGHT);\r
+​        Add(imageViewTop);\r
+​        imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y);\r
+​        imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH);\r
+​        imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT);\r
+​        Add(imageViewBottom);\r
+​    }\r
+\r
+​    void HeartRateView::UpdataTopAndBottomRate(void)\r
+​    {\r
+​        uint16_t bottom, top;\r
+​        if (chart == nullptr)\r
+​        {\r
+​            return;\r
+​        }\r
+​        if (dataTopAndbottom != nullptr)\r
+​        {\r
+​            chart->DeleteDataSerial(dataTopAndbottom);\r
+​            delete dataTopAndbottom;\r
+​            dataTopAndbottom = nullptr;\r
+​        }\r
+​        dataTopAndbottom = new UIChartDataSerial();\r
+​        if (dataTopAndbottom == nullptr)\r
+​        {\r
+​            return;\r
+​        }\r
+​        if (dataNume != 1)\r
+​        {\r
+​            dataTopAndbottom->SetMaxDataCount(dataNume);        // number of data points\r
+​            dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points\r
+​        }\r
+​        else\r
+​        {\r
+​            Point tmp[NUM_2];\r
+​            tmp[0].x = tmp[1].x = rateDataTmp[0].x;\r
+​            tmp[0].y = tmp[1].y = rateDataTmp[0].y;\r
+​            dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points\r
+​            dataTopAndbottom->AddPoints(tmp, NUM_2);  // number of data points\r
+​        }\r
+​        dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明\r
+​        chart->AddDataSerial(dataTopAndbottom);\r
+​        chart->Invalidate();\r
+\r
+​        UIChartDataSerial::PointStyle pointStyle;\r
+​        // 最低心跳\r
+​        dataTopAndbottom->EnableBottomPoint(true);\r
+​        pointStyle.radius = BOTTOM_RADIUS; // Inner radius\r
+​        pointStyle.fillColor = Color::Gray();\r
+​        pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width\r
+​        pointStyle.strokeColor = Color::Black();\r
+​        dataTopAndbottom->SetBottomPointStyle(pointStyle);\r
+​        chart->Invalidate();\r
+\r
+​        bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
+​        // 最高心跳\r
+​        dataTopAndbottom->EnableTopPoint(true);\r
+​        pointStyle.fillColor = Color::Red();\r
+​        pointStyle.radius = TOP_RADIUS; // Inner radius\r
+​        pointStyle.strokeColor = Color::Black();\r
+​        pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width\r
+​        dataTopAndbottom->SetTopPointStyle(pointStyle);\r
+​        chart->Invalidate();\r
+\r
+​        top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS;\r
+​        if (top <= HEART_RATE_LIMIT_UPPER)\r
+​        {\r
+​            maxRate = (maxRate >= top) ? maxRate : top;\r
+​        }\r
+​        if (bottom != 0)\r
+​        {\r
+​            minRate = (minRate <= bottom) ? minRate : bottom;\r
+​        }\r
+​    }\r
+\r
+​    void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index)\r
+​    {\r
+​        Point tmp[NUM_2];\r
+\r
+​        if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM)\r
+​        {\r
+​            return;\r
+​        }\r
+\r
+​        tmp[0].x = tmp[1].x = rateData[index].x;\r
+​        tmp[0].y = tmp[1].y = rateData[index].y;\r
+\r
+​        dataSerial[serialIndex] = new UIChartDataSerial();\r
+​        if (dataSerial[serialIndex] == nullptr)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex);\r
+​            serialIndex++;\r
+​            return;\r
+​        }\r
+\r
+​        dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点\r
+​        dataSerial[serialIndex]->AddPoints(tmp, NUM_2);\r
+​        dataSerial[serialIndex]->SetLineColor(Color::Red());\r
+​        dataSerial[serialIndex]->SetFillColor(Color::Red());\r
+​        dataSerial[serialIndex]->EnableGradient(true);\r
+\r
+​        chart->AddDataSerial(dataSerial[serialIndex]);\r
+​        chart->Invalidate();\r
+​        serialIndex++;\r
+​    }\r
+\r
+​    void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume)\r
+​    {\r
+​        uint16_t i = 0;\r
+​        uint16_t j = 0;\r
+​        uint16_t tmp = 1;\r
+​        if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM)\r
+​        {\r
+​            return;\r
+​        }\r
+\r
+​        while (i < rateDataNume)\r
+​        {\r
+​            while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4))\r
+​            { // 15分钟对应的秒数\r
+​                tmp++;\r
+​                j++;\r
+​            }\r
+​            if (tmp == 1)\r
+​            {\r
+​                ElectrocardiogramOnePoint(rateData, i);\r
+​            }\r
+​            else\r
+​            {\r
+​                if (serialIndex >= HEART_AVE_NUM)\r
+​                {\r
+​                    return;\r
+​                }\r
+​                if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0)\r
+​                {\r
+​                    dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points\r
+​                    chart->Invalidate();\r
+​                }\r
+​                else\r
+​                {\r
+​                    dataSerial[serialIndex] = new UIChartDataSerial();\r
+​                    if (dataSerial[serialIndex] == nullptr)\r
+​                    {\r
+​                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex);\r
+​                        serialIndex++;\r
+​                        return;\r
+​                    }\r
+\r
+​                    dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points\r
+​                    dataSerial[serialIndex]->AddPoints(rateData + i, tmp);   // number of data points\r
+​                    dataSerial[serialIndex]->SetLineColor(Color::Red());\r
+​                    dataSerial[serialIndex]->SetFillColor(Color::Red());\r
+​                    dataSerial[serialIndex]->EnableGradient(true);\r
+\r
+​                    chart->AddDataSerial(dataSerial[serialIndex]);\r
+​                    chart->Invalidate();\r
+​                    serialIndex++;\r
+​                }\r
+​            }\r
+​            i += tmp;\r
+​            j = i;\r
+​            tmp = 1;\r
+​        }\r
+​    }\r
+\r
+​    void HeartRateView::HeartRateElectrocardiogram(void)\r
+​    {\r
+​        if (dataNume == 0)\r
+​        {\r
+​            return;\r
+​        }\r
+​        serialIndex = 0;\r
+​        if (dataNume != 1)\r
+​        {\r
+​            ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点\r
+​        }\r
+​        else\r
+​        {\r
+​            ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点\r
+​        }\r
+​        currIndex = dataNume;\r
+​    }\r
+\r
+​    void HeartRateView::HeartbeatImageAnimator()\r
+​    {\r
+​        imageAnimator = new UIImageAnimatorView();\r
+​        if (imageAnimator == nullptr)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail");\r
+​            return;\r
+​        }\r
+​        imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT);\r
+​        imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY);\r
+​        imageAnimator->SetRepeat(true);\r
+​        Add(imageAnimator);\r
+​        imageAnimator->Start();\r
+​    }\r
+\r
+​    void HeartRateView::HeartbeatImageAnimatorStart(void)\r
+​    {\r
+​        if (imageAnimator != nullptr)\r
+​        {\r
+​            imageAnimator->Start();\r
+​        }\r
+​    }\r
+\r
+​    void HeartRateView::HeartbeatImageAnimatorStop(void)\r
+​    {\r
+​        if (imageAnimator != nullptr)\r
+​        {\r
+​            imageAnimator->Stop();\r
+​        }\r
+​    }\r
+\r
+​    bool HeartRateView::InitView(void)\r
+​    {\r
+​        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InitView");\r
+​        HeartRateDataProc();\r
+​        HeartRateLabelDisplay();\r
+​        HeartbeatImageAnimator();\r
+​        HeartRateCoordinate();\r
+​        InsertTopAndBottomRateImage();\r
+​        HeartRateElectrocardiogram();\r
+​        UpdataTopAndBottomRate();\r
+​        // HeartbeatImageAnimatorStop(); 进入界面进行 动画播放\r
+​        InitRefreshInterface();\r
+​        return true;\r
+​    }\r
+\r
+​    /*预加载心率图片资源*/\r
+​    void HeartRateView::PreLoadHeartRateImageRes(void)\r
+​    {\r
+​        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoadHeartRateImageRes");\r
+​        if (!resLoadStatus)\r
+​        {\r
+​            /*心率背景图*/\r
+​            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_RATE_TOP);\r
+​            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_RATE_BOTTOM);\r
+​            ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_RATE_COOR);\r
+​            resLoadStatus = true;\r
+​        }\r
+​    }\r
+\r
+​    /*卸载心率图片资源*/\r
+​    void HeartRateView::UnLoadHeartRateImageRes(void)\r
+​    {\r
+​        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::UnLoadHeartRateImageRes");\r
+​        if (resLoadStatus)\r
+​        {\r
+​            ImageInfo *img = nullptr;\r
+​            imageViewTop->SetSrc(img);\r
+​            imageViewBottom->SetSrc(img);\r
+​            imageViewCoordinate->SetSrc(img);\r
+​            // ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES);\r
+​            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_TOP, HEART_IAMGES);\r
+​            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_BOTTOM, HEART_IAMGES);\r
+​            ImageCacheManager::GetInstance().UnloadOneInMultiRes(HEART_RATE_COOR, HEART_IAMGES);\r
+​            resLoadStatus = false;\r
+​        }\r
+​    }\r
+\r
+​    void HeartRateView::PreLoad(void)\r
+​    {\r
+​        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::PreLoad");\r
+​        if (!viewiInitStatus)\r
+​        {\r
+​            if (InitView())\r
+​            {\r
+​                viewiInitStatus = true;\r
+​            }\r
+​        }\r
+​        PreLoadHeartRateImageRes();\r
+​    }\r
+\r
+​    void HeartRateView::UnLoad(void)\r
+​    {\r
+​        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::UnLoad");\r
+​        UnLoadHeartRateImageRes();\r
+​    }\r
+\r
+​    void HeartRateView::InitRefreshInterface(void)\r
+​    {\r
+​        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface");\r
+\r
+​        Point *rateData = HeartModel::GetInstance()->GetAveHeartRate();\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
+​    }\r
+\r
+​    // 刷新心率曲线\r
+​    void HeartRateView::RefreshElectrocardiogram(void)\r
+​    {\r
+​        int32_t ret;\r
+​        uint16_t tmp, count;\r
+​        Point *rate = nullptr;\r
+​        Point modPoint;\r
+\r
+​        ret = HeartRateDataProc();\r
+​        if (ret != OHOS_SUCCESS)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail");\r
+​            return;\r
+​        }\r
+​        rate = rateDataTmp;\r
+\r
+​        if (chart == nullptr)\r
+​        {\r
+​            return;\r
+​        }\r
+\r
+​        if (currIndex >= HEART_AVE_NUM)\r
+​        {\r
+​            currIndex = HEART_AVE_NUM;\r
+​        }\r
+​        if (dataNume > currIndex)\r
+​        {\r
+​            tmp = dataNume - currIndex;\r
+​            if (currIndex > 0)\r
+​            {\r
+​                rate += (currIndex - 1);\r
+​                tmp += 1;\r
+​            }\r
+​            ElectrocardiogramMultiPoint(rate, tmp);\r
+​            currIndex = dataNume;\r
+​        }\r
+​        else if (dataNume == currIndex)\r
+​        { // 当前点平均心率刷新\r
+​            if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr)\r
+​            {\r
+​                modPoint.x = rate[currIndex - 1].x;\r
+​                modPoint.y = rate[currIndex - 1].y;\r
+\r
+​                count = dataSerial[serialIndex - 1]->GetDataCount();\r
+​                dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint);\r
+​                chart->Invalidate();\r
+​            }\r
+​        }\r
+​        else\r
+​        {\r
+​            return;\r
+​        }\r
+​        UpdataTopAndBottomRate(); // 最高、最低心率\r
+​    }\r
+\r
+​    // 清空心率曲线\r
+​    void HeartRateView::ClearElectrocardiogram(void)\r
+​    {\r
+​        int32_t i;\r
+​        dataNume = 0;\r
+​        currIndex = 0;\r
+​        maxRate = 0;\r
+​        minRate = HEART_RATE_LIMIT_UPPER;\r
+​        InitHeartRateData();\r
+\r
+​        if (chart == nullptr)\r
+​        {\r
+​            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr");\r
+​            return;\r
+​        }\r
+\r
+​        if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr)\r
+​        {\r
+​            ratePerSec->SetText("--");\r
+​            topRate->SetText("--");\r
+​            bottomRate->SetText("--");\r
+​            restRate->SetText("--");\r
+​        }\r
+\r
+​        chart->DeleteDataSerial(dataTopAndbottom);\r
+​        delete dataTopAndbottom;\r
+​        dataTopAndbottom = nullptr;\r
+​        for (i = 0; i < serialIndex; i++)\r
+​        {\r
+​            delete dataSerial[i];\r
+​            dataSerial[i] = nullptr;\r
+​        }\r
+​        chart->ClearDataSerial();\r
+\r
+​        serialIndex = 0;\r
+​        chart->Invalidate();\r
+​    }\r
+\r
+​    // 刷新每秒上报的心率\r
+​    void HeartRateView::RefreshHeartRatePerSec(uint16_t value)\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
+​            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
+​        }\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
+​            topRate->SetText("--");\r
+​            return;\r
+​        }\r
+​        ret = sprintf_s(top, sizeof(top), "%u", maxRate);\r
+​        if (ret > EOK)\r
+​        {\r
+​            topRate->SetText(top);\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
+​            bottomRate->SetText("--");\r
+​            return;\r
+​        }\r
+​        ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate);\r
+​        if (ret > EOK)\r
+​        {\r
+​            bottomRate->SetText(bottom);\r
+​        }\r
+​    }\r
+\r
+​    // 刷新静息心率\r
+​    void HeartRateView::RefreshRestHeartRate(uint16_t value)\r
+​    {\r
+​        char heartRate[NUM_4] = "--";\r
+​        int32_t ret = 0;\r
+\r
+​        if (restRate == nullptr)\r
+​        {\r
+​            return;\r
+​        }\r
+\r
+​        if (value == 0 || value == (uint16_t)0xFFFF)\r
+​        {\r
+​            // 无效值\r
+​            restRate->SetText("--");\r
+​        }\r
+​        else\r
+​        {\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
+\r
+​            if (ret > EOK)\r
+​            {\r
+​                restRate->SetText(heartRate);\r
+​            }\r
+​        }\r
+​    }\r
+#if 0\r
+#ifdef __cplusplus\r
+​    extern "C"\r
+​    {\r
+#endif\r
+​        /* 定时器回调函数 */\r
+​        void HeartTimerCallback()\r
+​        {\r
+​            g_motionTimes++;\r
+​            HeartCardPresenter *gHeartCardPresenter = HeartPresenter::GetInstance();\r
+​            if (gHeartCardPresenter == nullptr)\r
+​            {\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartTimerCallback::gHeartCardPresenter new fail");\r
+​                return;\r
+​            }\r
+​            // gHeartCardPresenter->ModifiesTime();\r
+​            // PRINT("HeartTimerCallback\r\n");\r
+​        }\r
+\r
+​        /* 开启定时器 */\r
+​        void InitTimer(void)\r
+​        {\r
+​            if (g_startCounting != NULL)\r
+​            {\r
+​                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer already exists!!");\r
+​                return;\r
+​            }\r
+​            g_startCounting = osTimerNew((osTimerFunc_t)HeartTimerCallback, osTimerPeriodic, NULL, NULL);\r
+​            if (g_startCounting == NULL)\r
+​            {\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer osTimerNew failed!!");\r
+​                return;\r
+​            }\r
+​            int tick = osMs2Tick(MS_ONE_SECONDS);\r
+​            osStatus_t retTimer = osTimerStart(g_startCounting, tick);\r
+​            if (retTimer != osOK)\r
+​            {\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartTimer osTimerStart failed, ret = %lx!!", retTimer);\r
+​                if (g_startCounting != NULL)\r
+​                {\r
+​                    retTimer = osTimerDelete(g_startCounting);\r
+​                    if (retTimer != osOK)\r
+​                    {\r
+​                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::osTimerDelete failed, ret = %lx!!", retTimer);\r
+​                        return;\r
+​                    }\r
+​                    g_startCounting = NULL;\r
+​                }\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitTimer!");\r
+​                return;\r
+​            }\r
+​        }\r
+​        /* 关闭定时器 */\r
+​        void DisableTimer(void)\r
+​        {\r
+​            if (g_startCounting != NULL)\r
+​            {\r
+​                osStatus_t ret = osTimerDelete(g_startCounting);\r
+​                if (ret != osOK)\r
+​                {\r
+​                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret);\r
+​                    return;\r
+​                }\r
+​                g_startCounting = NULL;\r
+​                PRINT("g_motionTimes:%d\r\n", sportdata->duration);\r
+​                g_motionTimes = 0;\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisableTimer!");\r
+​            }\r
+​        }\r
+​        /* 暂停定时器 */\r
+​        void PauseTimer(void)\r
+​        {\r
+​            // 检查定时器是否存在\r
+​            if (g_startCounting != NULL)\r
+​            {\r
+​                // 暂停定时器,但不删除它\r
+​                osStatus_t ret = osTimerStop(g_startCounting);\r
+​                if (ret != osOK)\r
+​                {\r
+​                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopWatch_PauseTimer osTimerStop failed, ret = %lx!!", ret);\r
+​                }\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PauseTimer!");\r
+​            }\r
+​        }\r
+\r
+​        /*恢复定时器*/\r
+​        void ResumeTimer(void)\r
+​        {\r
+​            // 检查定时器是否存在\r
+​            if (g_startCounting != NULL)\r
+​            {\r
+​                int tick = osMs2Tick(MS_ONE_SECONDS);\r
+​                // 恢复定时器\r
+​                osStatus_t ret = osTimerStart(g_startCounting, tick);\r
+​                if (ret != osOK)\r
+​                {\r
+​                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResumeTimer osTimerStart failed, ret = %lx!!", ret);\r
+​                }\r
+​                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ResumeTimer!");\r
+​            }\r
+​        }\r
+\r
+#ifdef __cplusplus\r
+    }\r
+#endif\r
+#endif\r
+} // namespace OHOS
\ No newline at end of file
index a47ea39..8343ea2 100644 (file)
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:4e59c777aadc1f8891a4fc3affe5f4e4b48bb9a2e929620de73479f924f6cfad
-size 68520
+oid sha256:acd50a8ffb429071ede16fe2970420b241ee83c4e7c9f46b5022eb3abff07791
+size 52616
index cabbde9..e60196c 100644 (file)
@@ -190,7 +190,9 @@ void shutdown_reboot_prejobs_task(void)
 
     //保存信息文件
     saveancsdata();
-    
+    //保存当天心率数据
+    save_heart_data();
+
     dial_file_save();
     //同步所有需要保存实时数据到config文件
     uapi_dev_runtime_sync_runtime_env_to_config();
diff --git a/tools/image_converter_tool/test/hert/heart/BOTTOM.png b/tools/image_converter_tool/test/hert/heart/BOTTOM.png
new file mode 100644 (file)
index 0000000..cf657ed
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart/BOTTOM.png differ
diff --git a/tools/image_converter_tool/test/hert/heart/COOR.png b/tools/image_converter_tool/test/hert/heart/COOR.png
new file mode 100644 (file)
index 0000000..4252e11
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart/COOR.png differ
diff --git a/tools/image_converter_tool/test/hert/heart/TOP.png b/tools/image_converter_tool/test/hert/heart/TOP.png
new file mode 100644 (file)
index 0000000..3607a0b
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart/TOP.png differ
index 608fd05..18705d3 100644 (file)
@@ -1,26 +1,36 @@
-#!/bin/bash
+#!/bin/bash  
 ###
- # @Date: 2024-07-10 21:03:33
+ # @Date: 2024-07-11 20:53:59
  # @LastEditors: Caisking 3449750381@qq.com
- # @LastEditTime: 2024-07-20 16:13:48
+ # @LastEditTime: 2024-08-15 15:59:04
  # @FilePath: /FD230/tools/language_tool/make_language.sh
 ### 
 
-# 进入目录 Language_xml
+set -e  # 在命令失败时退出  
 
-cd Language_xml/
+# 进入目录 Language_xml  
+cd Language_xml/  
 
-# 运行 languagetool.py
-python languagetool.py
+# 运行 languagetool.py  
+python languagetool.py  
 
-# 回到上级目录
-cd ..
+# 回到上级目录  
+cd ..  
 
-# 进入目录 stringpack_tool
-cd stringpack_tool
+# 进入目录 stringpack_tool  
+cd stringpack_tool  
 
-# 运行 language_trans.py
-python language_trans.py ../Language_xml/ ../font/ ../font/
+# 运行 language_trans.py  
+python language_trans.py ../Language_xml/ ../font/ ../font/  
 
-# 打印完成信息
-echo "脚本执行完成。"
\ No newline at end of file
+# 打印完成信息  
+echo "脚本生成文件执行完成。"  
+
+#复制头文件  
+cp ./font/ui_resource_string.h ../../../code/sdk/application/wearable/fd230app/nativelauncher/include/
+
+#复制资源文件  
+cp -r ./font  ../../../code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/  
+
+# 打印完成信息  
+echo "脚本复制文件执行完成。"
\ No newline at end of file
index 341f405..87d9315 100644 (file)
@@ -1,7 +1,7 @@
 <!--\r
  * @Date: 2024-04-15 10:55:58\r
  * @LastEditors: Caisking 3449750381@qq.com\r
- * @LastEditTime: 2024-07-20 16:14:59\r
+ * @LastEditTime: 2024-08-15 16:00:55\r
  * @FilePath: /FD230/tools/language_tool/多国语言工具脚本.md\r
 -->\r
 ## 多国语言工具脚本使用方法\r
@@ -88,3 +88,6 @@ chmod +x languagemake.sh
 \r
 ### 更新 0720\r
 修复脚本异常\r
+\r
+### 更新 0815\r
+脚本增加生成文件直接copy功能 复制到对应文件夹\r