1.优化心率血氧的初始化显示;2.搭建心率检测流程
authorCaisking <3449750381@qq.com>
Wed, 6 Mar 2024 10:24:06 +0000 (18:24 +0800)
committerCaisking <3449750381@qq.com>
Wed, 6 Mar 2024 10:24:06 +0000 (18:24 +0800)
16 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dialupdate/KUMI.bin

index 6de55db..761d965 100644 (file)
@@ -199,6 +199,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/activity/src/ActivityModel.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartRateView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartModel.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartBandoffView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartCheckView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartResultView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartView.cpp
index 148a07a..198257f 100644 (file)
@@ -1,89 +1,45 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodOxygen view
- * Author:
- * Create: 2021-08-01
- */
-
 #include "BloodOxygenModel.h"
 #include "DialModelSPO2.h"
 #include "wearable_log.h"
 #include "BloodOxygenPresenter.h"
+
 namespace OHOS
 {
-    BloodOxygenModel::BloodOxygenModel()
+    BloodOxygenModel::BloodOxygenModel() : OxygenView(false), BandoffView(false), CheckView(false), ResultView(false), CheckStatus(false), SPO2_(DialModelSPO2::GetInstance()->GetSPO2Data())
     {
-        OxygenView = false;
-        BandoffView = false;
-        CheckView = false;
-        ResultView = false;
-        CheckStatus = false;
-        // 初始化血氧值
-        SPO2_ = DialModelSPO2::GetInstance()->GetSPO2Data();
     }
 
-    bool BloodOxygenModel::GetBloodOxygenViewStatus(void)
-    {
-        return OxygenView;
-    }
+    bool BloodOxygenModel::GetBloodOxygenViewStatus() { return OxygenView; }
 
-    bool BloodOxygenModel::GetBloodBandoffViewStatus(void)
-    {
-        return BandoffView;
-    }
+    bool BloodOxygenModel::GetBloodBandoffViewStatus() { return BandoffView; }
 
-    bool BloodOxygenModel::GetBloodCheckViewStatus(void)
-    {
-        return CheckView;
-    }
+    bool BloodOxygenModel::GetBloodCheckViewStatus() { return CheckView; }
 
-    void BloodOxygenModel::SetBloodBandoffViewStatus(bool bandoffViewStatus)
-    {
-        BandoffView = bandoffViewStatus;
-    }
+    void BloodOxygenModel::SetBloodBandoffViewStatus(bool bandoffViewStatus) { BandoffView = bandoffViewStatus; }
 
-    void BloodOxygenModel::SetBloodOxygenViewStatus(bool oxygenViewStatus)
-    {
-        OxygenView = oxygenViewStatus;
-    }
+    void BloodOxygenModel::SetBloodOxygenViewStatus(bool oxygenViewStatus) { OxygenView = oxygenViewStatus; }
 
-    void BloodOxygenModel::SetBloodCheckViewStatus(bool checkViewStatus)
-    {
-        CheckView = checkViewStatus;
-    }
+    void BloodOxygenModel::SetBloodCheckViewStatus(bool checkViewStatus) { CheckView = checkViewStatus; }
+
+    bool BloodOxygenModel::GetCheckStatus() { return CheckStatus; }
+
+    void BloodOxygenModel::SetCheckStatus(bool checkstatus) { CheckStatus = checkstatus; }
+
+    uint16_t BloodOxygenModel::GetSPO2data() { return SPO2_; }
+
+    uint16_t BloodOxygenModel::GetShowSPO2data() { return Show_SPO2_; }
 
-    /* -------------------------------------------------------------------------- */
-    // 获取检测状态
-    bool BloodOxygenModel::GetCheckStatus()
-    {
-        return CheckStatus;
-    }
-    // 设置检测状态
-    void BloodOxygenModel::SetCheckStatus(bool checkstatus)
-    {
-        CheckStatus = checkstatus;
-    }
-    uint16_t BloodOxygenModel::GetSPO2data()
-    {
-        return SPO2_;
-    }
-    uint16_t BloodOxygenModel::GetShowSPO2data()
-    {
-        return Show_SPO2_;
-    }
     void BloodOxygenModel::UpSPO2data(uint16_t spo2)
     {
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpSPO2data SPO2:%d->%d", SPO2_, spo2);
         Show_SPO2_ = spo2;
-        // 筛选有效信息
         if (Show_SPO2_ != 0)
         {
             SPO2_ = spo2;
         }
     }
+
     uint16_t BloodOxygenModel::GetCheckTime()
     {
-        // 第一次进入,默认刚刚测试
         if (initstatus)
         {
             TIME_ = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
@@ -91,14 +47,12 @@ namespace OHOS
         }
         return TIME_;
     }
-    void BloodOxygenModel::SetCheckTime(uint16_t time)
-    {
-        TIME_ = time;
-    }
-    /* -------------------------------------------------------------------------- */
-    BloodOxygenModel *BloodOxygenModel::GetInstance(void)
+
+    void BloodOxygenModel::SetCheckTime(uint16_t time) { TIME_ = time; }
+
+    BloodOxygenModel *BloodOxygenModel::GetInstance()
     {
         static BloodOxygenModel instance;
         return &instance;
     }
-}
\ No newline at end of file
+}
index 22f8c95..0ec393d 100644 (file)
@@ -76,16 +76,22 @@ namespace OHOS
     {
         // 更新血氧数据
         uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data();
-        if (spo2_ != 97) // 判断是否为默认数据
+        if (spo2_ != 0) // 判断是否为默认数据
         {
+            // 更新数据
             std::string bloodoxygenStr = std::to_string(spo2_);
             percent->SetText(bloodoxygenStr.c_str());
+            // 更新时间
+            uint16_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
+            uint16_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();
+            std::string TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time) + "检测";
+            timeLabel->SetText(TimeStr.c_str());
+        }
+        else
+        {
+            percent->SetText("--");
+            timeLabel->SetText("暂无检测结果");
         }
