From: Caisking <3449750381@qq.com> Date: Wed, 6 Mar 2024 10:24:06 +0000 (+0800) Subject: 1.优化心率血氧的初始化显示;2.搭建心率检测流程 X-Git-Tag: release_V1.2.70_20241020_135402~1274^2~25 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=2a9ffe4675bd3d828342fd131d275109b93e138a;p=mirrors%2FFD230.git 1.优化心率血氧的初始化显示;2.搭建心率检测流程 --- diff --git a/code/sdk/application/wearable/fd230app/CMakeLists.txt b/code/sdk/application/wearable/fd230app/CMakeLists.txt index 6de55db57..761d9657d 100644 --- a/code/sdk/application/wearable/fd230app/CMakeLists.txt +++ b/code/sdk/application/wearable/fd230app/CMakeLists.txt @@ -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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp index 148a07a12..198257f03 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp @@ -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 +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp index 22f8c9576..0ec393d28 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenView.cpp @@ -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); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp index f2d6d526a..c2be257cd 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/src/BloodCardView.cpp @@ -62,9 +62,15 @@ namespace OHOS // Set additional property bloodoxygen = BloodOxygenModel::GetInstance()->GetSPO2data(); - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSPO2Data %d", bloodoxygen); - std::string bloodoxygenStr = std::to_string(bloodoxygen); - bloodLabel->SetText(bloodoxygenStr.c_str()); + if (bloodoxygen != 0) + { + std::string bloodoxygenStr = std::to_string(bloodoxygen); + bloodLabel->SetText(bloodoxygenStr.c_str()); + } + else + { + bloodLabel->SetText("--"); + } bloodLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); bloodLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); bloodLabel->SetRollSpeed(0); @@ -73,7 +79,7 @@ namespace OHOS // Add to rootView Add(bloodLabel); - /* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ timeLabel = new UILabel(); if (timeLabel == nullptr) { @@ -81,15 +87,21 @@ namespace OHOS return false; } timeLabel->SetPosition(90, 300); // widget's left position and top position - timeLabel->Resize(280, 100); // widget's width and height - timeLabel->SetViewId("label1"); // Set style + timeLabel->Resize(280, 100); // widget's width and height + timeLabel->SetViewId("label1"); // Set style timeLabel->SetStyle(STYLE_TEXT_FONT, 30); - /* -------------------------------------------------------------------------- */ - // 更新时间 - 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()); + if (bloodoxygen != 0) + { + // 更新时间 + 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 + { + timeLabel->SetText("暂无测量记录"); + } /* -------------------------------------------------------------------------- */ timeLabel->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); timeLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h index e69de29bb..060059ee4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h @@ -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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h index 26c62b0fd..3a7379f0b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h @@ -34,7 +34,7 @@ namespace OHOS UIScrollView *HeartCheckViewInit(); UIImageAnimatorView *GetImageAnimator(); UILabelButton *CreateAndSetUIButton(const char *title); - void UpHeartText(); + void UpShowHeartText(); private: UIImageAnimatorView *imageAnimator; diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index 59aa389ed..246d0476b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -112,9 +112,12 @@ extern "C" bool GetHeartViewStatus(void); bool GetHeartBandoffViewStatus(void); bool GetHeartCheckViewStatus(void); + bool GetHeartResultViewStaus(void); + void SetHeartViewStatus(bool HeartViewStatus); void SetHeartBandoffViewStatus(bool bandoffViewStatus); void SetHeartCheckViewStatus(bool checkViewStatus); + void SetHeartResultViewStatus(bool resultViewStatus); bool GetCheckStatus(); void SetCheckStatus(bool checkstatus); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h index 213e4e879..0de763603 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h @@ -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, - public UIView::OnClickListener, - public RootView::OnKeyActListener, - public ModelListenerSample, - public UIView::OnDragListener + public UIView::OnClickListener, + public RootView::OnKeyActListener, + public ModelListenerSample, + public UIView::OnDragListener { public: HeartPresenter(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h index 0869abbbc..59bf6e80e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h @@ -26,7 +26,7 @@ namespace OHOS { class HeartPresenter; - //class HeartBandoffView; + class HeartBandoffView; class HeartCheckView; class HeartResultView; class HeartView : public View @@ -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; // 获取系统亮屏时间暂存 }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp index e69de29bb..59af17ed0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp @@ -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; + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp index ab72cc08c..3f44ae496 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp @@ -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_); diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index 99f61242b..fe9bc7c7f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -472,17 +472,17 @@ namespace OHOS } } } - bool HeartModel::GetHeartViewStatus(void) + bool HeartModel::GetHeartViewStatus() { return HeartView; } - bool HeartModel::GetHeartBandoffViewStatus(void) + bool HeartModel::GetHeartBandoffViewStatus() { return BandoffView; } - bool HeartModel::GetHeartCheckViewStatus(void) + bool HeartModel::GetHeartCheckViewStatus() { return CheckView; } @@ -492,9 +492,19 @@ namespace OHOS BandoffView = bandoffViewStatus; } - void HeartModel::SetHeartViewStatus(bool HeartViewStatus) + bool HeartModel::GetHeartResultViewStaus() { - HeartView = HeartViewStatus; + return ResultView; + } + + void HeartModel::SetHeartResultViewStatus(bool resultViewStatus) + { + ResultView = resultViewStatus; + } + + void HeartModel::SetHeartViewStatus(bool heartViewStatus) + { + HeartView = heartViewStatus; } void HeartModel::SetHeartCheckViewStatus(bool checkViewStatus) @@ -502,38 +512,37 @@ namespace OHOS CheckView = checkViewStatus; } - /* -------------------------------------------------------------------------- */ - // 获取检测状态 bool HeartModel::GetCheckStatus() { return CheckStatus; } - // 设置检测状态 - void HeartModel::SetCheckStatus(bool checkstatus) + + void HeartModel::SetCheckStatus(bool checkStatus) { - CheckStatus = checkstatus; + CheckStatus = checkStatus; } + uint16_t HeartModel::GetHeartdata() { return Heart_; } + uint16_t HeartModel::GetShowHeartdata() { return Show_Heart_; } + void HeartModel::UpHeartdata(uint16_t heart) { - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpHeartdata Heart:%d->%d", Heart_, heart); Show_Heart_ = heart; - // 筛选有效信息 if (Show_Heart_ != 0) { Heart_ = heart; } } + uint16_t HeartModel::GetCheckTime() { - // 第一次进入,默认刚刚测试 if (initstatus) { TIME_ = HeartPresenter::GetInstance()->GetCurrentTime(); @@ -541,9 +550,9 @@ namespace OHOS } return TIME_; } + void HeartModel::SetCheckTime(uint16_t time) { TIME_ = time; } - /* -------------------------------------------------------------------------- */ } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp index 801111ff5..faa4d4bf3 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp @@ -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 -#include "iostream" +#include #include #include #include @@ -22,17 +12,20 @@ #include "wearable_log.h" #include "cmsis_os.h" #include "securec.h" -#include "broadcast_service.h" #include "graphic_service.h" #include #include #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) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp index 8dcd0e558..d4197111c 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp @@ -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}, }; 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 index da9662f2a..54f3cc2b7 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelSPO2.h @@ -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 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dialupdate/KUMI.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/dialupdate/KUMI.bin index df8ecd7b4..5532379ee 100644 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