1.增加星空表盘,验证表盘血氧心率数据;2.更正血氧Slice,可以正常进入
authorCaisking <3449750381@qq.com>
Wed, 28 Feb 2024 02:18:36 +0000 (10:18 +0800)
committerCaisking <3449750381@qq.com>
Wed, 28 Feb 2024 02:18:36 +0000 (10:18 +0800)
16 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodBandoffView.cpp
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/dialupdate/include/DialUpdateModel.h
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialDataBase.h
code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPower.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp [new file with mode: 0644]
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/KUMI.bin
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/dog.bin
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/galaxy.bin [new file with mode: 0644]
code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp

index 6de8e8b..add4a74 100644 (file)
@@ -131,6 +131,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelSteps.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelPower.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelCharge.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/DialModelSPO2.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodBandoffView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp
index 9b8eef2..db8bfe5 100644 (file)
@@ -30,6 +30,8 @@ typedef enum : uint16_t
     VIEW_MAIN = 1,                // 主界面
     VIEW_SETTING,                 // 设置
     VIEW_APPLIST,                 // App应用
+    VIEW_DIALUPDATE,              // 更新表盘ID ,请不要在前面增加任何Slice
+    /* -------------------------------------------------------------------------- */
     VIEW_MAIN_ALARM,              // 闹钟
     VIEW_ALARM_POP_UP,            // 闹铃界面
     VIEW_BLUETOOTH_EARPHONE,      // 连接蓝牙耳机界面
@@ -66,7 +68,6 @@ typedef enum : uint16_t
     VIEW_MESSAGE,    // 信息通知
     VIEW_BLOODO,     // 血氧监测
     VIEW_ROTATE,     // 模拟表冠
-    VIEW_DIALUPDATE, // 更新表盘
     /* -------------------------------------------------------------------------- */
     VIEW_MAIN_TEMP,     // 体温界面(暂时不用)
     VIEW_OFFLINEVOICE,  // 语音助手界面(暂时不用)
index 8114e24..d284cf1 100644 (file)
@@ -96,6 +96,31 @@ namespace OHOS
     static constexpr const char *PNG_BLOOD_FLOW_IMAGE_29 = APP_RES_PATH "/BLOOD_FLOW_IMAGE_31.bin";
     static constexpr const char *PNG_BLOOD_FLOW_IMAGE_30 = APP_RES_PATH "/BLOOD_FLOW_IMAGE_32.bin";
     /* -------------------------------- 血氧动画 ------------------------------------------------- */
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH"/COUNTDOWN_IMAGE_01.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH"/COUNTDOWN_IMAGE_02.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH"/COUNTDOWN_IMAGE_03.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_3 = APP_RES_PATH"/COUNTDOWN_IMAGE_04.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_4 = APP_RES_PATH"/COUNTDOWN_IMAGE_05.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_5 = APP_RES_PATH"/COUNTDOWN_IMAGE_06.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_6 = APP_RES_PATH"/COUNTDOWN_IMAGE_07.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_7 = APP_RES_PATH"/COUNTDOWN_IMAGE_08.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_8 = APP_RES_PATH"/COUNTDOWN_IMAGE_09.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_9 = APP_RES_PATH"/COUNTDOWN_IMAGE_10.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_10 = APP_RES_PATH"/COUNTDOWN_IMAGE_11.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_11 = APP_RES_PATH"/COUNTDOWN_IMAGE_12.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_12 = APP_RES_PATH"/COUNTDOWN_IMAGE_13.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_13 = APP_RES_PATH"/COUNTDOWN_IMAGE_14.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_14 = APP_RES_PATH"/COUNTDOWN_IMAGE_15.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_15 = APP_RES_PATH"/COUNTDOWN_IMAGE_16.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_16 = APP_RES_PATH"/COUNTDOWN_IMAGE_17.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_17 = APP_RES_PATH"/COUNTDOWN_IMAGE_18.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_18 = APP_RES_PATH"/COUNTDOWN_IMAGE_19.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_19 = APP_RES_PATH"/COUNTDOWN_IMAGE_20.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_20 = APP_RES_PATH"/COUNTDOWN_IMAGE_21.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_21 = APP_RES_PATH"/COUNTDOWN_IMAGE_22.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_22 = APP_RES_PATH"/COUNTDOWN_IMAGE_23.bin";
+    static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_23 = APP_RES_PATH"/COUNTDOWN_IMAGE_24.bin";
+#if 0
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_0 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_1.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_1 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_2.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_2 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_3.bin";
@@ -186,7 +211,7 @@ namespace OHOS
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_87 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_88.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_88 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_89.bin";
     static constexpr const char *PNG_COUNTDOWN_TIME_IMAGE_89 = APP_RES_PATH "/Blood/SPO2H/BLOOD_IMAGE_90.bin";
