Merge #978 into sdk602patch0626 from refs/changes/978/head
author袁清梦 <3449750381@qq.com>
Wed, 18 Sep 2024 02:28:23 +0000 (02:28 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Wed, 18 Sep 2024 02:28:23 +0000 (02:28 +0000)
安全模式:下载修复文件增加repari_file_start接口

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

  - 安全模式:下载修复文件增加repari_file_start接口

  - 心率:增加心率动画的资源文件

  - 心率:修改心率UI;增加上一次检测数据以及检测间隔

  - 心率:同步心率卡片更新

  - 心率:修复心率卡片显示异常

  - 心率:心率动画修改

  - 心率:使用图片icon替换动画

Signed-off-by: Caisking <3449750381@qq.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/978
66 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateCardView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp
code/sdk/application/wearable/fd230app/nativeui/main/include/MainViewSample.h
code/sdk/application/wearable/fd230app/nativeui/main/src/MainViewSample.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/src/SafeModeManagerModel.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/background.bin
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_01.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_02.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_03.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_04.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_05.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_06.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_07.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_08.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_09.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_10.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_11.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_12.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_13.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_14.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_15.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_16.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_17.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_18.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_19.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_20.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_21.bin [new file with mode: 0644]
code/sdk/drivers/peripheral/utils/custom_cmd_service.c
code/sdk/drivers/peripheral/utils/custom_utils.h
tools/image_converter_tool/image_makcopy_tool.py [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart/back.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/background.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/buttomicon.png [moved from tools/image_converter_tool/test/hert/heartchart/buttomicon.png with 100% similarity]
tools/image_converter_tool/test/hert/heart_chart/hearticon.png [moved from tools/image_converter_tool/test/hert/heartchart/hearticon.png with 100% similarity]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_01.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_02.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_03.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_04.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_05.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_06.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_07.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_08.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_09.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_10.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_11.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_12.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_13.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_14.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_15.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_16.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_17.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_18.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_19.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_20.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_21.png [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/heartrate.gif [new file with mode: 0644]
tools/image_converter_tool/test/hert/heart_chart/topicon.png [moved from tools/image_converter_tool/test/hert/heartchart/topicon.png with 100% similarity]
tools/image_converter_tool/test/hert/heartchart/background.png [deleted file]

index de8c7f7..8497548 100644 (file)
@@ -192,6 +192,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartDetectionPresenter.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartChartView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartChartPresenter.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartRateCardView.cpp
 
     #BloodCheck
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodResultView.cpp
index c10f53e..28dc1f2 100644 (file)
@@ -71,6 +71,7 @@ namespace OHOS
 #define APP_DOWNLOAD_DIAL_PATH "/user/userdata/dial"      /*表盘市场安装路径*/
 #define APP_CUSTOM_DIAL_PATH "/user/userdata/custom_dial" /*自定义表盘安装路径*/
 #define APP_LIST_PATH "/user/res/applist_icon"
+#define APP_HEARET_ICON_PATH "/user/res/heart_chart/hearticon"//心率动画
 
     static constexpr const char *CARD_CONFIG_PATH = "/user/cardconfig.bin";
 
@@ -246,25 +247,27 @@ namespace OHOS
     static constexpr const char *ALARM_DELETE_ADD_PATH = APP_RES_PATH "/DELETE.bin";
     static constexpr const char *ALARM_TRUE_ADD_PATH = APP_RES_PATH "/TRUE_ADD.bin";
     /* ---------------------------------- 心率动画图片 ---------------------------------- */
-    static constexpr const char *PNG_A004_070_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_01.bin";
-    static constexpr const char *PNG_A004_071_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_02.bin";
-    static constexpr const char *PNG_A004_072_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_03.bin";
-    static constexpr const char *PNG_A004_073_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_04.bin";
-    static constexpr const char *PNG_A004_074_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_05.bin";
-    static constexpr const char *PNG_A004_075_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_06.bin";
-    static constexpr const char *PNG_A004_076_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_07.bin";
-    static constexpr const char *PNG_A004_077_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_08.bin";
-    static constexpr const char *PNG_A004_078_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_09.bin";
-    static constexpr const char *PNG_A004_079_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_10.bin";
-    static constexpr const char *PNG_A004_080_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_11.bin";
-    static constexpr const char *PNG_A004_081_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_12.bin";
-    static constexpr const char *PNG_A004_082_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_13.bin";
-    static constexpr const char *PNG_A004_083_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_14.bin";
-    static constexpr const char *PNG_A004_084_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_15.bin";
-    static constexpr const char *PNG_A004_085_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_16.bin";
-    static constexpr const char *PNG_A004_086_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_17.bin";
-    static constexpr const char *PNG_A004_087_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_18.bin";
-    static constexpr const char *PNG_A004_088_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_19.bin";
+    static constexpr const char *PNG_A004_070_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_01.bin";
+    static constexpr const char *PNG_A004_071_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_02.bin";
+    static constexpr const char *PNG_A004_072_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_03.bin";
+    static constexpr const char *PNG_A004_073_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_04.bin";
+    static constexpr const char *PNG_A004_074_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_05.bin";
+    static constexpr const char *PNG_A004_075_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_06.bin";
+    static constexpr const char *PNG_A004_076_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_07.bin";
+    static constexpr const char *PNG_A004_077_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_08.bin";
+    static constexpr const char *PNG_A004_078_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_09.bin";
+    static constexpr const char *PNG_A004_079_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_10.bin";
+    static constexpr const char *PNG_A004_080_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_11.bin";
+    static constexpr const char *PNG_A004_081_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_12.bin";
+    static constexpr const char *PNG_A004_082_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_13.bin";
+    static constexpr const char *PNG_A004_083_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_14.bin";
+    static constexpr const char *PNG_A004_084_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_15.bin";
+    static constexpr const char *PNG_A004_085_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_16.bin";
+    static constexpr const char *PNG_A004_086_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_17.bin";
+    static constexpr const char *PNG_A004_087_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_18.bin";
+    static constexpr const char *PNG_A004_088_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_19.bin";
+    static constexpr const char *PNG_A004_089_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_20.bin";
+    static constexpr const char *PNG_A004_090_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_21.bin";
     /* -------------------------------- 蓝牙搜索的动画图片 ------------------------------- */
     static constexpr const char *PNG_A019_080_IMAGE_PATH = APP_RES_PATH "/BLUETOOTH_IMAGE_01.bin";
     static constexpr const char *PNG_A019_081_IMAGE_PATH = APP_RES_PATH "/BLUETOOTH_IMAGE_02.bin";
index b2e7676..ae4c969 100644 (file)
@@ -2,84 +2,96 @@
  * @Date: 2024-08-15 18:38:49
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-08-26 15:17:07
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
  */
 /***
  * @Date: 2024-08-15 18:38:49
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-08-15 20:25:38
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
  */
 
 #ifndef HEART_Chart_VIEW_H
 #define HEART_Chart_VIEW_H
 
-#include "View.h"
 #include "BaseView.h"
-#include "wearable_log.h"
 #include "UiConfig.h"
-#include "components/ui_label.h"
-#include "components/ui_label_ext.h"
+#include "View.h"
 #include "components/ui_button.h"
-#include "components/ui_label_button.h"
-#include "components/ui_image_animator.h"
 #include "components/ui_circle_progress.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_label_ext.h"
 #include "components/ui_view_group.h"
+#include "wearable_log.h"
 
 #include "heartrate/include/HeartChartPresenter.h"
 
-#include "components/ui_scroll_view.h"
 #include "components/ui_label_button_ext.h"
+#include "components/ui_scroll_view.h"
 
-#include "power_display_service.h"
-#include "components/ui_image_animator.h"
 #include "components/ui_chart.h"
+#include "components/ui_image_animator.h"
+#include "power_display_service.h"
 
 #define STOPCHECK "stop_check"
-namespace OHOS
-{
-    class HeartChartPresenter;
-    class HeartChartView : public View<HeartChartPresenter>
-    {
-    public:
-        HeartChartView();
-        virtual ~HeartChartView();
-        void OnStop() override;
-        void OnSetUpView() override;
-        void OnTearDownView() override;
-        void OnStart() override;
-        static HeartChartView *GetInstance(void);
+namespace OHOS {
+class HeartChartPresenter;
+class HeartChartView : public View<HeartChartPresenter> {
+public:
+  HeartChartView();
+  virtual ~HeartChartView();
+  void OnStop() override;
+  void OnSetUpView() override;
+  void OnTearDownView() override;
+  void OnStart() override;
+  static HeartChartView *GetInstance(void);
+
+  UIImageAnimatorView *GetImageAnimator(void);
 
-        UIImageAnimatorView *GetImageAnimator(void);
+  bool HeartViewInit();
+  void InitChartView(void);
+  void InitChartLabel(void);
+  void InitChartImageView(void);
 
-        bool HeartViewInit();
-        void InitChartView(void);
-        void SetDataChart();
-        void SetDataTopAndBottom();
-        void HeartImageAnimator();
+  void SetDataChart();
+  void SetDataTopAndBottom();
+  void HeartImageAnimator();
 
-        void UpdateShowHeart(void);
-        void Update_data_Chart(int serialIndex);
-        void CleanAllDataView();
+  void UpdateShowHeart(void);
+  void Update_data_Chart(int serialIndex);
+  void CleanAllDataView();
+  void UpdateChartConfig();
+  void SetLastHeart();
+  UIViewGroup *GetchartGroup();
 
-    private:
-        UILabelExt *CurrentHeartText{nullptr};
-        UILabelExt *MaxHeartText{nullptr};
-        UILabelExt *MinHeartText{nullptr};
-        UILabelExt *UHeartText{nullptr};
-        UILabelExt *RestHeartText{nullptr};
+private:
+  UIImageView *maxRateIconView_{nullptr};
+  UIImageView *minRateIconView_{nullptr};
+  UIImageView *chartBackgroundView_{nullptr};
+  UIImageView *heartIconView_{nullptr};
 
-        UIImageView *TopimageView{nullptr};
-        UIImageView *BottomimageView{nullptr};
-        UIImageView *CoordinateimageView{nullptr};
-        UIImageView *HeartIconView{nullptr};
+  UIImageAnimatorView *imageAnimator{nullptr};
 
-        UIImageAnimatorView *imageAnimator{nullptr};
+  Point heartdata[24];
+  UIChartDataSerial *heartSerial{nullptr};
+  UIChartPolyline *heartchart = nullptr;
 
-        Point heartdata[24];
-        UIChartDataSerial *heartSerial{nullptr};
-        UIChartPolyline *heartchart = nullptr;
-    };
-}
+  UILabelExt *displayheart_{nullptr};
+  UILabelExt *uheart_{nullptr};
+  UILabelExt *lastheart_{nullptr};
+  UILabelExt *minheart_{nullptr};
+  UILabelExt *maxheart_{nullptr};
+  
+  UILabelExt *maxheart_dynamic_{nullptr};
+  UILabelExt *maxheart_dynamic_3_{nullptr};
+  UILabelExt *maxheart_dynamic_2_{nullptr};
+  UILabelExt *maxheart_dynamic_1_{nullptr};
+  UILabelExt *minheart_dynamic_{nullptr};
+};
+} // namespace OHOS
 
 #endif // 心率主界面
\ No newline at end of file
index 491904d..4827a8a 100644 (file)
@@ -1,67 +1,61 @@
 #ifndef HEART_MODEL_H\r
 #define HEART_MODEL_H\r
 \r
-#include <ctime>\r
+#include "MainClockView.h"\r
 #include "broadcast_feature.h"\r
 #include "broadcast_service.h"\r
 #include "samgr_lite.h"\r
-#include "MainClockView.h"\r
+#include <ctime>\r
 \r
 #ifdef __cplusplus\r
-extern "C"\r
-{\r
+extern "C" {\r
 #endif\r
 \r
-    int PushOHOSMsgToHeartModel(Request *request);\r
-    void HeartDataSubscribeTopic(Topic topic);\r
-    void HearDatatUnsubscribeTopic(Topic topic);\r
+int PushOHOSMsgToHeartModel(Request *request);\r
+void HeartDataSubscribeTopic(Topic topic);\r
+void HearDatatUnsubscribeTopic(Topic topic);\r
 \r
 #define HEART_ALL_POINTS 360\r
 \r
-    typedef struct\r
-    {\r
-        uint16_t x;\r
-        uint16_t y;\r
-        bool flag;\r
-    } Point;\r
-\r
-    typedef struct\r
-    {\r
-        /** X coordinate */\r
-        uint16_t x;\r
-        /** Y coordinate */\r
-        uint16_t y;\r
-    } HeartPoint;\r
-\r
-    typedef struct\r
-    {\r
-        uint16_t perSec;\r
-        uint16_t rest;\r
-        uint16_t minX;\r
-        uint16_t minValue;\r
-        uint16_t maxX;\r
-        uint16_t maxValue;\r
-        uint16_t index;\r
-        Point value[HEART_ALL_POINTS];\r
-    } HeartInfo;\r
+typedef struct {\r
+  uint16_t x;\r
+  uint16_t y;\r
+  bool flag;\r
+} Point;\r
+\r
+typedef struct {\r
+  /** X coordinate */\r
+  uint16_t x;\r
+  /** Y coordinate */\r
+  uint16_t y;\r
+} HeartPoint;\r
+\r
+typedef struct {\r
+  uint16_t perSec;\r
+  uint16_t rest;\r
+  uint16_t minX;\r
+  uint16_t minValue;\r
+  uint16_t maxX;\r
+  uint16_t maxValue;\r
+  uint16_t index;\r
+  Point value[HEART_ALL_POINTS];\r
+} HeartInfo;\r
 \r
 #pragma pack(4)\r
-    typedef struct\r
-    {\r
-        uint16_t perSec;\r
-        uint16_t rest;\r
-        uint16_t minX;\r
-        uint16_t minValue;\r
-        uint16_t maxX;\r
-        uint16_t maxValue;\r
-        uint16_t index;\r
-        HeartPoint value[HEART_ALL_POINTS];\r
-    } HeartDatas;\r
+typedef struct {\r
+  uint16_t perSec;\r
+  uint16_t rest;\r
+  uint16_t minX;\r
+  uint16_t minValue;\r
+  uint16_t maxX;\r
+  uint16_t maxValue;\r
+  uint16_t index;\r
+  HeartPoint value[HEART_ALL_POINTS];\r
+} HeartDatas;\r
 \r
 #pragma pack()\r
 \r
-    namespace OHOS\r
-    {\r
+namespace OHOS {\r
 #define HEART_AVE_NUM 360\r
 #define HEART_RATE_LIMIT_UPPER 200\r
 #define HEART_RATE_LIMIT_LOWER 0\r
@@ -75,121 +69,125 @@ extern "C"
 #define NUM_7 7\r
 #define NUM_16 16\r
 #define NUM_99 99\r
-        // 心率检测状态\r
-        enum class HeartState\r
-        {\r
-            End = 0,\r
-            Start,\r
-        };\r
-        enum class HeartCheck\r
-        {\r
-            RESTSTSTE = 0, // 未检测状态\r
-            PASSIVITY,     // 被动检测心率\r
-            CARDCHECK,     // 卡片检测\r
-            INITIATIVE,    // 主动检测心率\r
-            EXERCISE,      // 运动心率\r
-        };\r
-        enum class HeartResult\r
-        {\r
-            NOT_TESTED = 0, // 未检测\r
-            SUCCESS,        // 检测成功\r
-            NOT_WORN,       // 未佩戴检测\r
-            TIMEOUT,        // 检测超时\r
-            HIGH_RESULT,    // 检测结果过高\r
-            LOW_RESULT,     // 检测结果过低\r
-            INVALID_DATA    // 无效数据\r
-        };\r
-        // 控制心率检测\r
-        typedef struct\r
-        {\r
-            uint32_t heartRatePerSec;\r
-            Point heartRateAvg[HEART_AVE_NUM];\r
-            uint32_t heartRateRest;\r
-            Point heartRateMax;\r
-            Point heartRateMin;\r
-        } HealthAllDatas;\r
-\r
-        class HeartModel\r
-        {\r
-        public:\r
-            HeartModel();\r
-            ~HeartModel();\r
-            static HeartModel *GetInstance(void);\r
-            void ObtainingHeartRateData(void);\r
-            void PushHealthDatas(HealthMsg healthMsg);\r
-            Point *GetAveHeartRate(void);\r
-            uint16_t GetAveHeartRateCount(void);\r
-            void SetAveHeartRateCount(uint16_t value);\r
-            Point *GetMaximumHeartRate(void);\r
-            void Init(void);\r
-            void HeartRatePros(HeartDatas *heartInfo);\r
-            void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate);\r
-            void ClearHeartData(void);\r
-            void HandleMaxHeart(uint16_t coord, uint16_t value);\r
-            void HandleMinHeart(uint16_t coord, uint16_t value);\r
-            void SetHeartRatePerSec(uint32_t sec);\r
-            uint16_t GetHeartRateMax(void);\r
-            uint16_t GetHeartRateMin(void);\r
-            /* -------------------------------------------------------------------------- */\r
-            void UpHeartdata(uint16_t heart);\r
-            uint16_t GetHeartdata();\r
-            uint16_t GetShowHeartdata();\r
-            uint16_t GetShowMaxHeartdata();\r
-            uint16_t GetShowMinHeartdata();\r
-\r
-            uint16_t GetIndex();\r
-            void SetIndex(uint16_t index);\r
-\r
-            uint32_t GetCheckTime(void);\r
-            void SetCheckTime(uint32_t time);\r
-            void SetWearStatus(int32_t wear);\r
-            void SetResult(HeartResult result);\r
-            HeartResult GetResult();\r
-\r
-            void Heart_Start(void);\r
-            void Heart_Stop(void);\r
-            void Heart_Save(void);\r
-            void Heart_Result(void);\r
-\r
-            void Heart_Control(HeartState state, HeartCheck check);\r
-            void ClearDisplayData();\r
-            void Heart_Update_View(void);\r
-            void CleanAllData(void);\r
-\r
-        private:\r
-            HealthAllDatas healthDatas;\r
-            uint16_t pretime{0};\r
-            uint16_t entryTimes{0};\r
-            uint16_t aveCount{0};\r
-            uint16_t preMaxValue{0};\r
-            uint16_t preMaxX{NUM_1};\r
-            uint16_t preMinValue{HEART_RATE_LIMIT_UPPER};\r
-            uint16_t preMinX{NUM_1};\r
-            uint16_t countMax{0};\r
-            uint16_t countMin{0};\r
-            bool wearStatus{true};\r
-            uint16_t index_ = 0;\r
-\r
-            uint16_t displayheart;     // 显示心率\r
-            uint16_t currentheart;     // 保存心率\r
-            uint16_t displayheart_max; // 显示最大心率\r
-            uint16_t displayheart_min; // 显示最小心率\r
-\r
-            uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
-\r
-            bool initstatus = true;\r
-            bool heartstate = false;\r
-            bool sensorstate{false};\r
-\r
-            uint16_t wear_;\r
-            uint16_t valid_counter_ = 0;    // 有效数计数器\r
-            uint16_t disvalid_counter_ = 0; // 无效数计数器\r
-            uint16_t unwear_counter_ = 0;   // 佩戴错误计数器\r
-\r
-            HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
-            HeartCheck checkstate = HeartCheck::RESTSTSTE;      // 目前检测状态\r
-        };\r
-    }\r
+// 心率检测状态\r
+enum class HeartState {\r
+  End = 0,\r
+  Start,\r
+};\r
+enum class HeartCheck {\r
+  RESTSTSTE = 0, // 未检测状态\r
+  PASSIVITY,     // 被动检测心率\r
+  CARDCHECK,     // 卡片检测\r
+  INITIATIVE,    // 主动检测心率\r
+  EXERCISE,      // 运动心率\r
+};\r
+enum class HeartResult {\r
+  NOT_TESTED = 0, // 未检测\r
+  SUCCESS,        // 检测成功\r
+  NOT_WORN,       // 未佩戴检测\r
+  TIMEOUT,        // 检测超时\r
+  HIGH_RESULT,    // 检测结果过高\r
+  LOW_RESULT,     // 检测结果过低\r
+  INVALID_DATA    // 无效数据\r
+};\r
+// 控制心率检测\r
+typedef struct {\r
+  uint32_t heartRatePerSec;\r
+  Point heartRateAvg[HEART_AVE_NUM];\r
+  uint32_t heartRateRest;\r
+  Point heartRateMax;\r
+  Point heartRateMin;\r
+} HealthAllDatas;\r
+\r
+class HeartModel {\r
+public:\r
+  HeartModel();\r
+  ~HeartModel();\r
+  static HeartModel *GetInstance(void);\r
+  void ObtainingHeartRateData(void);\r
+  void PushHealthDatas(HealthMsg healthMsg);\r
+  Point *GetAveHeartRate(void);\r
+  uint16_t GetAveHeartRateCount(void);\r
+  void SetAveHeartRateCount(uint16_t value);\r
+  Point *GetMaximumHeartRate(void);\r
+  void Init(void);\r
+  void HeartRatePros(HeartDatas *heartInfo);\r
+  void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate,\r
+                              uint16_t minRate);\r
+  void ClearHeartData(void);\r
+  void HandleMaxHeart(uint16_t coord, uint16_t value);\r
+  void HandleMinHeart(uint16_t coord, uint16_t value);\r
+  void SetHeartRatePerSec(uint32_t sec);\r
+  uint16_t GetHeartRateMax(void);\r
+  uint16_t GetHeartRateMin(void);\r
+  /* --------------------------------------------------------------------------\r
+   */\r
+  void UpHeartdata(uint16_t heart);\r
+  uint16_t GetHeartdata();\r
+  uint16_t GetShowHeartdata();\r
+  uint16_t GetShowMaxHeartdata();\r
+  uint16_t GetShowMinHeartdata();\r
+\r
+  uint16_t GetIndex();\r
+  void SetIndex(uint16_t index);\r
+\r
+  uint32_t GetCheckTime(void);\r
+  void SetCheckTime(uint32_t time);\r
+  void SetWearStatus(int32_t wear);\r
+  void SetResult(HeartResult result);\r
+  HeartResult GetResult();\r
+\r
+  void Heart_Start(void);\r
+  void Heart_Stop(void);\r
+  void Heart_Save(void);\r
+  void Heart_Result(void);\r
+\r
+  void Heart_Control(HeartState state, HeartCheck check);\r
+  void ClearDisplayData();\r
+  void Heart_Update_View(void);\r
+  void CleanAllData(void);\r
+\r
+  std::string GetCheckString();\r
+  uint16_t *GetArrayData();\r
+  void SetArrayData();\r
+\r
+private:\r
+  HealthAllDatas healthDatas;\r
+  uint16_t pretime{0};\r
+  uint16_t entryTimes{0};\r
+  uint16_t aveCount{0};\r
+  uint16_t preMaxValue{0};\r
+  uint16_t preMaxX{NUM_1};\r
+  uint16_t preMinValue{HEART_RATE_LIMIT_UPPER};\r
+  uint16_t preMinX{NUM_1};\r
+  uint16_t countMax{0};\r
+  uint16_t countMin{0};\r
+  bool wearStatus{true};\r
+  uint16_t index_ = 0;\r
+\r
+  uint16_t displayheart;     // 显示心率\r
+  uint16_t currentheart;     // 保存心率\r
+  uint16_t displayheart_max; // 显示最大心率\r
+  uint16_t displayheart_min; // 显示最小心率\r
+\r
+  uint32\r
+      timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+\r
+  bool initstatus = true;\r
+  bool heartstate = false;\r
+  bool sensorstate{false};\r
+\r
+  uint16_t wear_;\r
+  uint16_t valid_counter_ = 0;    // 有效数计数器\r
+  uint16_t disvalid_counter_ = 0; // 无效数计数器\r
+  uint16_t unwear_counter_ = 0;   // 佩戴错误计数器\r
+\r
+  HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
+  HeartCheck checkstate = HeartCheck::RESTSTSTE;      // 目前检测状态\r
+\r
+  uint16_t dynamic_heartrate[5]; //动态心率配置项\r
+};\r
+} // namespace OHOS\r
 \r
 #ifdef __cplusplus\r
 }\r
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateCardView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartRateCardView.h
new file mode 100644 (file)
index 0000000..cdab034
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef HEART_RATECARD_VIEW_H
+#define HEART_RATECARD_VIEW_H
+
+#include "components/root_view.h"
+#include "components/ui_card_page.h"
+#include "heartrate/include/HeartChartView.h"
+#include "wearable_log.h"
+namespace OHOS {
+
+class HeartRateCardView : public UICardPage {
+public:
+  HeartRateCardView();
+  virtual ~HeartRateCardView();
+  static HeartRateCardView *GetInstance(void);
+
+  bool InitView(void);
+  void PreLoad(void) override;
+  void UnLoad(void) override;
+  UIViewGroup *GetHeartRateCardView();
+
+private:
+  HeartChartView *heartRateCardView{nullptr};
+  UIViewGroup *heartRateGroupView{nullptr};
+  void ClearAll(void);
+  bool viewiInitStatus{false};
+};
+
+} // namespace OHOS
+#endif
\ No newline at end of file
index c8dacf3..7b26631 100644 (file)
  * @Date: 2024-08-15 18:39:02
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-09-05 14:36:17
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
  */
 /***
  * @Date: 2024-04-15 10:55:58
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-07-29 15:35:06
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
  */
-#include "UiConfig.h"
-#include "wearable_log.h"
 #include "HeartChartView.h"
 #include "HeartModel.h"
+#include "UiConfig.h"
+#include "heart_blood/health_service/health_service.h"
+#include "power_display_service.h"
 #include "ui_image_animator.h"
-#include "HeartChartView.h"
 #include "ui_resource_string.h"
-#include "power_display_service.h"
 #include "uicomponents/UIComponents.h"
-#include "heart_blood/health_service/health_service.h"
-namespace OHOS
-{
-    static HeartChartView *g_pHeartCheckView = nullptr;
-
-    // 动态刷新设置
-    static constexpr uint16_t IMAGE_SIZE = 180;
-    static constexpr uint16_t IMAGE_POSITION_Y = 134;
-    static constexpr uint16_t IMAGE_POSITION_X = 150;
-    static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SIZE = 20;
-    static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SPEED = 40;
-    // 图片路径
-    static constexpr const char *BACKGROUND_IMAGE_PATH = "/user/res/heart_chart/background.bin";
-    static constexpr const char *BUTTOM_ICON_PATH = "/user/res/heart_chart/buttomicon.bin";
-    static constexpr const char *TOP_ICON_PATH = "/user/res/heart_chart/topicon.bin";
-    static constexpr const char *HEART_ICON_PATH = "/user/res/heart_chart/hearticon.bin";
-    // 心形心跳
-    static constexpr int HEARTBEAT_IMAGE_WIDTH = 92;
-    static constexpr int HEARTBEAT_IMAGE_HEIGHT = 92;
-    static constexpr int HEARTBEAT_IMAGE_X = 85;
-    static constexpr int HEARTBEAT_IMAGE_Y = 50;
-    static constexpr int HEARTBEAT_IMAGE_NUM = 19;
-    static constexpr int HEARTBEAT_DELAY = 50;
-    // 心跳image
-    static ImageAnimatorInfo g_heartImageInfo[HEARTBEAT_IMAGE_NUM] = {
-        {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-
-        {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-        {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
-    };
-
-    HeartChartView::HeartChartView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
-        g_pHeartCheckView = this;
-    }
-    HeartChartView::~HeartChartView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::~HeartChartView");
-
-        imageAnimator->Stop();
-        /*
-            UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
-            UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
-        */
-
-        delete CurrentHeartText;
-        CurrentHeartText = nullptr;
-        delete MaxHeartText;
-        MaxHeartText = nullptr;
-        delete MinHeartText;
-        MinHeartText = nullptr;
-        delete UHeartText;
-        UHeartText = nullptr;
-        delete RestHeartText;
-        RestHeartText = nullptr;
-        delete TopimageView;
-        TopimageView = nullptr;
-        delete BottomimageView;
-        BottomimageView = nullptr;
-        delete CoordinateimageView;
-        CoordinateimageView = nullptr;
-        delete HeartIconView;
-        HeartIconView = nullptr;
-        delete imageAnimator;
-        imageAnimator = nullptr;
-
-        heartchart->ClearDataSerial();
-        delete heartSerial;
-        heartSerial = nullptr;
-        delete heartchart;
-        heartchart = nullptr;
-
-        g_pHeartCheckView = this;
-    }
-    HeartChartView *HeartChartView::GetInstance(void)
-    {
-        return g_pHeartCheckView;
-    }
-
-    /* 更新显示数据 */
-    void HeartChartView::UpdateShowHeart()
-    {
-        // 获取当前心率
-        uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
-        std::string heartrateStr = (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_));
-
-        // 更新当前心率显示
-        if (CurrentHeartText != nullptr)
-        {
-            CurrentHeartText->SetText(heartrateStr.c_str());
-        }
-
-        // 获取最大心率
-        uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
-        std::string heartmaxStr = (heartmax_ == 0) ? "--" : (heartmax_ < 50 ? "--" : std::to_string(heartmax_));
-
-        // 更新最大心率显示
-        if (MaxHeartText != nullptr)
-        {
-            MaxHeartText->SetText(heartmaxStr.c_str());
-        }
-
-        // 获取最小心率
-        uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
-        std::string heartminStr = (heartmin_ == 0) ? "--" : (heartmin_ < 50 ? "--" : std::to_string(heartmin_));
-
-        // 更新最小心率显示
-        if (MinHeartText != nullptr)
-        {
-            MinHeartText->SetText(heartminStr.c_str());
-        }
-    }
-    void HeartChartView::Update_data_Chart(int serialIndex)
-    {
-        if (heartchart == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);
-            return;
-        }
-        /*清除原数据*/
-        heartSerial->ClearData();
-
-        /*设置单个项*/
-        heartdata[serialIndex].x = serialIndex;
-        heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
-
-        /*重新添加*/
-        heartSerial->AddPoints(heartdata, 24);
-        heartSerial->SetLineColor(Color::Red());
-        heartSerial->SetFillColor(Color::Red());
-        heartSerial->EnableGradient(true);
-
-        heartchart->AddDataSerial(heartSerial);
-        heartchart->Invalidate();
-    }
-    void HeartChartView::CleanAllDataView()
-    {
-        if (heartchart == nullptr || MaxHeartText == nullptr || MinHeartText == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail");
-            return;
-        }
-        for (int serialIndex = 0; serialIndex < 24; serialIndex++)
-        {
-            heartdata[serialIndex].x = serialIndex;
-            heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
-        }
-
-        /*清空原数据*/
-        heartSerial->ClearData();
-        heartSerial->AddPoints(heartdata, 24);
-        heartSerial->SetLineColor(Color::Red());
-        heartSerial->SetFillColor(Color::Red());
-        heartSerial->EnableGradient(true);
-
-        heartchart->AddDataSerial(heartSerial);
-        // heartchart->RefreshChart();
-
-        /*更新最大最小值*/
-        SetDataTopAndBottom();
-    }
-    /*设置最大最小数据*/
-    void HeartChartView::SetDataTopAndBottom()
-    {
-        int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax();
-        int MinHeart = HeartModel::GetInstance()->GetHeartRateMin();
-
-        if (MaxHeartText != nullptr)
-        {
-            MaxHeartText->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() : "--");
-        }
-
-        if (MinHeartText != nullptr)
-        {
-            MinHeartText->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str() : "--");
-        }
-
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart, MinHeart);
-    }
-    /*设置曲线图数据*/
-    void HeartChartView::SetDataChart()
-    {
-        if (heartchart == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init_data_Chart new chart fail");
-            return;
-        }
-        heartSerial = new UIChartDataSerial();
-        heartSerial->SetMaxDataCount(24);
+#include "wearable_log.h"
+namespace OHOS {
+static HeartChartView *g_pHeartCheckView = nullptr;
+
+// 动态刷新设置
+static constexpr uint16_t IMAGE_SIZE = 180;
+static constexpr uint16_t IMAGE_POSITION_Y = 134;
+static constexpr uint16_t IMAGE_POSITION_X = 150;
+static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SIZE = 20;
+static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SPEED = 40;
+// 图片路径
+static constexpr const char *BACKGROUND_IMAGE_PATH =
+    "/user/res/heart_chart/background.bin";
+static constexpr const char *BUTTOM_ICON_PATH =
+    "/user/res/heart_chart/buttomicon.bin";
+static constexpr const char *TOP_ICON_PATH =
+    "/user/res/heart_chart/topicon.bin";
+static constexpr const char *HEART_ICON_PATH =
+    "/user/res/heart_chart/hearticon.bin";
+// 心形心跳
+static constexpr int HEARTBEAT_IMAGE_WIDTH = 54;
+static constexpr int HEARTBEAT_IMAGE_HEIGHT = 50;
+static constexpr int HEARTBEAT_IMAGE_X = 111;
+static constexpr int HEARTBEAT_IMAGE_Y = 57;
+static constexpr int HEARTBEAT_IMAGE_NUM = 21;
+static constexpr int HEARTBEAT_DELAY = 50;
+// 心跳image
+static ImageAnimatorInfo g_heartImageInfo[HEARTBEAT_IMAGE_NUM] = {
+    {PNG_A004_070_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_071_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_072_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_073_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_074_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_075_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_076_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_077_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_078_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_079_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_080_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_081_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_082_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_083_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_084_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_085_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_086_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_087_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_088_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_089_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+    {PNG_A004_090_IMAGE_PATH,
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+     HEARTBEAT_IMAGE_WIDTH,
+     HEARTBEAT_IMAGE_HEIGHT,
+     IMG_SRC_FILE_PATH},
+};
+
+HeartChartView::HeartChartView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
+  g_pHeartCheckView = this;
+}
+HeartChartView::~HeartChartView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::~HeartChartView");
+
+  /*
+    UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
+    UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
+  */
+
+  delete displayheart_;
+  displayheart_ = nullptr;
+  delete maxheart_;
+  maxheart_ = nullptr;
+  delete minheart_;
+  minheart_ = nullptr;
+  delete uheart_;
+  uheart_ = nullptr;
+  delete lastheart_;
+  lastheart_ = nullptr;
+  delete maxheart_dynamic_;
+  maxheart_dynamic_ = nullptr;
+  delete maxheart_dynamic_3_;
+  maxheart_dynamic_3_ = nullptr;
+  delete maxheart_dynamic_2_;
+  maxheart_dynamic_2_ = nullptr;
+  delete maxheart_dynamic_1_;
+  maxheart_dynamic_1_ = nullptr;
+  delete minheart_dynamic_;
+  minheart_dynamic_ = nullptr;
+
+  delete maxRateIconView_;
+  maxRateIconView_ = nullptr;
+  delete minRateIconView_;
+  minRateIconView_ = nullptr;
+  delete chartBackgroundView_;
+  chartBackgroundView_ = nullptr;
+  delete heartIconView_;
+  heartIconView_ = nullptr;
+
+  // imageAnimator->Stop();
+  // delete imageAnimator;
+  // imageAnimator = nullptr;
+
+  heartchart->ClearDataSerial();
+  delete heartSerial;
+  heartSerial = nullptr;
+  delete heartchart;
+  heartchart = nullptr;
+
+  g_pHeartCheckView = this;
+}
+HeartChartView *HeartChartView::GetInstance(void) { return g_pHeartCheckView; }
+
+/* 更新显示数据 */
+void HeartChartView::UpdateShowHeart() {
+  // 获取当前心率
+  uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
+  std::string heartrateStr =
+      (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_));
+
+  // 更新当前心率显示
+  if (displayheart_ != nullptr) {
+    displayheart_->SetText(heartrateStr.c_str());
+  }
+
+  // 获取最大心率
+  uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
+  std::string heartmaxStr =
+      (heartmax_ == 0) ? "--"
+                       : (heartmax_ < 50 ? "--" : std::to_string(heartmax_));
+
+  // 更新最大心率显示
+  if (maxheart_ != nullptr) {
+    maxheart_->SetText(heartmaxStr.c_str());
+  }
+
+  // 获取最小心率
+  uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
+  std::string heartminStr =
+      (heartmin_ == 0) ? "--"
+                       : (heartmin_ < 50 ? "--" : std::to_string(heartmin_));
+
+  // 更新最小心率显示
+  if (minheart_ != nullptr) {
+    minheart_->SetText(heartminStr.c_str());
+  }
+}
+void HeartChartView::Update_data_Chart(int serialIndex) {
+  if (heartchart == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d",
+                  serialIndex);
+    return;
+  }
+  /*清除原数据*/
+  heartSerial->ClearData();
+
+  /*设置单个项*/
+  heartdata[serialIndex].x = serialIndex;
+  heartdata[serialIndex].y =
+      HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+
+  /*重新添加*/
+  heartSerial->AddPoints(heartdata, 24);
+  heartSerial->SetLineColor(Color::Red());
+  heartSerial->SetFillColor(Color::Red());
+  heartSerial->EnableGradient(true);
+
+  heartchart->AddDataSerial(heartSerial);
+  heartchart->Invalidate();
+
+  //更新为刚刚检测
+  SetLastHeart();
+}
+void HeartChartView::CleanAllDataView() {
+  if (heartchart == nullptr || maxheart_ == nullptr || minheart_ == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail");
+    return;
+  }
+  for (int serialIndex = 0; serialIndex < 24; serialIndex++) {
+    heartdata[serialIndex].x = serialIndex;
+    heartdata[serialIndex].y =
+        HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+  }
+
+  /*清空原数据*/
+  heartSerial->ClearData();
+  heartSerial->AddPoints(heartdata, 24);
+  heartSerial->SetLineColor(Color::Red());
+  heartSerial->SetFillColor(Color::Red());
+  heartSerial->EnableGradient(true);
+
+  heartchart->AddDataSerial(heartSerial);
+  // heartchart->RefreshChart();
+
+  /*更新最大最小值*/
+  SetDataTopAndBottom();
+}
+/*设置最大最小数据*/
+void HeartChartView::SetDataTopAndBottom() {
+  int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax();
+  int MinHeart = HeartModel::GetInstance()->GetHeartRateMin();
+
+  if (maxheart_ != nullptr) {
+    maxheart_->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str()
+                                    : "--");
+  }
+
+  if (minheart_ != nullptr) {
+    minheart_->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str()
+                                    : "--");
+  }
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart,
+                MinHeart);
+}
+/*设置曲线图数据*/
+void HeartChartView::SetDataChart() {
+  if (heartchart == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init_data_Chart new chart fail");
+    return;
+  }
+  heartSerial = new UIChartDataSerial();
+  heartSerial->SetMaxDataCount(24);
 #if HEART_DATA_TEST
-        Point temp[] = {
-            {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}};
-        std::copy(std::begin(temp), std::end(temp), heartdata);
+  Point temp[] = {{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}};
+  std::copy(std::begin(temp), std::end(temp), heartdata);
 #else
-        for (int serialIndex = 0; serialIndex < 24; serialIndex++)
-        {
-            heartdata[serialIndex].x = serialIndex;
-            heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
-        }
+  for (int serialIndex = 0; serialIndex < 24; serialIndex++) {
+    heartdata[serialIndex].x = serialIndex;
+    heartdata[serialIndex].y =
+        HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+  }
+#endif
+  heartSerial->AddPoints(heartdata, 24);
+  heartSerial->SetLineColor(Color::Red());
+  heartSerial->SetFillColor(Color::Red());
+  heartSerial->EnableGradient(true);
+
+  heartchart->AddDataSerial(heartSerial);
+  heartchart->Invalidate();
+}
+/*设置心率动画*/
+void HeartChartView::HeartImageAnimator() {
+  imageAnimator = new UIImageAnimatorView();
+  if (imageAnimator == nullptr) {
+    WEARABLE_LOGE(
+        WEARABLE_LOG_MODULE_APP,
+        "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail");
+    return;
+  }
+  imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y,
+                             HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT);
+  imageAnimator->SetImageAnimatorSrc(g_heartImageInfo, HEARTBEAT_IMAGE_NUM,
+                                     HEARTBEAT_DELAY);
+  imageAnimator->SetRepeat(true);
+  container_->Add(imageAnimator);
+  imageAnimator->Start();
+}
+/*初始化心率曲线*/
+void HeartChartView::InitChartView(void) {
+  if (heartchart == nullptr) {
+    heartchart = new UIChartPolyline();
+  }
+  heartchart->SetPosition(80, 199);
+  heartchart->Resize(313, 122);
+  heartchart->SetViewId("uiChart1");
+  heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00);
+
+  UIXAxis &heartXAxis = heartchart->GetXAxis();
+  heartXAxis.SetMarkNum(24);
+  heartXAxis.SetDataRange(0, 24);
+  heartXAxis.SetLineColor(Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+
+  UIYAxis &heartYAxis = heartchart->GetYAxis();
+  heartYAxis.SetMarkNum(4);
+  heartYAxis.SetDataRange(0, 220);
+  heartYAxis.SetLineColor(Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+
+  heartchart->SetGradientOpacity(78, 64);
+
+  // Add to rootView
+  container_->Add(heartchart);
+}
+
+//初始化label
+/*
+需要显示一个动态心率的效果
+有5个label代表 曲线图的y轴
+    最大心率+10
+    最大心率+10-(最小心率-10)*3/4
+    最大心率+10-(最小心率-10)*2/4
+    最大心率+10-(最小心率-10)*1/4
+    最小心率-10
+*/
+void HeartChartView::InitChartLabel() {
+  //当前心率值
+  InitLabel(displayheart_, 133, 32, 200, 100, "label", "--", GILROY_BOLD_FONT,
+            65);
+  // 单位
+  InitRollLabel(uheart_, 283, 52, 100, 60, "label", STR_TIMES_PER_MIN,
+                DEFAULT_VECTOR_FONT_FILENAME, 30);
+  uheart_->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));
+  //上一次检测信息
+  InitLabel(lastheart_, 53, 130, 360, 35, "label", "--",
+            DEFAULT_VECTOR_FONT_FILENAME, 30);
+  //最小心率 不居中
+  InitLabelAdapt(minheart_, 293, 380, 200, 35, "label", "--",
+                 DEFAULT_VECTOR_FONT_FILENAME, 35);
+  //最大心率 不居中
+  InitLabelAdapt(maxheart_, 158, 380, 200, 35, "label", "--",
+                 DEFAULT_VECTOR_FONT_FILENAME, 35);
+
+  //动态心率最大
+  InitLabel(maxheart_dynamic_, 30, 190, 50, 20, "label", "220",
+            DEFAULT_VECTOR_FONT_FILENAME, 20);
+  maxheart_dynamic_->SetTextColor(
+      Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+  //动态心率3/4
+  InitLabel(maxheart_dynamic_3_, 30, 218, 50, 20, "label", "160",
+            DEFAULT_VECTOR_FONT_FILENAME, 20);
+  maxheart_dynamic_3_->SetTextColor(
+      Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+  //动态心率2/4
+  InitLabel(maxheart_dynamic_2_, 30, 247, 50, 20, "label", "100",
+            DEFAULT_VECTOR_FONT_FILENAME, 20);
+  maxheart_dynamic_2_->SetTextColor(
+      Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+  //动态心率1/4
+  InitLabel(maxheart_dynamic_1_, 30, 277, 50, 20, "label", "40",
+            DEFAULT_VECTOR_FONT_FILENAME, 20);
+  maxheart_dynamic_1_->SetTextColor(
+      Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+  //动态心率最小
+  InitLabel(minheart_dynamic_, 30, 306, 50, 20, "label", "0",
+            DEFAULT_VECTOR_FONT_FILENAME, 20);
+  minheart_dynamic_->SetTextColor(
+      Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+
+  container_->Add(displayheart_);
+  container_->Add(uheart_);
+  container_->Add(lastheart_);
+  container_->Add(minheart_);
+  container_->Add(maxheart_);
+  container_->Add(maxheart_dynamic_);
+  container_->Add(maxheart_dynamic_3_);
+  container_->Add(maxheart_dynamic_2_);
+  container_->Add(maxheart_dynamic_1_);
+  container_->Add(minheart_dynamic_);
+}
+
+void HeartChartView::InitChartImageView() {
+
+  if (minRateIconView_ == nullptr) {
+    minRateIconView_ = new UIImageView();
+  }
+  minRateIconView_->SetPosition(266, 394);
+  minRateIconView_->Resize(100, 100);
+  minRateIconView_->SetViewId("minRateIcon");
+  minRateIconView_->SetSrc(BUTTOM_ICON_PATH);
+  if (maxRateIconView_ == nullptr) {
+    maxRateIconView_ = new UIImageView();
+  }
+  maxRateIconView_->SetPosition(129, 394);
+  maxRateIconView_->Resize(100, 100);
+  maxRateIconView_->SetViewId("maxRateIcon");
+  maxRateIconView_->SetSrc(TOP_ICON_PATH);
+
+  if (chartBackgroundView_ == nullptr) {
+    chartBackgroundView_ = new UIImageView();
+  }
+  chartBackgroundView_->SetPosition(30, 160);
+  chartBackgroundView_->Resize(100, 100);
+  chartBackgroundView_->SetViewId("chartBackground");
+  chartBackgroundView_->SetSrc(BACKGROUND_IMAGE_PATH);
+
+  container_->Add(chartBackgroundView_);
+  container_->Add(minRateIconView_);
+  container_->Add(maxRateIconView_);
+
+  if (heartIconView_ == nullptr) {
+    heartIconView_ = new UIImageView();
+  }
+  heartIconView_->SetPosition(111, 57);
+  heartIconView_->Resize(100, 100);
+  heartIconView_->SetViewId("heartIcon");
+  heartIconView_->SetSrc(HEART_ICON_PATH);
+
+  container_->Add(heartIconView_);
+  heartIconView_->SetVisible(true);
+#if 0
+  if (lineView_ == nullptr) {
+    lineView_ = new UIImageView();
+  }
+  lineView_->SetPosition(230, 385);
+  lineView_->Resize(1, 26);
+  lineView_->SetViewId("lineView");
+  lineView_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff666666);
+  lineView_->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+
+  container_->Add(lineView_);
+  lineView_->SetVisible(true);
 #endif
-        heartSerial->AddPoints(heartdata, 24);
-        heartSerial->SetLineColor(Color::Red());
-        heartSerial->SetFillColor(Color::Red());
-        heartSerial->EnableGradient(true);
-
-        heartchart->AddDataSerial(heartSerial);
-        heartchart->Invalidate();
-    }
-    /*设置心率动画*/
-    void HeartChartView::HeartImageAnimator()
-    {
-        imageAnimator = new UIImageAnimatorView();
-        if (imageAnimator == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail");
-            return;
-        }
-        imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT);
-        imageAnimator->SetImageAnimatorSrc(g_heartImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY);
-        imageAnimator->SetRepeat(true);
-        container_->Add(imageAnimator);
-        imageAnimator->Start();
-    }
-    /*初始化心率曲线*/
-    void HeartChartView::InitChartView(void)
-    {
-        if (heartchart == nullptr)
-        {
-            heartchart = new UIChartPolyline();
-        }
-        heartchart->SetPosition(95, 178);
-        heartchart->Resize(320, 110);
-        heartchart->SetViewId("uiChart");
-        heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00);
-
-        UIXAxis &heartXAxis = heartchart->GetXAxis();
-        UIYAxis &heartYAxis = heartchart->GetYAxis();
-        heartXAxis.SetMarkNum(1);
-        heartXAxis.SetDataRange(0, 24);
-        heartXAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));
-        heartYAxis.SetMarkNum(1);
-        heartYAxis.SetDataRange(0, 220);
-        heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0));
-
-        heartchart->SetGradientOpacity(25, 180);
-        // heartchart->SetGradientOpacity(255, 0);
-
-        container_->Add(heartchart);
-    }
-    /*初始化检测界面*/
-    bool HeartChartView::HeartViewInit()
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartViewInit is begin");
-        // 初始化图片
-        InitImageView(CoordinateimageView, 38, 130, 390, 200, "CoordinateimageView", BACKGROUND_IMAGE_PATH);
-        InitImageView(TopimageView, 131, 350, 21, 12, "TopimageView", TOP_ICON_PATH);
-        InitImageView(BottomimageView, 267, 350, 21, 12, "BottomimageView", BUTTOM_ICON_PATH);
-        // 初始化心率值
-        InitLabel(CurrentHeartText, 172, 62, 102, 79, "CurrentHeartText", "--", GILROY_BOLD_FONT, 65);
-        InitRollLabel(UHeartText, 283, 85, 100, 35, "UHeartText", STR_TIMES_PER_MIN, DEFAULT_VECTOR_FONT_FILENAME, 30);
-        InitLabelAdapt(MaxHeartText, 160, 336, 102, 79, "MaxHeartText", "--", DEFAULT_VECTOR_FONT_FILENAME, 35);
-        InitLabelAdapt(MinHeartText, 295, 336, 102, 79, "MinHeartText", "--", DEFAULT_VECTOR_FONT_FILENAME, 35);
-
-        container_->Add(CoordinateimageView);
-        container_->Add(TopimageView);
-        container_->Add(BottomimageView);
-        container_->Add(CurrentHeartText);
-        container_->Add(UHeartText);
-        container_->Add(MaxHeartText);
-        container_->Add(MinHeartText);
-
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartViewInit is ok");
-        return true;
-    }
-
-    void HeartChartView::OnStart()
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStart");
-        View<HeartChartPresenter>::OnStart();
-
-        SetContainerView(new UIViewGroup());
-        container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-
-        if (!HeartViewInit())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::InitHeartView fail");
-        }
-
-        HeartImageAnimator();
-        InitChartView();
-        SetDataChart();
-        SetDataTopAndBottom();
-
-        SetContainerView(container_);
-        container_->SetDraggable(true);
-        container_->SetTouchable(true);
-        container_->SetOnDragListener(presenter_);
-
-        // 增加按键监听
-        RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartChartPresenter::GetInstance();
-        RootView::GetInstance()->SetOnKeyActListener(keyactListener);
-    }
-    void HeartChartView::OnSetUpView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnSetUpView");
-        View<HeartChartPresenter>::OnSetUpView();
-
-        Draw();
-    }
-    void HeartChartView::OnTearDownView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnTearDownView");
-        View<HeartChartPresenter>::OnTearDownView();
-        return;
-    }
-
-    void HeartChartView::OnStop()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStop");
-        View<HeartChartPresenter>::OnStop();
-        if (container_ != nullptr)
-        {
-            container_->RemoveAll();
-            delete container_;
-            container_ = nullptr;
-        }
-        return;
-    }
 }
