重构心率检测Slice
authorCaisking <3449750381@qq.com>
Wed, 31 Jul 2024 08:40:48 +0000 (16:40 +0800)
committerCaisking <3449750381@qq.com>
Wed, 31 Jul 2024 08:40:48 +0000 (16:40 +0800)
22 files changed:
code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h
code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h [deleted file]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp [deleted file]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp [deleted file]

index bf47fc6..e88f797 100644 (file)
@@ -81,8 +81,10 @@ typedef enum : uint16_t
     VIEW_ROTATE,         // 模拟表冠
     VIEW_CHECK_ABNORMAL, // 检测异常
     VIEW_CHECK_INVALID,  // 检测数无效
-    VIEW_BLOODXY_RESULT, // 血氧结果界面
-    VIEW_BLOODOXY_CHECK, // 血氧检测界面
+    VIEW_BLOOD_RESULT,   // 血氧结果界面
+    VIEW_BLOOD_CHECK,    // 血氧检测界面
+    VIEW_HEART_RESULT,   // 心率结果界面
+    VIEW_HEART_CHECK,    // 心率检测界面
     VIEW_HEART,          // 心率监测
     VIEW_SAVEELE,        // 省电模式
     VIEW_SAVEBAT,        // 省电模式界面
@@ -125,7 +127,7 @@ typedef enum : uint16_t
     VIEW_DIALING_METHOD, // 拨号方式
     VIEW_TEST,           // 测试
     VIEW_GOAL,           // 每日目标
-    VIEW_CALCULATOR,     //计算器
+    VIEW_CALCULATOR,     // 计算器
 /* -------------------------------------------------------------------------- */
 #ifdef SUPPORT_ALIPAY_SEC
     VIEW_MAIN_ALIPAY,
index 11007cd..e6ba0aa 100644 (file)
@@ -70,6 +70,8 @@ namespace OHOS
         void InitBloodSlice(void);
         void InitCheckAbnormalSlice(void);
         void InitCheckInvalidSlice(void);
+        void InitHeartResultSlice(void);
+        void InitHeartCheckSlice(void);
         void InitBloodResultSlice(void);
         void InitBloodCheckSlice(void);
         void InitHeartSlice(void);
index ff1c030..1fabeb8 100644 (file)
@@ -503,12 +503,14 @@ enum UIResourceTextId : uint16_t {
     STR_MOTION_DETECTION_NOTE = 490,\r
     STR_PE4GC = 491,\r
     STR_OBU_MESSAGE = 492,\r
-    STR_MAX_ID = 493,\r
+    STR_CHARGE = 493,\r
+    STR_CHARGE_NOTE = 494,\r
+    STR_MAX_ID = 495,\r
 }; // UIResourceTextId\r
 \r
 enum FontLanguageId : uint8_t {\r
-    LANGUAGE_ID_EN,\r
     LANGUAGE_ID_ZH,\r
+    LANGUAGE_ID_EN,\r
     LANGUAGE_ID_MAX\r
 }; // UITextLanguageTextId\r
 }\r
index d4eb910..3fd0115 100644 (file)
@@ -28,7 +28,6 @@
 #include "ApplistView.h"
 #include "ApplistPresenter.h"
 
-#include "HeartPresenter.h"
 #include "CallerLogView.h"
 #include "CallerLogPresenter.h"
 #include "MainCallingView.h"
 #include "bloodoxygen/include/BloodResultView.h"
 #include "bloodoxygen/include/BloodResultPresenter.h"
 /*心率监测*/
-#include "heartrate/include/HeartPresenter.h"
-#include "heartrate/include/HeartView.h"
+#include "heartrate/include/HeartDetectionView.h"
+#include "heartrate/include/HeartDetectionPresenter.h"
+#include "heartrate/include/HeartResultView.h"
+#include "heartrate/include/HeartResultPresenter.h"
 
 #include "secondaryfunction/include/SecondaryFunctionPresenter.h"
 #include "secondaryfunction/include/SecondaryFunctionView.h"
@@ -345,7 +346,7 @@ namespace OHOS
         {VIEW_MAIN_PHONE, &NativeLauncher::InitMainPhoneSlice},
         {VIEW_DIALING_METHOD, &NativeLauncher::InitDialingMethodSlice},
         {VIEW_TEST, &NativeLauncher::InittestSlice},
-        {VIEW_CALCULATOR,&NativeLauncher::InitCalculatorSlice},
+        {VIEW_CALCULATOR, &NativeLauncher::InitCalculatorSlice},
 
         /* -------------------------------------------------------------------------- */
         /* ----------------------------------- 训练 ----------------------------------- */
@@ -377,10 +378,11 @@ namespace OHOS
         {VIEW_CHECK_ABNORMAL, &NativeLauncher::InitCheckAbnormalSlice},
         {VIEW_CHECK_INVALID, &NativeLauncher::InitCheckInvalidSlice},
         /*血氧检测*/
-        {VIEW_BLOODOXY_CHECK, &NativeLauncher::InitBloodCheckSlice},
-        {VIEW_BLOODXY_RESULT, &NativeLauncher::InitBloodResultSlice},
+        {VIEW_BLOOD_CHECK, &NativeLauncher::InitBloodCheckSlice},
+        {VIEW_BLOOD_RESULT, &NativeLauncher::InitBloodResultSlice},
         /*心率检测*/
-        {VIEW_HEART, &NativeLauncher::InitHeartSlice},
+        {VIEW_HEART_CHECK, &NativeLauncher::InitHeartCheckSlice},
+        {VIEW_HEART_RESULT, &NativeLauncher::InitHeartResultSlice},
         /*设置卡片*/
         {VIEW_SET_CARD, &NativeLauncher::InitSetCardSlice},
         /*添加卡片*/
@@ -601,17 +603,6 @@ namespace OHOS
         }
         NativeAbility::GetInstance().AddSliceProxy(VIEW_ALARM_POP_UP, alarmPopUpView);
     }
-    void NativeLauncher::InitHeartSlice(void)
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::HeartSlice");
-        SliceProxy *heartView = new AbilitySliceProxy<HeartView, HeartPresenter>;
-        if (heartView == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartView is nullptr");
-            return;
-        }
-        NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART, heartView);
-    }
     void NativeLauncher::InitMainMakePhoneView(void)
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitMainMakePhoneView");
@@ -1178,7 +1169,7 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bloodCheckView is nullptr");
             return;
         }
-        NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOODOXY_CHECK, bloodCheckView);
+        NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOOD_CHECK, bloodCheckView);
     }
     // 血氧监测结果
     void NativeLauncher::InitBloodResultSlice(void)
@@ -1190,7 +1181,31 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bloodResultView is nullptr");
             return;
         }
-        NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOODXY_RESULT, bloodResultView);
+        NativeAbility::GetInstance().AddSliceProxy(VIEW_BLOOD_RESULT, bloodResultView);
+    }
+    // 心率监测界面
+    void NativeLauncher::InitHeartCheckSlice(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartCheckSlice");
+        SliceProxy *HeartCheckView = new AbilitySliceProxy<HeartDetectionView, HeartDetectionPresenter>;
+        if (HeartCheckView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartCheckView is nullptr");
+            return;
+        }
+        NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_CHECK, HeartCheckView);
+    }
+    // 心率监测结果
+    void NativeLauncher::InitHeartResultSlice(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartResultSlice");
+        SliceProxy *heartResultView = new AbilitySliceProxy<HeartResultView, HeartResultPresenter>;
+        if (heartResultView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartResultView is nullptr");
+            return;
+        }
+        NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_RESULT, heartResultView);
     }
     /* -------------------------------------------------------------------------- */
     // 查找手机
index b4e8725..5485ced 100644 (file)
@@ -21,7 +21,7 @@
 #include "applist/include/ApplistModel.h"
 #include "themestyle/include/ThemeStyleModel.h"
 