-
+#endif
     /* -------------------------------------------------------------------------- */
     static constexpr const char *PNG_APPLIST_ALIPAY_IMAGE = APP_RES_PATH "/alipay/alipay_logo.bin"; // 支付宝
     static constexpr const char *PNG_ALIPAY_BIND_FAILURE = APP_RES_PATH "/alipay/ALIPAY_BIND_FAILURE.bin";
index 6fec8f0..8715776 100644 (file)
@@ -1,9 +1,11 @@
+
 /*
  * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
  * Description: bloodBandoff view
  * Author:
  * Create: 2021-08-01
  */
+#if 0
 #include "UiConfig.h"
 #include "wearable_log.h"
 #include "BloodBandoffView.h"
@@ -230,3 +232,156 @@ namespace OHOS
         return group;
     }
 }
+#endif
+
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodBandoff view
+ * Author:
+ * Create: 2021-08-01
+ */
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "BloodBandoffView.h"
+#include "BloodOxygenModel.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 BloodBandoffView *g_pMainView = nullptr;
+    BloodBandoffView::BloodBandoffView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::BloodBandoffView");
+        label = nullptr;
+        imageView = nullptr;
+        group = nullptr;
+        imageAnimator = nullptr;
+        g_pMainView = this;
+    }
+
+    BloodBandoffView::~BloodBandoffView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::~BloodBandoffView");
+        group->RemoveAll();
+        delete label;
+        delete imageView;
+        delete group;
+        delete imageAnimator;
+        label = nullptr;
+        imageView = nullptr;
+        group = nullptr;
+        imageAnimator = nullptr;
+        g_pMainView = nullptr;
+    }
+
+    BloodBandoffView *BloodBandoffView::GetInstance(void)
+    {
+        return g_pMainView;
+    }
+
+    UIViewGroup *BloodBandoffView::GetBandoffViewGroup()
+    {
+        return group;
+    }
+
+    UIImageAnimatorView *BloodBandoffView::GetImageAnimator()
+    {
+        return imageAnimator;
+    }
+
+    UIViewGroup *BloodBandoffView::CreateUIViewGroup()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::CreateUIViewGroup");
+        group = new UIViewGroup();
+        if (group == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new group fail");
+            return nullptr;
+        }
+        group->SetPosition(0, 0);
+        group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+
+        label = new UILabel();
+        if (label == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new Label fail");
+            return nullptr;
+        }
+        group->Add(label);
+        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);
+
+        imageAnimator = new UIImageAnimatorView();
+        if (imageAnimator == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail");
+            return nullptr;
+        }
+        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_Time, IMAGEANIMATOERVIEW_SIZE, IMAGEANIMATOERVIEW_SPEED);
+        imageAnimator->Start();
+        imageAnimator->SetRepeat(false);
+        group->Add(imageAnimator);
+
+        imageView = new UIImageView();
+        if (imageView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageView fail");
+            return nullptr;
+        }
+        imageView->SetPosition(IMAGE_ENTER_POSITION_X, IMAGE_ENTER_POSITION_Y); // 30 : offset
+        imageView->SetSrc(PNG_BLOOD_ICON_ENTER);
+        group->Add(imageView);
+
+        return group;
+    }
+}
index 9a7c3a1..9e2eea3 100644 (file)
@@ -7,36 +7,37 @@
 
 #include "BloodOxygenModel.h"
 