+
+//更新图表配置
+void HeartChartView::UpdateChartConfig() {
+  if (minheart_dynamic_ == nullptr || maxheart_dynamic_1_ == nullptr ||
+      maxheart_dynamic_2_ == nullptr || maxheart_dynamic_3_ == nullptr ||
+      heartchart == nullptr) {
+    return;
+  }
+
+  // 获取动态心率数据
+  HeartModel::GetInstance()->SetArrayData();
+  uint16_t *dynamicArray = HeartModel::GetInstance()->GetArrayData();
+
+  //更新label
+  if (dynamicArray) {
+    minheart_dynamic_->SetText(std::to_string(dynamicArray[0]).c_str());
+    maxheart_dynamic_1_->SetText(std::to_string(dynamicArray[1]).c_str());
+    maxheart_dynamic_2_->SetText(std::to_string(dynamicArray[2]).c_str());
+    maxheart_dynamic_3_->SetText(std::to_string(dynamicArray[3]).c_str());
+    maxheart_dynamic_->SetText(std::to_string(dynamicArray[4]).c_str());
+  }
+  //更新chart
+  UIYAxis &heartYAxis = heartchart->GetYAxis();
+  heartYAxis.SetMarkNum(4);
+  heartYAxis.SetDataRange(dynamicArray[0], dynamicArray[4]);
+  heartYAxis.SetLineColor(Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+  heartchart->Invalidate();
+}
+//更新上一次检测信息
+void HeartChartView::SetLastHeart() {
+  if (lastheart_ == nullptr)
+    return;
+  std::string lastStr = HeartModel::GetInstance()->GetCheckString();
+  lastheart_->SetText(lastStr.c_str());
+}
+/*初始化检测界面*/
+bool HeartChartView::HeartViewInit() {
+
+  //图片
+  InitChartImageView();
+  //标签
+  InitChartLabel();
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartViewInit is ok");
+  return true;
+}
+UIViewGroup *HeartChartView::GetchartGroup() {
+  SetContainerView(new UIViewGroup());
+  container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(),
+                          Screen::GetInstance().GetHeight());
+  if (!HeartViewInit()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "HeartChartView::InitHeartView fail");
+  }
+  // HeartImageAnimator(); 暂时屏蔽
+  InitChartView();
+  UpdateChartConfig();
+  SetDataChart();
+  SetLastHeart();
+  SetDataTopAndBottom();
+  return container_;
+}
+void HeartChartView::OnStart() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStart");
+  View<HeartChartPresenter>::OnStart();
+
+  SetContainerView(new UIViewGroup());
+  container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(),
+                          Screen::GetInstance().GetHeight());
+
+  if (!HeartViewInit()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "HeartChartView::InitHeartView fail");
+  }
+
+  HeartImageAnimator();
+  InitChartView();
+  UpdateChartConfig();
+  SetDataChart();
+  SetLastHeart();
+  SetDataTopAndBottom();
+
+  SetContainerView(container_);
+  container_->SetDraggable(true);
+  container_->SetTouchable(true);
+  container_->SetOnDragListener(presenter_);
+
+  // 增加按键监听
+  RootView::OnKeyActListener *keyactListener =
+      (RootView::OnKeyActListener *)OHOS::HeartChartPresenter::GetInstance();
+  RootView::GetInstance()->SetOnKeyActListener(keyactListener);
+}
+void HeartChartView::OnSetUpView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnSetUpView");
+  View<HeartChartPresenter>::OnSetUpView();
+
+  Draw();
+}
+void HeartChartView::OnTearDownView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnTearDownView");
+  View<HeartChartPresenter>::OnTearDownView();
+  return;
+}
+
+void HeartChartView::OnStop() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStop");
+  View<HeartChartPresenter>::OnStop();
+  if (container_ != nullptr) {
+    container_->RemoveAll();
+    delete container_;
+    container_ = nullptr;
+  }
+  return;
+}
+} // namespace OHOS
index e87e4b6..f21f91f 100644 (file)
@@ -1,33 +1,31 @@
 #include "heartrate/include/HeartModel.h"\r