-#define HEART_APPLIST 0
+#define HEART_APPLIST 1
 namespace OHOS
 {
     /**- APPLSIT
@@ -57,9 +57,9 @@ namespace OHOS
 #endif
         {VIEW_MAIN_PHONE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_DEFAULT_IMG, "手机", STR_PHONE, nullptr},
 #if HEART_APPLIST
-        {VIEW_HEART, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_DEFAULT_IMG, "心率", STR_HEART_RATE, nullptr},
+        {VIEW_HEART_RESULT, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_DEFAULT_IMG, "心率", STR_HEART_RATE, nullptr},
 #endif
-        {VIEW_BLOODXY_RESULT, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧", STR_BLOOD_OXYGEN, nullptr},
+        {VIEW_BLOOD_RESULT, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧", STR_BLOOD_OXYGEN, nullptr},
         {VIEW_TRAINING, PNG_APPLIST_TRAINING_IMAGE, PNG_APPLIST_TRAINING_IMAGE, PNG_APPLIST_DEFAULT_IMG, "训练", STR_TRAINING, nullptr},
         {VIEW_TRAINING_RECORD, PNG_APPLIST_TRAINING_RECORD_IMAGE, PNG_APPLIST_TRAINING_RECORD_IMAGE, PNG_APPLIST_DEFAULT_IMG, "训练记录", STR_TRAINING_RECORD, nullptr},
         {VIEW_GOAL, PNG_APPLIST_GOAL_IMAGE, PNG_APPLIST_GOAL_IMAGE, PNG_APPLIST_DEFAULT_IMG, "活动", STR_ACTIVITY, nullptr},
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h
deleted file mode 100644 (file)
index 6f8acc6..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*** 
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-05-07 18:46:22
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h
- */
-/*** 
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-05-07 14:53:32
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h
- */
-
-
-#ifndef Heart_BANDOFF_VIEW_H
-#define Heart_BANDOFF_VIEW_H
-
-#include "components/ui_label.h"
-#include "components/ui_label_ext.h"
-#include "components/ui_view_group.h"
-#include "components/ui_image_animator.h"
-#include "components/ui_button.h"
-#include "components/ui_label_button.h"
-#include "BaseView.h"
-#include "View.h"
-#include "ohos_types.h"
-#include "components/ui_scroll_view.h"
-namespace OHOS
-{
-    class HeartBandoffView
-    {
-    public:
-        HeartBandoffView();
-        virtual ~HeartBandoffView();
-
-        UIViewGroup *CreateUIViewGroup();
-        static HeartBandoffView *GetInstance(void);
-        UIScrollView *HeartBondoffViewInit();
-        UIImageAnimatorView *GetImageAnimator();
-
-    private:
-        UILabelExt *label;
-        UILabelButton *testButton;
-        UIScrollView *HeartBandoffScrollView;
-        UIViewGroup *group;
-        UIImageView *imageView;
-        UIImageAnimatorView *imageAnimator;
-    };
-}
-
-#endif // 血氧跳转界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h
deleted file mode 100644 (file)
index 2adb7af..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-05-07 14:55:13
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodCheck view
- * Author:
- * Create: 2021-08-01
- */
-
-#ifndef HEART_Check_VIEW_H
-#define HEART_Check_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 "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_view_group.h"
-#include "HeartPresenter.h"
-#include "components/ui_scroll_view.h"
-#include "components/ui_label_button_ext.h"
-namespace OHOS
-{
-    class HeartPresenter;
-    class HeartBandoffView;
-
-    class HeartCheckView : public View<HeartPresenter>
-    {
-    public:
-        HeartCheckView();
-        virtual ~HeartCheckView();
-        static HeartCheckView *GetInstance(void);
-        UIScrollView *HeartCheckViewInit();
-        UIImageAnimatorView *GetImageAnimator();
-        UILabelButtonExt *CreateAndSetUIButton(const char *title);
-        void UpShowHeartText();
-
-    private:
-        UIImageAnimatorView *imageAnimator;
-        UILabelExt *titleLabel;
-        UILabelExt *HeartText;
-        UIScrollView *HeartCheckScrollView;
-        UILabelButtonExt *testButton;
-    };
-}
-
-#endif // 血氧主界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionPresenter.h
new file mode 100644 (file)
index 0000000..8c7ec93
--- /dev/null
@@ -0,0 +1,59 @@
+/***
+ * @Date: 2024-07-29 15:33:59
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 16:28:08
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionPresenter.h
+ */
+
+#ifndef HEART_DETECTION_PRESENTER_H
+#define HEART_DETECTION_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_list.h"
+#include "components/ui_view.h"
+#include "KeyInputListener.h"
+#include "ModelListenerSample.h"
+#include "heartrate/include/HeartDetectionView.h"
+#include "power_display_service.h"
+
+#define HEART_KEEP_TIME 40000 // 40s
+
+namespace OHOS
+{
+
+    class HeartDetectionView;
+    class HeartDetectionPresenter : public Presenter<HeartDetectionView>,
+                                    public ModelListenerSample,
+                                    public UIView::OnClickListener,
+                                    public UIView::OnDragListener,
+                                    public RootView::OnKeyActListener,
+                                    public ListScrollListener
+    {
+    public:
+        HeartDetectionPresenter();
+        ~HeartDetectionPresenter() override;
+        static HeartDetectionPresenter *GetInstance(void);
+
+        void OnStart() override;
+        void OnResume() override;
+        void OnStop() override;
+        void OnTickEvent() override;
+        void Notify() override {}
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+        bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+        void NavigateBack(void);
+
+    private:
+        void ResetTickTimer(void);
+        uint64_t startTime{0};
+        bool HeartCountEvent{false};
+        bool HeartCheckState{false};
+
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        uint32_t display_time;
+    };
+}
+
+#endif // HEART_DETECTION_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
new file mode 100644 (file)
index 0000000..76d57ef
--- /dev/null
@@ -0,0 +1,78 @@
+/*** 
+ * @Date: 2024-07-31 10:27:26
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 14:12:07
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
+ */
+/***
+ * @Date: 2024-07-31 10:27:26
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 10:30:11
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
+ */
+/***
+ * @Date: 2024-07-29 15:38:56
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 15:42:12
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.cpp
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodDetection view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#ifndef HEART_Detection_VIEW_H
+#define HEART_Detection_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 "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_view_group.h"
+
+#include "heartrate/include/HeartDetectionPresenter.h"
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_button_ext.h"
+
+#include "power_display_service.h"
+
+#define STOPCHECK "stop_check"
+namespace OHOS
+{
+    class HeartDetectionPresenter;
+    class HeartDetectionView : public View<HeartDetectionPresenter>
+    {
+    public:
+        HeartDetectionView();
+        virtual ~HeartDetectionView();
+        void OnStop() override;
+        void OnSetUpView() override;
+        void OnTearDownView() override;
+        void OnStart() override;
+        static HeartDetectionView *GetInstance(void);
+
+        bool HeartDetectionViewInit();
+        UIImageAnimatorView *GetImageAnimator(void);
+        void UpShowHeartText(void);
+
+    private:
+        UIImageAnimatorView *imageAnimator;
+        UILabelExt *titleLabel;
+        UILabel *HeartText;
+        UIScrollView *HeartDetectionScrollView;
+        UILabelButtonExt *testButton;
+
+        uint32_t heart_;
+    };
+}
+
+#endif // 心率主界面
\ No newline at end of file
index ee8cf2a..c2d83ef 100644 (file)
@@ -88,6 +88,16 @@ extern "C"
             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
@@ -119,32 +129,25 @@ extern "C"
             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
 \r
-            bool GetHeartViewStatus(void);\r
-            bool GetHeartBandoffViewStatus(void);\r
-            bool GetHeartCheckViewStatus(void);\r
-            bool GetHeartResultViewStaus(void);\r
-\r
-            void SetHeartViewStatus(bool HeartViewStatus);\r
-            void SetHeartBandoffViewStatus(bool bandoffViewStatus);\r
-            void SetHeartCheckViewStatus(bool checkViewStatus);\r
-            void SetHeartResultViewStatus(bool resultViewStatus);\r
+            uint16_t GetIndex();\r
+            void SetIndex(uint16_t index);\r
 \r
-            bool GetCheckStatus();\r
-            void SetCheckStatus(bool checkstatus);\r
+            uint32_t GetCheckTime(void);\r
+            void SetCheckTime(uint32_t time);\r
             void SetWearStatus(int32_t wear);\r
-            bool GetWearStatus(void);\r
+            void SetResult(HeartResult result);\r
+            HeartResult GetResult();\r
 \r
-            void Heart_Start();\r
-            void Heart_Stop();\r
-            void UpHeartdata(uint16_t heart);\r
+            void Heart_Start(void);\r
+            void Heart_Stop(void);\r
+            void Heart_Save(void);\r
+            void Heart_Result(void);\r
 \r
-            uint16_t GetHeartdata();\r
-            uint16_t GetShowHeartdata();\r
-            uint64_t GetCheckTime();          // 获取距离上传测试时间\r
-            void SetCheckTime(uint64_t time); // 设置本次测试完的时间\r
-            uint16_t GetIndex();              // 测试点位\r
-            void SetIndex(uint16_t index);\r
             void Heart_Control(HeartState state, HeartCheck check);\r
             void ReInit();\r
 \r
@@ -162,23 +165,21 @@ extern "C"
             bool wearStatus{true};\r
             uint16_t index_ = 0;\r
 \r
-            bool HeartView;\r
-            bool BandoffView;\r
-            bool CheckView;\r
-            bool ResultView;\r
-            bool CheckStatus;     // 检测状态标志\r
-            uint16_t Show_Heart_; // 显示心率\r
-            uint16_t Heart_;      // 保存心率\r
-            uint32 TIME_;         // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+            uint16_t displayheart; // 显示心率\r
+            uint16_t currentheart; // 保存心率\r
+            uint32 timestamp_ms;   // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
 \r
             bool initstatus = true;\r
             bool heartstate = false;\r
-            uint8_t wear_;\r
-            uint8_t valid_counter_ = 0;    // 有效数计数器\r
-            uint8_t disvalid_counter_ = 0; // 无效数计数器\r
-            uint8_t unwear_counter_ = 0;   // 佩戴错误计数器\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
-            HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
+            HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
+            HeartCheck checkstate = HeartCheck::RESTSTSTE;      // 目前检测状态\r
         };\r
     }\r
 \r
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h
deleted file mode 100644 (file)
index d0916d2..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodOxygen view
- * Author:
- * Create: 2021-08-01
- */
-
-#ifndef HEART_PRESENTER_H
-#define HEART_PRESENTER_H
-
-#include "Presenter.h"
-#include "ModelListenerSample.h"
-#include "components/ui_circle_progress.h"
-#include "ohos_types.h"
-#include "KeyInputListener.h"
-#include "common/key_code.h"
-
-namespace OHOS
-{
-
-    typedef enum
-    {
-        HEARTVIEW = 0,  // 血氧视图(slice)
-        HEARTBANDVIEW,  // 佩戴提醒
-        HEARTCHECKVIEW, // 检测视图(subView)
-        HEARTRESULT,    // 测试失败(subView)
-        MAX_HEARTVIEW,
-    } HEARTVIEWID;
-
-    class HeartView;
-    class HeartPresenter : public Presenter<HeartView>,
-                           public UIView::OnClickListener,
-                           public RootView::OnKeyActListener,
-                           public ModelListenerSample,
-                           public UIView::OnDragListener
-    {
-    public:
-        HeartPresenter();
-        virtual ~HeartPresenter();
-
-        void OnStart() override;
-        void OnPause() override;
-        void OnResume() override;
-        void OnStop() override;
-        virtual void Notify() override;
-        static HeartPresenter *GetInstance(void);
-        bool OnDrag(UIView &view, const DragEvent &event) override;
-        bool OnDragEnd(UIView &view, const DragEvent &event) override;
-        bool OnClick(UIView &view, const ClickEvent &event) override;
-        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
-
-        uint32_t GetCurrentTime();
-        int GetTDOA(uint32_t new_time, uint32_t old_time);
-
-    private:
-        bool CheckPointersValue(void);
-        void ReturnInterface(void);
-        void ProgressNotify(void);
-        int count;
-        bool startheart = true;
-        KeyInputListener *keyActListenr{nullptr};
-    };
-}
-
-#endif
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultPresenter.h
new file mode 100644 (file)
index 0000000..f0ce271
--- /dev/null
@@ -0,0 +1,51 @@
+/*** 
+ * @Date: 2024-07-31 10:27:08
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 10:31:42
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultPresenter.h
+ */
+
+
+#ifndef HEART_RESULT_PRESENTER_H
+#define HEART_RESULT_PRESENTER_H
+
+#include "Presenter.h"
+#include "ModelListenerSample.h"
+#include "components/ui_circle_progress.h"
+#include "ohos_types.h"
+#include "KeyInputListener.h"
+#include "common/key_code.h"
+#include "battery_hal.h"
+#include "heartrate/include/HeartResultView.h"
+
+namespace OHOS
+{
+    static constexpr const char *CLICK_HEART = "clickheart"; // 心率检测
+
+    class HeartResultView;
+    class HeartResultPresenter : public Presenter<HeartResultView>,
+                                 public UIView::OnClickListener,
+                                 public RootView::OnKeyActListener,
+                                 public UIView::OnDragListener
+    {
+    public:
+        HeartResultPresenter();
+        virtual ~HeartResultPresenter();
+        static HeartResultPresenter *GetInstance(void);
+
+        void OnStart() override;
+        void OnPause() override;
+        void OnResume() override;
+        void OnStop() override;
+
+        bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnDragEnd(UIView &view, const DragEvent &event) override;
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+        uint32_t GetCurrentTime();
+        int GetTDOA(uint32_t new_time, uint32_t old_time);
+    };
+}
+
+#endif
index d31466e..6ce0b90 100644 (file)
@@ -1,9 +1,3 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodResult view
- * Author:
- * Create: 2021-08-01
- */
 
 #ifndef HEART_Result_VIEW_H
 #define HEART_Result_VIEW_H
 #include "components/ui_image_animator.h"
 #include "components/ui_circle_progress.h"
 #include "components/ui_view_group.h"
-#include "HeartPresenter.h"
+#include "heartrate/include/HeartResultPresenter.h"
+
 #include "components/ui_scroll_view.h"
 #include "components/ui_label_button_ext.h"
 namespace OHOS
 {
-    class HeartPresenter;
-    class HeartBandoffView;
-
-    class HeartResultView : public View<HeartPresenter>
+    class HeartResultPresenter;
+    class HeartResultView : public View<HeartResultPresenter>
     {
     public:
         HeartResultView();
         virtual ~HeartResultView();
         static HeartResultView *GetInstance(void);
-        UIScrollView *HeartResultViewInit();
+
+        void OnStop() override;
+        void OnSetUpView() override;
+        void OnTearDownView() override;
+        void OnStart() override;
+
+        bool HeartResultViewInit();
+        void UpHeartText(void);
+
+        void DeInit();
+        bool AddButton();
+        bool InitLable();
+        bool Initbackground();
+
     private:
-        // 增加图片
-        bool InitImageDisplay(void);
-        // 初始化标签
-        bool InitLabel(void);
-        HeartResultView *bloodresult{nullptr};
-        UIImageView *imageerror; // 图片
-        UILabelExt *titlelabel;
-        UILabelExt *label1;
-        UILabelExt *label2;
-        UILabelExt *label3;
-
-        UIScrollView *HeartResultScrollView;
-        UILabelButtonExt *ReButton;
-        UILabelButtonExt *StButton;
+        UIImageView *background = nullptr;
+        UILabelExt *titleLabel = nullptr;
+        UILabelExt *timeLabel = nullptr;
+        UILabel *heartLabel = nullptr;
+        UILabelButtonExt *checkButton;
     };
 }
 
-#endif // 血氧主界面
\ No newline at end of file
+#endif // 心率主界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h
deleted file mode 100644 (file)
index e6749a0..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: heart view
- * Author:
- * Create: 2021-08-01
- */
-
-#ifndef HEART_VIEW_H
-#define HEART_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 "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_view_group.h"
-#include "components/ui_scroll_view.h"
-#include "HeartPresenter.h"
-#include "HeartCheckView.h"
-#include "HeartResultView.h"
-#include "power_display_service.h"
-#include "components/ui_label_button_ext.h"
-
-namespace OHOS
-{
-    class HeartPresenter;
-    class HeartBandoffView;
-    class HeartCheckView;
-    class HeartResultView;
-    class HeartView : public View<HeartPresenter>
-    {
-    public:
-        HeartView();
-        virtual ~HeartView();
-
-        void OnStop() override;
-        void OnSetUpView() override;
-        void OnTearDownView() override;
-        void OnStart() override;
-        static HeartView *GetInstance(void);
-        bool ChangeHeartView(int16_t thisview);   // 主视图
-        bool ChangeBandoffView(int16_t thisview); // 佩戴手表
-        bool ChangeCheckView(int16_t thisview);   // 检测心率
-        bool ChangeResultView(int16_t thisview);  // 异常检测(佩戴,心率过高或过低)
-
-        bool ClickFunc(int16_t interface);
-        void ChangeView(int16_t hideView, int16_t showView);
-        UIScrollView *GetHeartScrollView(int ViewId);
-        void UpHeartText(); // 更新心率结果文本
-
-    private:
-        bool InitImageDisplay(void);                               // 初始化背景图片
-        bool InitLabel(void);                                      // 初始化标签
-        UILabelButtonExt *CreateAndSetUIButton(const char *title); // 添加label按键
-        bool InitHeartView(void);                                  // 初始化界面
-        bool SetOnDragListener(void);
-
-        HeartBandoffView *heartbandoff{nullptr};
-        HeartCheckView *heartcheck{nullptr};
-        HeartResultView *heartresult{nullptr};
-        UIScrollView *HeartScrollView[4]{nullptr};
-
-        UIViewGroup *group;
-        UIImageView *imageViewMain;   // 背景图片
-        UILabelExt *percent;          // 心率值
-        UILabelExt *timeLabel;        // 检测时间
-        UILabelExt *titleLabel;       // 页面title
-        UILabelButtonExt *testButton; // 检测按键
-
-        const power_display_svr_api_t *display_api = power_display_svr_get_api();
-        uint32_t display_time; // 获取系统亮屏时间暂存
-    };
-}
-
-#endif // 血氧主界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp
deleted file mode 100644 (file)
index 3929763..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: HeartBandoff view
- * Author:
- * Create: 2021-08-01
- */
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "HeartBandoffView.h"
-#include "HeartModel.h"
-#include "ui_resource_string.h"
-
-namespace OHOS
-{
-    // 动态显示图片设置
-    static constexpr uint16_t IMAGE_SIZE = 96;
-    static constexpr uint16_t IMAGE_POSITION_Y = 276;
-    static constexpr uint16_t IMAGE_POSITION_X = 179;
-    static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 24;
-    static constexpr uint16_t IMAGEANIMATOERVIEW_SPEED = 40;
-
-    // 标签设置
-    static constexpr uint16_t LABEL_POSITION_X = 87;
-    static constexpr uint16_t LABEL_POSITION_Y = 200;
-    static constexpr uint16_t LABEL_POSITION_WIDTH = 288;
-    static constexpr uint16_t LABEL_POSITION_HEIGHT = 50;
-
-    // 图片设置
-    static constexpr uint16_t IMAGE_ENTER_POSITION_X = 131;
-    static constexpr uint16_t IMAGE_ENTER_POSITION_Y = 70;
-
-    static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;
-    static constexpr uint16_t FONT_DEFAULT_SIZE = 25;
-    static constexpr uint16_t VIEW_DISTANCE_TO_LEFT_SIDE = 48;
-    static constexpr uint16_t TEXT_DISTANCE_TO_LEFT_SIDE = 50;
-    static constexpr uint16_t TEXT_DISTANCE_TO_TOP_SIDE = 11;
-
-    static ImageAnimatorInfo g_imageAnimatorInfo_Time[IMAGEANIMATOERVIEW_SIZE] = {
-        {PNG_COUNTDOWN_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_COUNTDOWN_TIME_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-    };
-    static HeartBandoffView *g_pMainView = nullptr;
-    HeartBandoffView::HeartBandoffView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
-        label = nullptr;
-        imageView = nullptr;
-        HeartBandoffScrollView = nullptr;
-        imageAnimator = nullptr;
-        g_pMainView = this;
-    }
-
-    HeartBandoffView::~HeartBandoffView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::~HeartBandoffView");
-        HeartBandoffScrollView->RemoveAll();
-        delete label;
-        delete imageView;
-        delete imageAnimator;
-        label = nullptr;
-        imageView = nullptr;
-        delete HeartBandoffScrollView;
-        HeartBandoffScrollView = nullptr;
-        imageAnimator = nullptr;
-        g_pMainView = nullptr;
-    }
-
-    HeartBandoffView *HeartBandoffView::GetInstance(void)
-    {
-        return g_pMainView;
-    }
-
-    // 返回动画状态
-    UIImageAnimatorView *HeartBandoffView::GetImageAnimator()
-    {
-        return imageAnimator;
-    }
-
-    UIScrollView *HeartBandoffView::HeartBondoffViewInit()
-    {
-        // 初始化界面
-        HeartBandoffScrollView = new UIScrollView();
-        if (HeartBandoffScrollView == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBondoffViewInit::HeartBandoffView new fail!");
-            // return nullptr;
-        }
-        HeartBandoffScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-        HeartBandoffScrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        HeartBandoffScrollView->SetStyle(STYLE_BORDER_RADIUS, 1294);
-        HeartBandoffScrollView->SetScrollBlankSize(35);
-        HeartBandoffScrollView->SetReboundSize(50);
-        HeartBandoffScrollView->SetDirection(1);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::CreateUIViewGroup");
-
-        // 佩戴title
-        label = new UILabelExt();
-        if (label == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new Label fail");
-            // return nullptr;
-        }
-        label->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);
-        // label->SetText("偏紧佩戴,保持静止");
-        label->SetTextId(STR_CHECKNOTE);
-        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
-        label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        HeartBandoffScrollView->Add(label);
-
-        // 播放动画
-        imageAnimator = new UIImageAnimatorView();
-        if (imageAnimator == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageAnimatorView fail");
-            // return nullptr;
-        }
-        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, IMAGEANIMATOERVIEW_SIZE, IMAGEANIMATOERVIEW_SPEED);
-        imageAnimator->Start();
-        imageAnimator->SetRepeat(false);
-        HeartBandoffScrollView->Add(imageAnimator);
-
-        // 提醒图片
-        imageView = new UIImageView();
-        if (imageView == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageView fail");
-            // return nullptr;
-        }
-        imageView->SetPosition(IMAGE_ENTER_POSITION_X, IMAGE_ENTER_POSITION_Y); // 30 : offset
-        imageView->SetSrc(PNG_BLOOD_ICON_ENTER);
-        HeartBandoffScrollView->Add(imageView);
-
-        return HeartBandoffScrollView;
-    }
-}
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp
deleted file mode 100644 (file)
index 51c1242..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-#include "UiConfig.h"
-#include "wearable_log.h"
-#include "HeartCheckView.h"
-#include "HeartModel.h"
-#include "ui_image_animator.h"
-#include "HeartCheckView.h"
-#include "ui_resource_string.h"
-namespace OHOS
-{
-    // 动态刷新设置
-    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 CHECKIMAGEANIMATORVIEW_SIZE = 20;
-    static constexpr uint16_t CHECKIMAGEANIMATORVIEW_SPEED = 40;
-
-    static ImageAnimatorInfo g_imageAnimatorInfo_Time[20] = {
-        {PNG_CHECK_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-        {PNG_CHECK_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
-    };
-
-    static HeartCheckView *g_pMainView = nullptr;
-    HeartCheckView::HeartCheckView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
-        titleLabel = nullptr;
-        HeartCheckScrollView = nullptr;
-        imageAnimator = nullptr;
-        testButton = nullptr;
-        g_pMainView = this;
-    }
-
-    HeartCheckView *HeartCheckView::GetInstance(void)
-    {
-        return g_pMainView;
-    }
-
-    UIImageAnimatorView *HeartCheckView::GetImageAnimator()
-    {
-        return imageAnimator;
-    }
-
-    HeartCheckView::~HeartCheckView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartCheckView::~HeartCheckView");
-        HeartCheckScrollView->RemoveAll();
-        delete titleLabel;
-        delete testButton;
-        delete HeartCheckScrollView;
-        delete imageAnimator;
-        delete HeartText;
-        titleLabel = nullptr;
-        HeartCheckScrollView = nullptr;
-        imageAnimator = nullptr;
-        testButton = nullptr;
-        HeartText = nullptr;
-        g_pMainView = this;
-    }
-    void HeartCheckView::UpShowHeartText()
-    {
-        // 防止访问空的Text
-        if (HeartText != nullptr)
-        {
-            uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
-            std::string bloodoxygenStr = std::to_string(heart_);
-            HeartText->SetText(bloodoxygenStr.c_str());
-        }
-    }
-    UIScrollView *HeartCheckView::HeartCheckViewInit()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartCheckView::CreateUIViewHeartCheckScrollView");
-        HeartCheckScrollView = new UIScrollView();
-        if (HeartCheckScrollView == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new HeartCheckScrollView fail");
-            return nullptr;
-        }
-        HeartCheckScrollView->SetPosition(0, 0);
-        HeartCheckScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
-        /* -------------------------------------------------------------------------- */
-        titleLabel = new UILabelExt();
-        if (titleLabel == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new titleLabel fail");
-            return nullptr;
-        }
-        titleLabel->SetPosition(175, 55); // widget's left position and top position
-        titleLabel->Resize(200, 90);      // widget's width and height
-        titleLabel->SetViewId("label3");  // Set style
-        titleLabel->SetStyle(STYLE_TEXT_FONT, 28);
-        // titleLabel->SetText("正在检测");
-        titleLabel->SetTextId(STR_CHECKON);
-        titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
-        titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        titleLabel->SetRollSpeed(0);
-        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
-        HeartCheckScrollView->Add(titleLabel);
-        /* -------------------------------------------------------------------------- */
-
-        imageAnimator = new UIImageAnimatorView();
-        if (imageAnimator == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageAnimatorView fail");
-            return nullptr;
-        }
-        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, CHECKIMAGEANIMATORVIEW_SIZE, CHECKIMAGEANIMATORVIEW_SPEED);
-        // imageAnimator->SetRepeatTimes(30);
-        imageAnimator->SetRepeat(true);
-        imageAnimator->Start();
-        HeartCheckScrollView->Add(imageAnimator);
-        /* -------------------------------------------------------------------------- */
-        if (testButton == nullptr)
-        {
-            testButton = new UILabelButtonExt();
-        }
-        testButton->SetPosition(118, 336);    // widget's left position and top position
-        testButton->Resize(230, 80);          // widget's width and height
-        testButton->SetViewId("labelButton"); // Set style
-        testButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-
-        // Set additional property
-        // testButton->SetText("停止检测");
-        testButton->SetTextId(STR_CHECKSTOP);
-        testButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-        testButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
-        testButton->SetViewId("checkstop");
-        UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
-        if (clickLeftListener == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeftListener fail");
-            return nullptr;
-        }
-        testButton->SetOnClickListener(clickLeftListener);
-        HeartCheckScrollView->Add(testButton);
-        /* -------------------------------------------------------------------------- */
-        HeartText = new UILabelExt();
-        if (HeartText == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new HeartText fail");
-            return nullptr;
-        }
-        HeartText->SetPosition(83, 110); // widget's left position and top position
-        HeartText->Resize(300, 250);     // widget's width and height
-        HeartText->SetViewId("label");   // Set style
-        HeartText->SetStyle(STYLE_TEXT_FONT, 140);
-        uint16_t heart_ = HeartModel::GetInstance()->GetHeartdata();
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetHeartData %d", heart_);
-        std::string bloodoxygenStr = std::to_string(heart_);
-        HeartText->SetText(bloodoxygenStr.c_str());
-        HeartText->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
-        HeartText->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        HeartText->SetRollSpeed(0);
-        HeartText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 140);
-        HeartCheckScrollView->Add(HeartText);
-        /* -------------------------------------------------------------------------- */
-        return HeartCheckScrollView;
-    }
-}
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionPresenter.cpp
new file mode 100644 (file)
index 0000000..d1dc5cc
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HeartDetectionPresenter.cpp
+ * Author:
+ * Create: 2021-11-23
+ */
+
+#include "heartrate/include/HeartDetectionView.h"
+#include "heartrate/include/HeartDetectionPresenter.h"
+
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include "KeyInputListener.h"
+#include "custom_utils.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "heartrate/include/HeartModel.h"
+#include "MainModel.h"
+
+namespace OHOS
+{
+
+    // 当前Presenter属性实例化的内存指针
+    static HeartDetectionPresenter *g_pHeartDetectionPresenter = nullptr;
+
+    HeartDetectionPresenter::HeartDetectionPresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionPresenter::HeartDetectionPresenter");
+        g_pHeartDetectionPresenter = this;
+        display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
+        display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
+        ResetTickTimer();
+    }
+
+    HeartDetectionPresenter::~HeartDetectionPresenter()
+    {
+        display_api->set_screen_auto_off_timeout(display_time); // 恢复
+        g_pHeartDetectionPresenter = nullptr;
+    }
+    HeartDetectionPresenter *HeartDetectionPresenter::GetInstance()
+    {
+        return g_pHeartDetectionPresenter;
+    }
+    void HeartDetectionPresenter::NavigateBack()
+    {
+        NativeAbility::GetInstance().Back(TransitionType::TRANSITION_ZOOM);
+    }
+    void HeartDetectionPresenter::OnStart()
+    {
+        Presenter<HeartDetectionView>::OnStart();
+        if (!HeartCheckState)
+        {
+            HeartModel::GetInstance()->Heart_Start();
+            HeartCheckState = true;
+        }
+    }
+    void HeartDetectionPresenter::OnResume(void)
+    {
+    }
+
+    void HeartDetectionPresenter::OnStop(void)
+    {
+        if (HeartCheckState)
+        {
+            HeartModel::GetInstance()->Heart_Stop();
+            HeartCheckState = false;
+        }
+    }
+
+    bool HeartDetectionPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionPresenter::OnDrag");
+        UNUSED(view);
+        if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) &&
+            (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY()))))
+        {
+            NavigateBack();
+        }
+        return false;
+    }
+
+    bool HeartDetectionPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        if (strcmp(view.GetViewId(), STOPCHECK) == 0)
+        {
+            NavigateBack();
+        }
+        return true;
+    }
+
+    void HeartDetectionPresenter::OnTickEvent()
+    {
+        // 更新显示心率数据
+        HeartDetectionView::GetInstance()->UpShowHeartText();
+        uint64_t current_time = osKernelGetTick2ms();
+        // printf("current_time diff: %d\r\n", (current_time - startTime));
+        if ((startTime != 0) && (current_time - startTime > HEART_KEEP_TIME))
+        {
+            // 超时处理
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 HEART_KEEP_TIME: %lld", current_time - startTime);
+            HeartModel::GetInstance()->SetResult(HeartResult::TIMEOUT);
+            HeartModel::GetInstance()->Heart_Stop();
+        }
+    }
+    void HeartDetectionPresenter::ResetTickTimer(void)
+    {
+        startTime = osKernelGetTick2ms();
+    }
+    // 增加按键事件
+    bool HeartDetectionPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+        unsigned short keyID = event.GetKeyId();
+        unsigned short keyState = event.GetState();
+        // 如果是power键,且是亮屏状态,按键释放就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
+        {
+            NavigateBack();
+        }
+        return true;
+    }
+}
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartDetectionView.cpp
new file mode 100644 (file)
index 0000000..e76c850
--- /dev/null
@@ -0,0 +1,184 @@
+/***
+ * @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/HeartDetectionView.cpp
+ */
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "HeartDetectionView.h"
+#include "HeartModel.h"
+#include "ui_image_animator.h"
+#include "HeartDetectionView.h"
+#include "ui_resource_string.h"
+#include "power_display_service.h"
+#include "uicomponents/UIComponents.h"
+namespace OHOS
+{
+    // 动态刷新设置
+    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 DETECTION_IMAGE_ANIMATORVIEW_SIZE = 20;
+    static constexpr uint16_t DETECTION_IMAGE_ANIMATORVIEW_SPEED = 40;
+
+    static ImageAnimatorInfo g_imageAnimatorInfo_heart[20] = {
+        {PNG_CHECK_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_CHECK_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    };
+
+    static HeartDetectionView *g_pHeartCheckView = nullptr;
+    HeartDetectionView::HeartDetectionView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
+        g_pHeartCheckView = this;
+    }
+    HeartDetectionView::~HeartDetectionView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::~HeartDetectionView");
+        // container_->RemoveAll();
+
+        delete titleLabel;
+        titleLabel = nullptr;
+
+        delete testButton;
+        testButton = nullptr;
+
+        imageAnimator->Stop();
+        delete imageAnimator;
+        imageAnimator = nullptr;
+
+        delete HeartText;
+        HeartText = nullptr;
+
+        g_pHeartCheckView = this;
+    }
+    HeartDetectionView *HeartDetectionView::GetInstance(void)
+    {
+        return g_pHeartCheckView;
+    }
+    UIImageAnimatorView *HeartDetectionView::GetImageAnimator()
+    {
+        return imageAnimator;
+    }
+
+    /*更新显示数据*/
+    void HeartDetectionView::UpShowHeartText()
+    {
+        uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
+        std::string heartrateStr = std::to_string(heart_);
+        if (HeartText != nullptr)
+            HeartText->SetText(heartrateStr.c_str());
+    }
+    /*初始化检测界面*/
+    bool HeartDetectionView::HeartDetectionViewInit()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionViewInit is begin");
+        /*初始化title*/
+        InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_CHECKON, DEFAULT_VECTOR_FONT_FILENAME, 30);
+        container_->Add(titleLabel);
+
+        /* -------------------------------------------------------------------------- */
+        imageAnimator = new UIImageAnimatorView();
+        if (imageAnimator == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new UIImageAnimatorView fail");
+            return false;
+        }
+        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_heart, DETECTION_IMAGE_ANIMATORVIEW_SIZE, DETECTION_IMAGE_ANIMATORVIEW_SPEED);
+        imageAnimator->SetRepeat(true);
+        container_->Add(imageAnimator);
+
+        /* -------------------------------------------------------------------------- */
+        /*初始化心率值label*/
+        InitUILabel(HeartText, 83, 83, 300, 300, "hearttext", "--", GILROY_BOLD_FONT, 140);
+        container_->Add(HeartText);
+
+        /* -------------------------------------------------------------------------- */
+        InitButtonExt(testButton, 118, 336, 230, 80, STOPCHECK, STR_CHECKSTOP, 30);
+        container_->Add(testButton);
+
+        /* -------------------------------------------------------------------------- */
+        UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartDetectionPresenter::GetInstance();
+        if (clickLeftListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::new clickLeftListener fail");
+            return false;
+        }
+        testButton->SetOnClickListener(clickLeftListener);
+        /* -------------------------------------------------------------------------- */
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionViewInit is ok");
+        return true;
+    }
+    void HeartDetectionView::OnStart()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnStart");
+        View<HeartDetectionPresenter>::OnStart();
+
+        SetContainerView(new UIViewGroup());
+        container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+
+        if (!HeartDetectionViewInit())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::InitHeartView fail");
+        }
+
+        RootView::GetInstance()->Add(container_);
+        SetContainerView(container_);
+
+        container_->SetDraggable(true);
+        container_->SetTouchable(true);
+        container_->SetOnDragListener(presenter_);
+
+        // 增加按键监听
+        RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartDetectionPresenter::GetInstance();
+        RootView::GetInstance()->SetOnKeyActListener(keyactListener);
+    }
+    void HeartDetectionView::OnSetUpView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnSetUpView");
+        View<HeartDetectionPresenter>::OnSetUpView();
+        if (imageAnimator != nullptr)
+        {
+            imageAnimator->Start();
+        }
+        Draw();
+    }
+    void HeartDetectionView::OnTearDownView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnTearDownView");
+        View<HeartDetectionPresenter>::OnTearDownView();
+        return;
+    }
+
+    void HeartDetectionView::OnStop()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnStop");
+        View<HeartDetectionPresenter>::OnStop();
+        if (container_ != nullptr)
+        {
+            container_->RemoveAll();
+            delete container_;
+            container_ = nullptr;
+        }
+        return;
+    }
+}
index f78e5ce..8226b20 100644 (file)
@@ -4,11 +4,13 @@
 #include "IndoorWalkPreparedView.h"\r
 #include "IndoorWalkPresenter.h"\r
 #include "MainViewSample.h"\r
