From: Caisking <3449750381@qq.com> Date: Tue, 5 Mar 2024 03:58:05 +0000 (+0800) Subject: 1.搭建心率检测Slice;2.开启通话记录Slice;3.更正主界面心率界面检测效果;4.后续填补model X-Git-Tag: release_V1.2.70_20241020_135402~1274^2~29^2~1 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=18972413188cf6ea2e1819fc22df9795d7dc37b7;p=mirrors%2FFD230.git 1.搭建心率检测Slice;2.开启通话记录Slice;3.更正主界面心率界面检测效果;4.后续填补model --- diff --git a/code/sdk/application/wearable/fd230app/CMakeLists.txt b/code/sdk/application/wearable/fd230app/CMakeLists.txt index 7c64f8ac1..e5254e0b1 100644 --- a/code/sdk/application/wearable/fd230app/CMakeLists.txt +++ b/code/sdk/application/wearable/fd230app/CMakeLists.txt @@ -199,6 +199,10 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/activity/src/ActivityModel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartRateView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartCheckView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartResultView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartPresenter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/alarm/src/AlarmClockModel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/alarm/src/MainAlarmView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/alarm/src/AlarmConfigView.cpp diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h index 067ac99ff..207125a5f 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h @@ -55,6 +55,7 @@ namespace OHOS /* --------------------------------测试界面------------------------------------ */ void InitRotateSlice(void); void InitBloodSlice(void); + void InitHeartSlice(void); void InitMainAlipaySlice(void); void InitDialUpdateSlice(void); /* -------------------------------------------------------------------------- */ diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h index 692839c84..1f48666d4 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h @@ -223,7 +223,6 @@ namespace OHOS static constexpr const char *PNG_ALIPAY_LIST_HELP = APP_RES_PATH "/alipay/ALIPAY_LIST_HELP.bin"; static constexpr const char *PNG_ALIPAY_PAY_ICON_WHITE = APP_RES_PATH "/alipay/ALIPAY_PAY_ICON_WHITE.bin"; static constexpr const char *PNG_ALIPAY_PAY_ICON_GREY = APP_RES_PATH "/alipay/ALIPAY_PAY_ICON_GREY.bin"; - /* -------------------------------------------------------------------------- */ /* ----------------------------------- 录音 ----------------------------------- */ static constexpr const char *PNG_ANIMATOR1_IMAGE = APP_RES_PATH "/record/animator1.bin"; static constexpr const char *PNG_ANIMATOR2_IMAGE = APP_RES_PATH "/record/animator2.bin"; @@ -289,6 +288,7 @@ namespace OHOS static constexpr const char *PNG_APPLIST_HEART_IMAGE = APP_RES_PATH "/APPLIST_HEART.bin"; // 心率 static constexpr const char *PNG_APPLIST_SETTING_IMAGE = APP_RES_PATH "/APPLIST_SETTING.bin"; // 设置 static constexpr const char *PNG_APPLIST_CALLER_IMAGE = APP_RES_PATH "/APPLIST_CALLER_IMAGE.bin"; // 打电话 + static constexpr const char *PNG_APPLIST_CALLLOG_IMAGE = APP_RES_PATH "/APPLIST_CALLLOG.bin"; // 1通话记录 static constexpr const char *PNG_APPLIST_COMPASS_IMAGE = APP_RES_PATH "/APPLIST_COMPASS_IMAGE.bin"; // 指南针 static constexpr const char *PNG_APPLIST_WEATHER_IMAGE = APP_RES_PATH "/APPLIST_WEATHER_IMAGE.bin"; // 天气 static constexpr const char *PNG_APPLIST_RECORD_IMAGE = APP_RES_PATH "/APPLIST_RECORD_IMAGE.bin"; // 录音 diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp index 54a07f645..2778ea2ab 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp @@ -25,6 +25,9 @@ #include "ApplistPresenter.h" #include "BloodOxygenView.h" #include "BloodOxygenPresenter.h" +#include "heartrate/include/HeartPresenter.h" +#include "heartrate/include/HeartView.h" +#include "HeartPresenter.h" #include "CallerLogView.h" #include "CallerLogPresenter.h" #include "MainCallingView.h" @@ -85,7 +88,6 @@ #include "message/include/MessageModel.h" #include "message/include/MessagePresenter.h" - #include "secondaryfunction/include/SecondaryFunctionPresenter.h" #include "secondaryfunction/include/SecondaryFunctionView.h" #include "secondaryfunction/include/FastTrainingPresenter.h" @@ -147,7 +149,6 @@ namespace OHOS {VIEW_BLUETOOTH_EARPHONE, &NativeLauncher::InitBluetoothSlice}, {VIEW_CALLER_LOG, &NativeLauncher::InitMainCallerLogView}, {VIEW_INCOMING_CALL, &NativeLauncher::InitMainMakePhoneView}, - {VIEW_BLOODOXY, &NativeLauncher::InitMainBloodOxyView}, {VIEW_COMPASS, &NativeLauncher::InitCompassSlice}, {VIEW_CONNECT_PHONE, &NativeLauncher::InitConnectPhoneSlice}, {VIEW_INDOORWALK, &NativeLauncher::InitIndoorWalkSlice}, @@ -174,6 +175,8 @@ namespace OHOS {VIEW_MESSAGE, &NativeLauncher::InitMessageSlice}, {VIEW_ROTATE, &NativeLauncher::InitRotateSlice}, {VIEW_DIALUPDATE, &NativeLauncher::InitDialUpdateSlice}, + {VIEW_BLOODOXY, &NativeLauncher::InitMainBloodOxyView}, + {VIEW_HEART, &NativeLauncher::InitHeartSlice}, #ifdef SUPPORT_ALIPAY_SEC {VIEW_MAIN_ALIPAY, &NativeLauncher::InitMainAlipaySlice}, #endif @@ -364,6 +367,17 @@ namespace OHOS } NativeAbility::GetInstance().AddSliceProxy(VIEW_ALARM_POP_UP, alarmPopUpView); } + void NativeLauncher::InitHeartSlice(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::HeartSlice"); + SliceProxy *heartView = new AbilitySliceProxy; + if (heartView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartView is nullptr"); + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART, heartView); + } void NativeLauncher::InitMainBloodOxyView(void) { @@ -612,10 +626,10 @@ namespace OHOS } NativeAbility::GetInstance().AddSliceProxy(VIEW_ROTATE, rotate); } - void NativeLauncher::InitDialUpdateSlice(void) //切换表盘 + void NativeLauncher::InitDialUpdateSlice(void) // 切换表盘 { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitDialUpdateSlice"); - SliceProxy *dialupdate= new AbilitySliceProxy; + SliceProxy *dialupdate = new AbilitySliceProxy; if (dialupdate == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dialupdate"); diff --git a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp index 45b65903d..2d05348f2 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/applist/src/ApplistModel.cpp @@ -25,16 +25,16 @@ namespace OHOS {VIEW_COMPASS, PNG_APPLIST_COMPASS_IMAGE, PNG_APPLIST_COMPASS_IMAGE, "指南针", nullptr}, {VIEW_INDOORWALK, PNG_APPLIST_WALK_IMAGE, PNG_APPLIST_WALK_IMAGE, "室内步行", nullptr}, {VIEW_WEATHER, PNG_APPLIST_WEATHER_IMAGE, PNG_APPLIST_WEATHER_IMAGE, "天气", nullptr}, + {VIEW_HEART, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, "心率检测", nullptr}, {VIEW_RECORD, PNG_APPLIST_RECORD_IMAGE, PNG_APPLIST_RECORD_IMAGE, "录音", nullptr}, {VIEW_SETTING, PNG_APPLIST_SETTING_IMAGE, PNG_APPLIST_SETTING_IMAGE, "设置", nullptr}, {VIEW_DIALUPDATE, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_UI_SAMPLE_IMAGE, "表盘切换", nullptr}, + {VIEW_CALLER_LOG, PNG_APPLIST_CALLLOG_IMAGE, PNG_APPLIST_CALLLOG_IMAGE, "通话记录", nullptr}, #ifdef SUPPORT_ALIPAY_SEC {VIEW_MAIN_ALIPAY, PNG_APPLIST_ALIPAY_IMAGE, PNG_APPLIST_ALIPAY_IMAGE, "支付宝", nullptr}, #endif #if 0 - {VIEW_HEART, PNG_APPLIST_HEART_IMAGE, PNG_APPLIST_HEART_IMAGE, "心率检测", nullptr}, {VIEW_MAIN_TEMP, PNG_APPLIST_TEMP_IMAGE, PNG_APPLIST_TEMP_IMAGE, "体温", nullptr}, - {VIEW_CALLER_LOG, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, "通话记录", nullptr}, {VIEW_OFFLINEVOICE, PNG_APPLIST_VOCASSIST_IMAGE, PNG_APPLIST_VOCASSIST_IMAGE, "语音助手", nullptr}, {VIEW_UISAMPLE, PNG_APPLIST_UI_SAMPLE_IMAGE, PNG_APPLIST_UI_SAMPLE_IMAGE, "示例", nullptr}, {VIEW_MESSAGE, PNG_APPLIST_CALLER_IMAGE, PNG_APPLIST_CALLER_IMAGE, "信息通知", nullptr}, diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp index 4aa92f61b..b635c66ba 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenPresenter.cpp @@ -262,7 +262,7 @@ namespace OHOS if (BloodCheckView::GetInstance()->GetImageAnimator()->GetState() == false) { // 测试失败 - if (BloodOxygenModel::GetInstance()->GetSPO2data() == 0) + if (BloodOxygenModel::GetInstance()->GetShowSPO2data() == 0) { BloodOxygenView::GetInstance()->ChangeView(BLOODCHECKVIEW, BLOODRESULT); } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartBandoffView.h new file mode 100644 index 000000000..e69de29bb diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h new file mode 100644 index 000000000..26c62b0fd --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartCheckView.h @@ -0,0 +1,48 @@ +/* + * 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_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" +namespace OHOS +{ + class HeartPresenter; + class HeartBandoffView; + + class HeartCheckView : public View + { + public: + HeartCheckView(); + virtual ~HeartCheckView(); + static HeartCheckView *GetInstance(void); + UIScrollView *HeartCheckViewInit(); + UIImageAnimatorView *GetImageAnimator(); + UILabelButton *CreateAndSetUIButton(const char *title); + void UpHeartText(); + + private: + UIImageAnimatorView *imageAnimator; + UILabel *titleLabel; + UILabel *HeartText; + UIScrollView *HeartCheckScrollView; + UILabelButton *testButton; + }; +} + +#endif // 血氧主界面 \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index e073bcecb..59aa389ed 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -8,54 +8,60 @@ #include "MainClockView.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -int PushOHOSMsgToHeartModel(Request *request); -void HeartDataSubscribeTopic(Topic topic); -void HearDatatUnsubscribeTopic(Topic topic); + int PushOHOSMsgToHeartModel(Request *request); + void HeartDataSubscribeTopic(Topic topic); + void HearDatatUnsubscribeTopic(Topic topic); #define HEART_ALL_POINTS 360 -typedef struct { - uint16_t x; - uint16_t y; - bool flag; -} Point; - -typedef struct { - /** X coordinate */ - uint16_t x; - /** Y coordinate */ - uint16_t y; -} HeartPoint; - -typedef struct { - uint16_t perSec; - uint16_t rest; - uint16_t minX; - uint16_t minValue; - uint16_t maxX; - uint16_t maxValue; - uint16_t index; - Point value[HEART_ALL_POINTS]; -} HeartInfo; + typedef struct + { + uint16_t x; + uint16_t y; + bool flag; + } Point; + + typedef struct + { + /** X coordinate */ + uint16_t x; + /** Y coordinate */ + uint16_t y; + } HeartPoint; + + typedef struct + { + uint16_t perSec; + uint16_t rest; + uint16_t minX; + uint16_t minValue; + uint16_t maxX; + uint16_t maxValue; + uint16_t index; + Point value[HEART_ALL_POINTS]; + } HeartInfo; #pragma pack(4) -typedef struct { - uint16_t perSec; - uint16_t rest; - uint16_t minX; - uint16_t minValue; - uint16_t maxX; - uint16_t maxValue; - uint16_t index; - HeartPoint value[HEART_ALL_POINTS]; -} HeartDatas; + typedef struct + { + uint16_t perSec; + uint16_t rest; + uint16_t minX; + uint16_t minValue; + uint16_t maxX; + uint16_t maxValue; + uint16_t index; + HeartPoint value[HEART_ALL_POINTS]; + } HeartDatas; #pragma pack() -namespace OHOS { + namespace OHOS + { #define HEART_AVE_NUM 360 #define HEART_RATE_LIMIT_UPPER 200 #define HEART_RATE_LIMIT_LOWER 0 @@ -70,51 +76,83 @@ namespace OHOS { #define NUM_16 16 #define NUM_99 99 -typedef struct { - uint32_t heartRatePerSec; - Point heartRateAvg[HEART_AVE_NUM]; - uint32_t heartRateRest; - Point heartRateMax; - Point heartRateMin; -} HealthAllDatas; - -class HeartModel { -public: - HeartModel(); - ~HeartModel(); - static HeartModel *GetInstance(void); - void ObtainingHeartRateData(void); - void PushHealthDatas(HealthMsg healthMsg); - Point* GetAveHeartRate(void); - uint16_t GetAveHeartRateCount(void); - void SetAveHeartRateCount(uint16_t value); - Point* GetMaximumHeartRate(void); - void Init(void); - void HeartRatePros(HeartDatas *heartInfo); - void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate); - void ClearHeartData(void); - void HandleMaxHeart(uint16_t coord, uint16_t value); - void HandleMinHeart(uint16_t coord, uint16_t value); - void SetHeartRatePerSec(uint32_t sec); - void SetWearStatus(bool status); - bool GetWearStatus(void); - uint16_t GetHeartRateMax(void); - uint16_t GetHeartRateMin(void); - -private: - HealthAllDatas healthDatas; - uint16_t pretime{0}; - uint16_t entryTimes{0}; - uint16_t aveCount{0}; - uint16_t preMaxValue{0}; - uint16_t preMaxX{NUM_1}; - uint16_t preMinValue{HEART_RATE_LIMIT_UPPER}; - uint16_t preMinX{NUM_1}; - uint16_t countMax{0}; - uint16_t countMin{0}; - bool wearStatus{false}; -}; -} + typedef struct + { + uint32_t heartRatePerSec; + Point heartRateAvg[HEART_AVE_NUM]; + uint32_t heartRateRest; + Point heartRateMax; + Point heartRateMin; + } HealthAllDatas; + + class HeartModel + { + public: + HeartModel(); + ~HeartModel(); + static HeartModel *GetInstance(void); + void ObtainingHeartRateData(void); + void PushHealthDatas(HealthMsg healthMsg); + Point *GetAveHeartRate(void); + uint16_t GetAveHeartRateCount(void); + void SetAveHeartRateCount(uint16_t value); + Point *GetMaximumHeartRate(void); + void Init(void); + void HeartRatePros(HeartDatas *heartInfo); + void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate); + void ClearHeartData(void); + void HandleMaxHeart(uint16_t coord, uint16_t value); + void HandleMinHeart(uint16_t coord, uint16_t value); + void SetHeartRatePerSec(uint32_t sec); + void SetWearStatus(bool status); + bool GetWearStatus(void); + uint16_t GetHeartRateMax(void); + uint16_t GetHeartRateMin(void); + + bool GetHeartViewStatus(void); + bool GetHeartBandoffViewStatus(void); + bool GetHeartCheckViewStatus(void); + void SetHeartViewStatus(bool HeartViewStatus); + void SetHeartBandoffViewStatus(bool bandoffViewStatus); + void SetHeartCheckViewStatus(bool checkViewStatus); + + bool GetCheckStatus(); + void SetCheckStatus(bool checkstatus); + void UpHeartdata(uint16_t heart); + + uint16_t GetHeartdata(); + uint16_t GetShowHeartdata(); + uint16_t GetCheckTime(); // 获取距离上传测试时间 + void SetCheckTime(uint16_t time); // 设置本次测试完的时间 + uint16_t GetIndex(); // 测试点位 + void SetIndex(uint16_t index); + + private: + HealthAllDatas healthDatas; + uint16_t pretime{0}; + uint16_t entryTimes{0}; + uint16_t aveCount{0}; + uint16_t preMaxValue{0}; + uint16_t preMaxX{NUM_1}; + uint16_t preMinValue{HEART_RATE_LIMIT_UPPER}; + uint16_t preMinX{NUM_1}; + uint16_t countMax{0}; + uint16_t countMin{0}; + bool wearStatus{false}; + uint16_t index_ = 0; + + bool HeartView; + bool BandoffView; + bool CheckView; + bool ResultView; + bool CheckStatus; // 检测状态标志 + uint16_t Show_Heart_; // 显示血氧 + uint16_t Heart_; // 保存血氧 + uint16_t TIME_; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) + + bool initstatus = true; + }; + } #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h new file mode 100644 index 000000000..213e4e879 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartPresenter.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: bloodOxygen view + * Author: + * Create: 2021-08-01 + */ + +#ifndef HEART_PRESENTER_H +#define HEART_PRESENTER_H + +#include "Presenter.h" +#include "ModelListenerSample.h" +#include "components/ui_circle_progress.h" +#include "ohos_types.h" +#include "KeyInputListener.h" +#include "common/key_code.h" + +namespace OHOS +{ + + typedef enum + { + HEARTVIEW = 0, // 血氧视图(slice) + HEARTBANDVIEW, + HEARTCHECKVIEW, // 检测视图(subView) + HEARTRESULT, // 测试失败(subView) + MAX_HEARTVIEW, + } HEARTVIEWID; + + class HeartView; + class HeartPresenter : public Presenter, + public UIView::OnClickListener, + public RootView::OnKeyActListener, + public ModelListenerSample, + public UIView::OnDragListener + { + public: + HeartPresenter(); + virtual ~HeartPresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + virtual void Notify() override; + static HeartPresenter *GetInstance(void); + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnDragEnd(UIView &view, const DragEvent &event) override; + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + + uint16_t GetCurrentTime(); + std::string GetTDOA(uint16_t new_time, uint16_t old_time); + + private: + bool CheckPointersValue(void); + void ReturnInterface(void); + void ProgressNotify(void); + int count; + bool startheart = true; + KeyInputListener *keyActListenr{nullptr}; + }; +} + +#endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultView.h new file mode 100644 index 000000000..6b8a48ee0 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartResultView.h @@ -0,0 +1,53 @@ +/* + * 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 "View.h" +#include "BaseView.h" +#include "wearable_log.h" +#include "UiConfig.h" +#include "components/ui_label.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" +namespace OHOS +{ + class HeartPresenter; + class HeartBandoffView; + + class HeartResultView : public View + { + public: + HeartResultView(); + virtual ~HeartResultView(); + static HeartResultView *GetInstance(void); + UIScrollView *HeartResultViewInit(); + private: + // 增加图片 + bool InitImageDisplay(void); + // 初始化标签 + bool InitLabel(void); + HeartResultView *bloodresult{nullptr}; + UIImageView *imageerror; // 图片 + UILabel *titlelabel; + UILabel *label1; + UILabel *label2; + UILabel *label3; + + UIScrollView *HeartResultScrollView; + UILabelButton *ReButton; + UILabelButton *StButton; + }; +} + +#endif // 血氧主界面 \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h new file mode 100644 index 000000000..0869abbbc --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartView.h @@ -0,0 +1,80 @@ +/* + * 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_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" +namespace OHOS +{ + class HeartPresenter; + //class HeartBandoffView; + class HeartCheckView; + class HeartResultView; + class HeartView : public View + { + public: + HeartView(); + virtual ~HeartView(); + + void OnStop() override; + void OnSetUpView() override; + void OnTearDownView() override; + void OnStart() override; + static HeartView *GetInstance(void); + bool ChangeHeartView(int16_t thisview); // 主视图 + bool ChangeCheckView(int16_t thisview); + bool ChangeResultView(int16_t thisview); + + bool ClickFunc(int16_t interface); + void ChangeView(int16_t hideView, int16_t showView); + UIScrollView *GetHeartScrollView(int ViewId); + void Upheartdata(); + + private: + // 增加图片 + bool InitImageDisplay(void); + // 初始化标签 + bool InitLabel(void); + // 添加label按键 + UILabelButton *CreateAndSetUIButton(const char *title); + // 初始化界面 + bool InitHeartView(void); + bool SetOnDragListener(void); + + HeartCheckView *heartcheck{nullptr}; + HeartResultView *heartresult{nullptr}; + UIScrollView *HeartScrollView[4]{nullptr}; + + UIViewGroup *group; + UIImageView *imageViewMain; // 背景图片 + UILabel *percent; // 心率值 + UILabel *timeLabel; // 检测时间 + UILabel *titleLabel; // 页面title + UILabelButton *testButton; // 检测按键 + + const power_display_svr_api_t *display_api = power_display_svr_get_api(); + uint32_t display_time; + uint32_t heart_; + }; +} + +#endif // 血氧主界面 \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartBandoffView.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp new file mode 100644 index 000000000..ab72cc08c --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartCheckView.cpp @@ -0,0 +1,172 @@ + + +#include "UiConfig.h" +#include "wearable_log.h" +#include "HeartCheckView.h" +#include "HeartModel.h" +#include "ui_image_animator.h" +#include "HeartCheckView.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::UpHeartText() + { + uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata(); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetHeartData %d", heart_); + 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 UILabel(); + 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->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(20); + imageAnimator->SetRepeat(false); + imageAnimator->Start(); + HeartCheckScrollView->Add(imageAnimator); + /* -------------------------------------------------------------------------- */ + if (testButton == nullptr) + { + testButton = new UILabelButton(); + } + 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->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 UILabel(); + if (HeartText == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new HeartText fail"); + return nullptr; + } + HeartText->SetPosition(133, 110); // widget's left position and top position + HeartText->Resize(200, 200); // widget's width and height + HeartText->SetViewId("label"); // Set style + HeartText->SetStyle(STYLE_TEXT_FONT, 140); + uint16_t heart_ = HeartModel::GetInstance()->GetHeartdata(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetHeartData %d", heart_); + std::string bloodoxygenStr = std::to_string(heart_); + HeartText->SetText(bloodoxygenStr.c_str()); + HeartText->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + HeartText->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + HeartText->SetRollSpeed(0); + HeartText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 140); + HeartCheckScrollView->Add(HeartText); + /* -------------------------------------------------------------------------- */ + return HeartCheckScrollView; + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index a56deb97e..99f61242b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -5,357 +5,545 @@ #include "IndoorWalkPresenter.h" #include "MainViewSample.h" #include "HeartRateView.h" - +#include +#include +#include "heartrate/include/HeartView.h" +#include "heartrate/include/HeartPresenter.h" +#include "DialModelHeartRate.h" #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -/* 佩戴检测结果 */ -enum { - SENSOR_WEAR_ON = 0, - SENSOR_WEAR_OFF, - SENSOR_WEAR_UNKNOW, - SENSOR_WEAR_MAX -}; + /* 佩戴检测结果 */ + enum + { + SENSOR_WEAR_ON = 0, + SENSOR_WEAR_OFF, + SENSOR_WEAR_UNKNOW, + SENSOR_WEAR_MAX + }; -using namespace OHOS; + using namespace OHOS; #define LEN 32 -static void Notify(void *args, const Topic topic, Request* request); + static void Notify(void *args, const Topic topic, Request *request); -Subscriber heartSubscirber = { - .identity = NULL, - .args = NULL, - .Notify = Notify, -}; - -void HeartDataSubscribeTopic(Topic topic) -{ - BroadcastApi *broadcastApi = NULL; - IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); - if (api == NULL) { - return; - } - int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); - if (result != 0 || broadcastApi == NULL) { - return; - } - int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret = %d, topic = %u", ret, topic); - broadcastApi->Release((IUnknown *)broadcastApi); -} + Subscriber heartSubscirber = { + .identity = NULL, + .args = NULL, + .Notify = Notify, + }; -void HearDatatUnsubscribeTopic(Topic topic) -{ - BroadcastApi *broadcastApi = NULL; - IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); - if (api == NULL) { - return; - } - int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); - if (result != 0 || broadcastApi == NULL) { - return; + void HeartDataSubscribeTopic(Topic topic) + { + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); + if (api == NULL) + { + return; + } + int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) + { + return; + } + int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret = %d, topic = %u", ret, topic); + broadcastApi->Release((IUnknown *)broadcastApi); } - broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); - broadcastApi->Release((IUnknown *)broadcastApi); -} -static void Notify(void *args, const Topic topic, Request* request) -{ - UNUSED(args); - UNUSED(topic); - if (request == NULL) { - return; - } - if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) { - HeartDatas *heartInfo = (HeartDatas*)malloc(sizeof(HeartDatas)); - if (heartInfo == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail"); + void HearDatatUnsubscribeTopic(Topic topic) + { + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); + if (api == NULL) + { + return; } - - int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo*)request->data, request->len); - if (rets != EOK) { - free(heartInfo); - heartInfo = NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s heartRateData fail! ret = %d", rets); + int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) + { return; } - - OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); - - free(heartInfo); - heartInfo = NULL; - } - if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE) { - OHOS::HeartModel::GetInstance()->ClearHeartData(); + broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); } - if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE) { - OHOS::HeartModel::GetInstance()->ClearHeartData(); - } - if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE) { - uint32 wearStatus = *((uint32*)request->data); - if (wearStatus == SENSOR_WEAR_OFF) { - OHOS::HeartModel::GetInstance()->SetWearStatus(false); - OHOS::HeartModel::GetInstance()->SetHeartRatePerSec(0); - if (OHOS::MainClockView::GetInstance() != nullptr) { - OHOS::MainClockView::GetInstance()->RefreshHeartRate(0); + + static void Notify(void *args, const Topic topic, Request *request) + { + UNUSED(args); + UNUSED(topic); + if (request == NULL) + { + return; + } + if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) + { +#if 0 + int rets = memcpy_s(heartInfo, sizeof(HeartDatas), (HeartInfo *)request->data, request->len); + if (rets != EOK) + { + free(heartInfo); + heartInfo = NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s heartRateData fail! ret = %d", rets); + return; + } +#endif + uint16_t preheart = *(uint16_t *)request->data; + // 筛选出正常数据 + if (preheart > HEART_RATE_LIMIT_LOWER && preheart <= HEART_RATE_LIMIT_UPPER) + { + uint16_t index_ = HeartModel::GetInstance()->GetIndex(); + HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas)); + if (heartInfo == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail"); + } + heartInfo->index = index_; + heartInfo->maxX = index_; + heartInfo->minX = index_; + heartInfo->perSec = preheart; + heartInfo->rest = preheart; + heartInfo->maxValue = preheart; + heartInfo->minValue = preheart; + heartInfo->value[index_].x = index_; + heartInfo->value[index_].y = preheart; + index_++; + if (index_ == HEART_ALL_POINTS) + { + index_ = 0; + } + HeartModel::GetInstance()->SetIndex(index_); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart); + OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); + free(heartInfo); + heartInfo = NULL; + } + } + if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE) + { + OHOS::HeartModel::GetInstance()->ClearHeartData(); + } + if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE) + { + OHOS::HeartModel::GetInstance()->ClearHeartData(); + } + if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE) + { + uint32 wearStatus = *((uint32 *)request->data); + if (wearStatus == SENSOR_WEAR_OFF) + { + OHOS::HeartModel::GetInstance()->SetWearStatus(false); + OHOS::HeartModel::GetInstance()->SetHeartRatePerSec(0); + if (OHOS::MainClockView::GetInstance() != nullptr) + { + // OHOS::MainClockView::GetInstance()->RefreshHeartRate(*(uint16_t *)request->data); + } + } + else + { + OHOS::HeartModel::GetInstance()->SetWearStatus(true); } - } else { - OHOS::HeartModel::GetInstance()->SetWearStatus(true); } } -} #ifdef __cplusplus } #endif -namespace OHOS { -void HeartModel::ClearHeartData(void) +namespace OHOS { - pretime = 0; - entryTimes = 0; - aveCount = 0; - preMaxValue = 0; - preMaxX = NUM_1; - preMinValue = HEART_RATE_LIMIT_UPPER; - preMinX = NUM_1; - countMax = 0; - countMin = 0; - healthDatas.heartRateMax.x = (uint16_t)0XFFFF; - healthDatas.heartRateMax.y = 0; - healthDatas.heartRateMin.x = (uint16_t)0XFFFF; - healthDatas.heartRateMin.y = (uint16_t)0XFFFF; - for (int i = 0; i < HEART_AVE_NUM; i++) { - healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF; - healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF; - } - if (HeartRateView::GetInstance() != nullptr) { - HeartRateView::GetInstance()->ClearElectrocardiogram(); - } - SetAveHeartRateCount(0); - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); -} + void HeartModel::ClearHeartData(void) + { + pretime = 0; + entryTimes = 0; + aveCount = 0; + preMaxValue = 0; + preMaxX = NUM_1; + preMinValue = HEART_RATE_LIMIT_UPPER; + preMinX = NUM_1; + countMax = 0; + countMin = 0; + healthDatas.heartRateMax.x = (uint16_t)0XFFFF; + healthDatas.heartRateMax.y = 0; + healthDatas.heartRateMin.x = (uint16_t)0XFFFF; + healthDatas.heartRateMin.y = (uint16_t)0XFFFF; + for (int i = 0; i < HEART_AVE_NUM; i++) + { + healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF; + healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF; + } + if (HeartRateView::GetInstance() != nullptr) + { + HeartRateView::GetInstance()->ClearElectrocardiogram(); + } + SetAveHeartRateCount(0); + GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), + healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); + } -HeartModel::HeartModel() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); -} + HeartModel::HeartModel() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); + HeartView = false; + BandoffView = false; + CheckView = false; + ResultView = false; + CheckStatus = false; + // 初始化血氧值 + Heart_ = DialModelHeartRate::GetInstance()->GetHeartData(); + } -HeartModel::~HeartModel() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()"); - HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); - HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); - HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); - HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); -} + HeartModel::~HeartModel() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()"); + HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); + HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); + HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); + HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); + } -HeartModel *HeartModel::GetInstance(void) -{ - static HeartModel heartModel; - return &heartModel; -} + HeartModel *HeartModel::GetInstance(void) + { + static HeartModel heartModel; + return &heartModel; + } + uint16_t HeartModel::GetIndex() + { + return index_; + } + void HeartModel::SetIndex(uint16_t index) + { + index_ = index; + } -void HeartModel::Init(void) -{ - HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); - HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); - HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); - HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); -} + void HeartModel::Init(void) + { + HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); + HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); + HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); + HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); + } -Point* HeartModel::GetAveHeartRate(void) -{ - return healthDatas.heartRateAvg; -} + Point *HeartModel::GetAveHeartRate(void) + { + return healthDatas.heartRateAvg; + } -void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) -{ - healthDatas.heartRateMax.x = coord; - healthDatas.heartRateMax.y = value; - // 插入最大心率 countMax 数据个数 - if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) { - if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) { - healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y; - } else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x == healthDatas.heartRateAvg[aveCount - 1].x)) { - healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y; - } else { - healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax; - countMax = aveCount; - aveCount++; - } - if (healthDatas.heartRateMax.x != 0) { - if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0) { - for (int i = 1; i < (aveCount - 1); i++) { - healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; + void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) + { + healthDatas.heartRateMax.x = coord; + healthDatas.heartRateMax.y = value; + // 插入最大心率 countMax 数据个数 + if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) + { + if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) + { + healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y; + } + else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x == healthDatas.heartRateAvg[aveCount - 1].x)) + { + healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y; + } + else + { + healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax; + countMax = aveCount; + aveCount++; + } + if (healthDatas.heartRateMax.x != 0) + { + if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0) + { + for (int i = 1; i < (aveCount - 1); i++) + { + healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; + } + aveCount--; + countMax--; } - aveCount--; - countMax--; } } + preMaxValue = healthDatas.heartRateMax.y; + preMaxX = healthDatas.heartRateMax.x; } - preMaxValue = healthDatas.heartRateMax.y; - preMaxX = healthDatas.heartRateMax.x; -} -void HeartModel::HandleMinHeart(uint16 coord, uint16 value) -{ - // 最小心率 - healthDatas.heartRateMin.x = coord; - healthDatas.heartRateMin.y = value; - // 插入最小心率 - //avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题??? - //preMinValue 上一个心率最小值 - //preMinX 上一个最小值对应的坐标 - //当上一个值与当前值不等,且没有超过总数限制,则进行数据处理 - if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) { - - - if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) { - // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据 countMin 即可 - healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y; - } else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x == healthDatas.heartRateAvg[aveCount - 1].x)) { - //有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值 - healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y; - } else { - healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin; - countMin = aveCount; - aveCount++; - } + void HeartModel::HandleMinHeart(uint16 coord, uint16 value) + { + // 最小心率 + healthDatas.heartRateMin.x = coord; + healthDatas.heartRateMin.y = value; + // 插入最小心率 + // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题??? + // preMinValue 上一个心率最小值 + // preMinX 上一个最小值对应的坐标 + // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理 + if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) + { + + if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) + { + // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据 countMin 即可 + healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y; + } + else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x == healthDatas.heartRateAvg[aveCount - 1].x)) + { + // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值 + healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y; + } + else + { + healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin; + countMin = aveCount; + aveCount++; + } - //最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。 - if (healthDatas.heartRateMin.x != 0) { - if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0) { - for (int i = 0; i < (aveCount - 1); i++) { - healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; + // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。 + if (healthDatas.heartRateMin.x != 0) + { + if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0) + { + for (int i = 0; i < (aveCount - 1); i++) + { + healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; + } + aveCount--; + countMin--; } - aveCount--; - countMin--; } } + preMinValue = healthDatas.heartRateMin.y; + preMinX = healthDatas.heartRateMin.x; } - preMinValue = healthDatas.heartRateMin.y; - preMinX = healthDatas.heartRateMin.x; -} -void HeartModel::HeartRatePros(HeartDatas *heartInfo) -{ - uint16_t perSecHeartRate = 0; - uint16_t restHeartRate = 0; - - // 每秒心率 - perSecHeartRate = heartInfo->perSec; - if (perSecHeartRate > HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER) { - healthDatas.heartRatePerSec = perSecHeartRate; - } - - // 静息心率 - restHeartRate = heartInfo->rest; - if (restHeartRate > HEART_RATE_LIMIT_LOWER && restHeartRate <= HEART_RATE_LIMIT_UPPER) { - healthDatas.heartRateRest = restHeartRate; - } - HandleMinHeart(heartInfo->minX, heartInfo->minValue); - HandleMaxHeart(heartInfo->maxX, heartInfo->maxValue); - // 平均心率 - uint16_t count = aveCount + heartInfo->index; - if (aveCount < HEART_AVE_NUM) { - for (int i = aveCount; i < count; i++) { - if (healthDatas.heartRateMin.x != heartInfo->value[i - aveCount].x && healthDatas.heartRateMax.x != heartInfo->value[i - aveCount].x) { - healthDatas.heartRateAvg[aveCount].x = heartInfo->value[i - aveCount].x; - healthDatas.heartRateAvg[aveCount].y = heartInfo->value[i - aveCount].y; - aveCount++; + void HeartModel::HeartRatePros(HeartDatas *heartInfo) + { + uint16_t perSecHeartRate = 0; + uint16_t restHeartRate = 0; +#if 0 + // 使用随机数生成模拟数据 + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> heartRateDist(50, 100); + + heartInfo->perSec = heartRateDist(gen); + heartInfo->rest = heartRateDist(gen); + heartInfo->maxValue = heartRateDist(gen); + heartInfo->minValue = heartRateDist(gen); + heartInfo->minX = 1; + heartInfo->maxX = 10; + // heartInfo->index = 0; + heartInfo->value[heartInfo->index].x = 0; + heartInfo->value[heartInfo->index].y = heartRateDist(gen); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " heartRateData: %d %d %d %d %d %d %d %d ", + heartInfo->perSec, heartInfo->rest, heartInfo->maxValue, heartInfo->minValue, heartInfo->minX, heartInfo->index, heartInfo->value[0].x, heartInfo->value[0].y); + +#endif + // 每秒心率 + perSecHeartRate = heartInfo->perSec; + if (perSecHeartRate > HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER) + { + healthDatas.heartRatePerSec = perSecHeartRate; + } + + // 静息心率 + restHeartRate = heartInfo->rest; + if (restHeartRate > HEART_RATE_LIMIT_LOWER && restHeartRate <= HEART_RATE_LIMIT_UPPER) + { + healthDatas.heartRateRest = restHeartRate; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateRest:%d ", healthDatas.heartRateRest); + } + HandleMinHeart(heartInfo->minX, heartInfo->minValue); + HandleMaxHeart(heartInfo->maxX, heartInfo->maxValue); + // 平均心率 + uint16_t count = aveCount + heartInfo->index; + if (aveCount < HEART_AVE_NUM) + { + for (int i = aveCount; i < count; i++) + { + if (healthDatas.heartRateMin.x != heartInfo->value[i - aveCount].x && healthDatas.heartRateMax.x != heartInfo->value[i - aveCount].x) + { + healthDatas.heartRateAvg[aveCount].x = heartInfo->value[i - aveCount].x; + healthDatas.heartRateAvg[aveCount].y = heartInfo->value[i - aveCount].y; + aveCount++; + } } } - } - for (int i = 0; i < aveCount - 1; i++) { - if (healthDatas.heartRateAvg[i].x == healthDatas.heartRateAvg[i + 1].x) { - if (healthDatas.heartRateAvg[i].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i].y != healthDatas.heartRateMax.y) { - for (int j = i; j < aveCount - 1; j++) { - healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1]; + for (int i = 0; i < aveCount - 1; i++) + { + if (healthDatas.heartRateAvg[i].x == healthDatas.heartRateAvg[i + 1].x) + { + if (healthDatas.heartRateAvg[i].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i].y != healthDatas.heartRateMax.y) + { + for (int j = i; j < aveCount - 1; j++) + { + healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1]; + } + aveCount--; } - aveCount--; - } else if (healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMax.y) { - for (int j = i + 1; j < aveCount - 1; j++) { - healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1]; + else if (healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMin.y && healthDatas.heartRateAvg[i + 1].y != healthDatas.heartRateMax.y) + { + for (int j = i + 1; j < aveCount - 1; j++) + { + healthDatas.heartRateAvg[j] = healthDatas.heartRateAvg[j + 1]; + } + aveCount--; } - aveCount--; } } + GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), + healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); } - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); -} -uint16_t HeartModel::GetAveHeartRateCount(void) -{ - return aveCount; -} + uint16_t HeartModel::GetAveHeartRateCount(void) + { + return aveCount; + } -uint16_t HeartModel::GetHeartRateMax(void) -{ - return healthDatas.heartRateMax.y; -} + uint16_t HeartModel::GetHeartRateMax(void) + { + return healthDatas.heartRateMax.y; + } -uint16_t HeartModel::GetHeartRateMin(void) -{ - return healthDatas.heartRateMin.y; -} + uint16_t HeartModel::GetHeartRateMin(void) + { + return healthDatas.heartRateMin.y; + } -void HeartModel::SetHeartRatePerSec(uint32 sec) -{ - healthDatas.heartRatePerSec = sec; - if (HeartRateView::GetInstance() == nullptr) { - return; + void HeartModel::SetHeartRatePerSec(uint32 sec) + { + healthDatas.heartRatePerSec = sec; + if (HeartRateView::GetInstance() == nullptr) + { + return; + } + HeartRateView::GetInstance()->RefreshHeartRatePerSec(healthDatas.heartRatePerSec); } - HeartRateView::GetInstance()->RefreshHeartRatePerSec(healthDatas.heartRatePerSec); -} -void HeartModel::SetAveHeartRateCount(uint16_t value) -{ - aveCount = value; -} + void HeartModel::SetAveHeartRateCount(uint16_t value) + { + aveCount = value; + } -void HeartModel::SetWearStatus(bool status) -{ - wearStatus = status; -} + void HeartModel::SetWearStatus(bool status) + { + wearStatus = status; + } -bool HeartModel::GetWearStatus(void) -{ - return wearStatus; -} + bool HeartModel::GetWearStatus(void) + { + return wearStatus; + } -void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate) -{ - UNUSED(rest); - Point *rateData; - int len = GetAveHeartRateCount(); - rateData = GetAveHeartRate(); + void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate) + { + UNUSED(rest); + Point *rateData; + int len = GetAveHeartRateCount(); + rateData = GetAveHeartRate(); + + uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId(); + if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) + { + MainClockView::GetInstance()->RefreshHeartRate(perSec); + } + + if (IndoorWalkPreparedView::GetInstance() != nullptr) + { + IndoorWalkPreparedView::GetInstance()->RefreshHeartbeatData(perSec); + } + if (IndoorWalkPresenter::GetInstance() != nullptr) + { + IndoorWalkPresenter::GetInstance()->ModifiesHeartRate(perSec); + } - uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId(); - if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) { - MainClockView::GetInstance()->RefreshHeartRate(perSec); + if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) + { + if (MainViewSample::GetInstance()->GetHorCurrentPage() == HEART_RATE) + { + HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len); + HeartRateView::GetInstance()->RefreshElectrocardiogram(); + HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); + HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); + HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); + HeartRateView::GetInstance()->RefreshRestHeartRate(rest); + } + } + } + bool HeartModel::GetHeartViewStatus(void) + { + return HeartView; } - if (IndoorWalkPreparedView::GetInstance() != nullptr) { - IndoorWalkPreparedView::GetInstance()->RefreshHeartbeatData(perSec); + bool HeartModel::GetHeartBandoffViewStatus(void) + { + return BandoffView; } - if (IndoorWalkPresenter::GetInstance() != nullptr) { - IndoorWalkPresenter::GetInstance()->ModifiesHeartRate(perSec); + + bool HeartModel::GetHeartCheckViewStatus(void) + { + return CheckView; } - if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) { - if (MainViewSample::GetInstance()->GetHorCurrentPage() == HEART_RATE) { - HeartRateView::GetInstance()->SetHeartRateData(rateData, sizeof(Point) * len); - HeartRateView::GetInstance()->RefreshElectrocardiogram(); - HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); - HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); - HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); + void HeartModel::SetHeartBandoffViewStatus(bool bandoffViewStatus) + { + BandoffView = bandoffViewStatus; + } + + void HeartModel::SetHeartViewStatus(bool HeartViewStatus) + { + HeartView = HeartViewStatus; + } + + void HeartModel::SetHeartCheckViewStatus(bool checkViewStatus) + { + CheckView = checkViewStatus; + } + + /* -------------------------------------------------------------------------- */ + // 获取检测状态 + bool HeartModel::GetCheckStatus() + { + return CheckStatus; + } + // 设置检测状态 + void HeartModel::SetCheckStatus(bool checkstatus) + { + CheckStatus = checkstatus; + } + uint16_t HeartModel::GetHeartdata() + { + return Heart_; + } + uint16_t HeartModel::GetShowHeartdata() + { + return Show_Heart_; + } + void HeartModel::UpHeartdata(uint16_t heart) + { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpHeartdata Heart:%d->%d", Heart_, heart); + Show_Heart_ = heart; + // 筛选有效信息 + if (Show_Heart_ != 0) + { + Heart_ = heart; } } + uint16_t HeartModel::GetCheckTime() + { + // 第一次进入,默认刚刚测试 + if (initstatus) + { + TIME_ = HeartPresenter::GetInstance()->GetCurrentTime(); + initstatus = false; + } + return TIME_; + } + void HeartModel::SetCheckTime(uint16_t time) + { + TIME_ = time; + } + /* -------------------------------------------------------------------------- */ } -} - diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp new file mode 100644 index 000000000..801111ff5 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartPresenter.cpp @@ -0,0 +1,290 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: heartOxygen view + * Author: + * Create: 2021-08-01 + */ + +#include "HeartPresenter.h" +#include "common/task_manager.h" +#include "HeartView.h" +#include "HeartModel.h" +#include "HeartCheckView.h" +#include "components/ui_label.h" +#include "ChangeSliceListener.h" +#include "broadcast_service.h" +#include +#include "iostream" +#include +#include +#include +#include +#include "wearable_log.h" +#include "cmsis_os.h" +#include "securec.h" +#include "broadcast_service.h" +#include "graphic_service.h" +#include +#include +#include "ppg_service.h" +#include "displaybrightness/include/DisplayBrightnessModel.h" +#include "power_display_service.h" +#include "heartrate/include/HeartPresenter.h" +#include "heartrate/include/HeartView.h" + +#define HEARTKEYABLE 0 +namespace OHOS +{ + static HeartPresenter *g_pMainView = nullptr; + HeartView *g_pheartview = HeartView::GetInstance(); + + static constexpr uint16_t PROGRESS_VALUE_MIN = 0; + static constexpr uint16_t PROGRESS_VALUE_MAX = 10; + /* -------------------------------------------------------------------------- */ + // 获取当前的"时间分" + uint16_t HeartPresenter::GetCurrentTime() + { + time_t now = time(0); + struct tm *tblock = localtime(&now); + + uint16_t current_time = tblock->tm_hour * 60 + tblock->tm_min; + return current_time; + } + // 获取时间差 + std::string HeartPresenter::GetTDOA(uint16_t new_time, uint16_t old_time) + { + if (new_time == old_time) + { + return "刚刚"; + } + + int time_diff = new_time - old_time; + if (time_diff > 60) + { + int hours = time_diff / 60; + int minutes = time_diff % 60; + std::stringstream ss; + ss << hours << "小时"; + if (minutes > 0) + { + ss << minutes << "分钟"; + } + return ss.str() + "前"; + } + else + { + std::stringstream ss; + ss << time_diff << "分钟前"; + return ss.str(); + } + } + /* -------------------------------------------------------------------------- */ + HeartPresenter::HeartPresenter() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartPresenter::new HeartPresenter"); + g_pMainView = this; + } + + HeartPresenter::~HeartPresenter() + { +#if HEARTKEYABLE + if (keyActListenr != nullptr) + { + delete keyActListenr; + keyActListenr = nullptr; + } +#endif + g_pMainView = nullptr; + } + HeartPresenter *HeartPresenter::GetInstance() + { + return g_pMainView; + } + + void HeartPresenter::OnStart() + { + Presenter::OnStart(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartPresenter::On Start "); +#if HEARTKEYABLE + if (keyActListenr == nullptr) + { + keyActListenr = new KeyInputListener(); + if (keyActListenr != nullptr) + { + RootView::GetInstance()->SetOnKeyActListener(keyActListenr); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartPresenter::OnStart: new KeyInputListener fail"); + } + } +#endif + } + + void HeartPresenter::OnPause(void) {} + + void HeartPresenter::OnResume(void) {} + + void HeartPresenter::OnStop(void) {} + + bool HeartPresenter::CheckPointersValue() + { + if (HeartView::GetInstance() == nullptr) + { + return false; + } + +#if 0 + if (HeartBandoffView::GetInstance() == nullptr) + { + return false; + } +#endif + if (HeartModel::GetInstance() == nullptr) + { + return false; + } + return true; + } + bool HeartPresenter::OnDrag(UIView &view, const DragEvent &event) + { + return true; + } + bool HeartPresenter::OnDragEnd(UIView &view, const DragEvent &event) + { + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) + { + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); + return true; + } + return false; + } + + bool HeartPresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(view); + UNUSED(event); + // 主界面点击开始检测 + if (strcmp(view.GetViewId(), "checkbegin") == 0) + { + //HeartView::GetInstance()->ChangeView(HEARTVIEW, HEARTBANDVIEW); + //HeartModel::GetInstance()->SetHeartBandoffViewStatus(true); + // HeartBandoffView::GetInstance()->GetImageAnimator()->Start(); + return true; + } + // 从检测界面回到主界面 + if (strcmp(view.GetViewId(), "checkstop") == 0) + { + HeartView::GetInstance()->ChangeView(HEARTCHECKVIEW, HEARTVIEW); + HeartModel::GetInstance()->SetHeartCheckViewStatus(false); + HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测 + return true; + } + // 从检测失败界面回到检测界面 + if (strcmp(view.GetViewId(), "ReCheck") == 0) + { + HeartView::GetInstance()->ChangeView(HEARTRESULT, HEARTCHECKVIEW); + HeartCheckView::GetInstance()->GetImageAnimator()->Start(); // 播放检测界面动画 + HeartModel::GetInstance()->SetCheckStatus(true); // 开始检测 + return true; + } + // 从检测失败界面回到主界面 + if (strcmp(view.GetViewId(), "StCheck") == 0) + { + HeartView::GetInstance()->ChangeView(HEARTRESULT, HEARTVIEW); + HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测 + return true; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartPresenter::OnClick"); + return false; + } + + // 增加按键事件 + bool HeartPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { +#if HEARTKEYABLE + WEARABLE_LOGD("", "into the view is: %s\n", typeid(view).name()); + uint16 keyID = event.GetKeyId(); + WEARABLE_LOGD("", "into key! keyID %u\n", keyID); + // 如果是power键就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER)) + { + // uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); + } +#endif + return true; + } + void HeartPresenter::ProgressNotify(void) + { + // 当检测状态为开始检测,开始检测 + if (HeartModel::GetInstance()->GetCheckStatus() == true) + { + HeartCheckView::GetInstance()->UpHeartText(); // 更新 + if (startheart == true) + { + // uint8_t md = PPG_SERVICE_CMD_TYPE_DO_Heart_TEST; + // send_ppg_cmd_msg(md); + startheart = false; + } + } + + // 当检测状态为结束检测,结束检测 + if (HeartModel::GetInstance()->GetCheckStatus() == false) + { + HeartView::GetInstance()->Upheartdata(); // 更新主界面 + if (startheart == false) + { + // uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_Heart_TEST; + // send_ppg_cmd_msg(md); + startheart = true; + } + } + } + + void HeartPresenter::ReturnInterface() + { +#if 0 + // 佩戴动画播放完毕,前往检测界面 + if (HeartModel::GetInstance()->GetHeartBandoffViewStatus() == true) + { + if (HeartBandoffView::GetInstance()->GetImageAnimator()->GetState() == false) + { + HeartView::GetInstance()->ChangeView(HEARTBANDVIEW, HEARTCHECKVIEW); + HeartModel::GetInstance()->SetHeartBandoffViewStatus(false); + // 设置检测界面状态 + HeartModel::GetInstance()->SetHeartCheckViewStatus(true); + // 播放检测界面动画 + HeartCheckView::GetInstance()->GetImageAnimator()->Start(); + HeartModel::GetInstance()->SetCheckStatus(true); // 开始检测 + } + } +#endif + // 检测动画播放完毕 + if (HeartModel::GetInstance()->GetHeartCheckViewStatus() == true) + { + if (HeartCheckView::GetInstance()->GetImageAnimator()->GetState() == false) + { + // 测试失败 + if (HeartModel::GetInstance()->GetShowHeartdata() == 0) + { + HeartView::GetInstance()->ChangeView(HEARTCHECKVIEW, HEARTRESULT); + } + // 测试成功 + else + { + HeartView::GetInstance()->ChangeView(HEARTCHECKVIEW, HEARTVIEW); + } + HeartModel::GetInstance()->SetCheckStatus(false); // 关闭检测 + HeartModel::GetInstance()->SetHeartCheckViewStatus(false); + } + uint16_t time = GetCurrentTime(); + HeartModel::GetInstance()->SetCheckTime(time); // 更新时间 + } + } + void HeartPresenter::Notify(void) + { + ProgressNotify(); + ReturnInterface(); + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp index 5ece7d2b7..d10236d31 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateView.cpp @@ -13,8 +13,9 @@ #include "ui_resource_image.h" #include "common/image_cache_manager.h" -namespace OHOS { -static HeartRateView *g_pHeartRateView = nullptr; +namespace OHOS +{ + static HeartRateView *g_pHeartRateView = nullptr; // 背景坐标图形 #define ACT_IMAGE_X 0 // 图片坐标起点 @@ -101,698 +102,760 @@ static HeartRateView *g_pHeartRateView = nullptr; #define PERSEC_HEART_TEXT_WIDTH 75 #define PERSEC_HEART_TEXT_HEIGHT (PERSEC_HEART_TEXT_FONT_SIZE + 5) -// 心跳image -static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = { - {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - - {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, - {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, - IMG_SRC_FILE_PATH}, -}; - -HeartRateView::HeartRateView() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView"); - dataNume = 0; - currIndex = 0; - serialIndex = 0; - maxRate = 0; - minRate = HEART_RATE_LIMIT_UPPER; - InitHeartRateData(); - SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); - - g_pHeartRateView = this; -} - -HeartRateView::~HeartRateView() -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView"); - if (viewiInitStatus == true) { - int32_t i; - RemoveAll(); - delete imageViewCoordinate; - imageViewCoordinate = nullptr; - - chart->ClearDataSerial(); - for (i = 0; i < HEART_AVE_NUM; i++) { - delete dataSerial[i]; - dataSerial[i] = nullptr; + // 心跳image + static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = { + {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + + {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH}, + }; + + HeartRateView::HeartRateView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView"); + dataNume = 0; + currIndex = 0; + serialIndex = 0; + maxRate = 0; + minRate = HEART_RATE_LIMIT_UPPER; + InitHeartRateData(); + SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); + + g_pHeartRateView = this; + } + + HeartRateView::~HeartRateView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::~HeartRateView"); + if (viewiInitStatus == true) + { + int32_t i; + RemoveAll(); + delete imageViewCoordinate; + imageViewCoordinate = nullptr; + + chart->ClearDataSerial(); + for (i = 0; i < HEART_AVE_NUM; i++) + { + delete dataSerial[i]; + dataSerial[i] = nullptr; + } + delete chart; + chart = nullptr; + delete imageViewTop; + imageViewTop = nullptr; + delete imageViewBottom; + imageViewBottom = nullptr; + delete dataTopAndbottom; + dataTopAndbottom = nullptr; + imageAnimator->Stop(); + delete imageAnimator; + imageAnimator = nullptr; + delete topRate; + topRate = nullptr; + delete bottomRate; + bottomRate = nullptr; + delete ratePerSec; + ratePerSec = nullptr; + delete ratePerSecText; + ratePerSecText = nullptr; + delete restRate; + restRate = nullptr; + delete restRateText1; + restRateText1 = nullptr; + delete restRateText2; + restRateText2 = nullptr; } - delete chart; - chart = nullptr; - delete imageViewTop; - imageViewTop = nullptr; - delete imageViewBottom; - imageViewBottom = nullptr; - delete dataTopAndbottom; - dataTopAndbottom = nullptr; - imageAnimator->Stop(); - delete imageAnimator; - imageAnimator = nullptr; - delete topRate; - topRate = nullptr; - delete bottomRate; - bottomRate = nullptr; - delete ratePerSec; - ratePerSec = nullptr; - delete ratePerSecText; - ratePerSecText = nullptr; - delete restRate; - restRate = nullptr; - delete restRateText1; - restRateText1 = nullptr; - delete restRateText2; - restRateText2 = nullptr; + g_pHeartRateView = nullptr; } - g_pHeartRateView = nullptr; -} -HeartRateView *HeartRateView::GetInstance(void) -{ - return g_pHeartRateView; -} - -int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值 -{ - int32_t ret; - - heartRateData[0].x = INVALID_HEART_VALUE; - heartRateData[0].y = INVALID_HEART_VALUE; - - ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); - if (ret != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret); + HeartRateView *HeartRateView::GetInstance(void) + { + return g_pHeartRateView; } - return ret; -} -int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize) -{ - int ret; + int32_t HeartRateView::InitHeartRateData(void) // 初始化心率数据,将存放心率数据的有效字节设置为无效值 + { + int32_t ret; - if (rateData == nullptr) { - return OHOS_FAILURE; - } + heartRateData[0].x = INVALID_HEART_VALUE; + heartRateData[0].y = INVALID_HEART_VALUE; - if (rateDataSize > sizeof(Point) * HEART_AVE_NUM) { - rateDataSize = sizeof(Point) * HEART_AVE_NUM; - } - InitHeartRateData(); - ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret); - return OHOS_FAILURE; + ret = memset_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InitHeartRateData] memset_s heartRateData fail! ret = %d", ret); + } + return ret; } - return OHOS_SUCCESS; -} + int32_t HeartRateView::SetHeartRateData(Point *rateData, uint32 rateDataSize) + { + int ret; + if (rateData == nullptr) + { + return OHOS_FAILURE; + } -int32_t HeartRateView::HeartRateDataProc(void) -{ - int32_t i, ret; - Point datain[HEART_AVE_NUM]; + if (rateDataSize > sizeof(Point) * HEART_AVE_NUM) + { + rateDataSize = sizeof(Point) * HEART_AVE_NUM; + } + InitHeartRateData(); + ret = memcpy_s(heartRateData, sizeof(Point) * HEART_AVE_NUM, rateData, rateDataSize); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s heartRateData fail! ret = %d", ret); + return OHOS_FAILURE; + } - ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM); - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret); - return OHOS_FAILURE; + return OHOS_SUCCESS; } - ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值 - if (ret != EOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret); - return OHOS_FAILURE; - } + int32_t HeartRateView::HeartRateDataProc(void) + { + int32_t i, ret; + Point datain[HEART_AVE_NUM]; - dataNume = 0; - for (i = 0; i < HEART_AVE_NUM; i++) { - if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 && - datain[i].y <= HEART_RATE_LIMIT_UPPER) { - rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE; - rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE; - dataNume++; + ret = memcpy_s(datain, sizeof(Point) * HEART_AVE_NUM, heartRateData, sizeof(Point) * HEART_AVE_NUM); + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memcpy_s rateDataTmp fail! ret = %d", ret); + return OHOS_FAILURE; } - } - return OHOS_SUCCESS; -} -void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo) -{ - label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize); - label->SetPosition(labelInfo.x, labelInfo.y); - label->Resize(labelInfo.width, labelInfo.height); - label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); - Add(label); -} - -void HeartRateView::HeartRateLabelDisplay(void) -{ - LabelInfo PerSecLabel = { PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y, - PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT }; - LabelInfo PerSecTextLabel = { PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y, - PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT }; - - LabelInfo topLabel = { HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT }; - LabelInfo bottomLabel = { HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH, - BOTTOM_TEXT_HEIGHT }; - - LabelInfo restRateLabel = { REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH, - REST_HEART_RATE_HEIGHT }; - LabelInfo restRateTextLabel1 = { REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1, - REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1 }; - LabelInfo restRateTextLabel2 = { REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2, - REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2 }; - - topRate = new UILabel(); - bottomRate = new UILabel(); - ratePerSec = new UILabel(); - ratePerSecText = new UILabel(); - restRate = new UILabel(); - restRateText1 = new UILabel(); - restRateText2 = new UILabel(); - - if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr || - restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail"); - } + ret = memset_s(rateDataTmp, sizeof(Point) * HEART_AVE_NUM, INVALID_HEART_VALUE, sizeof(Point) * HEART_AVE_NUM); // 替换为无效值 + if (ret != EOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateDataProc] memset_s rateDataTmp fail! ret = %d", ret); + return OHOS_FAILURE; + } - // 实时心率 - SetLabel(ratePerSec, PerSecLabel); - SetLabel(ratePerSecText, PerSecTextLabel); - ratePerSec->SetText("--"); - ratePerSecText->SetText("次/分"); - - // 最高最低心率 - SetLabel(topRate, topLabel); - SetLabel(bottomRate, bottomLabel); - topRate->SetText("--"); - bottomRate->SetText("--"); - - // 静息心率 - SetLabel(restRate, restRateLabel); - SetLabel(restRateText1, restRateTextLabel1); - SetLabel(restRateText2, restRateTextLabel2); - restRateText1->SetText("静息"); - restRate->SetText("--"); - restRateText2->SetText("次/分"); -} - -void HeartRateView::HeartRateCoordinate(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start"); - // 坐标图片 - imageViewCoordinate = new UIImageView(); - if (imageViewCoordinate == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail"); - return; - } - imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y); - imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH); - imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT); - Add(imageViewCoordinate); - - // 心电图坐标适配 - chart = new UIChartPolyline(); - if (chart == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail"); - return; - } - chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y); - chart->SetWidth(COORDINATE_WIDTH); - chart->SetHeight(COORDINATE_HEIGHT); - chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); - chart->SetStyle(STYLE_BACKGROUND_OPA, 0); - chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width - - UIXAxis &xAxis = chart->GetXAxis(); - UIYAxis &yAxis = chart->GetYAxis(); - xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数 - yAxis.SetDataRange(0, COORDINATE_HEIGHT); - xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); - yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); - chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA); - Add(chart); -} - -void HeartRateView::InsertTopAndBottomRateImage(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start"); - imageViewTop = new UIImageView(); - imageViewBottom = new UIImageView(); - if (imageViewTop == nullptr || imageViewBottom == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail"); - return; - } - imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y); - imageViewTop->SetWidth(TOP_IMAGE_WIDTH); - imageViewTop->SetHeight(TOP_IMAGE_HEIGHT); - Add(imageViewTop); - imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y); - imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH); - imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT); - Add(imageViewBottom); -} - -void HeartRateView::UpdataTopAndBottomRate(void) -{ - uint16_t bottom, top; - if (chart == nullptr) { - return; - } - if (dataTopAndbottom != nullptr) { - chart->DeleteDataSerial(dataTopAndbottom); - delete dataTopAndbottom; - dataTopAndbottom = nullptr; - } - dataTopAndbottom = new UIChartDataSerial(); - if (dataTopAndbottom == nullptr) { - return; - } - if (dataNume != 1) { - dataTopAndbottom->SetMaxDataCount(dataNume); // number of data points - dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points - } else { - Point tmp[NUM_2]; - tmp[0].x = tmp[1].x = rateDataTmp[0].x; - tmp[0].y = tmp[1].y = rateDataTmp[0].y; - dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points - dataTopAndbottom->AddPoints(tmp, NUM_2); // number of data points - } - dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明 - chart->AddDataSerial(dataTopAndbottom); - chart->Invalidate(); - - UIChartDataSerial::PointStyle pointStyle; - // 最低心跳 - dataTopAndbottom->EnableBottomPoint(true); - pointStyle.radius = BOTTOM_RADIUS; // Inner radius - pointStyle.fillColor = Color::Gray(); - pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width - pointStyle.strokeColor = Color::Black(); - dataTopAndbottom->SetBottomPointStyle(pointStyle); - chart->Invalidate(); - - bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; - // 最高心跳 - dataTopAndbottom->EnableTopPoint(true); - pointStyle.fillColor = Color::Red(); - pointStyle.radius = TOP_RADIUS; // Inner radius - pointStyle.strokeColor = Color::Black(); - pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width - dataTopAndbottom->SetTopPointStyle(pointStyle); - chart->Invalidate(); - - top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; - if (top <= HEART_RATE_LIMIT_UPPER) { - maxRate = (maxRate >= top) ? maxRate : top; - } - if (bottom != 0) { - minRate = (minRate <= bottom) ? minRate : bottom; - } -} + dataNume = 0; + for (i = 0; i < HEART_AVE_NUM; i++) + { + if (datain[i].x >= 0 && datain[i].x < HEART_AVE_NUM && datain[i].y > 0 && + datain[i].y <= HEART_RATE_LIMIT_UPPER) + { + rateDataTmp[dataNume].x = datain[i].x + COORDINATE_VALUE; + rateDataTmp[dataNume].y = datain[i].y * ACT_IMAGE_COOR_PIXELS / ACT_IMAGE_COOR_VALUE; + dataNume++; + } + } + return OHOS_SUCCESS; + } + + void HeartRateView::SetLabel(UILabel *label, LabelInfo labelInfo) + { + label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelInfo.fontSize); + label->SetPosition(labelInfo.x, labelInfo.y); + label->Resize(labelInfo.width, labelInfo.height); + label->SetStyle(STYLE_BACKGROUND_COLOR, OPA_TRANSPARENT); + Add(label); + } + + void HeartRateView::HeartRateLabelDisplay(void) + { + LabelInfo PerSecLabel = {PERSEC_HEART_RATE_FONT_SIZE, PERSEC_HEART_RATE_X, PERSEC_HEART_RATE_Y, + PERSEC_HEART_RATE_WIDTH, PERSEC_HEART_RATE_HEIGHT}; + LabelInfo PerSecTextLabel = {PERSEC_HEART_TEXT_FONT_SIZE, PERSEC_HEART_TEXT_X, PERSEC_HEART_TEXT_Y, + PERSEC_HEART_TEXT_WIDTH, PERSEC_HEART_TEXT_HEIGHT}; + + LabelInfo topLabel = {HEART_RATE_LIMIT_FONT_SIZE, TOP_TEXT_X, TOP_TEXT_Y, TOP_TEXT_WIDTH, TOP_TEXT_HEIGHT}; + LabelInfo bottomLabel = {HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH, + BOTTOM_TEXT_HEIGHT}; + + LabelInfo restRateLabel = {REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH, + REST_HEART_RATE_HEIGHT}; + LabelInfo restRateTextLabel1 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1, + REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1}; + LabelInfo restRateTextLabel2 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2, + REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2}; + + topRate = new UILabel(); + bottomRate = new UILabel(); + ratePerSec = new UILabel(); + ratePerSecText = new UILabel(); + restRate = new UILabel(); + restRateText1 = new UILabel(); + restRateText2 = new UILabel(); + + if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr || + restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail"); + } -void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index) -{ - Point tmp[NUM_2]; + // 实时心率 + SetLabel(ratePerSec, PerSecLabel); + SetLabel(ratePerSecText, PerSecTextLabel); + ratePerSec->SetText("--"); + ratePerSecText->SetText("次/分"); - if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) { - return; + // 最高最低心率 + SetLabel(topRate, topLabel); + SetLabel(bottomRate, bottomLabel); + topRate->SetText("--"); + bottomRate->SetText("--"); + + // 静息心率 + SetLabel(restRate, restRateLabel); + SetLabel(restRateText1, restRateTextLabel1); + SetLabel(restRateText2, restRateTextLabel2); + restRateText1->SetText("静息"); + restRate->SetText("--"); + restRateText2->SetText("次/分"); + } + + void HeartRateView::HeartRateCoordinate(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateCoordinate start"); + // 坐标图片 + imageViewCoordinate = new UIImageView(); + if (imageViewCoordinate == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new imageViewCoordinate fail"); + return; + } + imageViewCoordinate->SetPosition(ACT_IMAGE_X, ACT_IMAGE_Y); + imageViewCoordinate->SetWidth(ACT_IMAGE_COOR_WIDTH); + imageViewCoordinate->SetHeight(ACT_IMAGE_COOR_HEIGHT); + Add(imageViewCoordinate); + + // 心电图坐标适配 + chart = new UIChartPolyline(); + if (chart == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateCoordinate] new chart fail"); + return; + } + chart->SetPosition(COORDINATE_POINT_X, COORDINATE_POINT_Y); + chart->SetWidth(COORDINATE_WIDTH); + chart->SetHeight(COORDINATE_HEIGHT); + chart->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + chart->SetStyle(STYLE_BACKGROUND_OPA, 0); + chart->SetStyle(STYLE_LINE_WIDTH, 1); // line width + + UIXAxis &xAxis = chart->GetXAxis(); + UIYAxis &yAxis = chart->GetYAxis(); + xAxis.SetDataRange(0, COORDINATE_WIDTH); // 24小时对应的秒数 + yAxis.SetDataRange(0, COORDINATE_HEIGHT); + xAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); + yAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); + chart->SetGradientOpacity(COORDINATE_GRAD_MIN_OPA, COORDINATE_GRAD_MAX_OPA); + Add(chart); + } + + void HeartRateView::InsertTopAndBottomRateImage(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::InsertTopAndBottomRateImage start"); + imageViewTop = new UIImageView(); + imageViewBottom = new UIImageView(); + if (imageViewTop == nullptr || imageViewBottom == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[InsertTopAndBottomRateImage] new imageViewTop or imageViewBottom fail"); + return; + } + imageViewTop->SetPosition(TOP_IMAGE_X, TOP_IMAGE_Y); + imageViewTop->SetWidth(TOP_IMAGE_WIDTH); + imageViewTop->SetHeight(TOP_IMAGE_HEIGHT); + Add(imageViewTop); + imageViewBottom->SetPosition(BOTTOM_IMAGE_X, BOTTOM_IMAGE_Y); + imageViewBottom->SetWidth(BOTTOM_IMAGE_WIDTH); + imageViewBottom->SetHeight(BOTTOM_IMAGE_HEIGHT); + Add(imageViewBottom); + } + + void HeartRateView::UpdataTopAndBottomRate(void) + { + uint16_t bottom, top; + if (chart == nullptr) + { + return; + } + if (dataTopAndbottom != nullptr) + { + chart->DeleteDataSerial(dataTopAndbottom); + delete dataTopAndbottom; + dataTopAndbottom = nullptr; + } + dataTopAndbottom = new UIChartDataSerial(); + if (dataTopAndbottom == nullptr) + { + return; + } + if (dataNume != 1) + { + dataTopAndbottom->SetMaxDataCount(dataNume); // number of data points + dataTopAndbottom->AddPoints(rateDataTmp, dataNume); // number of data points + } + else + { + Point tmp[NUM_2]; + tmp[0].x = tmp[1].x = rateDataTmp[0].x; + tmp[0].y = tmp[1].y = rateDataTmp[0].y; + dataTopAndbottom->SetMaxDataCount(NUM_2); // number of data points + dataTopAndbottom->AddPoints(tmp, NUM_2); // number of data points + } + dataTopAndbottom->SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); // 设置透明 + chart->AddDataSerial(dataTopAndbottom); + chart->Invalidate(); + + UIChartDataSerial::PointStyle pointStyle; + // 最低心跳 + dataTopAndbottom->EnableBottomPoint(true); + pointStyle.radius = BOTTOM_RADIUS; // Inner radius + pointStyle.fillColor = Color::Gray(); + pointStyle.strokeWidth = BOTTOM_STROKE_WIDTH; // border width + pointStyle.strokeColor = Color::Black(); + dataTopAndbottom->SetBottomPointStyle(pointStyle); + chart->Invalidate(); + + bottom = dataTopAndbottom->GetValleyData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; + // 最高心跳 + dataTopAndbottom->EnableTopPoint(true); + pointStyle.fillColor = Color::Red(); + pointStyle.radius = TOP_RADIUS; // Inner radius + pointStyle.strokeColor = Color::Black(); + pointStyle.strokeWidth = TOP_STROKE_WIDTH; // border width + dataTopAndbottom->SetTopPointStyle(pointStyle); + chart->Invalidate(); + + top = dataTopAndbottom->GetPeakData() * ACT_IMAGE_COOR_VALUE / ACT_IMAGE_COOR_PIXELS; + if (top <= HEART_RATE_LIMIT_UPPER) + { + maxRate = (maxRate >= top) ? maxRate : top; + } + if (bottom != 0) + { + minRate = (minRate <= bottom) ? minRate : bottom; + } } - tmp[0].x = tmp[1].x = rateData[index].x; - tmp[0].y = tmp[1].y = rateData[index].y; + void HeartRateView::ElectrocardiogramOnePoint(Point *rateData, uint16_t index) + { + Point tmp[NUM_2]; + + if (rateData == nullptr || chart == nullptr || index >= HEART_AVE_NUM || serialIndex >= HEART_AVE_NUM) + { + return; + } - dataSerial[serialIndex] = new UIChartDataSerial(); - if (dataSerial[serialIndex] == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex); - serialIndex++; - return; - } + tmp[0].x = tmp[1].x = rateData[index].x; + tmp[0].y = tmp[1].y = rateData[index].y; - dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点 - dataSerial[serialIndex]->AddPoints(tmp, NUM_2); - dataSerial[serialIndex]->SetLineColor(Color::Red()); - dataSerial[serialIndex]->SetFillColor(Color::Red()); - dataSerial[serialIndex]->EnableGradient(true); + dataSerial[serialIndex] = new UIChartDataSerial(); + if (dataSerial[serialIndex] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramOnePoint] new dataSerial[%d] fail", serialIndex); + serialIndex++; + return; + } - chart->AddDataSerial(dataSerial[serialIndex]); - chart->Invalidate(); - serialIndex++; -} + dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // 设置最大显示的像素点 + dataSerial[serialIndex]->AddPoints(tmp, NUM_2); + dataSerial[serialIndex]->SetLineColor(Color::Red()); + dataSerial[serialIndex]->SetFillColor(Color::Red()); + dataSerial[serialIndex]->EnableGradient(true); -void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume) -{ - uint16_t i = 0; - uint16_t j = 0; - uint16_t tmp = 1; - if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM) { - return; + chart->AddDataSerial(dataSerial[serialIndex]); + chart->Invalidate(); + serialIndex++; } - while (i < rateDataNume) { - while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4)) { // 15分钟对应的秒数 - tmp++; - j++; + void HeartRateView::ElectrocardiogramMultiPoint(Point *rateData, uint16_t rateDataNume) + { + uint16_t i = 0; + uint16_t j = 0; + uint16_t tmp = 1; + if (rateData == nullptr || chart == nullptr || rateDataNume > HEART_AVE_NUM) + { + return; } - if (tmp == 1) { - ElectrocardiogramOnePoint(rateData, i); - } else { - if (serialIndex >= HEART_AVE_NUM) { - return; + + while (i < rateDataNume) + { + while ((j + 1 < rateDataNume) && (rateData[j + 1].x - rateData[j].x <= NUM_4)) + { // 15分钟对应的秒数 + tmp++; + j++; } - if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0) { - dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points - chart->Invalidate(); - } else { - dataSerial[serialIndex] = new UIChartDataSerial(); - if (dataSerial[serialIndex] == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex); - serialIndex++; + if (tmp == 1) + { + ElectrocardiogramOnePoint(rateData, i); + } + else + { + if (serialIndex >= HEART_AVE_NUM) + { return; } - - dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points - dataSerial[serialIndex]->AddPoints(rateData + i, tmp); // number of data points - dataSerial[serialIndex]->SetLineColor(Color::Red()); - dataSerial[serialIndex]->SetFillColor(Color::Red()); - dataSerial[serialIndex]->EnableGradient(true); - - chart->AddDataSerial(dataSerial[serialIndex]); - chart->Invalidate(); - serialIndex++; + if (serialIndex > 0 && dataSerial[serialIndex - 1] != nullptr && i == 0) + { + dataSerial[serialIndex - 1]->AddPoints(rateData + 1, tmp - 1); // number of data points + chart->Invalidate(); + } + else + { + dataSerial[serialIndex] = new UIChartDataSerial(); + if (dataSerial[serialIndex] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[ElectrocardiogramMultiPoint] new dataSerial[%d] fail", serialIndex); + serialIndex++; + return; + } + + dataSerial[serialIndex]->SetMaxDataCount(HEART_AVE_NUM); // number of data points + dataSerial[serialIndex]->AddPoints(rateData + i, tmp); // number of data points + dataSerial[serialIndex]->SetLineColor(Color::Red()); + dataSerial[serialIndex]->SetFillColor(Color::Red()); + dataSerial[serialIndex]->EnableGradient(true); + + chart->AddDataSerial(dataSerial[serialIndex]); + chart->Invalidate(); + serialIndex++; + } } + i += tmp; + j = i; + tmp = 1; } - i += tmp; - j = i; - tmp = 1; } -} -void HeartRateView::HeartRateElectrocardiogram(void) -{ - if (dataNume == 0) { - return; - } - serialIndex = 0; - if (dataNume != 1) { - ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点 - } else { - ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点 + void HeartRateView::HeartRateElectrocardiogram(void) + { + if (dataNume == 0) + { + return; + } + serialIndex = 0; + if (dataNume != 1) + { + ElectrocardiogramMultiPoint(rateDataTmp, dataNume); // 多个点 + } + else + { + ElectrocardiogramOnePoint(rateDataTmp, 0); // 一个点 + } + currIndex = dataNume; } - currIndex = dataNume; -} -void HeartRateView::HeartbeatImageAnimator() -{ - imageAnimator = new UIImageAnimatorView(); - if (imageAnimator == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail"); - return; - } - imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT); - imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY); - imageAnimator->SetRepeat(true); - Add(imageAnimator); - imageAnimator->Start(); -} - -void HeartRateView::HeartbeatImageAnimatorStart(void) -{ - if (imageAnimator != nullptr) { + void HeartRateView::HeartbeatImageAnimator() + { + imageAnimator = new UIImageAnimatorView(); + if (imageAnimator == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartbeatImageAnimator] new imageAnimator fail"); + return; + } + imageAnimator->SetPosition(HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT); + imageAnimator->SetImageAnimatorSrc(g_heartBeatImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY); + imageAnimator->SetRepeat(true); + Add(imageAnimator); imageAnimator->Start(); } -} -void HeartRateView::HeartbeatImageAnimatorStop(void) -{ - if (imageAnimator != nullptr) { - imageAnimator->Stop(); + void HeartRateView::HeartbeatImageAnimatorStart(void) + { + if (imageAnimator != nullptr) + { + imageAnimator->Start(); + } } -} -bool HeartRateView::InitView(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitView"); - HeartRateDataProc(); - HeartRateLabelDisplay(); - HeartbeatImageAnimator(); - HeartRateCoordinate(); - InsertTopAndBottomRateImage(); - HeartRateElectrocardiogram(); - UpdataTopAndBottomRate(); - HeartbeatImageAnimatorStop(); - InitRefreshInterface(); - return true; -} - -void HeartRateView::PreLoad(void) -{ - if (!viewiInitStatus) { - if (InitView()) { - viewiInitStatus = true; + void HeartRateView::HeartbeatImageAnimatorStop(void) + { + if (imageAnimator != nullptr) + { + imageAnimator->Stop(); } } - if (!resLoadStatus) { - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP); - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM); - ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR); - resLoadStatus = true; + bool HeartRateView::InitView(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitView"); + HeartRateDataProc(); + HeartRateLabelDisplay(); + HeartbeatImageAnimator(); + HeartRateCoordinate(); + InsertTopAndBottomRateImage(); + HeartRateElectrocardiogram(); + UpdataTopAndBottomRate(); + HeartbeatImageAnimatorStop(); + InitRefreshInterface(); + return true; } -} -void HeartRateView::UnLoad(void) -{ - if (resLoadStatus) { - ImageInfo* img = nullptr; - imageViewTop->SetSrc(img); - imageViewBottom->SetSrc(img); - imageViewCoordinate->SetSrc(img); - ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES); - resLoadStatus = false; - } -} + void HeartRateView::PreLoad(void) + { + if (!viewiInitStatus) + { + if (InitView()) + { + viewiInitStatus = true; + } + } -void HeartRateView::InitRefreshInterface(void) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface"); - - Point *rateData = HeartModel::GetInstance()->GetAveHeartRate(); - uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount(); - SetHeartRateData(rateData, sizeof(Point) * len); - uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax(); - uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin(); - RefreshElectrocardiogram(); - if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER) { - RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax()); - } - if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER) { - RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin()); + if (!resLoadStatus) + { + ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewTop, HEART_HEARTRATE_TOP); + ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewBottom, HEART_HEARTRATE_BOTTOM); + ScreenModels::GetInstance()->LoadAppImages(HEART_IAMGES, imageViewCoordinate, HEART_HEARTRATECOOR); + resLoadStatus = true; + } } -} -// 刷新心率曲线 -void HeartRateView::RefreshElectrocardiogram(void) -{ - int32_t ret; - uint16_t tmp, count; - Point *rate = nullptr; - Point modPoint; - - ret = HeartRateDataProc(); - if (ret != OHOS_SUCCESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail"); - return; + void HeartRateView::UnLoad(void) + { + if (resLoadStatus) + { + ImageInfo *img = nullptr; + imageViewTop->SetSrc(img); + imageViewBottom->SetSrc(img); + imageViewCoordinate->SetSrc(img); + ImageCacheManager::GetInstance().UnloadAllInMultiRes(HEART_IAMGES); + resLoadStatus = false; + } } - rate = rateDataTmp; - if (chart == nullptr) { - return; - } + void HeartRateView::InitRefreshInterface(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartRateView::HeartRateView::InitRefreshInterface"); - if (currIndex >= HEART_AVE_NUM) { - currIndex = HEART_AVE_NUM; - } - if (dataNume > currIndex) { - tmp = dataNume - currIndex; - if (currIndex > 0) { - rate += (currIndex - 1); - tmp += 1; + Point *rateData = HeartModel::GetInstance()->GetAveHeartRate(); + uint16_t len = HeartModel::GetInstance()->GetAveHeartRateCount(); + SetHeartRateData(rateData, sizeof(Point) * len); + uint16_t maxRate = HeartModel::GetInstance()->GetHeartRateMax(); + uint16_t minRate = HeartModel::GetInstance()->GetHeartRateMin(); + RefreshElectrocardiogram(); + if (maxRate > 0 && maxRate < HEART_RATE_LIMIT_UPPER) + { + RefreshHeartRateMax(HeartModel::GetInstance()->GetHeartRateMax()); } - ElectrocardiogramMultiPoint(rate, tmp); - currIndex = dataNume; - } else if (dataNume == currIndex) { // 当前点平均心率刷新 - if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr) { - modPoint.x = rate[currIndex - 1].x; - modPoint.y = rate[currIndex - 1].y; - - count = dataSerial[serialIndex - 1]->GetDataCount(); - dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint); - chart->Invalidate(); + if (minRate > 0 && minRate < HEART_RATE_LIMIT_UPPER) + { + RefreshHeartRateMin(HeartModel::GetInstance()->GetHeartRateMin()); } - } else { - return; } - UpdataTopAndBottomRate(); // 最高、最低心率 -} -// 清空心率曲线 -void HeartRateView::ClearElectrocardiogram(void) -{ - int32_t i; - dataNume = 0; - currIndex = 0; - maxRate = 0; - minRate = HEART_RATE_LIMIT_UPPER; - InitHeartRateData(); - - if (chart == nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr"); - return; - } + // 刷新心率曲线 + void HeartRateView::RefreshElectrocardiogram(void) + { + int32_t ret; + uint16_t tmp, count; + Point *rate = nullptr; + Point modPoint; - if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr) { - ratePerSec->SetText("--"); - topRate->SetText("--"); - bottomRate->SetText("--"); - restRate->SetText("--"); - } + ret = HeartRateDataProc(); + if (ret != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[RefreshElectrocardiogram()] fail"); + return; + } + rate = rateDataTmp; + + if (chart == nullptr) + { + return; + } - chart->DeleteDataSerial(dataTopAndbottom); - delete dataTopAndbottom; - dataTopAndbottom = nullptr; - for (i = 0; i < serialIndex; i++) { - delete dataSerial[i]; - dataSerial[i] = nullptr; + if (currIndex >= HEART_AVE_NUM) + { + currIndex = HEART_AVE_NUM; + } + if (dataNume > currIndex) + { + tmp = dataNume - currIndex; + if (currIndex > 0) + { + rate += (currIndex - 1); + tmp += 1; + } + ElectrocardiogramMultiPoint(rate, tmp); + currIndex = dataNume; + } + else if (dataNume == currIndex) + { // 当前点平均心率刷新 + if (serialIndex > 0 && serialIndex <= HEART_AVE_NUM && dataSerial[serialIndex - 1] != nullptr) + { + modPoint.x = rate[currIndex - 1].x; + modPoint.y = rate[currIndex - 1].y; + + count = dataSerial[serialIndex - 1]->GetDataCount(); + dataSerial[serialIndex - 1]->ModifyPoint(count - 1, modPoint); + chart->Invalidate(); + } + } + else + { + return; + } + UpdataTopAndBottomRate(); // 最高、最低心率 } - chart->ClearDataSerial(); - serialIndex = 0; - chart->Invalidate(); -} + // 清空心率曲线 + void HeartRateView::ClearElectrocardiogram(void) + { + int32_t i; + dataNume = 0; + currIndex = 0; + maxRate = 0; + minRate = HEART_RATE_LIMIT_UPPER; + InitHeartRateData(); + + if (chart == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "chart == nullptr"); + return; + } -// 刷新每秒上报的心率 -void HeartRateView::RefreshHeartRatePerSec(uint16_t value) -{ - char heartRate[NUM_4] = "--"; - int32_t ret = 0; + if (ratePerSec != nullptr && topRate != nullptr && bottomRate != nullptr && restRate != nullptr) + { + ratePerSec->SetText("--"); + topRate->SetText("--"); + bottomRate->SetText("--"); + restRate->SetText("--"); + } - if (ratePerSec == nullptr) { - return; - } + chart->DeleteDataSerial(dataTopAndbottom); + delete dataTopAndbottom; + dataTopAndbottom = nullptr; + for (i = 0; i < serialIndex; i++) + { + delete dataSerial[i]; + dataSerial[i] = nullptr; + } + chart->ClearDataSerial(); - if (value == 0) { - ratePerSec->SetText("--"); - HeartbeatImageAnimatorStop(); - return; - } - HeartbeatImageAnimatorStart(); - if (value > NUM_99) { - ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); - } else { - ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); + serialIndex = 0; + chart->Invalidate(); } - if (ret > EOK) { - ratePerSec->SetText(heartRate); - } -} -// 刷新最大心率 -void HeartRateView::RefreshHeartRateMax(uint16_t max) -{ - char top[NUM_4] = "--"; - int32_t ret = 0; - maxRate = (maxRate >= max) ? maxRate : max; - if (topRate == nullptr) { - return; - } - if (maxRate <= HEART_RATE_LIMIT_LOWER) { - topRate->SetText("--"); - return; - } - ret = sprintf_s(top, sizeof(top), "%u", maxRate); - if (ret > EOK) { - topRate->SetText(top); - } -} + // 刷新每秒上报的心率 + void HeartRateView::RefreshHeartRatePerSec(uint16_t value) + { + char heartRate[NUM_4] = "--"; + int32_t ret = 0; -// 刷新最小心率 -void HeartRateView::RefreshHeartRateMin(uint16_t min) -{ - char bottom[NUM_4] = "--"; - int32_t ret = 0; + if (ratePerSec == nullptr) + { + return; + } - minRate = (minRate <= min) ? minRate : min; - if (bottomRate == nullptr) { - return; - } - if (minRate >= HEART_RATE_LIMIT_UPPER) { - bottomRate->SetText("--"); - return; + if (value == 0) + { + ratePerSec->SetText("--"); + HeartbeatImageAnimatorStop(); + return; + } + HeartbeatImageAnimatorStart(); + if (value > NUM_99) + { + ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); + } + else + { + ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); + } + if (ret > EOK) + { + ratePerSec->SetText(heartRate); + } } - ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate); - if (ret > EOK) { - bottomRate->SetText(bottom); + + // 刷新最大心率 + void HeartRateView::RefreshHeartRateMax(uint16_t max) + { + char top[NUM_4] = "--"; + int32_t ret = 0; + maxRate = (maxRate >= max) ? maxRate : max; + if (topRate == nullptr) + { + return; + } + if (maxRate <= HEART_RATE_LIMIT_LOWER) + { + topRate->SetText("--"); + return; + } + ret = sprintf_s(top, sizeof(top), "%u", maxRate); + if (ret > EOK) + { + topRate->SetText(top); + } } -} -// 刷新静息心率 -void HeartRateView::RefreshRestHeartRate(uint16_t value) -{ - char heartRate[NUM_4] = "--"; - int32_t ret = 0; + // 刷新最小心率 + void HeartRateView::RefreshHeartRateMin(uint16_t min) + { + char bottom[NUM_4] = "--"; + int32_t ret = 0; - if (restRate == nullptr) { - return; + minRate = (minRate <= min) ? minRate : min; + if (bottomRate == nullptr) + { + return; + } + if (minRate >= HEART_RATE_LIMIT_UPPER) + { + bottomRate->SetText("--"); + return; + } + ret = sprintf_s(bottom, sizeof(bottom), "%u", minRate); + if (ret > EOK) + { + bottomRate->SetText(bottom); + } } - if (value == 0 || value == (uint16_t)0xFFFF) { // 无效值 - restRate->SetText("--"); - } else { - if (value > NUM_99) { - ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); - } else { - ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); + // 刷新静息心率 + void HeartRateView::RefreshRestHeartRate(uint16_t value) + { + char heartRate[NUM_4] = "--"; + int32_t ret = 0; + + if (restRate == nullptr) + { + return; } - if (ret > EOK) { - restRate->SetText(heartRate); + if (value == 0 || value == (uint16_t)0xFFFF) + { + // 无效值 + restRate->SetText("--"); + } + else + { + if (value > NUM_99) + { + ret = sprintf_s(heartRate, sizeof(heartRate), "%u", value); + } + else + { + ret = sprintf_s(heartRate, sizeof(heartRate), " %u", value); + } + + if (ret > EOK) + { + restRate->SetText(heartRate); + } } } -} } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultView.cpp new file mode 100644 index 000000000..20078aeab --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartResultView.cpp @@ -0,0 +1,249 @@ + + +#include "UiConfig.h" +#include "wearable_log.h" +#include "HeartResultView.h" +#include "HeartModel.h" +#include "ui_image_animator.h" +#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; + HeartResultView::HeartResultView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView"); + + g_pMainView = this; + } + + HeartResultView *HeartResultView::GetInstance(void) + { + return g_pMainView; + } + + HeartResultView::~HeartResultView() + { + 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; + } + // 初始化标签 + bool HeartResultView::InitLabel() + { + titlelabel = new UILabel(); + 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->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 UILabel(); + if (label1 == nullptr) + { + 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 UILabel(); + if (label2 == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail"); + return false; + } + 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 UILabel(); + if (label3 == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail"); + return false; + } + 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); + + return true; + } + // 初始化图片 + bool HeartResultView::InitImageDisplay() + { + 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); + return true; + } + UIScrollView *HeartResultView::HeartResultViewInit() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::CreateUIViewHeartResultScrollView"); + HeartResultScrollView = new UIScrollView(); + if (HeartResultScrollView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::new HeartResultScrollView fail"); + return nullptr; + } + HeartResultScrollView->SetPosition(0, 0); + HeartResultScrollView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + HeartResultScrollView->SetScrollBlankSize(35); + HeartResultScrollView->SetReboundSize(50); + HeartResultScrollView->SetDirection(1); + // 增加拖拽监听 + UIView::OnDragListener *draglistener = static_cast(new HeartPresenter()); + if (draglistener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "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, "nitImageDisplay fail"); + return nullptr; + } + if (InitLabel() == false) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitLabel fail"); + return nullptr; + } + /* -------------------------------------------------------------------------- */ + ReButton = new UILabelButton(); + if (ReButton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButton fail"); + return nullptr; + } + ReButton->SetPosition(118, 334); + ReButton->Resize(230, 80); + ReButton->SetText("重新检测"); + 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) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeft1Listener fail"); + return nullptr; + } + ReButton->SetOnClickListener(clickLeft1Listener); + /* -------------------------------------------------------------------------- */ + StButton = new UILabelButton(); + if (StButton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UILabelButton fail"); + return nullptr; + } + StButton->SetPosition(118, 434); // widget's left position and top position + StButton->Resize(230, 80); // widget's width and height + StButton->SetText("停止检测"); + 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) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeft2Listener fail"); + return 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; + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp new file mode 100644 index 000000000..8dcd0e558 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp @@ -0,0 +1,401 @@ +/* + * 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 "HeartModel.h" +#include "HeartPresenter.h" +#include "displaybrightness/include/DisplayBrightnessModel.h" +#include "power_display_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 = 133; + 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; + } + + 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; + + imageViewMain = nullptr; + titleLabel = nullptr; + timeLabel = nullptr; + percent = nullptr; + testButton = nullptr; + g_pMainView = nullptr; + heartcheck = nullptr; + delete HeartScrollView[HEARTVIEW]; + HeartScrollView[HEARTVIEW] = nullptr; + } + HeartView *HeartView::GetInstance(void) + { + return g_pMainView; + } + void HeartView::Upheartdata() + { + // 更新血氧数据 + uint16_t heart_ = HeartModel::GetInstance()->GetHeartdata(); + if (heart_ != 97) // 判断是否为默认数据 + { + std::string heartStr = std::to_string(heart_); + percent->SetText(heartStr.c_str()); + } + // 更新时间 + uint16_t time = HeartPresenter::GetInstance()->GetCurrentTime(); + uint16_t check_time = HeartModel::GetInstance()->GetCheckTime(); + std::string TimeStr = HeartPresenter::GetInstance()->GetTDOA(time, check_time) + "检测"; + timeLabel->SetText(TimeStr.c_str()); + } + + // 初始化标签 + bool HeartView::InitLabel() + { + /* -------------------------------------------------------------------------- */ + percent = new UILabel(); + 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(200, 200); // widget's width and height + percent->SetViewId("label2"); // Set style + percent->SetStyle(STYLE_TEXT_FONT, PERCENT_FONT_SIZE); + uint16_t heart_ = HeartModel::GetInstance()->GetHeartdata(); + std::string heartStr = std::to_string(heart_); + percent->SetText(heartStr.c_str()); + 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 UILabel(); + 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); + /* -------------------------------------------------------------------------- */ + // 更新时间 + uint16_t on_time = HeartPresenter::GetInstance()->GetCurrentTime(); + uint16_t check_time = HeartModel::GetInstance()->GetCheckTime(); + std::string TimeStr = HeartPresenter::GetInstance()->GetTDOA(on_time, check_time); + timeLabel->SetText(TimeStr.c_str()); + /* -------------------------------------------------------------------------- */ + 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 UILabel(); + 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->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + titleLabel->SetRollSpeed(0); + titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE); + /* -------------------------------------------------------------------------- */ + return true; + } + // 创建标签按键 + UILabelButton *HeartView::CreateAndSetUIButton(const char *title) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::CreateAndSetUIButton"); + UILabelButton *btn = new UILabelButton(); + if (btn == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new UILabelButton fail"); + return nullptr; + } + btn->SetPosition(TESTBUTTON_X, TESTBUTTON_Y, BUTTON_WIDHT2, BUTTON_HEIGHT2); + btn->SetStyle(STYLE_BACKGROUND_COLOR, 0xffcd492c); + btn->SetText(title); + // btn->SetTextColor(Color::Red()); + btn->SetFont(DEFAULT_VECTOR_FONT_FILENAME, BUTTON_LABEL_SIZE); + btn->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + btn->SetAlign(TEXT_ALIGNMENT_CENTER); + btn->SetViewId("checkbegin"); + UIView::OnClickListener *clickLeftListener = (UIView::OnClickListener *)OHOS::HeartPresenter::GetInstance(); + if (clickLeftListener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new clickLeftListener fail"); + return nullptr; + } + btn->SetOnClickListener(clickLeftListener); + return btn; + } + // 初始化背景 + bool HeartView::InitImageDisplay() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::InitImageDisplay"); + imageViewMain = new UIImageView(); + if (imageViewMain == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new UIImageView fail"); + return false; + } + imageViewMain->SetPosition(MATH_ZERO, MATH_ZERO); // 30 : offset + char *image1imagesPath = "/user/res/Blood/beijing.bin"; + imageViewMain->SetSrc(image1imagesPath); + return true; + } + // 初始化界面 + bool HeartView::InitHeartView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitHeartView"); + HeartScrollView[HEARTVIEW] = new UIScrollView(); + if (HeartScrollView[HEARTVIEW] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::HeartScrollView new fail!"); + return false; + } + HeartScrollView[HEARTVIEW]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + HeartScrollView[HEARTVIEW]->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + HeartScrollView[HEARTVIEW]->SetScrollBlankSize(35); + HeartScrollView[HEARTVIEW]->SetReboundSize(50); + HeartScrollView[HEARTVIEW]->SetDirection(1); + // 增加拖拽监听 + UIView::OnDragListener *draglistener = static_cast(new HeartPresenter()); + if (draglistener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::draglistener can not be nullptr!"); + return false; + } + HeartScrollView[HEARTVIEW]->SetOnDragListener(draglistener); + HeartScrollView[HEARTVIEW]->SetTouchable(true); + HeartScrollView[HEARTVIEW]->SetDraggable(true); + HeartScrollView[HEARTVIEW]->SetVerticalScrollState(false); // 禁止纵向滑动 + /* -------------------------------------------------------------------------- */ + if (InitImageDisplay() == false) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitImageDisplay() fail!"); + return false; + } + if (InitLabel() == false) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitLabel() fail!"); + return false; + } + testButton = CreateAndSetUIButton("检测"); + if (testButton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::new Button fail"); + return false; + } + /* -------------------------------------------------------------------------- */ + return true; + } + + // 1.跳转到心率界面 + bool HeartView::ChangeHeartView(int16_t thisView) + { + if (HeartScrollView[thisView] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::ChangeHeartView"); + RootView::GetInstance()->Add(HeartScrollView[thisView]); + } + return true; + } + // 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}, + {HEARTCHECKVIEW, &HeartView::ChangeCheckView}, + {HEARTRESULT, &HeartView::ChangeResultView}, + }; + + // 3.根据传入的interface参数执行相应视图ID关联的成员函数。 + bool HeartView::ClickFunc(int16_t interface) + { + int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[HEARTVIEW]); + for (int i = 0; i < funcSize; i++) + { + if (interface == ViewMapper[i].viewId) + { + bool jug = (this->*(ViewMapper[i].func))(interface); + if (jug == false) + { + return false; + } + return true; + } + } + return false; + } + + // 4.切换视图 + void HeartView::ChangeView(int16_t hideView, int16_t showView) + { + if (hideView > MAX_HEARTVIEW) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView:: HeartViewId Overstep ones bounds"); + return; + } + HeartScrollView[hideView]->SetVisible(false); + ClickFunc(showView); + HeartScrollView[showView]->SetVisible(true); + Draw(); + } + /* -------------------------------------------------------------------------- */ + bool HeartView::SetOnDragListener() + { + UIView::OnDragListener *dragListener = (UIView::OnDragListener *)OHOS::HeartPresenter::GetInstance(); + if (dragListener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::OnDragListener fail"); + return false; + } + group->SetDraggable(true); + group->SetTouchable(true); + group->SetOnDragListener(dragListener); + return true; + } + + void HeartView::OnStart() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::OnStart"); + display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime(); + display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮 + View::OnStart(); + if (!InitHeartView()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartView::InitHeartView fail"); + } + } + + void HeartView::OnSetUpView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnSetUpView"); + View::OnSetUpView(); + if (HeartScrollView[HEARTVIEW] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HEARTVIEW:: OnSetUpView has nullptr"); + return; + } + HeartScrollView[HEARTVIEW]->Add(imageViewMain); + HeartScrollView[HEARTVIEW]->Add(percent); + HeartScrollView[HEARTVIEW]->Add(timeLabel); + HeartScrollView[HEARTVIEW]->Add(titleLabel); + HeartScrollView[HEARTVIEW]->Add(testButton); + RootView::GetInstance()->Add(HeartScrollView[HEARTVIEW]); + Draw(); + } + + void HeartView::OnTearDownView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnTearDownView"); + View::OnTearDownView(); + return; + } + + void HeartView::OnStop() + { + display_api->set_screen_auto_off_timeout(display_time); // 恢复 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::OnStop"); + View::OnStop(); + RootView::GetInstance()->RemoveAll(); + return; + } +} diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_CALLLOG.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_CALLLOG.bin new file mode 100644 index 000000000..26664922a Binary files /dev/null and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/APPLIST_CALLLOG.bin differ diff --git a/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp b/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp index 0a4545f6e..f79c48120 100644 --- a/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp +++ b/code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp @@ -167,6 +167,8 @@ void hx3695_msg_callback(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datale case HX3695_MSG_TYPE_GRAYCARD_UPDATE: break; case HX3695_MSG_TYPE_WEARSTAT_UPDATE: + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_WEARSTATUS_UPDATE = %d", sensor_data.wearstatus); + //update_wearstatus_event_sendmsg_toUI(sensor_data.wearstatus); break; default: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unknown sensor message type");