-#include "wearable_log.h"\r
-#include "graphic_service.h"\r
 #include "IndoorWalkPreparedView.h"\r
 #include "IndoorWalkPresenter.h"\r
 #include "MainViewSample.h"\r
+#include "graphic_service.h"\r
+#include "wearable_log.h"\r
 \r
-#include "heartrate/include/HeartRateView.h"\r
+#include "DialModelHeartRate.h"\r
+#include "heartrate/include/HeartChartView.h"\r
 #include "heartrate/include/HeartDetectionPresenter.h"\r
+#include "heartrate/include/HeartRateView.h"\r
 #include "heartrate/include/HeartResultPresenter.h"\r
-#include "heartrate/include/HeartChartView.h"\r
-#include "DialModelHeartRate.h"\r
 \r
-#include <iostream>\r
-#include <random>\r
 #include "DialModelHeartRate.h"\r
-#include "health_service.h"\r
+#include "custom_runtime.h"\r
 #include "custom_utils.h"\r
+#include "health_service.h"\r
 #include "ppg_service.h"\r
-#include "custom_runtime.h"\r
+#include <algorithm>\r
 #include <iostream>\r
 #include <memory>\r
-#include <algorithm>\r
+#include <random>\r
 \r
-#include "ui_service.h"\r
 #include "battery_hal.h"\r