+\r
 #include "heartrate/include/HeartRateView.h"\r
+#include "heartrate/include/HeartDetectionPresenter.h"\r
+#include "heartrate/include/HeartResultPresenter.h"\r
+\r
 #include <iostream>\r
 #include <random>\r
-#include "heartrate/include/HeartView.h"\r
-#include "heartrate/include/HeartPresenter.h"\r
 #include "DialModelHeartRate.h"\r
 #include "health_service.h"\r
 #include "custom_utils.h"\r
@@ -22,10 +24,11 @@ extern "C"
 {\r
 #endif\r
 \r
-#define MAX_UNWEAR_COUNT 20\r
+#define MAX_UNWEAR_COUNT 30\r
 #define MAX_VALID_HRS_COUNT 40\r
-#define MAX_DISVALID_HRS_COUNT 40\r
+#define MAX_DISVALID_HRS_COUNT 70\r
 #define HEARTTEST 1 //[0 开启测试 1 关闭]\r
+\r
     /* 佩戴检测结果 */\r
     enum\r
     {\r
@@ -192,24 +195,17 @@ namespace OHOS
     HeartModel::HeartModel()\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
-        HeartView = false;\r
-        BandoffView = false;\r
-        CheckView = false;\r
-        ResultView = false;\r
-        CheckStatus = false;\r
-        wearStatus = true;\r
-\r
         HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
         if (data != nullptr)\r
         {\r
-            Heart_ = data->Heart;\r
-            TIME_ = data->timestamp;\r
+            currentheart = data->Heart;\r
+            timestamp_ms = data->timestamp;\r
             delete data;\r
         }\r
         else\r
         {\r
-            Heart_ = 0;\r
-            TIME_ = 0;\r
+            currentheart = 0;\r
+            timestamp_ms = 0;\r
         }\r
     }\r
 \r
@@ -485,10 +481,37 @@ namespace OHOS
     // 重新初始化\r
     void HeartModel::ReInit()\r
     {\r
-        Heart_ = 0;\r
-        TIME_ = 0;\r
+        currentheart = 0;\r
+        timestamp_ms = 0;\r
+    }\r
+    // 获取心率数据\r
+    uint16_t HeartModel::GetHeartdata()\r
+    {\r
+        return currentheart;\r
+    }\r
+\r
+    uint16_t HeartModel::GetShowHeartdata()\r
+    {\r
+        return displayheart;\r
+    }\r
+\r
+    uint32_t HeartModel::GetCheckTime()\r
+    {\r
+        return timestamp_ms;\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
@@ -515,165 +538,175 @@ namespace OHOS
             checkstate = check;\r
         }\r
     }\r