-namespace OHOS {
-BloodOxygenModel::BloodOxygenModel()
+namespace OHOS
 {
-    OxygenView = false;
-    BandoffView = false;
-}
+    BloodOxygenModel::BloodOxygenModel()
+    {
+        OxygenView = false;
+        BandoffView = false;
+    }
 
-bool BloodOxygenModel::GetBloodOxygenViewStatus(void)
-{
-    return OxygenView;
-}
+    bool BloodOxygenModel::GetBloodOxygenViewStatus(void)
+    {
+        return OxygenView;
+    }
 
-bool BloodOxygenModel::GetBloodBandoffViewStatus(void)
-{
-    return BandoffView;
-}
+    bool BloodOxygenModel::GetBloodBandoffViewStatus(void)
+    {
+        return BandoffView;
+    }
 
-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;
+    }
 
-BloodOxygenModel *BloodOxygenModel::GetInstance(void)
-{
-    static BloodOxygenModel instance;
-    return &instance;
-}
+    BloodOxygenModel *BloodOxygenModel::GetInstance(void)
+    {
+        static BloodOxygenModel instance;
+        return &instance;
+    }
 }
\ No newline at end of file
index 0646019..2695759 100644 (file)
@@ -4,7 +4,7 @@
  * Author:
  * Create: 2021-08-01
  */
-
+#if 0
 #include "BloodOxygenView.h"
 #include "BloodOxygenModel.h"
 
@@ -415,3 +415,414 @@ namespace OHOS
         return;
     }
 }