+#include "ui_service.h"\r
 \r
 #ifdef __cplusplus\r
-extern "C"\r
-{\r
+extern "C" {\r
 #endif\r
 \r
 #define MAX_UNWEAR_COUNT 30\r
@@ -36,698 +34,717 @@ extern "C"
 #define MIN_DISPLAY_HEART 60\r
 #define HEARTTEST 1 //[0 开启测试 1 关闭]\r
 \r
-    /* 佩戴检测结果 */\r
-    enum\r
-    {\r
-        SENSOR_WEAR_ON = 0,\r
-        SENSOR_WEAR_OFF,\r
-        SENSOR_WEAR_UNKNOW,\r
-        SENSOR_WEAR_MAX\r
-    };\r
+/* 佩戴检测结果 */\r
+enum {\r
+  SENSOR_WEAR_ON = 0,\r
+  SENSOR_WEAR_OFF,\r
+  SENSOR_WEAR_UNKNOW,\r
+  SENSOR_WEAR_MAX\r
+};\r
 \r
-    using namespace OHOS;\r
+using namespace OHOS;\r
 #define LEN 32\r
 \r
-    static void Notify(void *args, const Topic topic, Request *request);\r
-\r
-    Subscriber heartSubscirber = {\r
-        .identity = nullptr,\r
-        .args = nullptr,\r
-        .Notify = Notify,\r
-    };\r
-    static void ProcessHeartRateUpdate(Request *request);\r
-    static void RefreshHeartData();\r
-    void HeartDataSubscribeTopic(Topic topic)\r
-    {\r
-        BroadcastApi *broadcastApi = nullptr;\r
-        IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
-        if (api == nullptr)\r
-        {\r
-            return;\r
-        }\r
-        int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
-        if (result != 0 || broadcastApi == nullptr)\r
-        {\r
-            return;\r
-        }\r
-        int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret = %d, topic = %u", ret, topic);\r
-        broadcastApi->Release((IUnknown *)broadcastApi);\r
-    }\r
-\r
-    void HearDatatUnsubscribeTopic(Topic topic)\r
-    {\r
-        BroadcastApi *broadcastApi = nullptr;\r
-        IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
-        if (api == nullptr)\r
-        {\r
-            return;\r
-        }\r
-        int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
-        if (result != 0 || broadcastApi == nullptr)\r
-        {\r
-            return;\r
-        }\r
-        broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber);\r
-        broadcastApi->Release((IUnknown *)broadcastApi);\r
-    }\r
+static void Notify(void *args, const Topic topic, Request *request);\r
+\r
+Subscriber heartSubscirber = {\r
+    .identity = nullptr,\r
+    .args = nullptr,\r
+    .Notify = Notify,\r
+};\r
+static void ProcessHeartRateUpdate(Request *request);\r
+static void RefreshHeartData();\r
+void HeartDataSubscribeTopic(Topic topic) {\r
+  BroadcastApi *broadcastApi = nullptr;\r
+  IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,\r
+                                                     BROADCAST_FEATURE_NAME);\r
+  if (api == nullptr) {\r
+    return;\r
+  }\r
+  int result =\r
+      api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+  if (result != 0 || broadcastApi == nullptr) {\r
+    return;\r
+  }\r
+  int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic,\r
+                                         &heartSubscirber);\r
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+                "HeartSubscribeTopic ret = %d, topic = %u", ret, topic);\r
+  broadcastApi->Release((IUnknown *)broadcastApi);\r
+}\r
 \r