+    // 开始检测\r
     void HeartModel::Heart_Start()\r
     {\r
+        displayheart = 0;\r
+        SetResult(HeartResult::NOT_TESTED); // 成功检测\r
         // 进行初始化操作\r
-        SetCheckStatus(true);\r
+        if (!sensorstate)\r
+        {\r
+            Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+            sensorstate = true;\r
+        }\r
     }\r
 \r
+    // 结束检测\r
     void HeartModel::Heart_Stop()\r
     {\r
         valid_counter_ = 0;\r
-        unwear_counter_ = 0;\r
         disvalid_counter_ = 0;\r
-        SetCheckStatus(false);\r
-        SetWearStatus(1);\r
+        unwear_counter_ = 0;\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
+\r
+    // 显示检测结果// 显示检测结果\r
+    void HeartModel::Heart_Result()\r
+    {\r
+        // 心率提醒(0开 1关)\r
+        uint8_t HeartState = 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 (HeartState)\r
+        {\r
+            // 检查当前心率是否高于或低于阈值\r
+            uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
+\r
+            if (ThresholdState == 0 && currentheart < ThresholdValue)\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
 \r
+        // 根据结果进行处理\r
+        switch (heartresult_)\r
+        {\r
+        case HeartResult::SUCCESS:\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
+            Heart_Save();\r
+            NativeAbility::GetInstance().Back(); // 成功\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
+        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
+            unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
         }\r
-\r
         wear_ = wear;\r
-\r
+        // 检查是否达到了最大未佩戴计数限制\r
         if (unwear_counter_ >= MAX_UNWEAR_COUNT)\r
         {\r
-            wearStatus = false; // 计数达到10次,停止检测\r
-        }\r
-        else\r
-        {\r
-            wearStatus = true;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_);\r
+            SetResult(HeartResult::NOT_WORN);\r
+            Heart_Stop();\r
         }\r
     }\r
 \r
-    bool HeartModel::GetWearStatus()\r
-    {\r
-        return wearStatus;\r
-    }\r
-\r
-    void HeartModel::SetHeartBandoffViewStatus(bool bandoffViewStatus)\r
-    {\r
-        BandoffView = bandoffViewStatus;\r
-    }\r
-\r
-    bool HeartModel::GetHeartBandoffViewStatus()\r
-    {\r
-        return BandoffView;\r
-    }\r
-\r
-    void HeartModel::SetHeartViewStatus(bool heartViewStatus)\r
-    {\r
-        HeartView = heartViewStatus;\r
-    }\r
-\r
-    bool HeartModel::GetHeartViewStatus()\r
-    {\r
-        return HeartView;\r
-    }\r
-\r
-    void HeartModel::SetHeartCheckViewStatus(bool checkViewStatus)\r
-    {\r
-        CheckView = checkViewStatus;\r
-    }\r
-\r
-    bool HeartModel::GetHeartCheckViewStatus()\r
-    {\r
-        return CheckView;\r
-    }\r
-\r
-    void HeartModel::SetHeartResultViewStatus(bool resultViewStatus)\r
-    {\r
-        ResultView = resultViewStatus;\r
-    }\r
-\r
-    bool HeartModel::GetHeartResultViewStaus()\r
-    {\r
-        return ResultView;\r
-    }\r
-\r
-    void HeartModel::SetCheckStatus(bool checkStatus)\r
-    {\r
-        CheckStatus = checkStatus;\r
-    }\r
-\r
-    bool HeartModel::GetCheckStatus()\r
-    {\r
-        return CheckStatus;\r
-    }\r
-    // 获取心率数据\r
-    uint16_t HeartModel::GetHeartdata()\r
-    {\r
-        return Heart_;\r
-    }\r
-\r
-    uint16_t HeartModel::GetShowHeartdata()\r
-    {\r
-        return Show_Heart_;\r
-    }\r
-\r
-    uint64_t HeartModel::GetCheckTime()\r
-    {\r
-        return TIME_;\r
-    }\r
-\r
-    void HeartModel::SetCheckTime(uint64_t time)\r
-    {\r
-        TIME_ = time;\r
-    }\r
-\r
     void HeartModel::UpHeartdata(uint16_t heart)\r
     {\r
         /*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
         if (uapi_dev_runtime_get_train_status() == 1)\r
             return;\r
 \r
-        Show_Heart_ = heart;\r
-        if (Show_Heart_ != 0)\r
+        displayheart = heart;\r
+\r
+        // 处理有效与无效计数\r
+        if (displayheart != 0)\r
         {\r
-            Heart_ = heart;\r
-            valid_counter_++;      // 增加有效计数器\r
-            disvalid_counter_ = 0; // 清零无效数\r
+            currentheart = displayheart; // 更新 currentheart\r
+            valid_counter_++;            // 增加有效计数器\r
+            disvalid_counter_ = 0;       // 清空无效计数器\r
         }\r
         else\r
         {\r
+            disvalid_counter_++; // 增加无效计数器\r
             valid_counter_ = 0;  // 清零有效计数器\r
-            disvalid_counter_++; // 增加无效数\r
         }\r
-        // 一直为无效数\r
+\r
+        // 检查无效计数器是否达标\r
         if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
         {\r
-            // 结束本次测试\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MAX_DISVALID_HRS_COUNT");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
+            SetResult(HeartResult::INVALID_DATA); // 无效数达标\r
             Heart_Stop();\r
-            // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
-            HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
-            return;\r
         }\r
-#if HEARTTEST\r
+\r
+        // 检查有效计数器是否达标\r
         if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
         {\r
-            // 结束本次测试,将最后一次有效数作为本次测量结果\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
+            SetResult(HeartResult::SUCCESS); // 成功检测\r
             Heart_Stop();\r
-            // 保存心率数据\r
-            HeartRateData *data = new HeartRateData;\r
-            data->Heart = heart;\r
-            data->timestamp = HeartPresenter::GetInstance()->GetCurrentTime();\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp);\r
-            SetCheckTime(data->timestamp);\r
-            HealthService::GetInstance()->UpdateHealthData(*data); // 心率数据存储\r
-            // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
-            HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
         }\r
-#endif\r
     }\r
-\r
 }\r
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultPresenter.cpp
new file mode 100644 (file)
index 0000000..cfa5da7
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: heart view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#include "heartrate/include/HeartResultPresenter.h"
+#include "common/task_manager.h"
+#include "HeartModel.h"
+
+#include "heartrate/include/HeartDetectionView.h"
+#include "heartrate/include/HeartResultView.h"
+
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+
+#include "ChangeSliceListener.h"
+#include "broadcast_service.h"
+#include <fstream>
+#include "iostream"
+#include <sstream>
+#include <string>
+#include <cstdlib>
+#include <ctime>
+#include "wearable_log.h"
+#include "cmsis_os.h"
+#include "securec.h"
+#include "broadcast_service.h"
+#include "graphic_service.h"
+#include <chrono>
+#include <thread>
+#include <sys/time.h>
+
+#include "ppg_service.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "power_display_service.h"
+#include "custom_utils.h"
+#include "cywee_service.h"
+#include "battery_hal.h"
+
+#include "heart_blood/health_service/health_service.h"
+
+#define BLOODKEYABLE 1
+namespace OHOS
+{
+    static constexpr uint16_t PROGRESS_VALUE_MIN = 0;
+    static constexpr uint16_t PROGRESS_VALUE_MAX = 10;
+
+    static HeartResultPresenter *g_pHeartResultPresenter;
+    /* -------------------------------------------------------------------------- */
+    // 获取当前的时间戳
+    uint32_t HeartResultPresenter::GetCurrentTime()
+    {
+        uint32_t time;
+        if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
+            return 0;
+        }
+        return time;
+    }
+
+    // 获取时间差,现在传进来的是两个时间戳
+    int HeartResultPresenter::GetTDOA(uint32_t new_time, uint32_t old_time)
+    {
+        if (new_time == old_time || old_time > new_time)
+        {
+            return 0;
+        }
+        int time_diff_seconds = new_time - old_time;
+        // 转换为分钟的差值
+        int time_diff_minutes = time_diff_seconds / 60;
+        return time_diff_minutes;
+    }
+    /* -------------------------------------------------------------------------- */
+    HeartResultPresenter::HeartResultPresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultPresenter::new HeartResultPresenter");
+        g_pHeartResultPresenter = this;
+    }
+    HeartResultPresenter::~HeartResultPresenter()
+    {
+        g_pHeartResultPresenter = nullptr;
+    }
+    HeartResultPresenter *HeartResultPresenter::GetInstance()
+    {
+        return g_pHeartResultPresenter;
+    }
+    void HeartResultPresenter::OnStart()
+    {
+        Presenter<HeartResultView>::OnStart();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultPresenter::On Start ");
+    }
+    void HeartResultPresenter::OnPause(void) {}
+
+    void HeartResultPresenter::OnResume(void) {}
+
+    void HeartResultPresenter::OnStop(void) {}
+
+    bool HeartResultPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        return true;
+    }
+    bool HeartResultPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
+        {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            return true;
+        }
+        return false;
+    }
+    bool HeartResultPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+        unsigned short keyID = event.GetKeyId();
+        unsigned short keyState = event.GetState();
+        // 如果是power键,且是亮屏状态,按键释放就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
+        {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+        }
+        return true;
+    }
+
+    bool HeartResultPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        if (strcmp(view.GetViewId(), CLICK_HEART) == 0)
+        {
+            // 如果正在充电进入提醒界面
+            if (get_charge_stat())
+            {
+                HealthState highHealthState;
+                highHealthState.checkType = CHARGE;
+                HealthService::GetInstance()->SetHealthCurrent(highHealthState);
+                NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID, TransitionType::TRANSITION_ZOOM);
+            }
+            else
+            {
+                NativeAbility::GetInstance().EnterSlice(VIEW_HEART_CHECK, TransitionType::TRANSITION_ZOOM);
+            }
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartPresenter::OnClick");
+        return true;
+    }
+
+}
\ No newline at end of file
index 94d9d3b..8558bc5 100644 (file)
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-30 16:39:56
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultView.cpp
+ */
 
