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