-        // 更新时间
-        uint16_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
-        uint16_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();
-        std::string TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time) + "检测";
-        timeLabel->SetText(TimeStr.c_str());
     }
 
     // 初始化标签
@@ -103,8 +109,21 @@ namespace OHOS
         percent->SetViewId("label2");               // Set style
         percent->SetStyle(STYLE_TEXT_FONT, PERCENT_FONT_SIZE);
         uint16_t spo2_ = BloodOxygenModel::GetInstance()->GetSPO2data();
-        std::string bloodoxygenStr = std::to_string(spo2_);
-        percent->SetText(bloodoxygenStr.c_str());
+        std::string TimeStr;
+        if (spo2_ != 0)
+        {
+            std::string bloodoxygenStr = std::to_string(spo2_);
+            percent->SetText(bloodoxygenStr.c_str());
+            // 更新时间
+            uint16_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
+            uint16_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();
+            TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time);
+        }
+        else
+        {
+            percent->SetText("--");
+            TimeStr = "暂无测量数据";
+        }
         percent->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
         percent->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         percent->SetRollSpeed(0);
@@ -121,10 +140,6 @@ namespace OHOS
         timeLabel->SetViewId("label1");                   // Set style
         timeLabel->SetStyle(STYLE_TEXT_FONT, TIMELABEL_FONT_SIZE);
         /* -------------------------------------------------------------------------- */
-        // 更新时间
-        uint16_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
-        uint16_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();
-        std::string TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time);
         timeLabel->SetText(TimeStr.c_str());
         /* -------------------------------------------------------------------------- */
         timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
index f2d6d52..c2be257 100644 (file)
@@ -62,9 +62,15 @@ namespace OHOS
 \r
         // Set additional property\r
         bloodoxygen = BloodOxygenModel::GetInstance()->GetSPO2data();\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", bloodoxygen);\r
-        std::string bloodoxygenStr = std::to_string(bloodoxygen);\r
-        bloodLabel->SetText(bloodoxygenStr.c_str());\r
+        if (bloodoxygen != 0)\r
+        {\r
+            std::string bloodoxygenStr = std::to_string(bloodoxygen);\r
+            bloodLabel->SetText(bloodoxygenStr.c_str());\r
+        }\r
+        else\r
+        {\r
+            bloodLabel->SetText("--");\r
+        }\r
         bloodLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
         bloodLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
         bloodLabel->SetRollSpeed(0);\r