+#include "common/image_cache_manager.h"
+#include "ui_resource_image.h"
+#include <ui_scroll_view.h>
+#include "components/ui_button.h"
+#include "MainViewSample.h"
+#include "components/ui_view_group.h"
+#include "DialModelSPO2.h"
+#include "DialModelHeartRate.h"
+#include "HeartModel.h"
 
 #include "UiConfig.h"
-#include "wearable_log.h"
-#include "HeartResultView.h"
-#include "HeartModel.h"
-#include "ui_image_animator.h"
-#include "HeartResultView.h"
-#include "ui_resource_string.h"
+#include "uicomponents/UIComponents.h"
+#include "MainPresenterSample.h"
+
+#include "heartrate/include/HeartResultPresenter.h"
+#include "heartrate/include/HeartResultView.h"
 namespace OHOS
 {
-    // 图片设置
-    static constexpr uint16_t IMAGE_SIZE = 80;
-    static constexpr uint16_t IMAGE_X = 193;
-    static constexpr uint16_t IMAGE_Y = 111;
-
-    // 按钮设置
-    static constexpr uint16_t BUTTON_LABEL_SIZE = 26;
-    static constexpr uint16_t BUTTON_WIDHT = 230;
-    static constexpr uint16_t BUTTON_HEIGHT = 80;
-    static constexpr uint16_t ST_BUTTON_X = 118;
-    static constexpr uint16_t ST_BUTTON_Y = 334;
-    static constexpr uint16_t RE_BUTTON_X = 118;
-    static constexpr uint16_t RE_BUTTON_Y = 434;
-
-    // 标签设置
-    static constexpr uint16_t LABLE_FONT_SIZE = 30;
-    static constexpr uint16_t TITLE_POSITION_X = 149;
-    static constexpr uint16_t TITLE_POSITION_Y = 52;
-    static constexpr uint16_t label1_POSITION_X = 58;
-    static constexpr uint16_t label1_POSITION_Y = 208;
-    static constexpr uint16_t label2_POSITION_X = 38;
-    static constexpr uint16_t label2_POSITION_Y = 243;
-    static constexpr uint16_t LABEL3_POSITION_X = 143;
-    static constexpr uint16_t LABEL3_POSITION_Y = 278;
-
-    static HeartResultView *g_pMainView = nullptr;
+    static HeartResultView *g_pHeartResultView{nullptr};
+    static const char *HEARTBACKPATH = "/user/res/Blood/beijing.bin";
+
     HeartResultView::HeartResultView()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
-
-        g_pMainView = this;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::HeartResultView");
+        g_pHeartResultView = this;
     }
 
