增加BloodSlice测试UI;功能需要驱动
authorCaisking <Casiking@zhihuishixun.com>
Tue, 25 Mar 2025 06:47:59 +0000 (14:47 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Tue, 25 Mar 2025 06:47:59 +0000 (14:47 +0800)
16 files changed:
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodBandoffView.h [deleted file]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodDetectionPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodDetectionView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenPresenter.h [deleted file]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenView.h [deleted file]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodResultPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodResultView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodBandoffView.cpp [deleted file]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodDetectionPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodDetectionView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp [deleted file]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenView.cpp [deleted file]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultView.cpp [new file with mode: 0644]

diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodBandoffView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodBandoffView.h
deleted file mode 100644 (file)
index de10edb..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodBandoff view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#ifndef BLOOD_BANDOFF_VIEW_H\r
-#define BLOOD_BANDOFF_VIEW_H\r
-\r
-#include "components/ui_label.h"\r
-#include "components/ui_view_group.h"\r
-#include "components/ui_image_animator.h"\r
-#include "View.h"\r
-#include "ohos_types.h"\r
-\r
-namespace OHOS {\r
-class BloodBandoffView {\r
-public:\r
-    BloodBandoffView();\r
-    virtual ~BloodBandoffView();\r
-\r
-    UIViewGroup *CreateUIViewGroup();\r
-    static BloodBandoffView *GetInstance(void);\r
-\r
-    UIViewGroup *GetBandoffViewGroup();\r
-    UIImageAnimatorView *GetImageAnimator();\r
-private:\r
-    UILabel *label;\r
-    UIViewGroup *group;\r
-    UIImageView *imageView;\r
-    UIImageAnimatorView *imageAnimator;\r
-};\r
-}\r
-\r
-\r
-#endif  // 血氧跳转界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodDetectionPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodDetectionPresenter.h
new file mode 100644 (file)
index 0000000..2eb9ed4
--- /dev/null
@@ -0,0 +1,57 @@
+/***
+ * @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/bloodoxygen/include/BloodDetectionPresenter.h
+ */
+
+#ifndef BLOOD_DETECTION_PRESENTER_H
+#define BLOOD_DETECTION_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_list.h"
+#include "components/ui_view.h"
+#include "KeyInputListener.h"
+#include "ModelListenerSample.h"
+#include "bloodoxygen/include/BloodDetectionView.h"
+#include "power_display_service.h"
+
+#define BLOOD_KEEP_TIME 60000 // 60s
+
+namespace OHOS
+{
+
+    class BloodDetectionView;
+    class BloodDetectionPresenter : public Presenter<BloodDetectionView>,
+                                    public ModelListenerSample,
+                                    public UIView::OnClickListener,
+                                    public UIView::OnDragListener,
+                                    public RootView::OnKeyActListener,
+                                    public ListScrollListener
+    {
+    public:
+        BloodDetectionPresenter();
+        ~BloodDetectionPresenter() override;
+        static BloodDetectionPresenter *GetInstance(void);
+
+  
+        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 BloodCountEvent{false};
+        bool BloodCheckState{false};
+
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        uint32_t display_time;
+    };
+}
+
+#endif // BLOOD_DETECTION_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodDetectionView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodDetectionView.h
new file mode 100644 (file)
index 0000000..7416fa9
--- /dev/null
@@ -0,0 +1,63 @@
+/***
+ * @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/bloodoxygen/include/BloodDetectionView.cpp
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodDetection view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#ifndef BLOOD_Detection_VIEW_H
+#define BLOOD_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 "bloodoxygen/include/BloodDetectionPresenter.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 BloodDetectionView : public View<BloodDetectionPresenter>
+    {
+    public:
+        BloodDetectionView();
+        ~BloodDetectionView()override;
+       
+        void OnStart() override;
+        static BloodDetectionView *GetInstance(void);
+
+        bool BloodDetectionViewInit();
+        UIImageAnimatorView *GetImageAnimator(void);
+        void UpShowBloodText(void);
+
+    private:
+        UIImageAnimatorView *imageAnimator{nullptr};
+        UILabelExt *titleLabel{nullptr};
+        UILabel *Spo2Text{nullptr};
+        UILabelButtonExt *testButton{nullptr};
+
+        uint32_t spo2_;
+    };
+}
+
+#endif // 血氧主界面
\ No newline at end of file
index 2fd37c8..339f0c0 100644 (file)
@@ -1,31 +1,81 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodOxygen view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#ifndef BLOOD_OXYGEN_MODEL_H\r
-#define BLOOD_OXYGEN_MODEL_H\r
-\r
-#include <cstdio>\r
-#include "gfx_utils/list.h"\r
-\r
-namespace OHOS {\r
-class BloodOxygenModel {\r
-public:\r
-    ~BloodOxygenModel(){};\r
-    static BloodOxygenModel *GetInstance(void);\r
-    bool GetBloodOxygenViewStatus(void);\r
-    bool GetBloodBandoffViewStatus(void);\r
-    void SetBloodOxygenViewStatus(bool oxygenViewStatus);\r
-    void SetBloodBandoffViewStatus(bool bandoffViewStatus);\r
-\r
-private:\r
-    BloodOxygenModel();\r
-    bool OxygenView;\r
-    bool BandoffView;\r
-};\r
-}\r
-\r
-#endif\r
+/*** 
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-05 14:58:21
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
+ */
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 10:38:26
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodOxygenModel.h
+ */
+
+#ifndef BLOOD_OXYGEN_MODEL_H
+#define BLOOD_OXYGEN_MODEL_H
+
+#include <stdint.h>
+#include <string>
+
+namespace OHOS
+{
+    // 血氧检测状态
+    enum class BloodState
+    {
+        End = 0,
+        Start,
+    };
+    enum class BloodResult
+    {
+        NOT_TESTED = 0, // 未检测
+        SUCCESS,        // 检测成功
+        NOT_WORN,       // 未佩戴检测
+        TIMEOUT,        // 检测超时
+        HIGH_RESULT,    // 检测结果过高
+        LOW_RESULT,     // 检测结果过低
+        INVALID_DATA    // 无效数据
+    };
+    class BloodOxygenModel
+    {
+    public:
+        BloodOxygenModel();
+        ~BloodOxygenModel();
+        static BloodOxygenModel *GetInstance();
+
+        void UpSPO2data(uint8_t spo2);
+        uint16_t GetSPO2data();
+        uint16_t GetShowSPO2data();
+
+        uint32_t GetCheckTime();
+        void SetCheckTime(uint32_t time);
+        void SetWearStatus(int32_t wear);
+        void SetResult(BloodResult result);
+        BloodResult GetResult();
+
+        void Blood_Stop(void);
+        void Blood_Start(void);
+        void Blood_Save(void);
+        void Blood_Result(void);
+
+        void Blood_Control(BloodState state);
+        void ClearDisplayData();
+        void CleanAllData();
+
+    private:
+        uint16_t displayspo2;
+        uint16_t currentspo2;
+        uint32_t timestamp_ms;
+        int32_t wear_;
+
+        bool sensorstate{false};
+        bool startspo2{false};
+
+        uint16_t unwear_counter_;                           // 无效佩戴计数器
+        uint16_t valid_counter_;                            // 有效数计数器
+        uint16_t disvalid_counter_;                         // 无效数计数器
+        BloodResult bloodresult_ = BloodResult::NOT_TESTED; // 检测结果
+        bool initstatus;
+    };
+}
+
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenPresenter.h
deleted file mode 100644 (file)
index e363937..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodOxygen view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#ifndef BLOOD_OXYGEN_PRESENTER_H\r
-#define BLOOD_OXYGEN_PRESENTER_H\r
-\r
-#include "Presenter.h"\r
-#include "ModelListenerSample.h"\r
-#include "components/ui_circle_progress.h"\r
-#include "ohos_types.h"\r
-\r
-namespace OHOS {\r
-class BloodOxygenView;\r
-class BloodOxygenPresenter : public Presenter<BloodOxygenView>,\r
-                            public UIView::OnClickListener,\r
-                            public ModelListenerSample,\r
-                            public UIView::OnDragListener {\r
-public:\r
-    BloodOxygenPresenter();\r
-    ~BloodOxygenPresenter() override;\r
-    void OnStart() override;\r
-    void OnStop() override;\r
-    void Notify() override;\r
-    static BloodOxygenPresenter *GetInstance(void);\r
-    bool OnDrag(UIView& view, const DragEvent& event) override;\r
-    bool OnClick(UIView& view, const ClickEvent& event) override;\r
-\r
-private:\r
-    bool CheckPointersValue(void);\r
-    void ReturnInterface(void);\r
-    void ProgressNotify(void);\r
-    int count;\r
-};\r
-}\r
-\r
-#endif\r
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodOxygenView.h
deleted file mode 100644 (file)
index 6ea3826..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodOxygen view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#ifndef BLOOD_OXYGEN_VIEW_H\r
-#define BLOOD_OXYGEN_VIEW_H\r
-\r
-#include "View.h"\r
-#include "wearable_log.h"\r
-#include "UiConfig.h"\r
-#include "components/ui_label.h"\r
-#include "components/ui_button.h"\r
-#include "components/ui_label_button.h"\r
-#include "components/ui_image_animator.h"\r
-#include "components/ui_circle_progress.h"\r
-#include "components/ui_view_group.h"\r
-#include "BloodOxygenPresenter.h"\r
-#include "BloodBandoffView.h"\r
-\r
-namespace OHOS {\r
-class BloodOxygenView : public View<BloodOxygenPresenter> {\r
-public:\r
-    BloodOxygenView();\r
-    ~BloodOxygenView() override;\r
-\r
-    void OnStart() override;\r
-\r
-    static BloodOxygenView *GetInstance(void);\r
-\r
-    UILabel *GetPercent();\r
-    UIViewGroup *GetBloodOxygenGroup();\r
-    UILabelButton *GetTestButton();\r
-    UICircleProgress *GetCircleProgress();\r
-private:\r
-    bool InitImageDisplay();\r
-    bool SetOnDragListener();\r
-    UICircleProgress *CreateAndSetUICircleProgress();\r
-    UILabelButton *CreateAndSetUIButton(const char *title);\r
-    UIView *CreateAndSetUIView(int16 x, int16 y) const;\r
-\r
-    BloodBandoffView *bloodbandoff{nullptr};\r
-    UIImageView *imageViewMain;\r
-    UIImageView *imageViewProgress;\r
-    UIImageAnimatorView *imageAnimator;\r
-\r
-    UILabel *percent;\r
-    UIViewGroup *group;\r
-    UILabelButton *testButton;\r
-    UICircleProgress *circleProgress;\r
-};\r
-}\r
-\r
-\r
-#endif  // 血氧主界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodResultPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodResultPresenter.h
new file mode 100644 (file)
index 0000000..b02ba0b
--- /dev/null
@@ -0,0 +1,41 @@
+
+
+#ifndef BLOOD_RESULT_PRESENTER_H
+#define BLOOD_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 "bloodoxygen/include/BloodResultView.h"
+
+namespace OHOS
+{
+    static constexpr const char *CLICK_BLOOD = "clickblood"; // 血氧检测
+
+    class BloodResultView;
+    class BloodResultPresenter : public Presenter<BloodResultView>,
+                                 public UIView::OnClickListener,
+                                 public RootView::OnKeyActListener,
+                                 public UIView::OnDragListener
+    {
+    public:
+        BloodResultPresenter();
+        virtual ~BloodResultPresenter();
+        static BloodResultPresenter *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);
+    };
+}
+
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodResultView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/include/BloodResultView.h
new file mode 100644 (file)
index 0000000..8fd8993
--- /dev/null
@@ -0,0 +1,67 @@
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-30 11:46:23
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodResultView.h
+ */
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-05-07 18:51:13
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/include/BloodResultView.h
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodResult view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#ifndef BLOOD_Result_VIEW_H
+#define BLOOD_Result_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 "bloodoxygen/include/BloodResultPresenter.h"
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_button_ext.h"
+namespace OHOS
+{
+    class BloodResultPresenter;
+    class BloodResultView : public View<BloodResultPresenter>
+    {
+    public:
+        BloodResultView();
+        virtual ~BloodResultView();
+        static BloodResultView *GetInstance(void);
+
+        void OnStart() override;
+
+        bool BloodResultViewInit();
+        void UpSPO2Text(void);
+
+        void DeInit();
+        bool AddButton();
+        bool InitLable();
+        bool Initbackground();
+
+    private:
+        UIImageView *background = nullptr;
+        UILabelExt *titleLabel = nullptr;
+        UILabelExt *timeLabel = nullptr;
+        UILabel *bloodLabel = nullptr;
+        UILabelButtonExt *checkButton{nullptr};
+    };
+}
+
+#endif // 血氧主界面
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodBandoffView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodBandoffView.cpp
deleted file mode 100644 (file)
index 656cf1b..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodBandoff view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-#include "UiConfig.h"\r
-#include "wearable_log.h"\r
-#include "BloodBandoffView.h"\r
-#include "BloodOxygenModel.h"\r
-\r
-namespace OHOS {\r
-// 动态显示图片设置\r
-static constexpr uint16_t IMAGE_SIZE = 96;\r
-static constexpr uint16_t IMAGE_POSITION_Y = 276;\r
-static constexpr uint16_t IMAGE_POSITION_X = 179;\r
-static constexpr uint16_t IMAGEANIMATOERVIEW_SIZE = 24;\r
-static constexpr uint16_t IMAGEANIMATOERVIEW_SPEED = 40;\r
-\r
-// 标签设置\r
-static constexpr uint16_t LABEL_POSITION_X = 87;\r
-static constexpr uint16_t LABEL_POSITION_Y = 200;\r
-static constexpr uint16_t LABEL_POSITION_WIDTH = 288;\r
-static constexpr uint16_t LABEL_POSITION_HEIGHT = 50;\r
-\r
-// 图片设置\r
-static constexpr uint16_t IMAGE_ENTER_POSITION_X = 131;\r
-static constexpr uint16_t IMAGE_ENTER_POSITION_Y = 70;\r
-\r
-static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;\r
-static constexpr uint16_t FONT_DEFAULT_SIZE = 25;\r
-static constexpr uint16_t VIEW_DISTANCE_TO_LEFT_SIDE = 48;\r
-static constexpr uint16_t TEXT_DISTANCE_TO_LEFT_SIDE = 50;\r
-static constexpr uint16_t TEXT_DISTANCE_TO_TOP_SIDE = 11;\r
-\r
-static ImageAnimatorInfo g_imageAnimatorInfo_Time[IMAGEANIMATOERVIEW_SIZE] = {\r
-    {PNG_COUNTDOWN_TIME_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_COUNTDOWN_TIME_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-};\r
-static BloodBandoffView *g_pMainView = nullptr;\r
-BloodBandoffView::BloodBandoffView()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");\r
-    label = nullptr;\r
-    imageView = nullptr;\r
-    group = nullptr;\r
-    imageAnimator = nullptr;\r
-    g_pMainView = this;\r
-}\r
-\r
-BloodBandoffView::~BloodBandoffView()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::~BloodBandoffView");\r
-    group->RemoveAll();\r
-    delete label;\r
-    delete imageView;\r
-    delete group;\r
-    delete imageAnimator;\r
-    label = nullptr;\r
-    imageView = nullptr;\r
-    group = nullptr;\r
-    imageAnimator = nullptr;\r
-    g_pMainView = nullptr;\r
-}\r
-\r
-BloodBandoffView *BloodBandoffView::GetInstance(void)\r
-{\r
-    return g_pMainView;\r
-}\r
-\r
-UIViewGroup *BloodBandoffView::GetBandoffViewGroup()\r
-{\r
-    return group;\r
-}\r
-\r
-UIImageAnimatorView *BloodBandoffView::GetImageAnimator()\r
-{\r
-    return imageAnimator;\r
-}\r
-\r
-UIViewGroup *BloodBandoffView::CreateUIViewGroup()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::CreateUIViewGroup");\r
-    group = new UIViewGroup();\r
-    if (group == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new group fail");\r
-        return nullptr;\r
-    }\r
-    group->SetPosition(0, 0);\r
-    group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
-\r
-    label = new UILabel();\r
-    if (label == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new Label fail");\r
-        return nullptr;\r
-    }\r
-    group->Add(label);\r
-    label->SetPosition(LABEL_POSITION_X, LABEL_POSITION_Y, LABEL_POSITION_WIDTH, LABEL_POSITION_HEIGHT);\r
-    label->SetText("偏紧佩戴,保持静止");\r
-    label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);\r
-    label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
-\r
-    imageAnimator = new UIImageAnimatorView();\r
-    if (imageAnimator == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail");\r
-        return nullptr;\r
-    }\r
-    imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, IMAGEANIMATOERVIEW_SIZE, IMAGEANIMATOERVIEW_SPEED);\r
-    imageAnimator->Start();\r
-    imageAnimator->SetRepeat(false);\r
-    group->Add(imageAnimator);\r
-\r
-    imageView = new UIImageView();\r
-    if (imageView == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageView fail");\r
-        return nullptr;\r
-    }\r
-    imageView->SetPosition(IMAGE_ENTER_POSITION_X, IMAGE_ENTER_POSITION_Y); // 30 : offset\r
-    imageView->SetSrc(PNG_BLOOD_ICON_ENTER);\r
-    group->Add(imageView);\r
-\r
-    return group;\r
-}\r
-}\r
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodDetectionPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodDetectionPresenter.cpp
new file mode 100644 (file)
index 0000000..09315b5
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: BloodDetectionPresenter.cpp
+ * Author:
+ * Create: 2021-11-23
+ */
+
+#include "bloodoxygen/include/BloodDetectionView.h"
+#include "bloodoxygen/include/BloodDetectionPresenter.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 "bloodoxygen/include/BloodOxygenModel.h"
+#include "MainModel.h"
+#include "NativeRegisterManager.h"
+namespace OHOS
+{
+
+    REGIST_SLICE(VIEW_BLOOD_CHECK, BloodDetectionView, BloodDetectionPresenter);
+  
+    // 当前Presenter属性实例化的内存指针
+    static BloodDetectionPresenter *g_pBloodDetectionPresenter = nullptr;
+
+    BloodDetectionPresenter::BloodDetectionPresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodDetectionPresenter::BloodDetectionPresenter");
+        g_pBloodDetectionPresenter = this;
+
+        // display_api->set_screen_set_keepon_timeout(-1); // 设置常亮
+        ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
+        ResetTickTimer();
+
+        if (!BloodCheckState)
+        {
+            BloodOxygenModel::GetInstance()->Blood_Start();
+            BloodCheckState = true;
+        }
+    }
+
+    BloodDetectionPresenter::~BloodDetectionPresenter()
+    {
+        // display_api->set_screen_set_keepon_timeout(0); // 恢复
+        ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+        g_pBloodDetectionPresenter = nullptr;
+
+        if (BloodCheckState)
+        {
+            BloodOxygenModel::GetInstance()->Blood_Stop();
+            BloodCheckState = false;
+        }
+    }
+    BloodDetectionPresenter *BloodDetectionPresenter::GetInstance()
+    {
+        return g_pBloodDetectionPresenter;
+    }
+    void BloodDetectionPresenter::NavigateBack()
+    {
+        // NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+    }
+   
+    bool BloodDetectionPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodDetectionPresenter::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 true;
+    }
+
+    bool BloodDetectionPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        if (strcmp(view.GetViewId(), STOPCHECK) == 0)
+        {
+            NavigateBack();
+        }
+        return true;
+    }
+
+    void BloodDetectionPresenter::OnTickEvent()
+    {
+        // 更新显示血氧数据
+        // BloodDetectionView::GetInstance()->UpShowBloodText(); 屏蔽动态显示实时数据
+        // uint64_t current_time = osKernelGetTick2ms();
+        // if ((startTime != 0) && (current_time - startTime >= BLOOD_KEEP_TIME))
+        // {
+        //     // 超时处理
+        //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 BLOOD_KEEP_TIME: %lld", current_time - startTime);
+        //     BloodOxygenModel::GetInstance()->SetResult(BloodResult::TIMEOUT);
+        //     BloodOxygenModel::GetInstance()->Blood_Stop();
+        // }
+    }
+    void BloodDetectionPresenter::ResetTickTimer(void)
+    {
+        // startTime = osKernelGetTick2ms();
+    }
+    // 增加按键事件
+    bool BloodDetectionPresenter::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 == 1 && uapi_get_screen_state() == 0)
+        {
+            NavigateBack();
+        }
+        return true;
+    }
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodDetectionView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodDetectionView.cpp
new file mode 100644 (file)
index 0000000..f9a031c
--- /dev/null
@@ -0,0 +1,171 @@
+/***
+ * @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/bloodoxygen/src/BloodDetectionView.cpp
+ */
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "BloodDetectionView.h"
+#include "BloodOxygenModel.h"
+#include "ui_image_animator.h"
+#include "BloodDetectionView.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 = 143;
+    static constexpr uint16_t IMAGE_POSITION_X = 143;
+    static constexpr uint16_t DETECTION_IMAGE_ANIMATORVIEW_SIZE = 30;
+    static constexpr uint16_t DETECTION_IMAGE_ANIMATORVIEW_SPEED = 40;
+
+    static ImageAnimatorInfo g_imageAnimatorInfo_blood[30] = {
+    {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},
+    {PNG_CHECK_TIME_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_24, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_25, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_26, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_27, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_28, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    {PNG_CHECK_TIME_IMAGE_29, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    };
+
+    static BloodDetectionView *g_pBloodCheckView = nullptr;
+    BloodDetectionView::BloodDetectionView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");
+        g_pBloodCheckView = this;
+    }
+    BloodDetectionView::~BloodDetectionView()
+    {
+        if(titleLabel)
+        {
+            delete titleLabel;
+            titleLabel = nullptr;
+        }
+        if(testButton)
+        {
+            delete testButton;
+            testButton = nullptr;
+        }
+        if(imageAnimator)
+        {
+            imageAnimator->Stop();
+            delete imageAnimator;
+            imageAnimator = nullptr;   
+        }
+        if(Spo2Text)
+        {
+            delete Spo2Text;
+            Spo2Text = nullptr;  
+        }
+        g_pBloodCheckView = nullptr;
+    }
+    BloodDetectionView *BloodDetectionView::GetInstance(void)
+    {
+        return g_pBloodCheckView;
+    }
+    UIImageAnimatorView *BloodDetectionView::GetImageAnimator()
+    {
+        return imageAnimator;
+    }
+
+    /*更新显示数据*/
+    void BloodDetectionView::UpShowBloodText()
+    {
+        uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetShowSPO2data();
+        std::string bloodoxygenStr = std::to_string(spo2_);
+        if (Spo2Text != nullptr)
+            Spo2Text->SetText(bloodoxygenStr.c_str());
+    }
+    /*初始化检测界面*/
+    bool BloodDetectionView::BloodDetectionViewInit()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodDetectionViewInit is begin");
+        /*初始化title*/
+        InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_CHECKON, DEFAULT_VECTOR_FONT_FILENAME, 30);
+        AddViewToRootContainer(titleLabel);
+
+        /* -------------------------------------------------------------------------- */
+        imageAnimator = new UIImageAnimatorView();
+        if (imageAnimator == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail");
+            return false;
+        }
+        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_blood, DETECTION_IMAGE_ANIMATORVIEW_SIZE, DETECTION_IMAGE_ANIMATORVIEW_SPEED);
+        imageAnimator->SetRepeat(true);
+        AddViewToRootContainer(imageAnimator);
+
+        /* -------------------------------------------------------------------------- */
+        /*初始化血氧值label*/
+        // InitUILabel(Spo2Text, 83, 83, 300, 300, "bloodtext", "--", GILROY_BOLD_FONT, 140);
+        // AddViewToRootContainer(Spo2Text);
+
+        /* -------------------------------------------------------------------------- */
+        InitButtonExt(testButton, 93, 330, 280, 90, STOPCHECK, STR_CHECKSTOP, 30);
+        AddViewToRootContainer(testButton);
+
+        /* -------------------------------------------------------------------------- */
+        UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::BloodDetectionPresenter::GetInstance();
+        if (clickLeftListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodDetectionView::new clickLeftListener fail");
+            return false;
+        }
+        testButton->SetOnClickListener(clickLeftListener);
+        /* -------------------------------------------------------------------------- */
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodDetectionViewInit is ok");
+        return true;
+    }
+    void BloodDetectionView::OnStart()
+    {
+        // SetContainerView(new UIViewGroup());
+        // container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+
+        if (!BloodDetectionViewInit())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodDetectionView::InitBloodView fail");
+        }
+
+
+        if (imageAnimator != nullptr)
+        {
+            imageAnimator->Start();
+        }
+
+        GetRootContainer()->SetDraggable(true);
+        GetRootContainer()->SetTouchable(true);
+        GetRootContainer()->SetOnDragListener(presenter_);
+
+        // 增加按键监听
+        // presenter_->SetOnKeyActListener(keyactListener);
+
+    }
+
+}
index c6f083a..406b849 100644 (file)
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodOxygen view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#include "BloodOxygenModel.h"\r
-\r
-namespace OHOS {\r
-BloodOxygenModel::BloodOxygenModel()\r
-{\r
-    OxygenView = false;\r
-    BandoffView = false;\r
-}\r
-\r
-bool BloodOxygenModel::GetBloodOxygenViewStatus(void)\r
-{\r
-    return OxygenView;\r
-}\r
-\r
-bool BloodOxygenModel::GetBloodBandoffViewStatus(void)\r
-{\r
-    return BandoffView;\r
-}\r
-\r
-void BloodOxygenModel::SetBloodBandoffViewStatus(bool bandoffViewStatus)\r
-{\r
-    BandoffView = bandoffViewStatus;\r
-}\r
-\r
-void BloodOxygenModel::SetBloodOxygenViewStatus(bool oxygenViewStatus)\r
-{\r
-    OxygenView = oxygenViewStatus;\r
-}\r
-\r
-BloodOxygenModel *BloodOxygenModel::GetInstance(void)\r
-{\r
-    static BloodOxygenModel instance;\r
-    return &instance;\r
-}\r
-}
\ No newline at end of file
+#include "bloodoxygen/include/BloodOxygenModel.h"
+#include "bloodoxygen/include/BloodResultPresenter.h"
+
+// #include "DialModelSPO2.h"
+#include "wearable_log.h"
+// #include "heart_blood/health_service/health_service.h"
+#include "custom_utils.h"
+
+extern "C" errcode_t uapi_get_timestamp_ms(uint32_t *tm);
+
+#include "custom_utils.h"
+// #include "ppg_service.h"
+#include "ConfigModel.h"
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+// #include "battery_hal.h"
+// #include "heart_blood/BloodCardView.h"
+#include "MainViewSample.h"
+
+#include <custom_save_runtime.h>
+
+#define MAX_UNWARE_COUNT 10
+#define MAX_VALID_SPO2_COUNT 30
+#define MAX_DISVALID_SPO2_COUNT 100
+namespace OHOS
+{
+    /**
+     * @brief Constructor for the BloodOxygenModel class.
+     */
+    BloodOxygenModel::BloodOxygenModel()
+    {
+        // BloodOxygenData *data = HealthService::GetInstance()->ReadBloodOxygenData();
+        // if (data)
+        // {
+        //     currentspo2 = data->SPO2;
+        //     timestamp_ms = data->timestamp;
+        //     // 更新表盘血氧数据
+        //     DialModelSPO2::GetInstance()->UpdateSPO2(currentspo2);
+        //     delete data;
+        // }
+        // else
+        // {
+            currentspo2 = 0;
+            timestamp_ms = 0;
+        // }
+    }
+    BloodOxygenModel::~BloodOxygenModel() {}
+    BloodOxygenModel *BloodOxygenModel::GetInstance(void)
+    {
+        static BloodOxygenModel instance;
+        return &instance;
+    }
+    /* ---------------------------------- 状态检测 ---------------------------------- */
+
+    void BloodOxygenModel::ClearDisplayData()
+    {
+      // currentspo2 = 0;
+      // timestamp_ms = 0;
+      // 不需要清空
+    }
+
+    // 血氧监控
+    void BloodOxygenModel::Blood_Control(BloodState state)
+    {
+        if (state == BloodState::End && startspo2 == true)
+        {
+            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startspo2 End");
+            // uint16_t md = PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST;
+            // send_ppg_cmd_msg(md);
+            // startspo2 = false;
+
+            // uapi_save_runtime_log(RUNTIME_LOG_OXYGEN_MEASURE_END);
+        }
+        else if (state == BloodState::Start && startspo2 == false)
+        {
+            /*充电状态下不进行检测*/
+            // bool isCharging = get_charge_stat(); // 获取充电状态
+            // if (isCharging)
+            // {
+            //     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测");
+            //     return;
+            // }
+            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startspo2 Start");
+            // uint16_t md = PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST;
+            // send_ppg_cmd_msg(md);
+            // startspo2 = true;
+
+            // uapi_save_runtime_log(RUNTIME_LOG_OXYGEN_MEASURE);
+        }
+    }
+
+    uint16_t BloodOxygenModel::GetSPO2data()
+    {
+        return currentspo2;
+    }
+
+    uint16_t BloodOxygenModel::GetShowSPO2data()
+    {
+        return displayspo2;
+    }
+
+    uint32_t BloodOxygenModel::GetCheckTime()
+    {
+        return timestamp_ms;
+    }
+
+    void BloodOxygenModel::SetCheckTime(uint32_t time)
+    {
+        timestamp_ms = time;
+    }
+    void BloodOxygenModel::SetResult(BloodResult result)
+    {
+        bloodresult_ = result;
+    }
+    BloodResult BloodOxygenModel::GetResult()
+    {
+        return bloodresult_;
+    }
+
+    // 开始检测
+    void BloodOxygenModel::Blood_Start()
+    {
+        displayspo2 = 0;
+        SetResult(BloodResult::NOT_TESTED); // 成功检测
+        // 进行初始化操作
+        if (!sensorstate)
+        {
+            Blood_Control(BloodState::Start);
+            sensorstate = true;
+        }
+    }
+
+    // 结束检测
+    void BloodOxygenModel::Blood_Stop()
+    {
+        valid_counter_ = 0;
+        disvalid_counter_ = 0;
+        unwear_counter_ = 0;
+
+        if (sensorstate)
+        {
+            Blood_Control(BloodState::End);
+            sensorstate = false;
+            Blood_Result(); // 处理结果
+        }
+    }
+
+    // 保存检测数据
+    void BloodOxygenModel::Blood_Save()
+    {
+        uint32_t timestamp = BloodResultPresenter::GetInstance()->GetCurrentTime();
+        SetCheckTime(timestamp);
+#if MSG_SAVE_TEST
+        BloodOxygenData data;
+        data.SPO2 = currentspo2;
+        data.timestamp = timestamp_ms;
+        HealthService::GetInstance()->UpdateHealthData(data);
+#else
+        // HealthService::GetInstance()->send_blood_save();
+#endif
+    }
+
+    // 显示检测结果// 显示检测结果
+    void BloodOxygenModel::Blood_Result()
+    {
+#if 0
+        uint16_t MiniBlood = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE);
+
+        // 检查当前血氧值并设置结果 需要检测成功
+        if(bloodresult_ == BloodResult::SUCCESS){
+            if (currentspo2 < MiniBlood && currentspo2 != 0)
+            {
+                // 测量结果小于最小血氧值
+                bloodresult_ = BloodResult::LOW_RESULT;
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentspo2 = %d, MiniBlood = %d", currentspo2, MiniBlood);
+            }
+        }
+
+        // 根据结果进行处理
+        switch (bloodresult_)
+        {
+        case BloodResult::SUCCESS:
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");
+            Blood_Save();
+            NativeAbility::GetInstance().Back(); // 成功
+            break;
+        }
+        case BloodResult::NOT_WORN: // 未佩戴状态
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴状态");
+            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);
+            break;
+        }
+        case BloodResult::TIMEOUT: // 超时情况
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时情况");
+            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);
+            break;
+        }
+        case BloodResult::LOW_RESULT: // 低结果情况
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");
+            HealthState healthState;
+            healthState.checkType = BLOOD_CHECK;
+            healthState.resultStatus = LOW;
+            healthState.checkResult = MiniBlood;
+            // HealthService::GetInstance()->SetHealthCurrent(healthState);
+            //保存异常数据
+            Blood_Save();
+            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);
+            break;
+        }
+        case BloodResult::INVALID_DATA: // 无效数据情况
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数据情况");
+            NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);
+            break;
+        }
+        default:
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");
+            break;
+        }
+        }
+    #endif
+    }
+    // 更新佩戴状态
+    void BloodOxygenModel::SetWearStatus(int32_t wear)
+    {
+        // 设置佩戴状态
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenModel Weartest::%d", wear);
+        //开启检测才对佩戴进行监听
+        if (sensorstate)
+        {
+            // 计数更新
+            if (wear_ != 1 && wear != 1)
+            {
+                unwear_counter_++; // 佩戴错误计时器计数
+            }
+            else
+            {
+                unwear_counter_ = 0; // 佩戴正常情况下清零计数器
+            }
+            wear_ = wear;
+            // 检查是否达到了最大未佩戴计数限制
+            if (unwear_counter_ >= MAX_UNWARE_COUNT)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_);
+                SetResult(BloodResult::NOT_WORN);
+                Blood_Stop();
+            }
+        }
+    }
+
+    // 更新SPO2数据
+    void BloodOxygenModel::UpSPO2data(uint8_t spo2)
+    {
+        displayspo2 = spo2;
+
+        // 处理有效与无效计数
+        if (displayspo2 != 0)
+        {
+            currentspo2 = displayspo2; // 更新 currentspo2
+            valid_counter_++;          // 增加有效计数器
+            disvalid_counter_ = 0;     // 清空无效计数器
+        }
+        else
+        {
+            disvalid_counter_++; // 增加无效计数器
+            valid_counter_ = 0;  // 清零有效计数器
+        }
+
+        // 检查无效计数器是否达标
+        if (disvalid_counter_ >= MAX_DISVALID_SPO2_COUNT)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);
+            SetResult(BloodResult::INVALID_DATA); // 无效数达标
+            Blood_Stop();
+        }
+
+        // 检查有效计数器是否达标
+        if (valid_counter_ >= MAX_VALID_SPO2_COUNT)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentspo2: %d", valid_counter_, currentspo2);
+            SetResult(BloodResult::SUCCESS); // 成功检测
+            Blood_Stop();
+        }
+    }
+
+    // 更新血氧数据
+    void BloodOxygenModel::CleanAllData(void)
+    {
+        // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Nextday!");
+        // if (MainViewSample::GetInstance() != nullptr && BloodCardView::GetInstance() != nullptr)
+        // {
+        //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面血氧卡片");
+        //     BloodCardView::GetInstance()->UpSPO2Text();
+        // }
+        // if (BloodResultView::GetInstance() != nullptr)
+        // {
+        //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量血氧卡片");
+        //     BloodResultView::GetInstance()->UpSPO2Text();
+        // }
+    }
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp
deleted file mode 100644 (file)
index c7bcfe3..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodOxygen view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#include "BloodOxygenPresenter.h"\r
-#include "common/task_manager.h"\r
-#include "BloodOxygenView.h"\r
-#include "BloodOxygenModel.h"\r
-#include "components/ui_label.h"\r
-#include "BloodBandoffView.h"\r
-#include "ChangeSliceListener.h"\r
-#include "ui_service.h"\r
-#include "NativeRegisterManager.h"\r
-\r
-namespace OHOS {\r
-\r
-REGIST_MENU(VIEW_BLOODOXY_SAMPLE, BloodOxygenView, BloodOxygenPresenter, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧饱和度");\r
-\r
-static BloodOxygenPresenter *g_pMainView = nullptr;\r
-static constexpr uint16_t PROGRESS_VALUE_MIN = 0;\r
-static constexpr uint16_t PROGRESS_VALUE_MAX = 100;\r
-\r
-BloodOxygenPresenter::BloodOxygenPresenter()\r
-{\r
-    count = PROGRESS_VALUE_MAX;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::new BloodOxygenPresenter");\r
-    g_pMainView = this;\r
-}\r
-\r
-BloodOxygenPresenter::~BloodOxygenPresenter()\r
-{\r
-    g_pMainView = nullptr;\r
-}\r
-\r
-BloodOxygenPresenter* BloodOxygenPresenter::GetInstance()\r
-{\r
-    return g_pMainView;\r
-}\r
-\r
-void BloodOxygenPresenter::OnStart()\r
-{\r
-    SendMsgToUIService(UI_ADD_SLEEP_VETO, 0, nullptr, 0);\r
-}\r
-\r
-void BloodOxygenPresenter::OnStop()\r
-{\r
-    SendMsgToUIService(UI_RM_SLEEP_VETO, 0, nullptr, 0);\r
-}\r
-\r
-bool BloodOxygenPresenter::CheckPointersValue()\r
-{\r
-    if (BloodOxygenView::GetInstance() == nullptr) {\r
-        return false;\r
-    }\r
-\r
-    if (BloodBandoffView::GetInstance() == nullptr) {\r
-        return false;\r
-    }\r
-\r
-    if (BloodOxygenModel::GetInstance() == nullptr) {\r
-        return false;\r
-    }\r
-    return true;\r
-}\r
-\r
-\r
-bool BloodOxygenPresenter::OnDrag(UIView& view, const DragEvent& event)\r
-{\r
-    UNUSED(view);\r
-    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {\r
-        BloodOxygenModel::GetInstance()->SetBloodOxygenViewStatus(false);\r
-        BloodOxygenView::GetInstance()->GetTestButton()->SetTouchable(true);\r
-        NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
-    }\r
-    return false;\r
-}\r
-\r
-\r
-bool BloodOxygenPresenter::OnClick(UIView& view, const ClickEvent& event)\r
-{\r
-    UNUSED(view);\r
-    UNUSED(event);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::OnClick");\r
-    if (!CheckPointersValue()) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::Pointers is empty");\r
-        return false;\r
-    }\r
-    BloodOxygenView::GetInstance()->GetPercent()->SetText("");\r
-    BloodOxygenView::GetInstance()->GetBloodOxygenGroup()->SetVisible(false);\r
-    BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(true);\r
-    BloodBandoffView::GetInstance()->GetImageAnimator()->Stop();\r
-    BloodBandoffView::GetInstance()->GetImageAnimator()->SetRepeat(false);\r
-    BloodBandoffView::GetInstance()->GetImageAnimator()->Start();\r
-    BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(true);\r
-    BloodOxygenView::GetInstance()->GetTestButton()->SetTouchable(false);\r
-    return true;\r
-}\r
-\r
-void BloodOxygenPresenter::ProgressNotify(void)\r
-{\r
-    if (!CheckPointersValue()) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenPresenter::Pointers is empty");\r
-        return;\r
-    }\r
-\r
-    if (BloodOxygenModel::GetInstance()->GetBloodOxygenViewStatus()) {\r
-        count--;\r
-        BloodOxygenView::GetInstance()->GetCircleProgress()->SetValue(count);\r
-        if (count == PROGRESS_VALUE_MIN) {\r
-            BloodOxygenView::GetInstance()->GetPercent()->SetText("98%");\r
-            BloodOxygenModel::GetInstance()->SetBloodOxygenViewStatus(false);\r
-            count = PROGRESS_VALUE_MAX;\r
-            BloodOxygenView::GetInstance()->GetCircleProgress()->SetValue(count);\r
-            BloodOxygenView::GetInstance()->GetTestButton()->SetTouchable(true);\r
-        }\r
-    }\r
-}\r
-\r
-void BloodOxygenPresenter::ReturnInterface()\r
-{\r
-    if (BloodOxygenModel::GetInstance()->GetBloodBandoffViewStatus()) {\r
-        if (!BloodBandoffView::GetInstance()->GetImageAnimator()->GetState()) {\r
-            BloodOxygenModel::GetInstance()->SetBloodBandoffViewStatus(false);\r
-            BloodOxygenModel::GetInstance()->SetBloodOxygenViewStatus(true);\r
-\r
-            BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(false);\r
-            BloodOxygenView::GetInstance()->GetBloodOxygenGroup()->SetVisible(true);\r
-        }\r
-    }\r
-}\r
-\r
-void BloodOxygenPresenter::Notify(void)\r
-{\r
-    ProgressNotify();\r
-    ReturnInterface();\r
-}\r
-}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenView.cpp
deleted file mode 100644 (file)
index d6ee39a..0000000
+++ /dev/null
@@ -1,368 +0,0 @@
-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
- * Description: bloodOxygen view\r
- * Author:\r
- * Create: 2021-08-01\r
- */\r
-\r
-#include "BloodOxygenView.h"\r
-#include "BloodOxygenModel.h"\r
-\r
-namespace OHOS {\r
-// 按钮设置\r
-static constexpr uint16_t TESTBUTTON_ZERO = 0;\r
-static constexpr uint16_t TESTBUTTON_X = 167;\r
-static constexpr uint16_t TESTBUTTON_Y = 360;\r
-\r
-// 进度条参数设置\r
-static constexpr uint16_t CIRCLE_PROGRESS_VALUE = 100;\r
-static constexpr uint16_t CIRCLE_PROGRESS_RADIUS = 43;\r
-static constexpr uint16_t CIRCLE_PROGRESS_STARTANGLE = 360;\r
-static constexpr uint16_t CIRCLE_PROGRESS_ENDANGLE = 0;\r
-static constexpr uint16_t CIRCLE_PROGRESS_WIDTH = 10;\r
-static constexpr uint16_t CIRCLE_PROGRESS_POSITION_X = 10;\r
-static constexpr uint16_t CIRCLE_PROGRESS_POSITION_Y = 10;\r
-static constexpr uint16_t CIRCLE_PROGRESS_CENTER_X = 195;\r
-static constexpr uint16_t CIRCLE_PROGRESS_CENTER_Y = 37;\r
-static constexpr uint16_t CIRCLE_PROGRESS_POSITION_WIDTH = 275;\r
-static constexpr uint16_t CIRCLE_PROGRESS_POSITION_HEIGHT = 130;\r
-static constexpr uint16_t CIRCLE_PROGRESS_LEFT = 10;\r
-static constexpr uint16_t CIRCLE_PROGRESS_TOP = 5;\r
-\r
-// 动态刷新设置\r
-static constexpr uint16_t IMAGE_SIZE = 60;\r
-static constexpr uint16_t IMAGE_POSITION_X = 186;\r
-static constexpr uint16_t IMAGE_POSITION_Y = 23;\r
-static constexpr uint16_t IMAGEANIMATORVIEW_SIZE = 31;\r
-static constexpr uint16_t IMAGEANIMATORVIEW_SPEED = 40;\r
-\r
-// 血氧主图设置\r
-static constexpr uint16_t IMAGE_PROGRESS_POSITION_X = 176;\r
-static constexpr uint16_t IMAGE_PROGRESS_POSITION_Y = 13;\r
-\r
-// 血氧%显示\r
-static constexpr uint16_t LABEL_PERCENT_POSITION_X = 258;\r
-static constexpr uint16_t LABEL_PERCENT_POSITION_Y = 40;\r
-\r
-// 血氧柱状图\r
-static constexpr int16 VIEW_MAX_X = 415;\r
-static constexpr int16 VIEW_MIN_X = 35;\r
-static constexpr int16 VIEW_MAX_Y = 150;\r
-static constexpr int16 VIEW_MIN_Y = 0;\r
-static constexpr int16 VIEW_WIDTH = 7;\r
-static constexpr int16 VIEW_HEIGHT = 300;\r
-static constexpr uint16_t VIEW_BACKGROUND_OPA = 127;\r
-static constexpr uint16_t VIEW_BORDER_RADIUS = 5;\r
-static constexpr uint16_t BORDER_OPA = 127;\r
-static constexpr uint16_t BORDER_WIDTH = 20;\r
-\r
-static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;\r
-static constexpr uint16_t FONT_DEFAULT_SIZE = 20;\r
-static constexpr uint16_t VIEW_DISTANCE_TO_LEFT_SIDE = 48;\r
-static constexpr uint16_t TEXT_DISTANCE_TO_LEFT_SIDE = 50;\r
-static constexpr uint16_t TEXT_DISTANCE_TO_TOP_SIDE = 11;\r
-static constexpr uint16_t BUTTON_LABEL_SIZE = 40;\r
-static constexpr uint8_t BUTTON_STYLE_BORDER_RADIUS_VALUE = 20;\r
-static constexpr uint32 BUTTON_STYLE_BACKGROUND_COLOR_VALUE = 0xFFFFFF;\r
-static constexpr uint16_t BUTTON_WIDHT2 = 120;\r
-static constexpr uint16_t BUTTON_HEIGHT2 = 60;\r
-\r
-// 字体大小\r
-static constexpr uint16_t PERCENT_FONT_SIZE = 25;\r
-\r
-static constexpr uint16_t MATH_ZERO = 0;\r
-\r
-static BloodOxygenView *g_pMainView = nullptr;\r
-static ImageAnimatorInfo g_imageAnimatorInfo_new[31] = {\r
-    {PNG_BLOOD_FLOW_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_24, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_25, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_26, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_27, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_28, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_29, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-    {PNG_BLOOD_FLOW_IMAGE_30, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},\r
-};\r
-\r
-BloodOxygenView::BloodOxygenView()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::BloodOxygenView");\r
-    imageViewMain = nullptr;\r
-    imageViewProgress = nullptr;\r
-    group = nullptr;\r
-    percent = nullptr;\r
-    testButton = nullptr;\r
-    circleProgress = nullptr;\r
-    imageAnimator = nullptr;\r
-    g_pMainView = this;\r
-    bloodbandoff = new BloodBandoffView();\r
-    if (bloodbandoff == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new BloodBandoffView fail");\r
-    }\r
-}\r
-\r
-BloodOxygenView::~BloodOxygenView()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::~BloodOxygenView");\r
-    group->RemoveAll();\r
-    delete imageViewMain;\r
-    delete imageViewProgress;\r
-    delete group;\r
-    delete testButton;\r
-    delete percent;\r
-    delete circleProgress;\r
-    delete imageAnimator;\r
-    delete bloodbandoff;\r
-    imageViewMain = nullptr;\r
-    imageViewProgress = nullptr;\r
-    group = nullptr;\r
-    percent = nullptr;\r
-    testButton = nullptr;\r
-    circleProgress = nullptr;\r
-    imageAnimator = nullptr;\r
-    g_pMainView = nullptr;\r
-    bloodbandoff = nullptr;\r
-}\r
-\r
-BloodOxygenView *BloodOxygenView::GetInstance(void)\r
-{\r
-    return g_pMainView;\r
-}\r
-\r
-UILabel *BloodOxygenView::GetPercent()\r
-{\r
-    return percent;\r
-}\r
-\r
-UIViewGroup *BloodOxygenView::GetBloodOxygenGroup()\r
-{\r
-    return group;\r
-}\r
-\r
-UILabelButton *BloodOxygenView::GetTestButton()\r
-{\r
-    return testButton;\r
-}\r
-\r
-UICircleProgress *BloodOxygenView::GetCircleProgress()\r
-{\r
-    return circleProgress;\r
-}\r
-\r
-UILabelButton *BloodOxygenView::CreateAndSetUIButton(const char *title)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUIButton");\r
-    UILabelButton* btn = new UILabelButton();\r
-    if (btn == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UILabelButton fail");\r
-        return nullptr;\r
-    }\r
-    btn->SetPosition(TESTBUTTON_X, TESTBUTTON_Y, BUTTON_WIDHT2, BUTTON_HEIGHT2);\r
-    btn->SetText(title);\r
-    btn->SetTextColor(Color::Red());\r
-    btn->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_LABEL_SIZE);\r
-    btn->SetAlign(TEXT_ALIGNMENT_CENTER);\r
-    btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::RELEASED);\r
-    btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::PRESSED);\r
-    btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::INACTIVE);\r
-    btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);\r
-    btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);\r
-    btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);\r
-    UIView::OnClickListener* clickLeftListener = (UIView::OnClickListener*)OHOS::BloodOxygenPresenter::GetInstance();\r
-    if (clickLeftListener == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new clickLeftListener fail");\r
-        return nullptr;\r
-    }\r
-    btn->SetOnClickListener(clickLeftListener);\r
-    return btn;\r
-}\r
-\r
-\r
-bool BloodOxygenView::SetOnDragListener()\r
-{\r
-    UIView::OnDragListener *dragListener = (UIView::OnDragListener*)OHOS::BloodOxygenPresenter::GetInstance();\r
-    if (dragListener == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnDragListener fail");\r
-        return false;\r
-    }\r
-    group->SetDraggable(true);\r
-    group->SetTouchable(true);\r
-    group->SetOnDragListener(dragListener);\r
-    return true;\r
-}\r
-\r
-UIView *BloodOxygenView::CreateAndSetUIView(int16 x, int16 y) const\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUIView");\r
-    UIView* view = new UIView();\r
-    if (view ==  nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new View fail");\r
-        return nullptr;\r
-    }\r
-    if (x > VIEW_MAX_X || x < VIEW_MIN_X) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::X error");\r
-        return nullptr;\r
-    }\r
-    if (y < VIEW_MIN_Y || y >VIEW_MAX_Y) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::Y error");\r
-        return nullptr;\r
-    }\r
-    view->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);\r
-    view->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BACKGROUND_OPA); // 127 : background opacity\r
-    view->SetStyle(STYLE_BORDER_RADIUS, VIEW_BORDER_RADIUS); // 5 : radius value\r
-    view->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);\r
-    view->SetStyle(STYLE_BORDER_OPA, BORDER_OPA); // 127 : border opacity\r
-    view->SetStyle(STYLE_BORDER_WIDTH, BORDER_WIDTH); // 20 : border width\r
-    view->SetStyle(STYLE_PADDING_LEFT, MATH_ZERO);\r
-    view->SetStyle(STYLE_PADDING_RIGHT, MATH_ZERO);\r
-    view->SetStyle(STYLE_PADDING_TOP, MATH_ZERO);\r
-    view->SetStyle(STYLE_PADDING_BOTTOM, MATH_ZERO);\r
-    view->SetStyle(STYLE_MARGIN_LEFT, MATH_ZERO);\r
-    view->SetStyle(STYLE_MARGIN_RIGHT, MATH_ZERO);\r
-    view->SetStyle(STYLE_MARGIN_TOP, MATH_ZERO);\r
-    view->SetStyle(STYLE_MARGIN_BOTTOM, MATH_ZERO);\r
-\r
-    view->SetPosition(x, VIEW_HEIGHT - y);\r
-    view->SetStyle(STYLE_BORDER_WIDTH, MATH_ZERO);\r
-    view->SetStyle(STYLE_BORDER_RADIUS, MATH_ZERO); // 2 : half width 10 : offset\r
-    view->Resize(VIEW_WIDTH, y);\r
-    return view;\r
-}\r
-\r
-UICircleProgress *BloodOxygenView::CreateAndSetUICircleProgress()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUICircleProgress");\r
-    UICircleProgress *circle = new UICircleProgress();\r
-    circle->SetPosition(CIRCLE_PROGRESS_POSITION_X, CIRCLE_PROGRESS_POSITION_Y,\r
-                        CIRCLE_PROGRESS_POSITION_WIDTH, CIRCLE_PROGRESS_POSITION_HEIGHT);\r
-    circle->SetCenterPosition(CIRCLE_PROGRESS_CENTER_X, CIRCLE_PROGRESS_CENTER_Y);\r
-    circle->SetRadius(CIRCLE_PROGRESS_RADIUS);\r
-    circle->SetValue(CIRCLE_PROGRESS_VALUE);\r
-    circle->SetBackgroundStyle(STYLE_LINE_WIDTH,\r
-                               circle->GetBackgroundStyle(STYLE_LINE_WIDTH) + CIRCLE_PROGRESS_WIDTH);\r
-    circle->SetForegroundStyle(STYLE_LINE_WIDTH,\r
-                               circle->GetForegroundStyle(STYLE_LINE_WIDTH) + CIRCLE_PROGRESS_WIDTH);\r
-    circle->SetStyle(STYLE_PADDING_LEFT, CIRCLE_PROGRESS_LEFT);\r
-    circle->SetStyle(STYLE_PADDING_TOP, CIRCLE_PROGRESS_TOP);\r
-    circle->SetStartAngle(CIRCLE_PROGRESS_STARTANGLE);\r
-    circle->SetEndAngle(CIRCLE_PROGRESS_ENDANGLE);\r
-    circle->SetImage(nullptr, PNG_PROGRESS_BAR_TMAGE);\r
-    circle->SetLineColor(Color::Black());\r
-\r
-    return circle;\r
-}\r
-\r
-bool BloodOxygenView::InitImageDisplay()\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitImageDisplay");\r
-    imageViewMain = new UIImageView();\r
-    if (imageViewMain == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");\r
-        return false;\r
-    }\r
-    imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 :  offset\r
-    imageViewMain->SetSrc(PNG_BLOODOXYGEN_IMAGE_PATH);\r
-    group->Add(imageViewMain);\r
-\r
-    imageAnimator = new UIImageAnimatorView();\r
-    if (imageAnimator == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageAnimatorView fail");\r
-        return false;\r
-    }\r
-    imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_new, IMAGEANIMATORVIEW_SIZE, IMAGEANIMATORVIEW_SPEED);\r
-    imageAnimator->Start();\r
-    imageAnimator->SetRepeat(true);\r
-    group->Add(imageAnimator);\r
-\r
-    imageViewProgress = new UIImageView();\r
-    if (imageViewProgress == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");\r
-        return false;\r
-    }\r
-    imageViewProgress->SetPosition(IMAGE_PROGRESS_POSITION_X, IMAGE_PROGRESS_POSITION_Y); // 30 :  offset\r
-    imageViewProgress->SetSrc(PNG_PROGRESS_BAR_TMAGE);\r
-    group->Add(imageViewProgress);\r
-\r
-    return true;\r
-}\r
-\r
-void BloodOxygenView::OnStart()\r
-{\r
-    group = new UIViewGroup();\r
-    if (group == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new group fail");\r
-        return;\r
-    }\r
-    group->SetPosition(MATH_ZERO, MATH_ZERO);\r
-    group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);\r
-\r
-    if (!InitImageDisplay()) {\r
-        return;\r
-    }\r
-\r
-    if (!SetOnDragListener()) {\r
-        return;\r
-    }\r
-\r
-    circleProgress = CreateAndSetUICircleProgress();\r
-    if (circleProgress == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new circleProgress fail");\r
-        return;\r
-    }\r
-    group->Add(circleProgress);\r
-\r
-    percent = new UILabel();\r
-    if (percent == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Label fail");\r
-        return;\r
-    }\r
-    percent->SetPosition(LABEL_PERCENT_POSITION_X, LABEL_PERCENT_POSITION_Y,\r
-                         VIEW_DISTANCE_TO_LEFT_SIDE, TITLE_LABEL_DEFAULT_HEIGHT);\r
-    percent->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);\r
-    percent->SetText("%97");\r
-    percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE);\r
-    percent->SetTextColor(Color::Red());\r
-    group->Add(percent);\r
-\r
-    testButton = CreateAndSetUIButton("测试");\r
-    if (testButton == nullptr) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Button fail");\r
-        return;\r
-    }\r
-    group->Add(testButton);\r
-\r
-    if (OHOS::BloodOxygenModel::GetInstance()->GetBloodOxygenViewStatus()) {\r
-        testButton->SetTouchable(false);\r
-        percent->SetText("");\r
-    }\r
-\r
-    BloodBandoffView::GetInstance()->CreateUIViewGroup();\r
-\r
-    AddViewToRootContainer(group);\r
-    AddViewToRootContainer(BloodBandoffView::GetInstance()->GetBandoffViewGroup());\r
-    BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(false);\r
-}\r
-}\r
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultPresenter.cpp
new file mode 100644 (file)
index 0000000..4970572
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodOxygen view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#include "bloodoxygen/include/BloodResultPresenter.h"
+#include "common/task_manager.h"
+#include "BloodOxygenModel.h"
+
+#include "bloodoxygen/include/BloodDetectionView.h"
+#include "bloodoxygen/include/BloodResultView.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"
+#include "gfx_utils/mem_check.h"
+#include "NativeRegisterManager.h"
+
+#define BLOODKEYABLE 1
+namespace OHOS
+{
+    static constexpr uint16_t PROGRESS_VALUE_MIN = 0;
+    static constexpr uint16_t PROGRESS_VALUE_MAX = 10;
+
+    static BloodResultPresenter *g_pBloodResultPresenter;
+
+    REGIST_MENU(VIEW_BLOOD_RESULT, BloodResultView, BloodResultPresenter, PNG_APPLIST_SPO2_IMAGE, PNG_APPLIST_DEFAULT_IMG, "血氧饱和度");
+
+    /* -------------------------------------------------------------------------- */
+    // 获取当前的时间戳
+    uint32_t BloodResultPresenter::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 BloodResultPresenter::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;
+    }
+    /* -------------------------------------------------------------------------- */
+    BloodResultPresenter::BloodResultPresenter()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodResultPresenter::new BloodResultPresenter");
+        g_pBloodResultPresenter = this;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+    }
+    BloodResultPresenter::~BloodResultPresenter()
+    {
+        g_pBloodResultPresenter = nullptr;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+    }
+    BloodResultPresenter *BloodResultPresenter::GetInstance()
+    {
+        return g_pBloodResultPresenter;
+    }
+
+    bool BloodResultPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        return true;
+    }
+    bool BloodResultPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
+        {
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            // NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            return true;
+        }
+        return false;
+    }
+    bool BloodResultPresenter::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 == 1 && uapi_get_screen_state() == 0)
+        {
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            // NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        return true;
+    }
+
+    bool BloodResultPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        if (strcmp(view.GetViewId(), CLICK_BLOOD) == 0)
+        {
+            // // 如果正在充电进入提醒界面
+            // if (get_charge_stat())
+            // {
+            //     HealthState highHealthState;
+            //     highHealthState.checkType = CHARGE;
+            //     HealthService::GetInstance()->SetHealthCurrent(highHealthState);
+            //     NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            // }
+            // else
+            // {
+                // NativeAbility::GetInstance().EnterSlice(VIEW_BLOOD_CHECK, TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            // }
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodPresenter::OnClick");
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodResultView.cpp
new file mode 100644 (file)
index 0000000..78e1334
--- /dev/null
@@ -0,0 +1,214 @@
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-31 14:36:25
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodResultView.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 "BloodOxygenModel.h"
+
+#include "UiConfig.h"
+#include "uicomponents/UIComponents.h"
+// #include "MainPresenterSample.h"
+
+#include "bloodoxygen/include/BloodResultPresenter.h"
+#include "bloodoxygen/include/BloodResultView.h"
+namespace OHOS
+{
+    static BloodResultView *g_pBloodResultView{nullptr};
+    static const char *BLOODBACKPATH = "/user/res/Blood/beijing.bin";
+
+    BloodResultView::BloodResultView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodResultView::BloodResultView");
+        g_pBloodResultView = this;
+    }
+
+    BloodResultView::~BloodResultView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodResultView::~BloodResultView");
+        DeInit();
+        g_pBloodResultView = nullptr;
+    }
+
+    BloodResultView *BloodResultView::GetInstance()
+    {
+        return g_pBloodResultView;
+    }
+
+    /* -------------------------------------------------------------------------- */
+    void BloodResultView::UpSPO2Text()
+    {
+        if (bloodLabel == nullptr || timeLabel == nullptr)
+            return;
+            
+        // 更新血氧数据
+        uint16_t spo2 = BloodOxygenModel::GetInstance()->GetSPO2data();
+        if (spo2 != 0) // 判断是否为默认数据
+        {
+            // 更新数据
+            std::string bloodoxygenStr = std::to_string(spo2) + "%";
+            bloodLabel->SetText(bloodoxygenStr.c_str());
+
+            // 获取时间差
+            uint32_t time = BloodResultPresenter::GetInstance()->GetCurrentTime();
+            uint32_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();
+            int time_diff = BloodResultPresenter::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
+        {
+            bloodLabel->SetText("--");
+            timeLabel->SetTextId(STR_CHECKNO);
+        }
+    }
+
+    /* -------------------------------------------------------------------------- */
+    /***
+     * @description:
+     * @return 添加按键是否成功
+     */
+    bool BloodResultView::AddButton()
+    {
+        InitButtonExt(checkButton, 118, 336, 230, 80, CLICK_BLOOD, STR_CHECK, 30);
+        checkButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF5A36); // 设置按键颜色
+        // 设置按键监听
+        UIView::OnClickListener *clickListener = (UIView::OnClickListener *)OHOS::BloodResultPresenter::GetInstance();
+        checkButton->SetOnClickListener(clickListener);
+
+        AddViewToRootContainer(checkButton);
+        return true;
+    }
+    /***
+     * @description:
+     * @return 初始化标签是否成功
+     */
+    bool BloodResultView::InitLable()
+    {
+        /*初始化title*/
+        InitLabelExt(titleLabel, 83, 50, 300, 35, "title", STR_BLOOD, DEFAULT_VECTOR_FONT_FILENAME, 30);
+        /*初始化血氧值label*/
+        InitUILabel(bloodLabel, 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(23);
+
+        UpSPO2Text();
+
+        AddViewToRootContainer(titleLabel);
+        AddViewToRootContainer(bloodLabel);
+        AddViewToRootContainer(timeLabel);
+
+        return true;
+    }
+    /***
+     * @description:
+     * @return 初始化背景是否成功
+     */
+    bool BloodResultView::Initbackground()
+    {
+
+        background = new UIImageView();
+        background->SetPosition(0, 0, 466, 466);
+        background->SetSrc(BLOODBACKPATH);
+
+        AddViewToRootContainer(background);
+        return true;
+    }
+    /***
+     * @description:
+     * @return 是否初始化成功
+     */
+    bool BloodResultView::BloodResultViewInit()
+    {
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bool BloodResultView::InitView()");
+        if (!Initbackground())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Initbackground error!");
+        };
+        if (!InitLable())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLable error!");
+        };
+        if (!AddButton())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AddButton error!");
+        };
+        return true;
+    }
+    /***
+     * @description:
+     * @return 删除组件
+     */
+    void BloodResultView::DeInit()
+    {
+        if (background != nullptr)
+        {
+            delete background;
+            background = nullptr;
+        }
+        if (bloodLabel != nullptr)
+        {
+            delete bloodLabel;
+            bloodLabel = nullptr;
+        }
+        if (timeLabel != nullptr)
+        {
+            delete timeLabel;
+            timeLabel = nullptr;
+        }
+        if (titleLabel != nullptr)
+        {
+            delete titleLabel;
+            titleLabel = nullptr;
+        }
+        if(checkButton!=nullptr)
+        {
+            delete checkButton;
+            checkButton = nullptr;
+        }
+    }
+
+    void BloodResultView::OnStart()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodResultView::OnStart");
+        View<BloodResultPresenter>::OnStart();
+
+        if (!BloodResultViewInit())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodResultView::InitBloodView fail");
+        }
+
+        GetRootContainer()->SetDraggable(true);
+        GetRootContainer()->SetTouchable(true);
+        GetRootContainer()->SetOnDragListener(presenter_);
+
+        // 增加按键监听
+        RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::BloodResultPresenter::GetInstance();
+        RootView::GetInstance()->SetOnKeyActListener(keyactListener);
+    }
+
+}