@@ -73,7 +79,7 @@ namespace OHOS
         // Add to rootView\r
         Add(bloodLabel);\r
 \r
-      /* -------------------------------------------------------------------------- */\r
+        /* -------------------------------------------------------------------------- */\r
         timeLabel = new UILabel();\r
         if (timeLabel == nullptr)\r
         {\r
@@ -81,15 +87,21 @@ namespace OHOS
             return false;\r
         }\r
         timeLabel->SetPosition(90, 300); // widget's left position and top position\r
-        timeLabel->Resize(280, 100);                      // widget's width and height\r
-        timeLabel->SetViewId("label1");                   // Set style\r
+        timeLabel->Resize(280, 100);     // widget's width and height\r
+        timeLabel->SetViewId("label1");  // Set style\r
         timeLabel->SetStyle(STYLE_TEXT_FONT, 30);\r
-        /* -------------------------------------------------------------------------- */\r
-        // 更新时间\r
-        uint16_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime();\r
-        uint16_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();\r
-        std::string TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time) +"检测";\r
-        timeLabel->SetText(TimeStr.c_str());\r
+        if (bloodoxygen != 0)\r
+        {\r
+            // 更新时间\r
+            uint16_t time = BloodOxygenPresenter::GetInstance()->GetCurrentTime();\r
+            uint16_t check_time = BloodOxygenModel::GetInstance()->GetCheckTime();\r
+            std::string TimeStr = BloodOxygenPresenter::GetInstance()->GetTDOA(time, check_time) + "检测";\r
+            timeLabel->SetText(TimeStr.c_str());\r
+        }\r
+        else\r
+        {\r
+            timeLabel->SetText("暂无测量记录");\r
+        }\r
         /* -------------------------------------------------------------------------- */\r
         timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);\r
         timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
index e69de29..060059e 100644 (file)
@@ -0,0 +1,38 @@
+
+
+#ifndef Heart_BANDOFF_VIEW_H
+#define Heart_BANDOFF_VIEW_H
+
+#include "components/ui_label.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:
+        UILabel *label;
+        UILabelButton *testButton;
+        UIScrollView *HeartBandoffScrollView;
+        UIViewGroup *group;
+        UIImageView *imageView;
+        UIImageAnimatorView *imageAnimator;
+    };
+}
+
+#endif // 血氧跳转界面
\ No newline at end of file
index 26c62b0..3a7379f 100644 (file)
@@ -34,7 +34,7 @@ namespace OHOS
         UIScrollView *HeartCheckViewInit();
         UIImageAnimatorView *GetImageAnimator();
         UILabelButton *CreateAndSetUIButton(const char *title);
-        void UpHeartText();
+        void UpShowHeartText();
 
     private:
         UIImageAnimatorView *imageAnimator;
index 59aa389..246d047 100644 (file)
@@ -112,9 +112,12 @@ extern "C"
             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
 \r
             bool GetCheckStatus();\r
             void SetCheckStatus(bool checkstatus);\r