-    HeartResultView *HeartResultView::GetInstance(void)
+    HeartResultView::~HeartResultView()
     {
-        return g_pMainView;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::~HeartResultView");
+        DeInit();
+        g_pHeartResultView = nullptr;
     }
 
-    HeartResultView::~HeartResultView()
+    HeartResultView *HeartResultView::GetInstance()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::~HeartResultView");
-        HeartResultScrollView->RemoveAll();
-        delete imageerror;
-        delete titlelabel;
-        delete label1;
-        delete label2;
-        delete label3;
-        delete ReButton;
-        delete StButton;
-        delete HeartResultScrollView;
-
-        titlelabel = nullptr;
-        label1 = nullptr;
-        label2 = nullptr;
-        label3 = nullptr;
-        HeartResultScrollView = nullptr;
-        ReButton = nullptr;
-        StButton = nullptr;
-        g_pMainView = this;
+        return g_pHeartResultView;
     }
-    // 初始化标签
-    bool HeartResultView::InitLabel()
+
+    /* -------------------------------------------------------------------------- */
+    void HeartResultView::UpHeartText()
     {
-        titlelabel = new UILabelExt();
-        if (titlelabel == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
-            return false;
-        }
-        titlelabel->SetPosition(149, 52); // widget's left position and top position
-        titlelabel->Resize(200, 60);      // widget's width and height
-        titlelabel->SetViewId("label1");  // Set style
-        titlelabel->SetStyle(STYLE_TEXT_FONT, 28);
-
-        // Set additional property
-        // titlelabel->SetText("检测不到结果");
-        titlelabel->SetTextId(STR_CHECKERROR);
-        titlelabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
-        titlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        titlelabel->SetRollSpeed(0);
-        titlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
-        /* -------------------------------------------------------------------------- */
-        label1 = new UILabelExt();
-        if (label1 == nullptr)
+        // 更新心率数据
+        uint16_t heart = HeartModel::GetInstance()->GetHeartdata();
+        if (heart != 0) // 判断是否为默认数据
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
-            return false;
-        }
-        label1->SetPosition(53, 208); // widget's left position and top position
-        label1->Resize(200, 60);      // widget's width and height
-        label1->SetViewId("label4");  // Set style
-        label1->SetStyle(STYLE_TEXT_FONT, 30);
-
-        label1->SetText("请确认已带上手表,并保持静止");
-        label1->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
-        label1->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        label1->SetRollSpeed(0);
-        label1->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-        /* -------------------------------------------------------------------------- */
-        label2 = new UILabelExt();
-        if (label2 == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
-            return false;
+            // 更新数据
+            std::string heartrateStr = std::to_string(heart);
+            heartLabel->SetText(heartrateStr.c_str());
+
+            // 获取时间差
+            uint32_t time = HeartResultPresenter::GetInstance()->GetCurrentTime();
+            uint32_t check_time = HeartModel::GetInstance()->GetCheckTime();
+            int time_diff = HeartResultPresenter::GetInstance()->GetTDOA(time, check_time);
+
+            if (time_diff == 0)
+            {
+                timeLabel->SetTextId(STR_CHECKNEW);
+            }
+            else if (time_diff <= 60)
+            {
+                UpdateLabel(timeLabel, time_diff, STR_CHECKTIME);
+            }
+            else
+            {
+                timeLabel->SetTextId(STR_CHECKLONG);
+            }
         }
-        label2->SetPosition(38, 243); // widget's left position and top position
-        label2->Resize(200, 60);      // widget's width and height
-        label2->SetViewId("label5");  // Set style
-        label2->SetStyle(STYLE_TEXT_FONT, 30);
-        label2->SetText("准备好后点击下方按钮");
-        label2->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
-        label2->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        label2->SetRollSpeed(0);
-        label2->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        /* -------------------------------------------------------------------------- */
-        label3 = new UILabelExt();
-        if (label3 == nullptr)
+        else
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
-            return false;
+            heartLabel->SetText("--");
+            timeLabel->SetTextId(STR_CHECKNO);
         }
-        label3->SetPosition(143, 278); // widget's left position and top position
-        label3->Resize(200, 60);       // widget's width and height
-        label3->SetViewId("label6");   // Set style
-        label3->SetStyle(STYLE_TEXT_FONT, 30);
-        label3->SetText("进行重新检测");
-        label3->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
-        label3->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        label3->SetRollSpeed(0);
-        label3->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+    }
+
+    /* -------------------------------------------------------------------------- */
+    /***
+     * @description:
+     * @return 添加按键是否成功
+     */
+    bool HeartResultView::AddButton()
+    {
+        InitButtonExt(checkButton, 118, 336, 230, 80, CLICK_HEART, STR_CHECK, 30);
+        checkButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF5A36); // 设置按键颜色
+        // 设置按键监听
+        UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::HeartResultPresenter::GetInstance();
+        checkButton->SetOnClickListener(clickListener);
 
+        container_->Add(checkButton);
         return true;
     }