-    static void Notify(void *args, const Topic topic, Request *request)\r
-    {\r
-        UNUSED(args);\r
-        UNUSED(topic);\r
+void HearDatatUnsubscribeTopic(Topic topic) {\r
+  BroadcastApi *broadcastApi = nullptr;\r
+  IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,\r
+                                                     BROADCAST_FEATURE_NAME);\r
+  if (api == nullptr) {\r
+    return;\r
+  }\r
+  int result =\r
+      api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+  if (result != 0 || broadcastApi == nullptr) {\r
+    return;\r
+  }\r
+  broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic,\r
+                                 &heartSubscirber);\r
+  broadcastApi->Release((IUnknown *)broadcastApi);\r
+}\r
 \r
-        // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
-        if (uapi_dev_runtime_get_train_status() == 1 || request == NULL)\r
-        {\r
-            return;\r
-        }\r
+static void Notify(void *args, const Topic topic, Request *request) {\r
+  UNUSED(args);\r
+  UNUSED(topic);\r
 \r
-        switch (request->msgId)\r
-        {\r
-        case TOPIC_EVENT_HEARTRATE_UPDATA:\r
-            // ProcessHeartRateUpdate(request);\r
-            break;\r
+  // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
+  if (uapi_dev_runtime_get_train_status() == 1 || request == NULL) {\r
+    return;\r
+  }\r
 \r
-        case TOPIC_EVENT_NEXTDAY_UPDATE:\r
-        case TOPIC_EVENT_UTCTIME_UPDATE:\r
-            RefreshHeartData();\r
-            break;\r
+  switch (request->msgId) {\r
+  case TOPIC_EVENT_HEARTRATE_UPDATA:\r
+    // ProcessHeartRateUpdate(request);\r
+    break;\r
 \r
-        case TOPIC_EVENT_WEARSTATE_UPDATE:\r
-            break;\r
+  case TOPIC_EVENT_NEXTDAY_UPDATE:\r
+  case TOPIC_EVENT_UTCTIME_UPDATE:\r
+    RefreshHeartData();\r
+    break;\r
 \r
-        default:\r
-            break;\r
-        }\r
-    }\r
+  case TOPIC_EVENT_WEARSTATE_UPDATE:\r
+    break;\r
 \r
-    static void ProcessHeartRateUpdate(Request *request)\r
-    {\r
-        uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
-\r
-        // 直接处理心率数据,不进行筛选\r
-        uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
-        HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
-        if (heartInfo == NULL)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
-            return;\r
-        }\r
+  default:\r
+    break;\r
+  }\r
+}\r
 \r
-        heartInfo->index = index_;\r
-        heartInfo->maxX = index_;\r
-        heartInfo->minX = index_;\r
-        heartInfo->perSec = preheart;\r
-        heartInfo->rest = preheart;\r
-        /*最大最小值不为0*/\r
-        heartInfo->maxValue = preheart;\r
-        heartInfo->minValue = preheart;\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
-        OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
-\r
-        free(heartInfo); // 释放内存\r
-        heartInfo = nullptr;\r
-    }\r
+static void ProcessHeartRateUpdate(Request *request) {\r
+  uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
+\r
+  // 直接处理心率数据,不进行筛选\r
+  uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
+  HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
+  if (heartInfo == NULL) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
+    return;\r
+  }\r
+\r
+  heartInfo->index = index_;\r
+  heartInfo->maxX = index_;\r
+  heartInfo->minX = index_;\r
+  heartInfo->perSec = preheart;\r
+  heartInfo->rest = preheart;\r
+  /*最大最小值不为0*/\r
+  heartInfo->maxValue = preheart;\r
+  heartInfo->minValue = preheart;\r
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d",\r
+                heartInfo->index, preheart);\r
+  OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
+\r
+  free(heartInfo); // 释放内存\r
+  heartInfo = nullptr;\r
+}\r
 \r
-    static void RefreshHeartData()\r
-    {\r
-        OHOS::HeartModel::GetInstance()->ClearHeartData();\r
-        GraphicService::GetInstance()->PostGraphicEvent(\r
-            std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
-    }\r
+static void RefreshHeartData() {\r
+  OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+  GraphicService::GetInstance()->PostGraphicEvent(std::bind(\r
+      &OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
+}\r
 \r
 #ifdef __cplusplus\r
 }\r
 #endif\r
 \r
-namespace OHOS\r
-{\r
-    void HeartModel::ClearHeartData(void)\r
-    {\r
-        pretime = 0;\r
-        entryTimes = 0;\r
-        aveCount = 0;\r
-        preMaxValue = 0;\r
-        preMaxX = NUM_1;\r
-        preMinValue = HEART_RATE_LIMIT_UPPER;\r
-        preMinX = NUM_1;\r
-        countMax = 0;\r
-        countMin = 0;\r
-        healthDatas.heartRateMax.x = (uint16_t)0XFFFF;\r
-        healthDatas.heartRateMax.y = 0;\r
-        healthDatas.heartRateMin.x = (uint16_t)0XFFFF;\r
-        healthDatas.heartRateMin.y = (uint16_t)0XFFFF;\r
-        for (int i = 0; i < HEART_AVE_NUM; i++)\r
-        {\r
-            healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF;\r
-            healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF;\r
-        }\r
-        if (HeartRateView::GetInstance() != nullptr)\r
-        {\r
-            HeartRateView::GetInstance()->ClearElectrocardiogram();\r
-        }\r
-        SetAveHeartRateCount(0);\r
-        GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
-                                                                  healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
-    }\r
-\r
-    HeartModel::HeartModel()\r
-    {\r
-        /*初始化读取文件*/\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
-            timestamp_ms = data->timestamp;\r
-            // 更新表盘心率数据\r
-            DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart);\r
-            delete data;\r
-        }\r
-        else\r
-        {\r
-            currentheart = 0;\r
-            timestamp_ms = 0;\r
-        }\r
-    }\r
-\r
-    HeartModel::~HeartModel()\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()");\r
-        HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
-        HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
-        HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
-        HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
-    }\r
-\r
-    HeartModel *HeartModel::GetInstance(void)\r
-    {\r
-        static HeartModel heartModel;\r
-        return &heartModel;\r
-    }\r
-    uint16_t HeartModel::GetIndex()\r
-    {\r
-        return index_;\r
-    }\r
-    void HeartModel::SetIndex(uint16_t index)\r
-    {\r
-        index_ = index;\r
-    }\r
-\r
-    void HeartModel::Init(void)\r
-    {\r
-        HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
-        HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
-        HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
-        HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
-    }\r
-\r
-    Point *HeartModel::GetAveHeartRate(void)\r
-    {\r
-        return healthDatas.heartRateAvg;\r
-    }\r
-\r
-    void HeartModel::HandleMaxHeart(uint16 coord, uint16 value)\r
-    {\r
-        healthDatas.heartRateMax.x = coord;\r
-        healthDatas.heartRateMax.y = value;\r
-        // 插入最大心率 countMax 数据个数\r
-        if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM)\r
-        {\r
-            if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM)\r
-            {\r
-                healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y;\r
-            }\r
-            else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x == healthDatas.heartRateAvg[aveCount - 1].x))\r
-            {\r
-                healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y;\r
-            }\r
-            else\r
-            {\r
-                healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax;\r
-                countMax = aveCount;\r
-                aveCount++;\r
-            }\r
-            if (healthDatas.heartRateMax.x != 0)\r
-            {\r
-                if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0)\r
-                {\r
-                    for (int i = 1; i < (aveCount - 1); i++)\r
-                    {\r
-                        healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
-                    }\r
-                    aveCount--;\r
-                    countMax--;\r
-                }\r
-            }\r
-        }\r
-        preMaxValue = healthDatas.heartRateMax.y;\r
-        preMaxX = healthDatas.heartRateMax.x;\r
-    }\r
-\r
-    void HeartModel::HandleMinHeart(uint16 coord, uint16 value)\r
-    {\r
-        // 最小心率\r
-        healthDatas.heartRateMin.x = coord;\r
-        healthDatas.heartRateMin.y = value;\r
-        // 插入最小心率\r
-        // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题???\r
-        // preMinValue 上一个心率最小值\r
-        // preMinX 上一个最小值对应的坐标\r
-        // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理\r
-        if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM)\r
-        {\r
-\r
-            if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM)\r
-            {\r
-                // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据 countMin 即可\r
-                healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y;\r
-            }\r
-            else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x == healthDatas.heartRateAvg[aveCount - 1].x))\r
-            {\r
-                // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值\r
-                healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y;\r
-            }\r
-            else\r
-            {\r
-                healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin;\r
-                countMin = aveCount;\r
-                aveCount++;\r
-            }\r
-\r
-            // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。\r
-            if (healthDatas.heartRateMin.x != 0)\r
-            {\r
-                if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0)\r
-                {\r
-                    for (int i = 0; i < (aveCount - 1); i++)\r
-                    {\r
-                        healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
-                    }\r
-                    aveCount--;\r
-                    countMin--;\r
-                }\r
-            }\r
-        }\r
-        preMinValue = healthDatas.heartRateMin.y;\r
-        preMinX = healthDatas.heartRateMin.x;\r
-    }\r
-\r
-    void HeartModel::HeartRatePros(HeartDatas *heartInfo)\r
-    {\r
-        uint16_t perSecHeartRate = 0;\r
-        uint16_t restHeartRate = 0;\r
-\r
-        // 每秒心率\r
-        perSecHeartRate = heartInfo->perSec;\r
-        if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
-        {\r
-            healthDatas.heartRatePerSec = perSecHeartRate;\r
-        }\r
-\r
-        GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
-                                                                  healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
-    }\r
-\r
-    uint16_t HeartModel::GetAveHeartRateCount(void)\r
-    {\r
-        return aveCount;\r
-    }\r
+namespace OHOS {\r
+void HeartModel::ClearHeartData(void) {\r
+  pretime = 0;\r
+  entryTimes = 0;\r
+  aveCount = 0;\r
+  preMaxValue = 0;\r
+  preMaxX = NUM_1;\r
+  preMinValue = HEART_RATE_LIMIT_UPPER;\r
+  preMinX = NUM_1;\r
+  countMax = 0;\r
+  countMin = 0;\r
+  healthDatas.heartRateMax.x = (uint16_t)0XFFFF;\r
+  healthDatas.heartRateMax.y = 0;\r
+  healthDatas.heartRateMin.x = (uint16_t)0XFFFF;\r
+  healthDatas.heartRateMin.y = (uint16_t)0XFFFF;\r
+  for (int i = 0; i < HEART_AVE_NUM; i++) {\r
+    healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF;\r
+    healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF;\r
+  }\r
+  if (HeartRateView::GetInstance() != nullptr) {\r
+    HeartRateView::GetInstance()->ClearElectrocardiogram();\r
+  }\r
+  SetAveHeartRateCount(0);\r
+  GraphicService::GetInstance()->PostGraphicEvent(\r
+      std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+                healthDatas.heartRatePerSec, healthDatas.heartRateRest,\r
+                healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
+}\r
 \r
-    uint16_t HeartModel::GetHeartRateMax(void)\r
-    {\r
-        return healthDatas.heartRateMax.y;\r
-    }\r
+HeartModel::HeartModel() {\r
+  /*初始化读取文件*/\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
+    currentheart = data->Heart;\r
+    timestamp_ms = data->timestamp;\r
+    // 更新表盘心率数据\r
+    DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart);\r
+    delete data;\r
+  } else {\r
+    currentheart = 0;\r
+    timestamp_ms = 0;\r
+  }\r
+  //配置动态数组\r
+  SetArrayData();\r
+}\r
 \r
-    uint16_t HeartModel::GetHeartRateMin(void)\r
-    {\r
-        return healthDatas.heartRateMin.y;\r
-    }\r
+HeartModel::~HeartModel() {\r
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()");\r
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
+  HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
+}\r
 \r
-    void HeartModel::SetHeartRatePerSec(uint32 sec)\r
-    {\r
-        healthDatas.heartRatePerSec = sec;\r
-        if (HeartRateView::GetInstance() == nullptr)\r
-        {\r
-            return;\r
-        }\r
-        HeartRateView::GetInstance()->RefreshHeartRatePerSec(healthDatas.heartRatePerSec);\r
-    }\r
+HeartModel *HeartModel::GetInstance(void) {\r
+  static HeartModel heartModel;\r
+  return &heartModel;\r
+}\r
+uint16_t HeartModel::GetIndex() { return index_; }\r
+void HeartModel::SetIndex(uint16_t index) { index_ = index; }\r
+\r
+void HeartModel::Init(void) {\r
+  HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+  HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
+  HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
+  HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
+}\r
 \r
-    void HeartModel::SetAveHeartRateCount(uint16_t value)\r
-    {\r
-        aveCount = value;\r
-    }\r
+Point *HeartModel::GetAveHeartRate(void) { return healthDatas.heartRateAvg; }\r
+\r
+void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) {\r
+  healthDatas.heartRateMax.x = coord;\r
+  healthDatas.heartRateMax.y = value;\r
+  // 插入最大心率 countMax 数据个数\r
+  if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) {\r
+    if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) {\r
+      healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y;\r
+    } else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x ==\r
+                                    healthDatas.heartRateAvg[aveCount - 1].x)) {\r
+      healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y;\r
+    } else {\r
+      healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax;\r
+      countMax = aveCount;\r
+      aveCount++;\r
+    }\r
+    if (healthDatas.heartRateMax.x != 0) {\r
+      if (healthDatas.heartRateAvg[0].x == 0 &&\r
+          healthDatas.heartRateAvg[1].x == 0) {\r
+        for (int i = 1; i < (aveCount - 1); i++) {\r
+          healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
+        }\r
+        aveCount--;\r
+        countMax--;\r
+      }\r
+    }\r
+  }\r
+  preMaxValue = healthDatas.heartRateMax.y;\r
+  preMaxX = healthDatas.heartRateMax.x;\r
+}\r
 \r