index 213e4e8..0de7636 100644 (file)
@@ -21,7 +21,7 @@ namespace OHOS
     typedef enum
     {
         HEARTVIEW = 0,  // 血氧视图(slice)
-        HEARTBANDVIEW,
+        HEARTBANDVIEW,  // 佩戴提醒
         HEARTCHECKVIEW, // 检测视图(subView)
         HEARTRESULT,    // 测试失败(subView)
         MAX_HEARTVIEW,
@@ -29,10 +29,10 @@ namespace OHOS
 
     class HeartView;
     class HeartPresenter : public Presenter<HeartView>,
-                                 public UIView::OnClickListener,
-                                 public RootView::OnKeyActListener,
-                                 public ModelListenerSample,
-                                 public UIView::OnDragListener
+                           public UIView::OnClickListener,
+                           public RootView::OnKeyActListener,
+                           public ModelListenerSample,
+                           public UIView::OnDragListener
     {
     public:
         HeartPresenter();
index 0869abb..59bf6e8 100644 (file)
@@ -26,7 +26,7 @@
 namespace OHOS
 {
     class HeartPresenter;
-    //class HeartBandoffView;
+    class HeartBandoffView;
     class HeartCheckView;
     class HeartResultView;
     class HeartView : public View<HeartPresenter>
@@ -40,26 +40,23 @@ namespace OHOS
         void OnTearDownView() override;
         void OnStart() override;
         static HeartView *GetInstance(void);
-        bool ChangeHeartView(int16_t thisview); // 主视图
-        bool ChangeCheckView(int16_t thisview);
-        bool ChangeResultView(int16_t thisview);
+        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 Upheartdata();
-
+        void UpHeartText(); // 更新心率结果文本
     private:
-        // 增加图片
-        bool InitImageDisplay(void);
-        // 初始化标签
-        bool InitLabel(void);
-        // 添加label按键
-        UILabelButton *CreateAndSetUIButton(const char *title);
-        // 初始化界面
-        bool InitHeartView(void);
+        bool InitImageDisplay(void);                            // 初始化背景图片
+        bool InitLabel(void);                                   // 初始化标签
+        UILabelButton *CreateAndSetUIButton(const char *title); // 添加label按键
+        bool InitHeartView(void);                               // 初始化界面
         bool SetOnDragListener(void);
 
+        HeartBandoffView *heartbandoff{nullptr};
         HeartCheckView *heartcheck{nullptr};
         HeartResultView *heartresult{nullptr};
         UIScrollView *HeartScrollView[4]{nullptr};
@@ -72,8 +69,7 @@ namespace OHOS
         UILabelButton *testButton;  // 检测按键
 
         const power_display_svr_api_t *display_api = power_display_svr_get_api();
-        uint32_t display_time;
-        uint32_t heart_;
+        uint32_t display_time; // 获取系统亮屏时间暂存
     };
 }
 
index e69de29..59af17e 100644 (file)
@@ -0,0 +1,156 @@
+
+/*
+ * 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"
+
+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 UILabel();
+        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->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;
+    }
+}
index ab72cc0..3f44ae4 100644 (file)
@@ -75,7 +75,7 @@ namespace OHOS
         HeartText = nullptr;
         g_pMainView = this;
     }
-    void HeartCheckView::UpHeartText()
+    void HeartCheckView::UpShowHeartText()
     {
         uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
         // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetHeartData %d", heart_);
index 99f6124..fe9bc7c 100644 (file)
@@ -472,17 +472,17 @@ namespace OHOS
             }\r
         }\r
     }\r
-    bool HeartModel::GetHeartViewStatus(void)\r
+    bool HeartModel::GetHeartViewStatus()\r
     {\r
         return HeartView;\r
     }\r
 \r
-    bool HeartModel::GetHeartBandoffViewStatus(void)\r
+    bool HeartModel::GetHeartBandoffViewStatus()\r
     {\r
         return BandoffView;\r
     }\r
 \r
-    bool HeartModel::GetHeartCheckViewStatus(void)\r
+    bool HeartModel::GetHeartCheckViewStatus()\r
     {\r
         return CheckView;\r
     }\r
@@ -492,9 +492,19 @@ namespace OHOS
         BandoffView = bandoffViewStatus;\r
     }\r
 \r
-    void HeartModel::SetHeartViewStatus(bool HeartViewStatus)\r
+    bool HeartModel::GetHeartResultViewStaus()\r
     {\r
-        HeartView = HeartViewStatus;\r
+        return ResultView;\r
+    }\r
+\r
+    void HeartModel::SetHeartResultViewStatus(bool resultViewStatus)\r
+    {\r
+        ResultView = resultViewStatus;\r
+    }\r
+\r
+    void HeartModel::SetHeartViewStatus(bool heartViewStatus)\r
+    {\r
+        HeartView = heartViewStatus;\r
     }\r
 \r
     void HeartModel::SetHeartCheckViewStatus(bool checkViewStatus)\r
@@ -502,38 +512,37 @@ namespace OHOS
         CheckView = checkViewStatus;\r
     }\r
 \r
-    /* -------------------------------------------------------------------------- */\r
-    // 获取检测状态\r
     bool HeartModel::GetCheckStatus()\r
     {\r
         return CheckStatus;\r
     }\r
-    // 设置检测状态\r
-    void HeartModel::SetCheckStatus(bool checkstatus)\r
+\r
+    void HeartModel::SetCheckStatus(bool checkStatus)\r
     {\r
-        CheckStatus = checkstatus;\r
+        CheckStatus = 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
     void HeartModel::UpHeartdata(uint16_t heart)\r
     {\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpHeartdata Heart:%d->%d", Heart_, heart);\r
         Show_Heart_ = heart;\r
-        // 筛选有效信息\r
         if (Show_Heart_ != 0)\r
         {\r
             Heart_ = heart;\r
         }\r
     }\r
+\r
     uint16_t HeartModel::GetCheckTime()\r
     {\r
-        // 第一次进入,默认刚刚测试\r
         if (initstatus)\r
         {\r
             TIME_ = HeartPresenter::GetInstance()->GetCurrentTime();\r
@@ -541,9 +550,9 @@ namespace OHOS
         }\r
         return TIME_;\r
     }\r
+\r
     void HeartModel::SetCheckTime(uint16_t time)\r
     {\r
         TIME_ = time;\r
     }\r
-    /* -------------------------------------------------------------------------- */\r
 }\r
index 801111f..faa4d4b 100644 (file)
@@ -1,20 +1,10 @@
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: heartOxygen view
- * Author:
- * Create: 2021-08-01
- */
-
 #include "HeartPresenter.h"
 #include "common/task_manager.h"
-#include "HeartView.h"
-#include "HeartModel.h"
-#include "HeartCheckView.h"
 #include "components/ui_label.h"
 #include "ChangeSliceListener.h"
 #include "broadcast_service.h"
 #include <fstream>
-#include "iostream"
+#include <iostream>
 #include <sstream>
 #include <string>
 #include <cstdlib>
 #include "wearable_log.h"
 #include "cmsis_os.h"
 #include "securec.h"
-#include "broadcast_service.h"
 #include "graphic_service.h"
 #include <chrono>
 #include <thread>
 #include "ppg_service.h"
 #include "displaybrightness/include/DisplayBrightnessModel.h"
 #include "power_display_service.h"
-#include "heartrate/include/HeartPresenter.h"
+
 #include "heartrate/include/HeartView.h"
+#include "HeartModel.h"
+#include "HeartCheckView.h"
+#include "HeartBandoffView.h"
 
 #define HEARTKEYABLE 0
+
 namespace OHOS
 {
     static HeartPresenter *g_pMainView = nullptr;
@@ -40,8 +33,7 @@ namespace OHOS
 
     static constexpr uint16_t PROGRESS_VALUE_MIN = 0;
     static constexpr uint16_t PROGRESS_VALUE_MAX = 10;
-    /* -------------------------------------------------------------------------- */
-    // 获取当前的"时间分"
+
     uint16_t HeartPresenter::GetCurrentTime()
     {
         time_t now = time(0);
@@ -50,7 +42,7 @@ namespace OHOS
         uint16_t current_time = tblock->tm_hour * 60 + tblock->tm_min;
         return current_time;
     }
-    // 获取时间差
+
     std::string HeartPresenter::GetTDOA(uint16_t new_time, uint16_t old_time)
     {
         if (new_time == old_time)
@@ -78,7 +70,7 @@ namespace OHOS
             return ss.str();
         }
     }
-    /* -------------------------------------------------------------------------- */
+
     HeartPresenter::HeartPresenter()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartPresenter::new HeartPresenter");
@@ -96,6 +88,7 @@ namespace OHOS
 #endif
         g_pMainView = nullptr;
     }