+#endif
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: bloodOxygen view
+ * Author:
+ * Create: 2021-08-01
+ */
+
+#include "BloodOxygenView.h"
+#include "BloodOxygenModel.h"
+
+namespace OHOS
+{
+    // 按钮设置
+    static constexpr uint16_t TESTBUTTON_ZERO = 0;
+    static constexpr uint16_t TESTBUTTON_X = 167;
+    static constexpr uint16_t TESTBUTTON_Y = 360;
+
+    // 进度条参数设置
+    static constexpr uint16_t CIRCLE_PROGRESS_VALUE = 100;
+    static constexpr uint16_t CIRCLE_PROGRESS_RADIUS = 43;
+    static constexpr uint16_t CIRCLE_PROGRESS_STARTANGLE = 360;
+    static constexpr uint16_t CIRCLE_PROGRESS_ENDANGLE = 0;
+    static constexpr uint16_t CIRCLE_PROGRESS_WIDTH = 10;
+    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_X = 10;
+    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_Y = 10;
+    static constexpr uint16_t CIRCLE_PROGRESS_CENTER_X = 195;
+    static constexpr uint16_t CIRCLE_PROGRESS_CENTER_Y = 37;
+    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_WIDTH = 275;
+    static constexpr uint16_t CIRCLE_PROGRESS_POSITION_HEIGHT = 130;
+    static constexpr uint16_t CIRCLE_PROGRESS_LEFT = 10;
+    static constexpr uint16_t CIRCLE_PROGRESS_TOP = 5;
+
+    // 动态刷新设置
+    static constexpr uint16_t IMAGE_SIZE = 60;
+    static constexpr uint16_t IMAGE_POSITION_X = 186;
+    static constexpr uint16_t IMAGE_POSITION_Y = 23;
+    static constexpr uint16_t IMAGEANIMATORVIEW_SIZE = 31;
+    static constexpr uint16_t IMAGEANIMATORVIEW_SPEED = 40;
+
+    // 血氧主图设置
+    static constexpr uint16_t IMAGE_PROGRESS_POSITION_X = 176;
+    static constexpr uint16_t IMAGE_PROGRESS_POSITION_Y = 13;
+
+    // 血氧%显示
+    static constexpr uint16_t LABEL_PERCENT_POSITION_X = 258;
+    static constexpr uint16_t LABEL_PERCENT_POSITION_Y = 40;
+
+    // 血氧柱状图
+    static constexpr int16 VIEW_MAX_X = 415;
+    static constexpr int16 VIEW_MIN_X = 35;
+    static constexpr int16 VIEW_MAX_Y = 150;
+    static constexpr int16 VIEW_MIN_Y = 0;
+    static constexpr int16 VIEW_WIDTH = 7;
+    static constexpr int16 VIEW_HEIGHT = 300;
+    static constexpr uint16_t VIEW_BACKGROUND_OPA = 127;
+    static constexpr uint16_t VIEW_BORDER_RADIUS = 5;
+    static constexpr uint16_t BORDER_OPA = 127;
+    static constexpr uint16_t BORDER_WIDTH = 20;
+
+    static constexpr uint16_t TITLE_LABEL_DEFAULT_HEIGHT = 30;
+    static constexpr uint16_t FONT_DEFAULT_SIZE = 20;
+    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 constexpr uint16_t BUTTON_LABEL_SIZE = 40;
+    static constexpr uint8_t BUTTON_STYLE_BORDER_RADIUS_VALUE = 20;
+    static constexpr uint32 BUTTON_STYLE_BACKGROUND_COLOR_VALUE = 0xFFFFFF;
+    static constexpr uint16_t BUTTON_WIDHT2 = 120;
+    static constexpr uint16_t BUTTON_HEIGHT2 = 60;
+
+    // 字体大小
+    static constexpr uint16_t PERCENT_FONT_SIZE = 25;
+
+    static constexpr uint16_t MATH_ZERO = 0;
+
+    static BloodOxygenView *g_pMainView = nullptr;
+    static ImageAnimatorInfo g_imageAnimatorInfo_new[31] = {
+        {PNG_BLOOD_FLOW_IMAGE_0, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_1, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_2, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_3, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_4, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_5, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_6, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_7, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_8, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_9, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_10, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_11, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_12, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_13, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_14, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_15, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_16, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_17, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_18, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_19, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_20, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_21, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_22, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_23, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_24, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_25, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_26, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_27, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_28, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_29, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+        {PNG_BLOOD_FLOW_IMAGE_30, {IMAGE_POSITION_X, IMAGE_POSITION_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+    };
+
+    BloodOxygenView::BloodOxygenView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::BloodOxygenView");
+        imageViewMain = nullptr;
+        imageViewProgress = nullptr;
+        group = nullptr;
+        percent = nullptr;
+        testButton = nullptr;
+        circleProgress = nullptr;
+        imageAnimator = nullptr;
+        g_pMainView = this;
+        bloodbandoff = new BloodBandoffView();
+        if (bloodbandoff == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new BloodBandoffView fail");
+        }
+    }
+
+    BloodOxygenView::~BloodOxygenView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::~BloodOxygenView");
+        group->RemoveAll();
+        delete imageViewMain;
+        delete imageViewProgress;
+        delete group;
+        delete testButton;
+        delete percent;
+        delete circleProgress;
+        delete imageAnimator;
+        delete bloodbandoff;
+        imageViewMain = nullptr;
+        imageViewProgress = nullptr;
+        group = nullptr;
+        percent = nullptr;
+        testButton = nullptr;
+        circleProgress = nullptr;
+        imageAnimator = nullptr;
+        g_pMainView = nullptr;
+        bloodbandoff = nullptr;
+    }
+
+    BloodOxygenView *BloodOxygenView::GetInstance(void)
+    {
+        return g_pMainView;
+    }
+
+    UILabel *BloodOxygenView::GetPercent()
+    {
+        return percent;
+    }
+
+    UIViewGroup *BloodOxygenView::GetBloodOxygenGroup()
+    {
+        return group;
+    }
+
+    UILabelButton *BloodOxygenView::GetTestButton()
+    {
+        return testButton;
+    }
+
+    UICircleProgress *BloodOxygenView::GetCircleProgress()
+    {
+        return circleProgress;
+    }
+
+    UILabelButton *BloodOxygenView::CreateAndSetUIButton(const char *title)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUIButton");
+        UILabelButton *btn = new UILabelButton();
+        if (btn == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UILabelButton fail");
+            return nullptr;
+        }
+        btn->SetPosition(TESTBUTTON_X, TESTBUTTON_Y, BUTTON_WIDHT2, BUTTON_HEIGHT2);
+        btn->SetText(title);
+        btn->SetTextColor(Color::Red());
+        btn->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_LABEL_SIZE);
+        btn->SetAlign(TEXT_ALIGNMENT_CENTER);
+        btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::RELEASED);
+        btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::PRESSED);
+        btn->SetStyleForState(STYLE_BORDER_RADIUS, BUTTON_STYLE_BORDER_RADIUS_VALUE, UIButton::INACTIVE);
+        btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::RELEASED);
+        btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::PRESSED);
+        btn->SetStyleForState(STYLE_BACKGROUND_COLOR, BUTTON_STYLE_BACKGROUND_COLOR_VALUE, UIButton::INACTIVE);
+        UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::BloodOxygenPresenter::GetInstance();
+        if (clickLeftListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new clickLeftListener fail");
+            return nullptr;
+        }
+        btn->SetOnClickListener(clickLeftListener);
+        return btn;
+    }
+
+    bool BloodOxygenView::SetOnDragListener()
+    {
+        UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::BloodOxygenPresenter::GetInstance();
+        if (dragListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnDragListener fail");
+            return false;
+        }
+        group->SetDraggable(true);
+        group->SetTouchable(true);
+        group->SetOnDragListener(dragListener);
+        return true;
+    }
+
+    UIView *BloodOxygenView::CreateAndSetUIView(int16 x, int16 y) const
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUIView");
+        UIView *view = new UIView();
+        if (view == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new View fail");
+            return nullptr;
+        }
+        if (x > VIEW_MAX_X || x < VIEW_MIN_X)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::X error");
+            return nullptr;
+        }
+        if (y < VIEW_MIN_Y || y > VIEW_MAX_Y)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::Y error");
+            return nullptr;
+        }
+        view->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
+        view->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BACKGROUND_OPA); // 127 : background opacity
+        view->SetStyle(STYLE_BORDER_RADIUS, VIEW_BORDER_RADIUS);   // 5 : radius value
+        view->SetStyle(STYLE_BORDER_COLOR, Color::Gray().full);
+        view->SetStyle(STYLE_BORDER_OPA, BORDER_OPA);     // 127 : border opacity
+        view->SetStyle(STYLE_BORDER_WIDTH, BORDER_WIDTH); // 20 : border width
+        view->SetStyle(STYLE_PADDING_LEFT, MATH_ZERO);
+        view->SetStyle(STYLE_PADDING_RIGHT, MATH_ZERO);
+        view->SetStyle(STYLE_PADDING_TOP, MATH_ZERO);
+        view->SetStyle(STYLE_PADDING_BOTTOM, MATH_ZERO);
+        view->SetStyle(STYLE_MARGIN_LEFT, MATH_ZERO);
+        view->SetStyle(STYLE_MARGIN_RIGHT, MATH_ZERO);
+        view->SetStyle(STYLE_MARGIN_TOP, MATH_ZERO);
+        view->SetStyle(STYLE_MARGIN_BOTTOM, MATH_ZERO);
+
+        view->SetPosition(x, VIEW_HEIGHT - y);
+        view->SetStyle(STYLE_BORDER_WIDTH, MATH_ZERO);
+        view->SetStyle(STYLE_BORDER_RADIUS, MATH_ZERO); // 2 : half width 10 : offset
+        view->Resize(VIEW_WIDTH, y);
+        return view;
+    }
+
+    UICircleProgress *BloodOxygenView::CreateAndSetUICircleProgress()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::CreateAndSetUICircleProgress");
+        UICircleProgress *circle = new UICircleProgress();
+        circle->SetPosition(CIRCLE_PROGRESS_POSITION_X, CIRCLE_PROGRESS_POSITION_Y,
+                            CIRCLE_PROGRESS_POSITION_WIDTH, CIRCLE_PROGRESS_POSITION_HEIGHT);
+        circle->SetCenterPosition(CIRCLE_PROGRESS_CENTER_X, CIRCLE_PROGRESS_CENTER_Y);
+        circle->SetRadius(CIRCLE_PROGRESS_RADIUS);
+        circle->SetValue(CIRCLE_PROGRESS_VALUE);
+        circle->SetBackgroundStyle(STYLE_LINE_WIDTH,
+                                   circle->GetBackgroundStyle(STYLE_LINE_WIDTH) + CIRCLE_PROGRESS_WIDTH);
+        circle->SetForegroundStyle(STYLE_LINE_WIDTH,
+                                   circle->GetForegroundStyle(STYLE_LINE_WIDTH) + CIRCLE_PROGRESS_WIDTH);
+        circle->SetStyle(STYLE_PADDING_LEFT, CIRCLE_PROGRESS_LEFT);
+        circle->SetStyle(STYLE_PADDING_TOP, CIRCLE_PROGRESS_TOP);
+        circle->SetStartAngle(CIRCLE_PROGRESS_STARTANGLE);
+        circle->SetEndAngle(CIRCLE_PROGRESS_ENDANGLE);
+        circle->SetImage(nullptr, PNG_PROGRESS_BAR_TMAGE);
+        circle->SetLineColor(Color::Black());
+
+        return circle;
+    }
+
+    bool BloodOxygenView::InitImageDisplay()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::InitImageDisplay");
+        imageViewMain = new UIImageView();
+        if (imageViewMain == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");
+            return false;
+        }
+        imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 :  offset
+        imageViewMain->SetSrc(PNG_BLOODOXYGEN_IMAGE_PATH);
+        group->Add(imageViewMain);
+
+        imageAnimator = new UIImageAnimatorView();
+        if (imageAnimator == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageAnimatorView fail");
+            return false;
+        }
+        imageAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_new, IMAGEANIMATORVIEW_SIZE, IMAGEANIMATORVIEW_SPEED);
+        imageAnimator->Start();
+        imageAnimator->SetRepeat(true);
+        group->Add(imageAnimator);
+
+        imageViewProgress = new UIImageView();
+        if (imageViewProgress == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new UIImageView fail");
+            return false;
+        }
+        imageViewProgress->SetPosition(IMAGE_PROGRESS_POSITION_X, IMAGE_PROGRESS_POSITION_Y); // 30 :  offset
+        imageViewProgress->SetSrc(PNG_PROGRESS_BAR_TMAGE);
+        group->Add(imageViewProgress);
+
+        return true;
+    }
+
+    void BloodOxygenView::OnStart()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnStart");
+        View<BloodOxygenPresenter>::OnStart();
+
+        group = new UIViewGroup();
+        if (group == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new group fail");
+            return;
+        }
+        group->SetPosition(MATH_ZERO, MATH_ZERO);
+        group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+
+        if (InitImageDisplay() == false)
+        {
+            return;
+        }
+
+        if (SetOnDragListener() == false)
+        {
+            return;
+        }
+
+        circleProgress = CreateAndSetUICircleProgress();
+        if (circleProgress == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new circleProgress fail");
+            return;
+        }
+        group->Add(circleProgress);
+
+        percent = new UILabel();
+        if (percent == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Label fail");
+            return;
+        }
+        percent->SetPosition(LABEL_PERCENT_POSITION_X, LABEL_PERCENT_POSITION_Y,
+                             VIEW_DISTANCE_TO_LEFT_SIDE, TITLE_LABEL_DEFAULT_HEIGHT);
+        percent->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT);
+        percent->SetText("%97");
+        percent->SetFont(DEFAULT_VECTOR_FONT_FILENAME, PERCENT_FONT_SIZE);
+        percent->SetTextColor(Color::Red());
+        group->Add(percent);
+
+        testButton = CreateAndSetUIButton("测试");
+        if (testButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::new Button fail");
+            return;
+        }
+        group->Add(testButton);
+
+        if (OHOS::BloodOxygenModel::GetInstance()->GetBloodOxygenViewStatus() == true)
+        {
+            testButton->SetTouchable(false);
+            percent->SetText("");
+        }
+
+        BloodBandoffView::GetInstance()->CreateUIViewGroup();
+
+        RootView::GetInstance()->Add(group);
+        RootView::GetInstance()->Add(BloodBandoffView::GetInstance()->GetBandoffViewGroup());
+        BloodBandoffView::GetInstance()->GetBandoffViewGroup()->SetVisible(false);
+    }
+
+    void BloodOxygenView::OnSetUpView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnSetUpView");
+        View<BloodOxygenPresenter>::OnSetUpView();
+        Draw();
+    }
+
+    void BloodOxygenView::OnTearDownView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnTearDownView");
+        View<BloodOxygenPresenter>::OnTearDownView();
+        return;
+    }
+
+    void BloodOxygenView::OnStop()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BloodOxygenView::OnStop");
+        View<BloodOxygenPresenter>::OnStop();
+        RootView::GetInstance()->RemoveAll();
+        return;
+    }
+}
index 1b662df..85879b0 100644 (file)
@@ -19,7 +19,7 @@ namespace OHOS
         DialUpdateModel &operator=(const DialUpdateModel &);
         virtual ~DialUpdateModel();
 
