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, // 省电模式界面
VIEW_DIALING_METHOD, // 拨号方式
VIEW_TEST, // 测试
VIEW_GOAL, // 每日目标
- VIEW_CALCULATOR, //计算器
+ VIEW_CALCULATOR, // 计算器
/* -------------------------------------------------------------------------- */
#ifdef SUPPORT_ALIPAY_SEC
VIEW_MAIN_ALIPAY,
void InitBloodSlice(void);
void InitCheckAbnormalSlice(void);
void InitCheckInvalidSlice(void);
+ void InitHeartResultSlice(void);
+ void InitHeartCheckSlice(void);
void InitBloodResultSlice(void);
void InitBloodCheckSlice(void);
void InitHeartSlice(void);
STR_MOTION_DETECTION_NOTE = 490,\r
STR_PE4GC = 491,\r
STR_OBU_MESSAGE = 492,\r
- STR_MAX_ID = 493,\r
+ STR_CHARGE = 493,\r
+ STR_CHARGE_NOTE = 494,\r
+ STR_MAX_ID = 495,\r
}; // UIResourceTextId\r
\r
enum FontLanguageId : uint8_t {\r
- LANGUAGE_ID_EN,\r
LANGUAGE_ID_ZH,\r
+ LANGUAGE_ID_EN,\r
LANGUAGE_ID_MAX\r
}; // UITextLanguageTextId\r
}\r
#include "ApplistView.h"
#include "ApplistPresenter.h"
-#include "HeartPresenter.h"
#include "CallerLogView.h"
#include "CallerLogPresenter.h"
#include "MainCallingView.h"
#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"
{VIEW_MAIN_PHONE, &NativeLauncher::InitMainPhoneSlice},
{VIEW_DIALING_METHOD, &NativeLauncher::InitDialingMethodSlice},
{VIEW_TEST, &NativeLauncher::InittestSlice},
- {VIEW_CALCULATOR,&NativeLauncher::InitCalculatorSlice},
+ {VIEW_CALCULATOR, &NativeLauncher::InitCalculatorSlice},
/* -------------------------------------------------------------------------- */
/* ----------------------------------- 训练 ----------------------------------- */
{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},
/*添加卡片*/
}
NativeAbility::GetInstance().AddSliceProxy(VIEW_ALARM_POP_UP, alarmPopUpView);
}
- void NativeLauncher::InitHeartSlice(void)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::HeartSlice");
- SliceProxy *heartView = new AbilitySliceProxy<HeartView, HeartPresenter>;
- 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");
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)
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<HeartDetectionView, HeartDetectionPresenter>;
+ 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<HeartResultView, HeartResultPresenter>;
+ if (heartResultView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartResultView is nullptr");
+ return;
+ }
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_RESULT, heartResultView);
}
/* -------------------------------------------------------------------------- */
// 查找手机
#include "applist/include/ApplistModel.h"
#include "themestyle/include/ThemeStyleModel.h"
-#define HEART_APPLIST 0
+#define HEART_APPLIST 1
namespace OHOS
{
/**- APPLSIT
#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},
+++ /dev/null
-/***
- * @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
+++ /dev/null
-/***
- * @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<HeartPresenter>
- {
- 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
--- /dev/null
+/***
+ * @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<HeartDetectionView>,
+ 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
--- /dev/null
+/***
+ * @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<HeartDetectionPresenter>
+ {
+ 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
INITIATIVE, // 主动检测心率\r
EXERCISE, // 运动心率\r
};\r
+ enum class HeartResult\r
+ {\r
+ NOT_TESTED = 0, // 未检测\r
+ SUCCESS, // 检测成功\r
+ NOT_WORN, // 未佩戴检测\r
+ TIMEOUT, // 检测超时\r
+ HIGH_RESULT, // 检测结果过高\r
+ LOW_RESULT, // 检测结果过低\r
+ INVALID_DATA // 无效数据\r
+ };\r
// 控制心率检测\r
typedef struct\r
{\r
void SetHeartRatePerSec(uint32_t sec);\r
uint16_t GetHeartRateMax(void);\r
uint16_t GetHeartRateMin(void);\r
+ /* -------------------------------------------------------------------------- */\r
+ void UpHeartdata(uint16_t heart);\r
+ uint16_t GetHeartdata();\r
+ uint16_t GetShowHeartdata();\r
\r
- bool GetHeartViewStatus(void);\r
- bool GetHeartBandoffViewStatus(void);\r
- bool GetHeartCheckViewStatus(void);\r
- bool GetHeartResultViewStaus(void);\r
-\r
- void SetHeartViewStatus(bool HeartViewStatus);\r
- void SetHeartBandoffViewStatus(bool bandoffViewStatus);\r
- void SetHeartCheckViewStatus(bool checkViewStatus);\r
- void SetHeartResultViewStatus(bool resultViewStatus);\r
+ uint16_t GetIndex();\r
+ void SetIndex(uint16_t index);\r
\r
- bool GetCheckStatus();\r
- void SetCheckStatus(bool checkstatus);\r
+ uint32_t GetCheckTime(void);\r
+ void SetCheckTime(uint32_t time);\r
void SetWearStatus(int32_t wear);\r
- bool GetWearStatus(void);\r
+ void SetResult(HeartResult result);\r
+ HeartResult GetResult();\r
\r
- void Heart_Start();\r
- void Heart_Stop();\r
- void UpHeartdata(uint16_t heart);\r
+ void Heart_Start(void);\r
+ void Heart_Stop(void);\r
+ void Heart_Save(void);\r
+ void Heart_Result(void);\r
\r
- uint16_t GetHeartdata();\r
- uint16_t GetShowHeartdata();\r
- uint64_t GetCheckTime(); // 获取距离上传测试时间\r
- void SetCheckTime(uint64_t time); // 设置本次测试完的时间\r
- uint16_t GetIndex(); // 测试点位\r
- void SetIndex(uint16_t index);\r
void Heart_Control(HeartState state, HeartCheck check);\r
void ReInit();\r
\r
bool wearStatus{true};\r
uint16_t index_ = 0;\r
\r
- bool HeartView;\r
- bool BandoffView;\r
- bool CheckView;\r
- bool ResultView;\r
- bool CheckStatus; // 检测状态标志\r
- uint16_t Show_Heart_; // 显示心率\r
- uint16_t Heart_; // 保存心率\r
- uint32 TIME_; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+ uint16_t displayheart; // 显示心率\r
+ uint16_t currentheart; // 保存心率\r
+ uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
\r
bool initstatus = true;\r
bool heartstate = false;\r
- uint8_t wear_;\r
- uint8_t valid_counter_ = 0; // 有效数计数器\r
- uint8_t disvalid_counter_ = 0; // 无效数计数器\r
- uint8_t unwear_counter_ = 0; // 佩戴错误计数器\r
+ bool sensorstate{false};\r
+\r
+ uint16_t wear_;\r
+ uint16_t valid_counter_ = 0; // 有效数计数器\r
+ uint16_t disvalid_counter_ = 0; // 无效数计数器\r
+ uint16_t unwear_counter_ = 0; // 佩戴错误计数器\r
\r
- HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
+ HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
+ HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
};\r
}\r
\r
+++ /dev/null
-/*
- * 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<HeartView>,
- 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
--- /dev/null
+/***
+ * @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<HeartResultView>,
+ 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
-/*
- * 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
#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<HeartPresenter>
+ class HeartResultPresenter;
+ class HeartResultView : public View<HeartResultPresenter>
{
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
+++ /dev/null
-/*
- * 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<HeartPresenter>
- {
- 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
+++ /dev/null
-
-/*
- * 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;
- }
-}
+++ /dev/null
-
-
-#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;
- }
-}
--- /dev/null
+/*
+ * 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<HeartDetectionView>::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<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
+ {
+ NavigateBack();
+ }
+ return true;
+ }
+}
--- /dev/null
+/***
+ * @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<HeartDetectionPresenter>::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<HeartDetectionPresenter>::OnSetUpView();
+ if (imageAnimator != nullptr)
+ {
+ imageAnimator->Start();
+ }
+ Draw();
+ }
+ void HeartDetectionView::OnTearDownView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnTearDownView");
+ View<HeartDetectionPresenter>::OnTearDownView();
+ return;
+ }
+
+ void HeartDetectionView::OnStop()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartDetectionView::OnStop");
+ View<HeartDetectionPresenter>::OnStop();
+ if (container_ != nullptr)
+ {
+ container_->RemoveAll();
+ delete container_;
+ container_ = nullptr;
+ }
+ return;
+ }
+}
#include "IndoorWalkPreparedView.h"\r
#include "IndoorWalkPresenter.h"\r
#include "MainViewSample.h"\r
+\r
#include "heartrate/include/HeartRateView.h"\r
+#include "heartrate/include/HeartDetectionPresenter.h"\r
+#include "heartrate/include/HeartResultPresenter.h"\r
+\r
#include <iostream>\r
#include <random>\r
-#include "heartrate/include/HeartView.h"\r
-#include "heartrate/include/HeartPresenter.h"\r
#include "DialModelHeartRate.h"\r
#include "health_service.h"\r
#include "custom_utils.h"\r
{\r
#endif\r
\r
-#define MAX_UNWEAR_COUNT 20\r
+#define MAX_UNWEAR_COUNT 30\r
#define MAX_VALID_HRS_COUNT 40\r
-#define MAX_DISVALID_HRS_COUNT 40\r
+#define MAX_DISVALID_HRS_COUNT 70\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
+\r
/* 佩戴检测结果 */\r
enum\r
{\r
HeartModel::HeartModel()\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
- HeartView = false;\r
- BandoffView = false;\r
- CheckView = false;\r
- ResultView = false;\r
- CheckStatus = false;\r
- wearStatus = true;\r
-\r
HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
if (data != nullptr)\r
{\r
- Heart_ = data->Heart;\r
- TIME_ = data->timestamp;\r
+ currentheart = data->Heart;\r
+ timestamp_ms = data->timestamp;\r
delete data;\r
}\r
else\r
{\r
- Heart_ = 0;\r
- TIME_ = 0;\r
+ currentheart = 0;\r
+ timestamp_ms = 0;\r
}\r
}\r
\r
// 重新初始化\r
void HeartModel::ReInit()\r
{\r
- Heart_ = 0;\r
- TIME_ = 0;\r
+ currentheart = 0;\r
+ timestamp_ms = 0;\r
+ }\r
+ // 获取心率数据\r
+ uint16_t HeartModel::GetHeartdata()\r
+ {\r
+ return currentheart;\r
+ }\r
+\r
+ uint16_t HeartModel::GetShowHeartdata()\r
+ {\r
+ return displayheart;\r
+ }\r
+\r
+ uint32_t HeartModel::GetCheckTime()\r
+ {\r
+ return timestamp_ms;\r
}\r
\r
+ void HeartModel::SetCheckTime(uint32_t time)\r
+ {\r
+ timestamp_ms = time;\r
+ }\r
+ void HeartModel::SetResult(HeartResult result)\r
+ {\r
+ heartresult_ = result;\r
+ }\r
+ HeartResult HeartModel::GetResult()\r
+ {\r
+ return heartresult_;\r
+ }\r
// 控制心率检测\r
void HeartModel::Heart_Control(HeartState state, HeartCheck check)\r
{\r
checkstate = check;\r
}\r
}\r
+ // 开始检测\r
void HeartModel::Heart_Start()\r
{\r
+ displayheart = 0;\r
+ SetResult(HeartResult::NOT_TESTED); // 成功检测\r
// 进行初始化操作\r
- SetCheckStatus(true);\r
+ if (!sensorstate)\r
+ {\r
+ Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+ sensorstate = true;\r
+ }\r
}\r
\r
+ // 结束检测\r
void HeartModel::Heart_Stop()\r
{\r
valid_counter_ = 0;\r
- unwear_counter_ = 0;\r
disvalid_counter_ = 0;\r
- SetCheckStatus(false);\r
- SetWearStatus(1);\r
+ unwear_counter_ = 0;\r
+\r
+ if (sensorstate)\r
+ {\r
+ Heart_Control(HeartState::End, HeartCheck::INITIATIVE);\r
+ sensorstate = false;\r
+ Heart_Result(); // 处理结果\r
+ }\r
}\r
+ // 保存检测数据\r
+ void HeartModel::Heart_Save()\r
+ {\r
+ HeartRateData data;\r
+ data.Heart = currentheart;\r
+ data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
+ SetCheckTime(data.timestamp);\r
+ HealthService::GetInstance()->UpdateHealthData(data);\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentheart, data.timestamp);\r
+ }\r
+\r
+ // 显示检测结果// 显示检测结果\r
+ void HeartModel::Heart_Result()\r
+ {\r
+ // 心率提醒(0开 1关)\r
+ uint8_t HeartState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
+ uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
+\r
+ if (HeartState)\r
+ {\r
+ // 检查当前心率是否高于或低于阈值\r
+ uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
+\r
+ if (ThresholdState == 0 && currentheart < ThresholdValue)\r
+ {\r
+ // 当前心率低于阈值\r
+ heartresult_ = HeartResult::LOW_RESULT;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
+ }\r
+ else if (ThresholdState == 1 && currentheart > ThresholdValue)\r
+ {\r
+ // 当前心率高于阈值\r
+ heartresult_ = HeartResult::HIGH_RESULT;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
+ }\r
+ }\r
\r
+ // 根据结果进行处理\r
+ switch (heartresult_)\r
+ {\r
+ case HeartResult::SUCCESS:\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
+ Heart_Save();\r
+ NativeAbility::GetInstance().Back(); // 成功\r
+ break;\r
+\r
+ case HeartResult::NOT_WORN: // 未佩戴状态\r
+ case HeartResult::TIMEOUT: // 超时情况\r
+ case HeartResult::INVALID_DATA: // 无效数据情况\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况",\r
+ heartresult_ == HeartResult::NOT_WORN ? "未佩戴状态" : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
+ : "无效数据");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+ break;\r
+\r
+ case HeartResult::LOW_RESULT:\r
+ // 低心率结果处理\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");\r
+ HealthState lowHealthState;\r
+ lowHealthState.checkType = BLOOD_CHECK;\r
+ lowHealthState.resultStatus = LOW;\r
+ lowHealthState.checkResult = ThresholdValue;\r
+ HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ break;\r
+\r
+ case HeartResult::HIGH_RESULT:\r
+ // 高心率结果处理\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况");\r
+ HealthState highHealthState;\r
+ highHealthState.checkType = BLOOD_CHECK;\r
+ highHealthState.resultStatus = HIGH;\r
+ highHealthState.checkResult = ThresholdValue;\r
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ break;\r
+\r
+ default:\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");\r
+ break;\r
+ }\r
+ }\r
void HeartModel::SetWearStatus(int32_t wear)\r
{\r
// 设置佩戴状态\r
- // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
+\r
+ // 计数更新\r
if (wear_ != 1 && wear != 1)\r
{\r
unwear_counter_++; // 佩戴错误计时器计数\r
}\r
else\r
{\r
- unwear_counter_ = 0;\r
+ unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
}\r
-\r
wear_ = wear;\r
-\r
+ // 检查是否达到了最大未佩戴计数限制\r
if (unwear_counter_ >= MAX_UNWEAR_COUNT)\r
{\r
- wearStatus = false; // 计数达到10次,停止检测\r
- }\r
- else\r
- {\r
- wearStatus = true;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_);\r
+ SetResult(HeartResult::NOT_WORN);\r
+ Heart_Stop();\r
}\r
}\r
\r
- bool HeartModel::GetWearStatus()\r
- {\r
- return wearStatus;\r
- }\r
-\r
- void HeartModel::SetHeartBandoffViewStatus(bool bandoffViewStatus)\r
- {\r
- BandoffView = bandoffViewStatus;\r
- }\r
-\r
- bool HeartModel::GetHeartBandoffViewStatus()\r
- {\r
- return BandoffView;\r
- }\r
-\r
- void HeartModel::SetHeartViewStatus(bool heartViewStatus)\r
- {\r
- HeartView = heartViewStatus;\r
- }\r
-\r
- bool HeartModel::GetHeartViewStatus()\r
- {\r
- return HeartView;\r
- }\r
-\r
- void HeartModel::SetHeartCheckViewStatus(bool checkViewStatus)\r
- {\r
- CheckView = checkViewStatus;\r
- }\r
-\r
- bool HeartModel::GetHeartCheckViewStatus()\r
- {\r
- return CheckView;\r
- }\r
-\r
- void HeartModel::SetHeartResultViewStatus(bool resultViewStatus)\r
- {\r
- ResultView = resultViewStatus;\r
- }\r
-\r
- bool HeartModel::GetHeartResultViewStaus()\r
- {\r
- return ResultView;\r
- }\r
-\r
- void HeartModel::SetCheckStatus(bool checkStatus)\r
- {\r
- CheckStatus = checkStatus;\r
- }\r
-\r
- bool HeartModel::GetCheckStatus()\r
- {\r
- return CheckStatus;\r
- }\r
- // 获取心率数据\r
- uint16_t HeartModel::GetHeartdata()\r
- {\r
- return Heart_;\r
- }\r
-\r
- uint16_t HeartModel::GetShowHeartdata()\r
- {\r
- return Show_Heart_;\r
- }\r
-\r
- uint64_t HeartModel::GetCheckTime()\r
- {\r
- return TIME_;\r
- }\r
-\r
- void HeartModel::SetCheckTime(uint64_t time)\r
- {\r
- TIME_ = time;\r
- }\r
-\r
void HeartModel::UpHeartdata(uint16_t heart)\r
{\r
/*训练过程中 不需要判断数据准确性 不需要存储心率数据*/\r
if (uapi_dev_runtime_get_train_status() == 1)\r
return;\r
\r
- Show_Heart_ = heart;\r
- if (Show_Heart_ != 0)\r
+ displayheart = heart;\r
+\r
+ // 处理有效与无效计数\r
+ if (displayheart != 0)\r
{\r
- Heart_ = heart;\r
- valid_counter_++; // 增加有效计数器\r
- disvalid_counter_ = 0; // 清零无效数\r
+ currentheart = displayheart; // 更新 currentheart\r
+ valid_counter_++; // 增加有效计数器\r
+ disvalid_counter_ = 0; // 清空无效计数器\r
}\r
else\r
{\r
+ disvalid_counter_++; // 增加无效计数器\r
valid_counter_ = 0; // 清零有效计数器\r
- disvalid_counter_++; // 增加无效数\r
}\r
- // 一直为无效数\r
+\r
+ // 检查无效计数器是否达标\r
if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
{\r
- // 结束本次测试\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MAX_DISVALID_HRS_COUNT");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
+ SetResult(HeartResult::INVALID_DATA); // 无效数达标\r
Heart_Stop();\r
- // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
- HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
- return;\r
}\r
-#if HEARTTEST\r
+\r
+ // 检查有效计数器是否达标\r
if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
{\r
- // 结束本次测试,将最后一次有效数作为本次测量结果\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
+ SetResult(HeartResult::SUCCESS); // 成功检测\r
Heart_Stop();\r
- // 保存心率数据\r
- HeartRateData *data = new HeartRateData;\r
- data->Heart = heart;\r
- data->timestamp = HeartPresenter::GetInstance()->GetCurrentTime();\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp);\r
- SetCheckTime(data->timestamp);\r
- HealthService::GetInstance()->UpdateHealthData(*data); // 心率数据存储\r
- // 关闭自动检测心率 如果有其他高级心率检测在进行,则不会进行关闭[低优先级]\r
- HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
}\r
-#endif\r
}\r
-\r
}\r
--- /dev/null
+/*
+ * 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 <fstream>
+#include "iostream"
+#include <sstream>
+#include <string>
+#include <cstdlib>
+#include <ctime>
+#include "wearable_log.h"
+#include "cmsis_os.h"
+#include "securec.h"
+#include "broadcast_service.h"
+#include "graphic_service.h"
+#include <chrono>
+#include <thread>
+#include <sys/time.h>
+
+#include "ppg_service.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "power_display_service.h"
+#include "custom_utils.h"
+#include "cywee_service.h"
+#include "battery_hal.h"
+
+#include "heart_blood/health_service/health_service.h"
+
+#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<HeartResultView>::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<uint16_t>(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
+/***
+ * @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 <ui_scroll_view.h>
+#include "components/ui_button.h"
+#include "MainViewSample.h"
+#include "components/ui_view_group.h"
+#include "DialModelSPO2.h"
+#include "DialModelHeartRate.h"
+#include "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<UIView::OnDragListener *>(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<HeartResultPresenter>::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<HeartResultPresenter>::OnSetUpView();
+ Draw();
+ }
+ void HeartResultView::OnTearDownView()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnTearDownView");
+ View<HeartResultPresenter>::OnTearDownView();
+ return;
+ }
+
+ void HeartResultView::OnStop()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStop");
+ View<HeartResultPresenter>::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;
}
}
+++ /dev/null
-/*
- * 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<UIView::OnDragListener *>(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<HeartPresenter>::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<HeartPresenter>::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<HeartPresenter>::OnTearDownView();
- return;
- }
-
- void HeartView::OnStop()
- {
- display_api->set_screen_auto_off_timeout(display_time); // 恢复
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnStop");
- View<HeartPresenter>::OnStop();
- RootView::GetInstance()->RemoveAll();
- return;
- }
-}