+
     HeartPresenter *HeartPresenter::GetInstance()
     {
         return g_pMainView;
@@ -129,27 +122,18 @@ namespace OHOS
 
     bool HeartPresenter::CheckPointersValue()
     {
-        if (HeartView::GetInstance() == nullptr)
-        {
-            return false;
-        }
-
-#if 0
-        if (HeartBandoffView::GetInstance() == nullptr)
-        {
-            return false;
-        }
-#endif
-        if (HeartModel::GetInstance() == nullptr)
+        if (HeartView::GetInstance() == nullptr || HeartBandoffView::GetInstance() == nullptr || HeartModel::GetInstance() == nullptr)
         {
             return false;
         }
         return true;
     }
+
     bool HeartPresenter::OnDrag(UIView &view, const DragEvent &event)
     {
         return true;
     }
+
     bool HeartPresenter::OnDragEnd(UIView &view, const DragEvent &event)
     {
         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
@@ -167,14 +151,16 @@ namespace OHOS
         // 主界面点击开始检测
         if (strcmp(view.GetViewId(), "checkbegin") == 0)
         {
-            //HeartView::GetInstance()->ChangeView(HEARTVIEW, HEARTBANDVIEW);
-            //HeartModel::GetInstance()->SetHeartBandoffViewStatus(true);
-            // HeartBandoffView::GetInstance()->GetImageAnimator()->Start();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTVIEW->HEARTBANDVIEW");
+            HeartView::GetInstance()->ChangeView(HEARTVIEW, HEARTBANDVIEW);
+            HeartModel::GetInstance()->SetHeartBandoffViewStatus(true);
+            HeartBandoffView::GetInstance()->GetImageAnimator()->Start();
             return true;
         }
         // 从检测界面回到主界面
         if (strcmp(view.GetViewId(), "checkstop") == 0)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTCHECKVIEW->HEARTVIEW");
             HeartView::GetInstance()->ChangeView(HEARTCHECKVIEW, HEARTVIEW);
             HeartModel::GetInstance()->SetHeartCheckViewStatus(false);
             HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测
@@ -183,6 +169,7 @@ namespace OHOS
         // 从检测失败界面回到检测界面
         if (strcmp(view.GetViewId(), "ReCheck") == 0)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTRESULT->HEARTCHECKVIEW");
             HeartView::GetInstance()->ChangeView(HEARTRESULT, HEARTCHECKVIEW);
             HeartCheckView::GetInstance()->GetImageAnimator()->Start(); // 播放检测界面动画
             HeartModel::GetInstance()->SetCheckStatus(true);            // 开始检测
@@ -191,6 +178,7 @@ namespace OHOS
         // 从检测失败界面回到主界面
         if (strcmp(view.GetViewId(), "StCheck") == 0)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTRESULT->HEARTVIEW");
             HeartView::GetInstance()->ChangeView(HEARTRESULT, HEARTVIEW);
             HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测
             return true;
@@ -220,11 +208,11 @@ namespace OHOS
         // 当检测状态为开始检测,开始检测
         if (HeartModel::GetInstance()->GetCheckStatus() == true)
         {
-            HeartCheckView::GetInstance()->UpHeartText(); // 更新
+            HeartCheckView::GetInstance()->UpShowHeartText(); // 更新
             if (startheart == true)
             {
-                // uint8_t md = PPG_SERVICE_CMD_TYPE_DO_Heart_TEST;
-                // send_ppg_cmd_msg(md);
+                uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST;
+                send_ppg_cmd_msg(md);
                 startheart = false;
             }
         }
@@ -232,11 +220,11 @@ namespace OHOS
         // 当检测状态为结束检测,结束检测
         if (HeartModel::GetInstance()->GetCheckStatus() == false)
         {
-            HeartView::GetInstance()->Upheartdata(); // 更新主界面
+            HeartView::GetInstance()->UpHeartText(); // 更新主界面
             if (startheart == false)
             {
-                // uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_Heart_TEST;
-                // send_ppg_cmd_msg(md);
+                uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;
+                send_ppg_cmd_msg(md);
                 startheart = true;
             }
         }
@@ -244,7 +232,7 @@ namespace OHOS
 
     void HeartPresenter::ReturnInterface()
     {
-#if 0
+
         // 佩戴动画播放完毕,前往检测界面
         if (HeartModel::GetInstance()->GetHeartBandoffViewStatus() == true)
         {
@@ -259,7 +247,7 @@ namespace OHOS
                 HeartModel::GetInstance()->SetCheckStatus(true); // 开始检测
             }
         }
-#endif
+
         // 检测动画播放完毕
         if (HeartModel::GetInstance()->GetHeartCheckViewStatus() == true)
         {
@@ -268,19 +256,25 @@ namespace OHOS
                 // 测试失败
                 if (HeartModel::GetInstance()->GetShowHeartdata() == 0)
                 {
+
                     HeartView::GetInstance()->ChangeView(HEARTCHECKVIEW, HEARTRESULT);
+                    HeartModel::GetInstance()->SetHeartResultViewStatus(true);
                 }
                 // 测试成功
                 else
                 {
                     HeartView::GetInstance()->ChangeView(HEARTCHECKVIEW, HEARTVIEW);
                 }
-                HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测
                 HeartModel::GetInstance()->SetHeartCheckViewStatus(false);
+                HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测
             }
             uint16_t time = GetCurrentTime();
             HeartModel::GetInstance()->SetCheckTime(time); // 更新时间
         }
+        if (HeartModel::GetInstance()->GetHeartResultViewStaus() == true)
+        {
+            HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测
+        }
     }
     void HeartPresenter::Notify(void)
     {
index 8dcd0e5..d419711 100644 (file)
@@ -8,9 +8,11 @@
 #include "heartrate/include/HeartView.h"
 #include "heartrate/include/HeartPresenter.h"
 #include "HeartModel.h"
-#include "HeartPresenter.h"
 #include "displaybrightness/include/DisplayBrightnessModel.h"
 #include "power_display_service.h"
+#include "HeartBandoffView.h"
+#include "HeartCheckView.h"
+#include "HeartRateView.h"
 
 namespace OHOS
 {
@@ -57,6 +59,8 @@ namespace OHOS
         delete testButton;
         delete percent;
         delete heartcheck;
+        delete heartbandoff;
+        delete heartresult;
 
         imageViewMain = nullptr;
         titleLabel = nullptr;
@@ -65,6 +69,8 @@ namespace OHOS
         testButton = nullptr;
         g_pMainView = nullptr;
         heartcheck = nullptr;
+        heartbandoff = nullptr;
+        heartresult = nullptr;
         delete HeartScrollView[HEARTVIEW];
         HeartScrollView[HEARTVIEW] = nullptr;
     }
@@ -72,11 +78,11 @@ namespace OHOS
     {
         return g_pMainView;
     }
-    void HeartView::Upheartdata()
+    void HeartView::UpHeartText()
     {
         // 更新血氧数据
         uint16_t heart_ = HeartModel::GetInstance()->GetHeartdata();
-        if (heart_ != 97) // 判断是否为默认数据
+        if (heart_ != 0) // 判断是否为默认数据
         {
             std::string heartStr = std::to_string(heart_);
             percent->SetText(heartStr.c_str());
@@ -249,6 +255,23 @@ namespace OHOS
         }
         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)
     {
@@ -302,6 +325,7 @@ namespace OHOS
     // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainStopWatchView类中的特定成员函数指针进行了绑定。
     static const HeartViewMapper ViewMapper[] = {
         {HEARTVIEW, &HeartView::ChangeHeartView},
+        {HEARTBANDVIEW, &HeartView::ChangeBandoffView},
         {HEARTCHECKVIEW, &HeartView::ChangeCheckView},
         {HEARTRESULT, &HeartView::ChangeResultView},
     };
index da9662f..54f3cc2 100644 (file)
@@ -27,7 +27,7 @@ namespace OHOS
         int GetSPO2Data();
 
     private:
-        float SPO2_ = 97.0; // 97.0: default SPO2 value as reference
+        float SPO2_ = 0; // 97.0: default SPO2 value as reference
     };
 }
 #endif
index df8ecd7..5532379 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dialupdate/KUMI.bin and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dialupdate/KUMI.bin differ