-        std::string dialConfigPath = "user/res/dials/dog.bin";; // Member variable to store the dial configuration path
+        std::string dialConfigPath = "user/res/dials/galaxy.bin";; // Member variable to store the dial configuration path
     };
 }
 
index 4ff6081..545d6ef 100644 (file)
@@ -31,8 +31,10 @@ enum class DialDataType
     DATA_TYPE_TIME_WEEK,      // 星期
     DATA_TYPE_TIME_MONTH,     // 月份
     DATA_TYPE_TIME_YEAR,      // 年份
-    DATA_TYPE_CHARGE,         // 充电状态
-    DATA_TYPE_DIALPATH,       // 表盘路径
+    /* ------------------------------- 在下面增加新数据类型 ------------------------------- */
+    DATA_TYPE_CHARGE,   // 充电状态
+    DATA_TYPE_DIALPATH, // 表盘路径
+    DATA_TYPE_SPO2,     // 血氧
 
     DATA_TYPE_MULTI_FLOAT_BASE = 0x2fff, // 多个浮点数据类型基值
 
diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h
new file mode 100644 (file)
index 0000000..0da9a52
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
+ * Description: DialModelSPO2
+ * Author:
+ * Create: 2023-12
+ */
+
+#ifndef DIAL_MODEL_SPO2_H
+#define DIAL_MODEL_SPO2_H
+
+#include "DialBaseModel.h"
+
+namespace OHOS
+{
+    class DialModelSPO2 : public DialBaseModel
+    {
+    public:
+        DialModelSPO2() {}
+        virtual ~DialModelSPO2() {}
+        static DialModelSPO2 *GetInstance()
+        {
+            static DialModelSPO2 instance;
+            return &instance;
+        }
+        bool GetDialFloatData(DialDataType &type, float &out) override;
+        void UpdateSPO2(int16_t SPO2);
+
+    private:
+        float SPO2_ = 97.0; // 97.0: default SPO2 value as reference
+    };
+}
+#endif
index 3dea6b5..9f8adde 100644 (file)
@@ -20,17 +20,18 @@ namespace OHOS
     bool DialModelPower::GetDialFloatData(DialDataType &type, float &out)
     {
         (void)type;
-#if 0
+#if 1
         if (power_ == 0)
         {
             UpdatePower();
+            return true;
         }
 #endif
         // 获取电池电压值
         float voltage = 0.0F;
-        power_ = battery_get_voltage(&voltage);//进度条0.1~1;电量1~100
+        power_ = battery_get_voltage(&voltage); // 进度条0.1~1;电量1~100
         out = static_cast<float>(power_);
-        //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialFloatData %d", power_);
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialFloatData %d", power_);
         return true;
     }
     void DialModelPower::UpdatePower()
diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelSPO2.cpp
new file mode 100644 (file)
index 0000000..0060916
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
+ * Description: DialModelSPO2
+ * Author:
+ * Create: 2023-12
+ */
+
+#include "RegisterDialModel.h"
+#include "DialModelSPO2.h"
+
+REGIST_DIAL_MODULE(DialDataType::DATA_TYPE_SPO2, OHOS::DialModelSPO2::GetInstance());
+
+namespace OHOS
+{
+    bool DialModelSPO2::GetDialFloatData(DialDataType &type, float &out)
+    {
+        (void)type;
+        out = SPO2_;
+        return true;
+    }
+
+    void DialModelSPO2::UpdateSPO2(int16_t SPO2)
+    {
+        SPO2_ = static_cast<float>(SPO2);
+        if (onChangeListener_ != nullptr)
+        {
+            onChangeListener_->OnDialFloatDataUpdate(DialDataType::DATA_TYPE_SPO2, SPO2_);
+        }
+    }
+}
index 3125dbb..ff999c9 100755 (executable)
@@ -18,6 +18,7 @@
 #include "AlarmPopUpPresenter.h"
 #include "DialModelCharge.h"
 #include "DialModelHeartRate.h"
+#include "DialModelSPO2.h"
 #include "CallerLogModel.h"
 #include "notification_manager.h"
 #include "NativeAbility.h"