-    // 初始化图片
-    bool HeartResultView::InitImageDisplay()
+    /***
+     * @description:
+     * @return 初始化标签是否成功
+     */
+    bool HeartResultView::InitLable()
     {
-        imageerror = new UIImageView();
-        if (imageerror == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitImageDisplay fail");
-            return false;
-        }
-        imageerror->SetPosition(193, 111); // widget's left position and top position
-        imageerror->Resize(100, 100);      // widget's width and height
-        imageerror->SetViewId("image1");   // Set style
-        char *image1imagesPath = "/user/res/Blood/Error.bin";
-        imageerror->SetSrc(image1imagesPath);
+        /*初始化title*/
+        InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_HEARTDATA, DEFAULT_VECTOR_FONT_FILENAME, 30);
+        /*初始化心率值label*/
+        InitUILabel(heartLabel, 83, 32, 300, 300, "bloodtext", "--", DEFAULT_VECTOR_FONT_FILENAME, 140);
+        /*初始化检测时间*/
+        InitLabelExt(timeLabel, 53, 270, 360, 35, "time", STR_CHECKNO, DEFAULT_VECTOR_FONT_FILENAME, 30);
+        // 设置来回滚动属性
+        timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        timeLabel->SetRollSpeed(70);
+
+        UpHeartText();
+
+        container_->Add(titleLabel);
+        container_->Add(heartLabel);
+        container_->Add(timeLabel);
+
         return true;
     }
-    UIScrollView *HeartResultView::HeartResultViewInit()
+    /***
+     * @description:
+     * @return 初始化背景是否成功
+     */
+    bool HeartResultView::Initbackground()
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::CreateUIViewHeartResultScrollView");
-        HeartResultScrollView = new UIScrollView();
-        if (HeartResultScrollView == nullptr)
+
+        background = new UIImageView();
+        background->SetPosition(0, 0, 466, 466);
+        background->SetSrc(HEARTBACKPATH);
+
+        container_->Add(background);
+        return true;
+    }
+    /***
+     * @description:
+     * @return 是否初始化成功
+     */
+    bool HeartResultView::HeartResultViewInit()
+    {
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bool HeartResultView::InitView()");
+        if (!Initbackground())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new HeartResultScrollView fail");
-            return nullptr;
-        }
-        HeartResultScrollView->SetPosition(0, 0);
-        HeartResultScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
-        HeartResultScrollView->SetScrollBlankSize(35);
-        HeartResultScrollView->SetReboundSize(50);
-        HeartResultScrollView->SetDirection(1);
-        // 增加拖拽监听
-        UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(new HeartPresenter());
-        if (draglistener == nullptr)
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Initbackground error!");
+        };
+        if (!InitLable())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::draglistener can not be nullptr!");
-            return nullptr;
-        }
-        HeartResultScrollView->SetOnDragListener(draglistener);
-        HeartResultScrollView->SetTouchable(true);
-        HeartResultScrollView->SetDraggable(true);
-        HeartResultScrollView->SetHorizontalScrollState(false); // 禁止横向滑动
-        /* -------------------------------------------------------------------------- */
-        if (InitImageDisplay() == false)
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLable error!");
+        };
+        if (!AddButton())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AddButton error!");
+        };
+        return true;
+    }
+    /***
+     * @description:
+     * @return 删除组件
+     */
+    void HeartResultView::DeInit()
+    {
+        if (background != nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "nitImageDisplay fail");
-            return nullptr;
+            delete background;
+            background = nullptr;
         }
-        if (InitLabel() == false)
+        if (heartLabel != nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail");
-            return nullptr;
+            delete heartLabel;
+            heartLabel = nullptr;
         }
-        /* -------------------------------------------------------------------------- */
-        ReButton = new UILabelButtonExt();
-        if (ReButton == nullptr)
+        if (timeLabel != nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButtonExt fail");
-            return nullptr;
+            delete timeLabel;
+            timeLabel = nullptr;
         }
-        ReButton->SetPosition(118, 334);
-        ReButton->Resize(230, 80);
-        // ReButton->SetText("重新检测");
-        ReButton->SetTextId(STR_RECHECK);
-        ReButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF8A36);
-        ReButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-        ReButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
-        ReButton->SetViewId("ReCheck");
-        UIView::OnClickListener *clickLeft1Listener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
-        if (clickLeft1Listener == nullptr)
+        if (titleLabel != nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeft1Listener fail");
-            return nullptr;
+            delete titleLabel;
+            titleLabel = nullptr;
         }
-        ReButton->SetOnClickListener(clickLeft1Listener);
-        /* -------------------------------------------------------------------------- */
-        StButton = new UILabelButtonExt();
-        if (StButton == nullptr)
+    }
+
+    void HeartResultView::OnStart()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStart");
+        View<HeartResultPresenter>::OnStart();
+
+        SetContainerView(new UIViewGroup());
+        container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+
+        if (!HeartResultViewInit())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButtonExt fail");
-            return nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::InitHeartView fail");
         }
-        StButton->SetPosition(118, 434); // widget's left position and top position
-        StButton->Resize(230, 80);       // widget's width and height
-        // StButton->SetText("停止检测");
-        StButton->SetTextId(STR_CHECKSTOP);
-        StButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
-        StButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-        StButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
-        StButton->SetViewId("StCheck");
-        UIView::OnClickListener *clickLeft2Listener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
-        if (clickLeft2Listener == nullptr)
+
+        RootView::GetInstance()->Add(container_);
+        SetContainerView(container_);
+
+        container_->SetDraggable(true);
+        container_->SetTouchable(true);
+        container_->SetOnDragListener(presenter_);
+
+        // 增加按键监听
+        RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartResultPresenter::GetInstance();
+        RootView::GetInstance()->SetOnKeyActListener(keyactListener);
+    }
+    void HeartResultView::OnSetUpView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnSetUpView");
+        View<HeartResultPresenter>::OnSetUpView();
+        Draw();
+    }
+    void HeartResultView::OnTearDownView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnTearDownView");
+        View<HeartResultPresenter>::OnTearDownView();
+        return;
+    }
+
+    void HeartResultView::OnStop()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStop");
+        View<HeartResultPresenter>::OnStop();
+        if (container_ != nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeft2Listener fail");
-            return nullptr;
+            container_->RemoveAll();
+            delete container_;
+            container_ = nullptr;
         }