-    void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate)\r
-    {\r
-        uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
-        /*主界面刷新心率*/\r
-        if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr)\r
-        {\r
-            MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
-        }\r
-        /*心率卡片刷新心率数据*/\r
-        if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
-        {\r
-            if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
-            {\r
-                HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
-                HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
-                HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
-            }\r
-        }\r
-        /*applist心率刷新心率数据*/\r
-        if (HeartChartView::GetInstance() != nullptr)\r
-        {\r
-            HeartChartView::GetInstance()->UpdateShowHeart();\r
-        }\r
-    }\r
-    /* ---------------------------------- 状态检测 ---------------------------------- */\r
-\r
-    // 重新初始化\r
-    void HeartModel::ClearDisplayData()\r
-    {\r
-        /*显示的心率数据清空*/\r
-        currentheart = 0;\r
-        timestamp_ms = 0;\r
-        displayheart = 0;\r
-        displayheart_max = 0; // 显示最大心率\r
-        displayheart_min = 0; // 显示最小心率\r
-    }\r
-    // 获取心率数据\r
-    uint16_t HeartModel::GetHeartdata()\r
-    {\r
-        return currentheart;\r
-    }\r
+void HeartModel::HandleMinHeart(uint16 coord, uint16 value) {\r
+  // 最小心率\r
+  healthDatas.heartRateMin.x = coord;\r
+  healthDatas.heartRateMin.y = value;\r
+  // 插入最小心率\r
+  // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题???\r
+  // preMinValue 上一个心率最小值\r
+  // preMinX 上一个最小值对应的坐标\r
+  // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理\r
+  if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) {\r
+\r
+    if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) {\r
+      // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据\r
+      // countMin 即可\r
+      healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y;\r
+    } else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x ==\r
+                                    healthDatas.heartRateAvg[aveCount - 1].x)) {\r
+      // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值\r
+      healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y;\r
+    } else {\r
+      healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin;\r
+      countMin = aveCount;\r
+      aveCount++;\r
+    }\r
+\r
+    // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。\r
+    if (healthDatas.heartRateMin.x != 0) {\r
+      if (healthDatas.heartRateAvg[0].x == 0 &&\r
+          healthDatas.heartRateAvg[1].x == 0) {\r
+        for (int i = 0; i < (aveCount - 1); i++) {\r
+          healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
+        }\r
+        aveCount--;\r
+        countMin--;\r
+      }\r
+    }\r
+  }\r
+  preMinValue = healthDatas.heartRateMin.y;\r
+  preMinX = healthDatas.heartRateMin.x;\r
+}\r
 \r
-    uint16_t HeartModel::GetShowHeartdata()\r
-    {\r
-        return displayheart;\r
-    }\r
-    uint16_t HeartModel::GetShowMaxHeartdata()\r
-    {\r
-        return displayheart_max;\r
-    }\r
-    uint16_t HeartModel::GetShowMinHeartdata()\r
-    {\r
-        return displayheart_min;\r
-    }\r
-    uint32_t HeartModel::GetCheckTime()\r
-    {\r
-        return timestamp_ms;\r
-    }\r
+void HeartModel::HeartRatePros(HeartDatas *heartInfo) {\r
+  uint16_t perSecHeartRate = 0;\r
+  uint16_t restHeartRate = 0;\r
+\r
+  // 每秒心率\r
+  perSecHeartRate = heartInfo->perSec;\r
+  if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER &&\r
+      perSecHeartRate <= HEART_RATE_LIMIT_UPPER) {\r
+    healthDatas.heartRatePerSec = perSecHeartRate;\r
+  }\r
+\r
+  GraphicService::GetInstance()->PostGraphicEvent(\r
+      std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+                healthDatas.heartRatePerSec, healthDatas.heartRateRest,\r
+                healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
+}\r
 \r
-    void HeartModel::SetCheckTime(uint32_t time)\r
-    {\r
-        timestamp_ms = time;\r
-    }\r
-    void HeartModel::SetResult(HeartResult result)\r
-    {\r
-        heartresult_ = result;\r
-    }\r
-    HeartResult HeartModel::GetResult()\r
-    {\r
-        return heartresult_;\r
-    }\r
-    // 控制心率检测\r
-    void HeartModel::Heart_Control(HeartState state, HeartCheck check)\r
-    {\r
-        if (check < checkstate)\r
-        {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Higher execution instruction exists");\r
-            return;\r
-        }\r
-        if (state == HeartState::End && heartstate == true)\r
-        {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState End");\r
-            uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
-            send_ppg_cmd_msg(md);\r
-            heartstate = false;\r
-            // 复原检测状态\r
-            checkstate = HeartCheck::RESTSTSTE;\r
-        }\r
-        else if (state == HeartState::Start && heartstate == false)\r
-        {\r
-            /*充电状态下不进行检测*/\r
-            bool isCharging = get_charge_stat(); // 获取充电状态\r
-            if (isCharging)\r
-            {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测");\r
-                return;\r
-            }\r
-\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState Start");\r
-            uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST;\r
-            send_ppg_cmd_msg(md);\r
-            heartstate = true;\r
-            checkstate = check;\r
-        }\r
-    }\r
-    // 开始检测\r
-    void HeartModel::Heart_Start()\r
-    {\r
-        displayheart = 0;\r
-        // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
-        // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
-\r
-        SetResult(HeartResult::NOT_TESTED); // 重置检测\r
-        // 进行初始化操作\r
-        if (!sensorstate)\r
-        {\r
-            Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
-            sensorstate = true;\r
-        }\r
-    }\r
+uint16_t HeartModel::GetAveHeartRateCount(void) { return aveCount; }\r
 \r
-    // 结束检测\r
-    void HeartModel::Heart_Stop()\r
-    {\r
-        valid_counter_ = 0;\r
-        disvalid_counter_ = 0;\r
-        unwear_counter_ = 0;\r
-\r
-        /*主界面卡片检测 或者 被动检测*/\r
-        if (checkstate == HeartCheck::CARDCHECK || checkstate == HeartCheck::PASSIVITY)\r
-        {\r
-            if (heartresult_ == HeartResult::SUCCESS)\r
-            {\r
-                Heart_Save();\r
-                /*更新曲线*/\r
-                GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
-            }\r
-            /*关闭被动检测*/\r
-            Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
-            return;\r
-        }\r
+uint16_t HeartModel::GetHeartRateMax(void) {\r
+  return healthDatas.heartRateMax.y;\r
+}\r
 \r
-        if (sensorstate)\r
-        {\r
-            // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 不需要关闭\r
-            sensorstate = false;\r
-            Heart_Result(); // 处理结果\r
-        }\r
-    }\r
-    // 保存检测数据\r
-    void HeartModel::Heart_Save()\r
-    {\r
-        HeartRateData data;\r
-        data.Heart = currentheart;\r
-        data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
-        SetCheckTime(data.timestamp);\r
-        HealthService::GetInstance()->UpdateHealthData(data);\r
-\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", currentheart, data.timestamp);\r
-    }\r
+uint16_t HeartModel::GetHeartRateMin(void) {\r
+  return healthDatas.heartRateMin.y;\r
+}\r
 \r
-    // 显示检测结果// 显示检测结果\r
-    void HeartModel::Heart_Result()\r
-    {\r
-        // 心率提醒(0开 1关)\r
-        uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
-        uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
-\r
-        if (HeartRemindState)\r
-        {\r
-            // 检查当前心率是否高于或低于阈值\r
-            uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
-\r
-            if (ThresholdState == 0 && currentheart < ThresholdValue && currentheart != 0)\r
-            {\r
-                // 当前心率低于阈值\r
-                heartresult_ = HeartResult::LOW_RESULT;\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
-            }\r
-            else if (ThresholdState == 1 && currentheart > ThresholdValue)\r
-            {\r
-                // 当前心率高于阈值\r
-                heartresult_ = HeartResult::HIGH_RESULT;\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
-            }\r
-        }\r
+void HeartModel::SetHeartRatePerSec(uint32 sec) {\r
+  healthDatas.heartRatePerSec = sec;\r
+  if (HeartRateView::GetInstance() == nullptr) {\r
+    return;\r
+  }\r
+  HeartRateView::GetInstance()->RefreshHeartRatePerSec(\r
+      healthDatas.heartRatePerSec);\r
+}\r
 \r
-        // 根据结果进行处理\r
-        switch (heartresult_)\r
-        {\r
-        case HeartResult::SUCCESS:\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
-            Heart_Save();\r
-            /*更新曲线*/\r
-            GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
-            break;\r
-\r
-        case HeartResult::NOT_WORN:     // 未佩戴状态\r
-        case HeartResult::TIMEOUT:      // 超时情况\r
-        case HeartResult::INVALID_DATA: // 无效数据情况\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况",\r
-                          heartresult_ == HeartResult::NOT_WORN ? "未佩戴状态" : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
-                                                                                                                      : "无效数据");\r
-            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
-            break;\r
-\r
-        case HeartResult::LOW_RESULT:\r
-            // 低心率结果处理\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");\r
-            HealthState lowHealthState;\r
-            lowHealthState.checkType = BLOOD_CHECK;\r
-            lowHealthState.resultStatus = LOW;\r
-            lowHealthState.checkResult = ThresholdValue;\r
-            HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
-            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
-            break;\r
-\r
-        case HeartResult::HIGH_RESULT:\r
-            // 高心率结果处理\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况");\r
-            HealthState highHealthState;\r
-            highHealthState.checkType = BLOOD_CHECK;\r
-            highHealthState.resultStatus = HIGH;\r
-            highHealthState.checkResult = ThresholdValue;\r
-            HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
-            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
-            break;\r
-\r
-        default:\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");\r
-            break;\r
-        }\r
-    }\r
-    void HeartModel::SetWearStatus(int32_t wear)\r
-    {\r
-        // 设置佩戴状态\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
-\r
-        // 计数更新\r
-        if (wear_ != 1 && wear != 1)\r
-        {\r
-            unwear_counter_++; // 佩戴错误计时器计数\r
-        }\r
-        else\r
-        {\r
-            unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
-        }\r
-        wear_ = wear;\r
-        // 检查是否达到了最大未佩戴计数限制\r
-        if (unwear_counter_ >= MAX_UNWEAR_COUNT)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_);\r
-            SetResult(HeartResult::NOT_WORN);\r
-            Heart_Stop();\r
-        }\r
-    }\r
+void HeartModel::SetAveHeartRateCount(uint16_t value) { aveCount = value; }\r
+\r
+void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest,\r
+                                        uint16_t maxRate, uint16_t minRate) {\r
+  uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
+  /*主界面刷新心率*/\r
+  if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) {\r
+    MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
+  }\r
+  /*心率卡片刷新心率数据*/\r
+  if (MainViewSample::GetInstance() != nullptr &&\r
+      HeartRateView::GetInstance() != nullptr) {\r
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) {\r
+      HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
+      HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
+      HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
+    }\r
+  }\r
+  /*applist心率刷新心率数据*/\r
+  if (HeartChartView::GetInstance() != nullptr) {\r
+    HeartChartView::GetInstance()->UpdateShowHeart();\r
+  }\r
+}\r
+/* ---------------------------------- 状态检测\r
+ * ---------------------------------- */\r
+\r
+// 重新初始化\r
+void HeartModel::ClearDisplayData() {\r
+  /*显示的心率数据清空*/\r
+  currentheart = 0;\r
+  timestamp_ms = 0;\r
+  displayheart = 0;\r
+  displayheart_max = 0; // 显示最大心率\r
+  displayheart_min = 0; // 显示最小心率\r
+}\r
+// 获取心率数据\r
+uint16_t HeartModel::GetHeartdata() { return currentheart; }\r
+\r
+uint16_t HeartModel::GetShowHeartdata() { return displayheart; }\r
+uint16_t HeartModel::GetShowMaxHeartdata() { return displayheart_max; }\r
+uint16_t HeartModel::GetShowMinHeartdata() { return displayheart_min; }\r
+uint32_t HeartModel::GetCheckTime() { return timestamp_ms; }\r
+\r
+void HeartModel::SetCheckTime(uint32_t time) { timestamp_ms = time; }\r
+void HeartModel::SetResult(HeartResult result) { heartresult_ = result; }\r
+HeartResult HeartModel::GetResult() { return heartresult_; }\r
+// 控制心率检测\r
+void HeartModel::Heart_Control(HeartState state, HeartCheck check) {\r
+  if (check < checkstate) {\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+                  "Higher execution instruction exists");\r
+    return;\r
+  }\r
+  if (state == HeartState::End && heartstate == true) {\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState End");\r
+    uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
+    send_ppg_cmd_msg(md);\r
+    heartstate = false;\r
+    // 复原检测状态\r
+    checkstate = HeartCheck::RESTSTSTE;\r
+  } else if (state == HeartState::Start && heartstate == false) {\r
+    /*充电状态下不进行检测*/\r
+    bool isCharging = get_charge_stat(); // 获取充电状态\r
+    if (isCharging) {\r
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测");\r
+      return;\r
+    }\r
+\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState Start");\r
+    uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST;\r
+    send_ppg_cmd_msg(md);\r
+    heartstate = true;\r
+    checkstate = check;\r
+  }\r
+}\r
+// 开始检测\r
+void HeartModel::Heart_Start() {\r
+  displayheart = 0;\r
+  // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
+  // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
+\r
+  SetResult(HeartResult::NOT_TESTED); // 重置检测\r
+  // 进行初始化操作\r
+  if (!sensorstate) {\r
+    Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+    sensorstate = true;\r
+  }\r
+}\r
 \r
-    void HeartModel::UpHeartdata(uint16_t heart)\r
-    {\r
-        // 如果处于训练模式,提前返回\r
-        if (uapi_dev_runtime_get_train_status() == 1)\r
-            return;\r
-\r
-        displayheart = heart;\r
-\r
-        // 更新心率和计数器\r
-        if (displayheart != 0)\r
-        {\r
-            currentheart = displayheart; // 更新当前心率\r
-            valid_counter_++;            // 增加有效计数器\r
-            disvalid_counter_ = 0;       // 清空无效计数器\r
-\r
-            // 更新最大和最小心率\r
-            displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max);\r
-\r
-            // 确保最小心率的第一次赋值大于50\r
-            if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART)\r
-            {\r
-                displayheart_min = displayheart; // 初始化最小心率\r
-            }\r
-            else\r
-            {\r
-                displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
-                                       ? displayheart\r
-                                       : displayheart_min;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            disvalid_counter_++; // 增加无效计数器\r
-            valid_counter_ = 0;  // 清零有效计数器\r
-        }\r
+// 结束检测\r
+void HeartModel::Heart_Stop() {\r
+  valid_counter_ = 0;\r
+  disvalid_counter_ = 0;\r
+  unwear_counter_ = 0;\r
+\r
+  /*主界面卡片检测 或者 被动检测*/\r
+  if (checkstate == HeartCheck::CARDCHECK ||\r
+      checkstate == HeartCheck::PASSIVITY) {\r
+    if (heartresult_ == HeartResult::SUCCESS) {\r
+      Heart_Save();\r
+      /*更新曲线*/\r
+      GraphicService::GetInstance()->PostGraphicEvent(\r
+          std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
+    }\r
+    /*关闭被动检测*/\r
+    Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
+    return;\r
+  }\r
+\r
+  if (sensorstate) {\r
+    // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率\r
+    // 不需要关闭\r
+    sensorstate = false;\r
+    Heart_Result(); // 处理结果\r
+  }\r
+}\r
+// 保存检测数据\r
+void HeartModel::Heart_Save() {\r
+  HeartRateData data;\r
+  data.Heart = currentheart;\r
+  data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
+  SetCheckTime(data.timestamp);\r
+  HealthService::GetInstance()->UpdateHealthData(data);\r
+\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld",\r
+                currentheart, data.timestamp);\r
+}\r
 \r