@@ -185,17 +186,18 @@ void MsgCenterNotifyHfpWatchProc(const Topic topic, Request* req)
 }
 #ifdef SUPPORT_SPO2_NOTIFICATION_TEST
 
-
+//血氧
 void MsgCenterNotifySPO2hProc(const Topic topic, Request* req)
 {
     unused(topic);
     unused(req);
     if (topic == TOPIC_EVENT_SPO2_UPDATE && req != nullptr && req->data != nullptr)
     {
-        u_int8_t sp02 = *((u_int8_t*)(req->data)); // 进行类型转换
-        DialModelHeartRate::GetInstance()->UpdateHeartRate(sp02);
+        //u_int8_t sp02 = *((u_int8_t*)(req->data)); // 进行类型转换
+        //DialModelSPO2::::GetInstance()->UpdateSPO2(sp02);
     }
 }
+//穿戴状态
 void MsgCenterNotifyWearStateProc(const Topic topic, Request* req)
 {
     unused(topic);
@@ -205,19 +207,15 @@ void MsgCenterNotifyWearStateProc(const Topic topic, Request* req)
         // req->msgId 
     }
 }
+//心率
 void MsgCenterNotifyHeartRateProc(const Topic topic, Request* req)
 {
     unused(topic);
     unused(req);
-    if ( topic == TOPIC_EVENT_HEARTRATE_UPDATA)
+    if (topic == TOPIC_EVENT_HEARTRATE_UPDATA && req != nullptr && req->data != nullptr)
     {
-        #if 0
-        // req->msgId 
-        if (OHOS::DialModelHeartRate::GetInstance()!=NULL)
-        {
-            OHOS::DialModelHeartRate::GetInstance()->UpdateHeartRate();
-        }
-        #endif
+        //u_int8_t heart = *((u_int8_t*)(req->data)); // 进行类型转换
+        //DialModelHeartRate::GetInstance()->UpdateHeartRate(heart);
     }
 }
 #endif
index b775322..a1b6c79 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/KUMI.bin and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/KUMI.bin differ
index ffefc97..70ec050 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/dog.bin and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/dog.bin differ
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/galaxy.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/galaxy.bin
new file mode 100644 (file)
index 0000000..3ee99ef
Binary files /dev/null and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dials/galaxy.bin differ
index 891b0ab..c2a3a88 100644 (file)
@@ -112,7 +112,7 @@ void CustomEventPublish(uint16_t topic, uint8_t *data , uint32_t size)
 
 errcode_t update_spo2_event_notify(uint8_t spo2)
 {
-   
+
     CustomEventPublish(TOPIC_EVENT_SPO2_UPDATE,(uint8_t*)&spo2,sizeof(spo2));
     return 0;
 }