心率:修改心率UI;增加上一次检测数据以及检测间隔
authorCaisking <3449750381@qq.com>
Sat, 14 Sep 2024 12:36:49 +0000 (20:36 +0800)
committerCaisking <3449750381@qq.com>
Sat, 14 Sep 2024 12:36:49 +0000 (20:36 +0800)
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp [new file with mode: 0644]

index b2e7676..4430a23 100644 (file)
@@ -2,84 +2,95 @@
  * @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
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