-        // 检查无效计数器是否达标\r
-        if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
-            SetResult(HeartResult::INVALID_DATA); // 标记为无效数据\r
-            Heart_Stop();\r
-            return;\r
-        }\r
+// 显示检测结果// 显示检测结果\r
+void HeartModel::Heart_Result() {\r
+  // 心率提醒(0开 1关)\r
+  uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
+      ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
+  uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
+      ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
+\r
+  if (HeartRemindState) {\r
+    // 检查当前心率是否高于或低于阈值\r
+    uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(\r
+        ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
+\r
+    if (ThresholdState == 0 && currentheart < ThresholdValue &&\r
+        currentheart != 0) {\r
+      // 当前心率低于阈值\r
+      heartresult_ = HeartResult::LOW_RESULT;\r
+      WEARABLE_LOGE(\r
+          WEARABLE_LOG_MODULE_APP,\r
+          "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d",\r
+          currentheart, ThresholdValue);\r
+    } else if (ThresholdState == 1 && currentheart > ThresholdValue) {\r
+      // 当前心率高于阈值\r
+      heartresult_ = HeartResult::HIGH_RESULT;\r
+      WEARABLE_LOGE(\r
+          WEARABLE_LOG_MODULE_APP,\r
+          "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d",\r
+          currentheart, ThresholdValue);\r
+    }\r
+  }\r
+\r
+  // 根据结果进行处理\r
+  switch (heartresult_) {\r
+  case HeartResult::SUCCESS:\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
+    Heart_Save();\r
+    /*更新曲线*/\r
+    GraphicService::GetInstance()->PostGraphicEvent(\r
+        std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
+    break;\r
+\r
+  case HeartResult::NOT_WORN:     // 未佩戴状态\r
+  case HeartResult::TIMEOUT:      // 超时情况\r
+  case HeartResult::INVALID_DATA: // 无效数据情况\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况",\r
+                  heartresult_ == HeartResult::NOT_WORN\r
+                      ? "未佩戴状态"\r
+                      : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
+                                                             : "无效数据");\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+    break;\r
+\r
+  case HeartResult::LOW_RESULT:\r
+    // 低心率结果处理\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");\r
+    HealthState lowHealthState;\r
+    lowHealthState.checkType = BLOOD_CHECK;\r
+    lowHealthState.resultStatus = LOW;\r
+    lowHealthState.checkResult = ThresholdValue;\r
+    HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+    break;\r
+\r
+  case HeartResult::HIGH_RESULT:\r
+    // 高心率结果处理\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况");\r
+    HealthState highHealthState;\r
+    highHealthState.checkType = BLOOD_CHECK;\r
+    highHealthState.resultStatus = HIGH;\r
+    highHealthState.checkResult = ThresholdValue;\r
+    HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+    break;\r
+\r
+  default:\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");\r
+    break;\r
+  }\r
+}\r
+void HeartModel::SetWearStatus(int32_t wear) {\r
+  // 设置佩戴状态\r
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
+\r
+  // 计数更新\r
+  if (wear_ != 1 && wear != 1) {\r
+    unwear_counter_++; // 佩戴错误计时器计数\r
+  } else {\r
+    unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
+  }\r
+  wear_ = wear;\r
+  // 检查是否达到了最大未佩戴计数限制\r
+  if (unwear_counter_ >= MAX_UNWEAR_COUNT) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "检测结果: 未佩戴计数最大 unwear_counter: %d",\r
+                  unwear_counter_);\r
+    SetResult(HeartResult::NOT_WORN);\r
+    Heart_Stop();\r
+  }\r
+}\r
 \r
-        // 检查有效计数器是否达标\r
-        if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
-            SetResult(HeartResult::SUCCESS); // 标记为成功检测\r
-            Heart_Stop();\r
-            return;\r
-        }\r
+void HeartModel::UpHeartdata(uint16_t heart) {\r
+  // 如果处于训练模式,提前返回\r
+  if (uapi_dev_runtime_get_train_status() == 1)\r
+    return;\r
+\r
+  displayheart = heart;\r
+\r
+  // 更新心率和计数器\r
+  if (displayheart != 0) {\r
+    currentheart = displayheart; // 更新当前心率\r
+    valid_counter_++;            // 增加有效计数器\r
+    disvalid_counter_ = 0;       // 清空无效计数器\r
+\r
+    // 更新最大和最小心率\r
+    displayheart_max =\r
+        (displayheart_max < displayheart ? displayheart : displayheart_max);\r
+\r
+    // 确保最小心率的第一次赋值大于50\r
+    if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART) {\r
+      displayheart_min = displayheart; // 初始化最小心率\r
+    } else {\r
+      displayheart_min =\r
+          (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
+              ? displayheart\r
+              : displayheart_min;\r
+    }\r
+  } else {\r
+    disvalid_counter_++; // 增加无效计数器\r
+    valid_counter_ = 0;  // 清零有效计数器\r
+  }\r
+\r
+  // 检查无效计数器是否达标\r
+  if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "检测结果: 无效数达标 disvalid_counter: %d",\r
+                  disvalid_counter_);\r
+    SetResult(HeartResult::INVALID_DATA); // 标记为无效数据\r
+    Heart_Stop();\r
+    return;\r
+  }\r
+\r
+  // 检查有效计数器是否达标\r
+  if (valid_counter_ >= MAX_VALID_HRS_COUNT) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "检测结果: 成功 valid_counter: %d currentheart: %d",\r
+                  valid_counter_, currentheart);\r
+    SetResult(HeartResult::SUCCESS); // 标记为成功检测\r
+    Heart_Stop();\r
+    return;\r
+  }\r
+\r
+  // 刷新心率显示\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                "[heart data update displayheart %d displayheart_max %d "\r
+                "displayheart_min %d]",\r
+                displayheart, displayheart_max, displayheart_min);\r
+  GraphicService::GetInstance()->PostGraphicEvent(\r
+      std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+                displayheart, 0, displayheart_max, displayheart_min));\r
+}\r
 \r
-        // 刷新心率显示\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[heart data update displayheart %d displayheart_max %d displayheart_min %d]", displayheart,\r
-                      displayheart_max, displayheart_min);\r
-        GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
-                                                                  displayheart, 0, displayheart_max, displayheart_min));\r
-    }\r
+void HeartModel::Heart_Update_View(void) {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新心率界面");\r
+  int hour = HealthService::GetInstance()->GetCurrentHour();\r
+  if (HeartRateView::GetInstance() != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");\r
+    HeartRateView::GetInstance()->Update_data_Chart(hour);\r
+  }\r
+  if (HeartChartView::GetInstance() != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+    HeartChartView::GetInstance()->Update_data_Chart(hour);\r
+  }\r
+}\r
 \r
-    void HeartModel::Heart_Update_View(void)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新心率界面");\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
-        if (HeartChartView::GetInstance() != nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
-            HeartChartView::GetInstance()->Update_data_Chart(hour);\r
-        }\r
-    }\r
+void HeartModel::CleanAllData(void) {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
+  if (MainViewSample::GetInstance() != nullptr &&\r
+      HeartRateView::GetInstance() != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
+    HeartRateView::GetInstance()->CleanAllDataView();\r
+  }\r
+  if (HeartChartView::GetInstance() != nullptr) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+    HeartChartView::GetInstance()->CleanAllDataView();\r
+  }\r
+}\r
 \r
-    void HeartModel::CleanAllData(void)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
-        if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
-            HeartRateView::GetInstance()->CleanAllDataView();\r
-        }\r
-        if (HeartChartView::GetInstance() != nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
-            HeartChartView::GetInstance()->CleanAllDataView();\r
-        }\r
-    }\r
+//配置5个动态心率数据\r
+//最大 最小\r
+void HeartModel::SetArrayData() {\r
+  // 如果没有进行心率检测,则默认为0-220\r
+  if (displayheart_max == 0 || displayheart_min == 0) {\r
+    dynamic_heartrate[0] = 0;\r
+    dynamic_heartrate[1] = 40;\r
+    dynamic_heartrate[2] = 100;\r
+    dynamic_heartrate[3] = 160;\r
+    dynamic_heartrate[4] = 220;\r
+    return; // 直接返回\r
+  }\r
+\r
+  // 计算心率范围并添加缓冲\r
+  uint16_t adjusted_min =\r
+      (displayheart_min > 10) ? (displayheart_min / 2) : displayheart_min;\r
+  uint16_t adjusted_max =\r
+      (displayheart_max < 210) ? (displayheart_max + 10) : displayheart_max;\r
+\r
+  uint16_t range = adjusted_max - adjusted_min;\r
+  uint16_t interval = range / 4; // 每个部分的宽度\r
+\r
+  // 设置动态心率数据\r
+  dynamic_heartrate[0] = adjusted_min;\r
+  dynamic_heartrate[1] = adjusted_min + interval;\r
+  dynamic_heartrate[2] = adjusted_min + 2 * interval;\r
+  dynamic_heartrate[3] = adjusted_min + 3 * interval;\r
+  dynamic_heartrate[4] = adjusted_max;\r
+\r
+  // 确保所有值为整数\r
+  for (int i = 0; i < 5; i++) {\r
+    dynamic_heartrate[i] = static_cast<uint16_t>(round(dynamic_heartrate[i]));\r
+  }\r
+\r
+  // 打印动态心率数据\r
+  for (int i = 0; i < 5; i++) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dynamic_heartrate[%d] = %d", i,\r
+                  dynamic_heartrate[i]);\r
+  }\r
+}\r
+//获取动态心率配置数组\r
+uint16_t *HeartModel::GetArrayData() { return dynamic_heartrate; }\r
+\r
+// 获取检测字符串\r
+// 获取检测字符串\r
+std::string HeartModel::GetCheckString() {\r
+  std::string check_string = "检测结果未知"; // 默认返回值\r
+\r
+  // 获取检测数据\r
+  if (currentheart == 0) {\r
+    check_string = "暂无检测数据";\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测数据: %s",\r
+                  check_string.c_str()); // 打印无检测数据信息\r
+    return check_string;                 // 直接返回,无需继续处理\r
+  }\r
+\r
+  // 获取目前的时间戳\r
+  uint32_t currentTime;\r
+  if (uapi_get_timestampe_ss(&currentTime) != ERRCODE_SUCC) {\r
+    check_string = "获取当前时间戳失败"; // 如果获取时间戳失败,返回相应的信息\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                  "获取当前时间戳失败"); // 打印错误信息\r
+    return check_string; // 直接返回,无法进行后续计算\r
+  }\r
+\r
+  // 检查时间戳是否有效\r
+  if (timestamp_ms == 0) {\r
+    check_string = std::to_string(currentheart) + " " + "时间戳无效,无法检测";\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间戳无效,无法检测: %s",\r
+                  check_string.c_str());\r
+    return check_string; // 直接返回,无需继续处理\r
+  }\r
+\r
+  // 进行时间戳相减计算\r
+  uint32_t diff = currentTime - timestamp_ms;\r
+  uint32_t diff_min = diff / 60;      // 计算分钟差\r
+  uint32_t diff_hour = diff_min / 60; // 计算小时差\r
+\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前时间: %d, 上次检测时间: %d",\r
+                currentTime, timestamp_ms); // 打印时间信息\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                "时间差 (秒): %d, 时间差 (分钟): %d, 时间差 (小时): %d", diff,\r
+                diff_min, diff_hour); // 打印时间差信息\r
+\r
+  // 根据时间差生成检测字符串\r
+  if (diff_min < 1) {\r
+    check_string = std::to_string(currentheart) + "次/分 " + "刚刚检测";\r
+  } else if (diff_hour < 1) { // 一个小时内\r
+    check_string = std::to_string(currentheart) + "次/分 " +\r
+                   std::to_string(diff_min) + "分钟前";\r
+  } else {\r
+    check_string = std::to_string(currentheart) + "次/分 " + "超过一个小时前";\r
+  }\r
+\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s",\r
+                check_string.c_str()); // 打印最终检测结果\r
+  return check_string;\r
 }\r
+} // namespace OHOS\r
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp
new file mode 100644 (file)
index 0000000..b85a869
--- /dev/null
@@ -0,0 +1,64 @@
+#include "heartrate/include/HeartRateCardView.h"
+#include "heartrate/include/HeartChartView.h"
+
+namespace OHOS {
+static HeartRateCardView *g_pHeartRateCardView = nullptr;
+HeartRateCardView::HeartRateCardView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "HeartRateCardView::HeartRateCardView");
+  SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+  g_pHeartRateCardView = this;
+}
+HeartRateCardView::~HeartRateCardView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "HeartRateCardView::~HeartRateCardView");
+  ClearAll();
+  g_pHeartRateCardView = nullptr;
+}
+HeartRateCardView *HeartRateCardView::GetInstance() {
+  return g_pHeartRateCardView;
+}
+void HeartRateCardView::ClearAll(void) {
+  if (viewiInitStatus == true) {
+    RemoveAll();
+    if (heartRateGroupView != nullptr) {
+      delete heartRateGroupView;
+      heartRateGroupView = nullptr;
+    }
+  }
+}
+
+bool HeartRateCardView::InitView(void) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateCardView::InitView");
+  heartRateCardView = new HeartChartView();
+  if (heartRateCardView == nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "HeartChartView::new HeartChartView fail!");
+    return false;
+  }
+
+  heartRateGroupView =
+      dynamic_cast<UIViewGroup *>(heartRateCardView->GetchartGroup());
+  if (heartRateGroupView == nullptr) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "HeartChartView->HeartChartViewInit() == nullptr!!");
+    return false;
+  }
+
+  Add(heartRateGroupView);
+  return true;
+}
+UIViewGroup *HeartRateCardView::GetHeartRateCardView() {
+  return heartRateGroupView;
+}
+void HeartRateCardView::PreLoad(void) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateCardView::PreLoad");
+  if (!viewiInitStatus) {
+    InitView();
+    viewiInitStatus = true;
+  }
+}
+void HeartRateCardView::UnLoad(void) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateCardView::UnLoad");
+}
+} // namespace OHOS
\ No newline at end of file
index 26910d3..6c7c5d8 100644 (file)
@@ -39,13 +39,120 @@ namespace OHOS
 #define COORDINATE_GRAD_MAX_OPA 180\r
 \r
 // 心形心跳\r