-        StButton->SetOnClickListener(clickLeft2Listener);
-        /* -------------------------------------------------------------------------- */
-        HeartResultScrollView->Add(imageerror);
-        HeartResultScrollView->Add(titlelabel);
-        HeartResultScrollView->Add(label1);
-        HeartResultScrollView->Add(label2);
-        HeartResultScrollView->Add(label3);
-        HeartResultScrollView->Add(ReButton);
-        HeartResultScrollView->Add(StButton);
-        /* -------------------------------------------------------------------------- */
-        return HeartResultScrollView;
+        return;
     }
 }
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp
deleted file mode 100644 (file)
index b1a5524..0000000
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: heart view
- * Author:
- * Create: 2021-08-01
- */
-
-#include "heartrate/include/HeartView.h"
-#include "heartrate/include/HeartPresenter.h"
-#include "heartrate/include/HeartModel.h"
-#include "displaybrightness/include/DisplayBrightnessModel.h"
-#include "power_display_service.h"
-#include "heartrate/include/HeartBandoffView.h"
-#include "heartrate/include/HeartCheckView.h"
-#include "heartrate/include/HeartRateView.h"
-#include "ui_resource_string.h"
-#include "uicomponents/UIComponents.h"
-#include "heart_blood/health_service/health_service.h"
-namespace OHOS
-{
-    // 按钮设置
-    static constexpr uint16_t BUTTON_LABEL_SIZE = 30;
-    static constexpr uint16_t TESTBUTTON_X = 118;
-    static constexpr uint16_t TESTBUTTON_Y = 336;
-    static constexpr uint16_t BUTTON_WIDHT2 = 230;
-    static constexpr uint16_t BUTTON_HEIGHT2 = 80;
-
-    // 标签设置
-    static constexpr uint16_t PERCENT_X = 83;
-    static constexpr uint16_t PERCENT_Y = 103;
-    static constexpr uint16_t PERCENT_FONT_SIZE = 140;
-    static constexpr uint16_t TIMELABEL_X = 90;
-    static constexpr uint16_t TIMELABEL_Y = 260;
-    static constexpr uint16_t TIMELABEL_FONT_SIZE = 30;
-    static constexpr uint16_t TITLE_X = 151;
-    static constexpr uint16_t TITLE_Y = 55;
-    static constexpr uint16_t TITLE_FONT_SIZE = 28;
-
-    static constexpr uint16_t MATH_ZERO = 0;
-    static HeartView *g_pMainView = nullptr;
-
-    HeartView::HeartView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::HeartView");
-        g_pMainView = this;
-        /*更新model 如果model数据为0,尝试再读一次*/
-        if (!HeartModel::GetInstance()->GetHeartdata())
-        {
-            HeartRateData *data;
-            data = HealthService::GetInstance()->ReadHeartRateData(); // 初始化心率值
-            if (data != nullptr)
-            {
-                HeartModel::GetInstance()->UpHeartdata(data->Heart);
-                HeartModel::GetInstance()->SetCheckTime(data->timestamp);
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
-            }
-            delete data;
-        }
-    }
-
-    HeartView::~HeartView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::~HeartView");
-
-        HeartScrollView[HEARTVIEW]->RemoveAll();
-        UIView::OnDragListener *draglistener = HeartScrollView[HEARTVIEW]->GetOnDragListener();
-        if (draglistener != nullptr)
-        {
-            delete draglistener;
-            draglistener = nullptr;
-        }
-        delete imageViewMain;
-        delete timeLabel;
-        delete titleLabel;
-        delete testButton;
-        delete percent;
-        delete heartcheck;
-        delete heartbandoff;
-        delete heartresult;
-
-        imageViewMain = nullptr;
-        titleLabel = nullptr;
-        timeLabel = nullptr;
-        percent = nullptr;
-        testButton = nullptr;
-        g_pMainView = nullptr;
-        heartcheck = nullptr;
-        heartbandoff = nullptr;
-        heartresult = nullptr;
-
-        delete HeartScrollView[HEARTVIEW];
-        HeartScrollView[HEARTVIEW] = nullptr;
-    }
-    HeartView *HeartView::GetInstance(void)
-    {
-        return g_pMainView;
-    }
-    void HeartView::UpHeartText()
-    {
-        // 更新心率数据
-        uint8_t heart = HeartModel::GetInstance()->GetHeartdata();
-
-        // 防止访问空组件
-        if (percent == nullptr || timeLabel == nullptr)
-            return;
-
-        if (heart != 0) // 判断是否为默认数据
-        {
-            // 更新心率数据
-            std::string heartStr = std::to_string(heart);
-            percent->SetText(heartStr.c_str());
-
-            // 获取时间差
-            uint32_t time = HeartPresenter::GetInstance()->GetCurrentTime();
-            uint32_t check_time = HeartModel::GetInstance()->GetCheckTime();
-            int time_diff = HeartPresenter::GetInstance()->GetTDOA(time, check_time);
-
-            // 更新时间标签
-            if (time_diff == 0)
-            {
-                timeLabel->SetTextId(STR_CHECKNEW);
-            }
-            else if (time_diff <= 60)
-            {
-                UpdateLabel(timeLabel, time_diff, STR_CHECKTIME);
-            }
-            else
-            {
-                timeLabel->SetTextId(STR_CHECKLONG);
-            }
-        }
-        else
-        {
-            percent->SetText("--");
-            timeLabel->SetTextId(STR_CHECKNO);
-        }
-    }
-
-    // 初始化标签
-    bool HeartView::InitLabel()
-    {
-        /* -------------------------------------------------------------------------- */
-        percent = new UILabelExt();
-        if (percent == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new percent fail");
-            return false;
-        }
-        percent->SetPosition(PERCENT_X, PERCENT_Y); // widget's left position and top position
-        percent->Resize(300, 250);                  // widget's width and height
-        percent->SetViewId("label2");               // Set style
-        percent->SetStyle(STYLE_TEXT_FONT, PERCENT_FONT_SIZE);
-        percent->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
-        percent->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        percent->SetRollSpeed(0);
-        percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE);
-        /* -------------------------------------------------------------------------- */
-        timeLabel = new UILabelExt();
-        if (timeLabel == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new timeLabel fail");
-            return false;
-        }
-        timeLabel->SetPosition(TIMELABEL_X, TIMELABEL_Y); // widget's left position and top position
-        timeLabel->Resize(280, 100);                      // widget's width and height
-        timeLabel->SetViewId("label1");                   // Set style
-        timeLabel->SetStyle(STYLE_TEXT_FONT, TIMELABEL_FONT_SIZE);
-        /* -------------------------------------------------------------------------- */
-        timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
-        timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        timeLabel->SetRollSpeed(0);
-        timeLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TIMELABEL_FONT_SIZE);
-        /* -------------------------------------------------------------------------- */
-        titleLabel = new UILabelExt();
-        if (titleLabel == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new titleLabel fail");
-            return false;
-        }
-        titleLabel->SetPosition(TITLE_X, TITLE_Y); // widget's left position and top position
-        titleLabel->Resize(200, 90);               // widget's width and height
-        titleLabel->SetViewId("label3");           // Set style
-        titleLabel->SetStyle(STYLE_TEXT_FONT, TITLE_FONT_SIZE);
-        // titleLabel->SetText("心率检测结果");
-        titleLabel->SetTextId(STR_HEARTDATA);
-        titleLabel->SetLineBreakMode(UILabelExt::LINE_BREAK_MARQUEE);
-        titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        titleLabel->SetRollSpeed(30);
-        titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);
-
-        UpHeartText();
-        /* -------------------------------------------------------------------------- */
-        return true;
-    }
-    // 创建标签按键
-    UILabelButtonExt *HeartView::CreateAndSetUIButton(const char *title)
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::CreateAndSetUIButton");
-        UILabelButtonExt *btn = new UILabelButtonExt();
-        if (btn == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new UILabelButtonExt fail");
-            return nullptr;
-        }
-        btn->SetPosition(TESTBUTTON_X, TESTBUTTON_Y, BUTTON_WIDHT2, BUTTON_HEIGHT2);
-        btn->SetStyle(STYLE_BACKGROUND_COLOR, 0xffcd492c);
-        // btn->SetText(title);
-        btn->SetTextId(STR_CHECK);
-        // btn->SetTextColor(Color::Red());
-        btn->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_LABEL_SIZE);
-        btn->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
-        btn->SetAlign(TEXT_ALIGNMENT_CENTER);
-        btn->SetViewId("checkbegin");
-        UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance();
-        if (clickLeftListener == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeftListener fail");
-            return nullptr;
-        }
-        btn->SetOnClickListener(clickLeftListener);
-        return btn;
-    }
-    // 初始化背景
-    bool HeartView::InitImageDisplay()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::InitImageDisplay");
-        imageViewMain = new UIImageView();
-        if (imageViewMain == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new UIImageView fail");
-            return false;
-        }
-        imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 :  offset
-        char *image1imagesPath = "/user/res/Blood/beijing.bin";
-        imageViewMain->SetSrc(image1imagesPath);
-        return true;
-    }
-    // 初始化界面
-    bool HeartView::InitHeartView()
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitHeartView");
-        HeartScrollView[HEARTVIEW] = new UIScrollView();
-        if (HeartScrollView[HEARTVIEW] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::HeartScrollView new fail!");
-            return false;
-        }
-        HeartScrollView[HEARTVIEW]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-        HeartScrollView[HEARTVIEW]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        HeartScrollView[HEARTVIEW]->SetScrollBlankSize(35);
-        HeartScrollView[HEARTVIEW]->SetReboundSize(50);
-        HeartScrollView[HEARTVIEW]->SetDirection(1);
-        // 增加拖拽监听
-        UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(new HeartPresenter());
-        if (draglistener == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::draglistener can not be nullptr!");
-            return false;
-        }
-        HeartScrollView[HEARTVIEW]->SetOnDragListener(draglistener);
-        HeartScrollView[HEARTVIEW]->SetTouchable(true);
-        HeartScrollView[HEARTVIEW]->SetDraggable(true);
-        HeartScrollView[HEARTVIEW]->SetVerticalScrollState(false); // 禁止纵向滑动
-        /* -------------------------------------------------------------------------- */
-        if (InitImageDisplay() == false)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitImageDisplay() fail!");
-            return false;
-        }
-        if (InitLabel() == false)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitLabel() fail!");
-            return false;
-        }
-        testButton = CreateAndSetUIButton("检测");
-        if (testButton == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new Button fail");
-            return false;
-        }
-        /* -------------------------------------------------------------------------- */
-        return true;
-    }
-
-    // 1.跳转到心率界面
-    bool HeartView::ChangeHeartView(int16_t thisView)
-    {
-        if (HeartScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::ChangeHeartView");
-            RootView::GetInstance()->Add(HeartScrollView[thisView]);
-        }
-        return true;
-    }
-    // 2.跳转到佩戴界面
-    bool HeartView::ChangeBandoffView(int16_t thisView)
-    {
-        if (HeartScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartOxygenView::ChangeBandoffView");
-            heartbandoff = new HeartBandoffView();
-            if (heartbandoff == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartOxygenView:: new scrollView[%d] fail", thisView);
-                return false;
-            }
-            HeartScrollView[thisView] = heartbandoff->HeartBondoffViewInit();
-            RootView::GetInstance()->Add(HeartScrollView[thisView]);
-        }
-        return true;
-    }
-    // 3.跳转到检测界面
-    bool HeartView::ChangeCheckView(int16_t thisView)
-    {
-        if (HeartScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::ChangeCheckView");
-            heartcheck = new HeartCheckView();
-            if (heartcheck == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: new scrollView[%d] fail", thisView);
-                return false;
-            }
-            HeartScrollView[thisView] = heartcheck->HeartCheckViewInit();
-            RootView::GetInstance()->Add(HeartScrollView[thisView]);
-        }
-        return true;
-    }
-    // 4.跳转到检测失败界面
-    bool HeartView::ChangeResultView(int16_t thisView)
-    {
-        if (HeartScrollView[thisView] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::HeartResultView");
-            heartresult = new HeartResultView();
-            if (heartresult == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: new scrollView[%d] fail", thisView);
-                return false;
-            }
-            HeartScrollView[thisView] = heartresult->HeartResultViewInit();
-            RootView::GetInstance()->Add(HeartScrollView[thisView]);
-        }
-        return true;
-    }
-    UIScrollView *HeartView::GetHeartScrollView(int ViewId)
-    {
-        if (HeartScrollView[ViewId] == nullptr)
-        {
-            return nullptr;
-        }
-        return HeartScrollView[ViewId];
-    }
-    /* -------------------------------------------------------------------------- */
-    // 1.MainStopWatchViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。
-    struct HeartViewMapper
-    {
-        const int16_t viewId;
-        bool (HeartView::*func)(int16_t thisView);
-    };
-
-    // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。
-    static const HeartViewMapper ViewMapper[] = {
-        {HEARTVIEW, &HeartView::ChangeHeartView},
-        {HEARTBANDVIEW, &HeartView::ChangeBandoffView},
-        {HEARTCHECKVIEW, &HeartView::ChangeCheckView},
-        {HEARTRESULT, &HeartView::ChangeResultView},
-    };
-
-    // 3.根据传入的interface参数执行相应视图ID关联的成员函数。
-    bool HeartView::ClickFunc(int16_t interface)
-    {
-        int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[HEARTVIEW]);
-        for (int i = 0; i < funcSize; i++)
-        {
-            if (interface == ViewMapper[i].viewId)
-            {
-                bool jug = (this->*(ViewMapper[i].func))(interface);
-                if (jug == false)
-                {
-                    return false;
-                }
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // 4.切换视图
-    void HeartView::ChangeView(int16_t hideView, int16_t showView)
-    {
-        if (hideView > MAX_HEARTVIEW)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: HeartViewId Overstep ones bounds");
-            return;
-        }
-        HeartScrollView[hideView]->SetVisible(false);
-        ClickFunc(showView);
-        HeartScrollView[showView]->SetVisible(true);
-        Draw();
-    }
-    bool HeartView::SetOnDragListener()
-    {
-        UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::HeartPresenter::GetInstance();
-        if (dragListener == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::OnDragListener fail");
-            return false;
-        }
-        group->SetDraggable(true);
-        group->SetTouchable(true);
-        group->SetOnDragListener(dragListener);
-        return true;
-    }
-
-    /* -------------------------------------------------------------------------- */
-    void HeartView::OnStart()
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::OnStart");
-        display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
-        display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
-        View<HeartPresenter>::OnStart();
-        if (!InitHeartView())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitHeartView fail");
-        }
-        // 增加按键监听
-        RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartPresenter::GetInstance();
-        RootView::GetInstance()->SetOnKeyActListener(keyactListener);
-    }
-
-    void HeartView::OnSetUpView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnSetUpView");
-        View<HeartPresenter>::OnSetUpView();
-        if (HeartScrollView[HEARTVIEW] == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTVIEW:: OnSetUpView  has nullptr");
-            return;
-        }
-
-        HeartScrollView[HEARTVIEW]->Add(imageViewMain);
-        HeartScrollView[HEARTVIEW]->Add(percent);
-        HeartScrollView[HEARTVIEW]->Add(timeLabel);
-        HeartScrollView[HEARTVIEW]->Add(titleLabel);
-        HeartScrollView[HEARTVIEW]->Add(testButton);
-
-        RootView::GetInstance()->Add(HeartScrollView[HEARTVIEW]);
-
-        Draw();
-    }
-
-    void HeartView::OnTearDownView()
-    {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnTearDownView");
-        View<HeartPresenter>::OnTearDownView();
-        return;
-    }
-
-    void HeartView::OnStop()
-    {
-        display_api->set_screen_auto_off_timeout(display_time); // 恢复
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnStop");
-        View<HeartPresenter>::OnStop();
-        RootView::GetInstance()->RemoveAll();
-        return;
-    }
-}