-#define HEARTBEAT_IMAGE_WIDTH 92\r
-#define HEARTBEAT_IMAGE_HEIGHT 92\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
+static constexpr int HEARTBEAT_IMAGE_WIDTH = 54;\r
+static constexpr int HEARTBEAT_IMAGE_HEIGHT = 50;\r
+static constexpr int HEARTBEAT_IMAGE_X = 111;\r
+static constexpr int HEARTBEAT_IMAGE_Y = 57;\r
+static constexpr int HEARTBEAT_IMAGE_NUM = 21;\r
+static constexpr int HEARTBEAT_DELAY = 50;\r
+// 心跳image\r
+static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
+    {PNG_A004_070_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_071_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_072_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_073_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_074_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_075_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_076_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_077_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_078_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_079_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_080_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_081_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_082_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_083_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_084_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_085_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_086_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_087_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_088_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_089_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+    {PNG_A004_090_IMAGE_PATH,\r
+     {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+     HEARTBEAT_IMAGE_WIDTH,\r
+     HEARTBEAT_IMAGE_HEIGHT,\r
+     IMG_SRC_FILE_PATH},\r
+};\r
 // 最高心率\r
 #define TOP_IMAGE_WIDTH 32\r
 #define TOP_IMAGE_HEIGHT 32\r
@@ -104,29 +211,6 @@ namespace OHOS
 #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, 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
index d223ae7..904ec7d 100644 (file)
@@ -41,6 +41,7 @@
 #include "message/include/MessageControlView.h"
 #include "sleep/include/SleepCardView.h"
 #include "set_card/include/SetMainView.h"
+#include "heartrate/include/HeartRateCardView.h"
 namespace OHOS
 {
     class MainPresenterSample;
@@ -107,7 +108,7 @@ namespace OHOS
         PlayersView *playersView{nullptr};
         CompassControlView *compassControlView{nullptr};
 
-        HeartRateView *heartRateView{nullptr};
+        HeartRateCardView *heartRateView{nullptr};
         BloodCardView *bloodView{nullptr};
         SleepCardView *sleepView{nullptr};
         Training_CardView *traingView{nullptr};
index cb5f599..52bd088 100644 (file)
@@ -540,7 +540,7 @@ namespace OHOS
     UICardPage *MainViewSample::InitHeartRatePage(void)
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitHeartRatePage");
-        heartRateView = new HeartRateView();
+        heartRateView = new HeartRateCardView();
         if (heartRateView == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateView new fail");
diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h
new file mode 100644 (file)
index 0000000..3f05a59
--- /dev/null
@@ -0,0 +1,16 @@
+
+#ifndef SAFE_MODE_MANAGER_MODEL_C_H
+#define SAFE_MODE_MANAGER_MODEL_C_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//进行修复开始
+void repari_file_start(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
index efbf921..b4a6eff 100644 (file)
@@ -9,6 +9,7 @@
 #include "safemodemanager/include/RepairView.h"
 #include "safemodemanager/include/ResourceCheckView.h"
 #include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerModelC.h"
 #include "safemodemanager/include/SafeModeManagerView.h"
 
 #include "broadcast_feature.h"
@@ -31,6 +32,11 @@ const char *get_version_string(void);
 }
 
 static const char *CHECK_DIFFERENTIAL_FILE = "/system/check_differential.txt";
+
+void repari_file_start() {
+  OHOS::SafeModeManagerModel::GetInstance()->RepairStart();
+}
+
 namespace OHOS {
 
 SafeModeManagerModel *SafeModeManagerModel::GetInstance(void) {
@@ -52,14 +58,14 @@ static void httpc_download_result(void *arg, httpc_result_t httpc_result,
          "srv_res %d, err %d\n",
          httpc_result, rx_content_len, srv_res, err);
   if (httpc_result == HTTPC_RESULT_OK) {
-    http_single_download_stop();
     OHOS::SafeModeManagerModel::GetInstance()->AddRepairCount();
-    //å¼\80å§\8bä¸\8bä¸\80个æ\96\87ä»¶
-    OHOS::SafeModeManagerModel::GetInstance()->RepairStart();
+    //å\8f\91æ¶\88æ\81¯è¿\9bè¡\8cé\87\8dæ\96°å¼\80å§\8b
+    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_DOWNLOAD_RES, nullptr, 0);
   } else {
     //结束
     OHOS::SafeModeManagerModel::GetInstance()->RepairEnd();
   }
+  http_single_download_stop();
   file_total_len = 0;
   return;
 }
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_01.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_01.bin
new file mode 100644 (file)
index 0000000..18fa390
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbbfb65f766ee8de8840e15812abb1d31035dfe2f1e7d63b23dac073896f5600
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_02.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_02.bin
new file mode 100644 (file)
index 0000000..d147041
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:13a516df219bf7246ec34ca65171bfa9000988907e7c9151584bd85efaddc19d
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_03.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_03.bin
new file mode 100644 (file)
index 0000000..8b39899
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b108813a68df254a3cebda9f3e938a5d76188133211fa974184b2a607bc689ac
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_04.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_04.bin
new file mode 100644 (file)
index 0000000..1769245
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dbda3ff00bd54d277acc2a86ed3210f3a069302c2363cbafefd60d0379b9d25b
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_05.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_05.bin
new file mode 100644 (file)
index 0000000..b3c8672
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8fd2d8818d0cc756e065e6a872b029081bc38662e05283aca9cc75fedeeab206
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_06.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_06.bin
new file mode 100644 (file)
index 0000000..d8a0f3a
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be60c395114125059579cafdd42e9e8c6a5372d4123e5204d1315026bce8e736
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_07.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_07.bin
new file mode 100644 (file)
index 0000000..492e25d
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:60fef533bd4c8a68cc5ced7d1d51a4af7d2868ca6099564dac103fcc70f79593
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_08.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_08.bin
new file mode 100644 (file)
index 0000000..ec1a744
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1370669175f3ea04c455839c377ec9f6eade73ea04fb88820cb9b2717a76ed1
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_09.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_09.bin
new file mode 100644 (file)
index 0000000..fee8035
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56e11c8370939aa63e41851bee4b39f1de58035f63c0ed9ed090fd04e546bcb0
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_10.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_10.bin
new file mode 100644 (file)
index 0000000..815fa27
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4add68c802082e008168c41c47c8a8ac4d494d9a8ef36fd0116252ca0b54c899
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_11.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_11.bin
new file mode 100644 (file)
index 0000000..1575ed1
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b38bd661e9db76946670deca370c4e7cf12411f82be9c6ca5d185752efe54e01
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_12.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_12.bin
new file mode 100644 (file)
index 0000000..b411dac
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c528e0e0aaa44eaf902c117c023000eb7843aa967aa245a64bd75b92338ec9f1
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_13.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_13.bin
new file mode 100644 (file)
index 0000000..f7a35cc
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2758f2d5973d4afabbf26c765ca46fd025bcbeb27d9849a226ca261d82ed5aa
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_14.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_14.bin
new file mode 100644 (file)
index 0000000..f5d4406
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f1a9c8e3f967f84b44b140735cd3ae23768531b0f552585b0f6d9326ffa2d12a
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_15.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_15.bin
new file mode 100644 (file)
index 0000000..6938b24
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae604513790f3f29fb2efe5d1077785c361b962a3877f1050df9d3fb91851a5c
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_16.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_16.bin
new file mode 100644 (file)
index 0000000..cec6396
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4e00d958a71ff06fa866c5b3cc46dc6e5a7b193e8681d84e1b60bad542db7fbc
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_17.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_17.bin
new file mode 100644 (file)
index 0000000..c3b3281
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e27f49f08cefb628db2aacc319e2ffbbcfab9eb7afc945630254824adf510343
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_18.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_18.bin
new file mode 100644 (file)
index 0000000..e5f996a
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5afb9b60880657ad7092445e90fddc488cc4087eeb1452c0a82df8f31443d78f
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_19.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_19.bin
new file mode 100644 (file)
index 0000000..a22ff50
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac0505e5357f162a082c9675acb47094e9251883ad6289364133e8c52c8ae6eb
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_20.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_20.bin
new file mode 100644 (file)
index 0000000..7ca22f9
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae4c188da2acee2a817c130543bf3be085676cdf6a108881dae341faf2a78a37
+size 1896
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_21.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/heart_chart/hearticon/HEARTICON_21.bin
new file mode 100644 (file)
index 0000000..18fa390
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbbfb65f766ee8de8840e15812abb1d31035dfe2f1e7d63b23dac073896f5600
+size 1896
index 04dbbbc..8987dc0 100644 (file)
@@ -39,6 +39,8 @@
 
 #include "bletest.h"
 
+#include "safemodemanager/include/SafeModeManagerModelC.h"
+
 typedef struct
 {
     uint8_t cmd;
@@ -255,6 +257,9 @@ static void custom_cmd_service_check_task(void const *arg)
         case CUSTOM_CMD_MSG_CHECK_RES:
             resfile_checksum_thread();
             break;
+        case CUSTOM_CMD_MSG_DOWNLOAD_RES:
+            repari_file_start();
+            break;
         default:
             PRINT("Unknown CUSTOM_CMD_MSG cmd 0x%02X \r\n", mail.cmd);
             break;
index eacc91c..7be63e2 100644 (file)
@@ -217,6 +217,7 @@ uint32_t uapi_calendar_store_date(void);
 #define CUSTOM_CMD_MSG_BR_CONNECT 0x0C
 
 #define CUSTOM_CMD_MSG_CHECK_RES 0x0D
+#define CUSTOM_CMD_MSG_DOWNLOAD_RES 0x0E
 typedef enum {
     BR_HFP_CONNECT=1,
     BR_HFP_DISCONNECT,
diff --git a/tools/image_converter_tool/image_makcopy_tool.py b/tools/image_converter_tool/image_makcopy_tool.py
new file mode 100644 (file)
index 0000000..65115a8
--- /dev/null
@@ -0,0 +1 @@
+import argparse\rimport subprocess\rimport shutil\rimport os\r\rdef main():\r    parser = argparse.ArgumentParser(description='Process paths.')\r    parser.add_argument('-c', '--config', help='Config file path', required=True)\r    parser.add_argument('-i', '--input', help='Input path', required=True)\r    parser.add_argument('-o', '--output', help='Output path', required=True)\r    args = parser.parse_args()\r\r    print(f"Config path: {args.config}")\r    print(f"Input path: {args.input}")\r    print(f"Output path: {args.output}")\r\r    # 定义命令和参数\r    command = [\r        "python", "images_tool.py",\r        "-p", "file",\r        "-d", "cmp",\r        "-c", args.config,\r        "-i", args.input,\r        "-o", args.output\r    ]\r\r    print(f"Executing command: {' '.join(command)}")\r\r    # 执行命令\r    try:\r        subprocess.run(command, check=True)\r        print("Command executed successfully.")\r    except subprocess.CalledProcessError as e:\r        print(f"An error occurred while executing the command: {e}")\r\r    # 构建目标路径\r    target_dir = os.path.join('FD230', 'code', 'sdk', 'build', 'config', 'target_config', 'brandy', 'mk_fs_image', 'fd230', 'fs', 'user', 'res')\r\r    print(f"Source directory: {args.output}")\r    print(f"Target directory: {target_dir}")\r\r    # 复制文件夹\r    try:\r        if os.path.exists(target_dir):\r            shutil.rmtree(target_dir)  # 删除目标文件夹(如果存在)\r        shutil.copytree(args.output, target_dir)\r        print(f"Copied {args.output} to {target_dir}.")\r    except Exception as e:\r        print(f"An error occurred while copying the directory: {e}")\r\rif __name__ == "__main__":\r    main()\r
\ No newline at end of file
diff --git a/tools/image_converter_tool/test/hert/heart/back.png b/tools/image_converter_tool/test/hert/heart/back.png
new file mode 100644 (file)
index 0000000..4a7cb44
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart/back.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/background.png b/tools/image_converter_tool/test/hert/heart_chart/background.png
new file mode 100644 (file)
index 0000000..4a7cb44
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/background.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_01.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_01.png
new file mode 100644 (file)
index 0000000..3af8325
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_01.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_02.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_02.png
new file mode 100644 (file)
index 0000000..4f88919
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_02.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_03.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_03.png
new file mode 100644 (file)
index 0000000..cfb9b63
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_03.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_04.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_04.png
new file mode 100644 (file)
index 0000000..547f8bd
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_04.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_05.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_05.png
new file mode 100644 (file)
index 0000000..e8066f7
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_05.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_06.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_06.png
new file mode 100644 (file)
index 0000000..73e9c79
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_06.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_07.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_07.png
new file mode 100644 (file)
index 0000000..635d063
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_07.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_08.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_08.png
new file mode 100644 (file)
index 0000000..5a5e41c
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_08.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_09.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_09.png
new file mode 100644 (file)
index 0000000..0bacfea
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_09.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_10.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_10.png
new file mode 100644 (file)
index 0000000..ae29f11
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_10.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_11.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_11.png
new file mode 100644 (file)
index 0000000..8d85656
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_11.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_12.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_12.png
new file mode 100644 (file)
index 0000000..8b29d63
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_12.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_13.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_13.png
new file mode 100644 (file)
index 0000000..fd4dc90
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_13.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_14.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_14.png
new file mode 100644 (file)
index 0000000..4ab2a57
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_14.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_15.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_15.png
new file mode 100644 (file)
index 0000000..1c185bf
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_15.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_16.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_16.png
new file mode 100644 (file)
index 0000000..7948740
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_16.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_17.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_17.png
new file mode 100644 (file)
index 0000000..590cc02
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_17.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_18.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_18.png
new file mode 100644 (file)
index 0000000..3e54c9e
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_18.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_19.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_19.png
new file mode 100644 (file)
index 0000000..7924613
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_19.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_20.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_20.png
new file mode 100644 (file)
index 0000000..90da4f9
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_20.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_21.png b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_21.png
new file mode 100644 (file)
index 0000000..3af8325
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/hearticon/HEARTICON_21.png differ
diff --git a/tools/image_converter_tool/test/hert/heart_chart/heartrate.gif b/tools/image_converter_tool/test/hert/heart_chart/heartrate.gif
new file mode 100644 (file)
index 0000000..8ac8da6
Binary files /dev/null and b/tools/image_converter_tool/test/hert/heart_chart/heartrate.gif differ
diff --git a/tools/image_converter_tool/test/hert/heartchart/background.png b/tools/image_converter_tool/test/hert/heartchart/background.png
deleted file mode 100644 (file)
index 4252e11..0000000
Binary files a/tools/image_converter_tool/test/hert/heartchart/background.png and /dev/null differ