From edacdb992bc249a01bca41daed2a9e41c6e863d2 Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Fri, 16 Aug 2024 16:51:19 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E5=BF=83=E7=8E=87=E6=A3=80?= =?utf8?q?=E6=B5=8Bapplsit=E4=B8=ADSlice?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativelauncher/include/AppViewIDs.h | 23 +- .../nativelauncher/include/NativeLauncher.h | 1 + .../include/ui_resource_string.h | 28 +- .../nativelauncher/src/NativeLauncher.cpp | 20 +- .../heartrate/include/HeartChartPresenter.h | 59 ++++ .../heartrate/include/HeartChartView.h | 76 ++++++ .../heartrate/include/HeartDetectionView.h | 25 +- .../heartrate/src/HeartChartPresenter.cpp | 121 +++++++++ .../nativeui/heartrate/src/HeartChartView.cpp | 256 ++++++++++++++++++ .../nativeui/heartrate/src/HeartModel.cpp | 16 +- 10 files changed, 571 insertions(+), 54 deletions(-) create mode 100644 code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h index 1df389f0d..87607a789 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h @@ -68,7 +68,7 @@ typedef enum : uint16_t VIEW_AI_MODELS, // AI模型选择界面 VIEW_REBOOTANDSHUTDOWN, //(滑动关机和重启带恢复出厂设置) VIEW_RECORD, - VIEW_MUSIC_PLAYER, //音乐播放器 + VIEW_MUSIC_PLAYER, // 音乐播放器 /* -------------------------------------------------------------------------- */ VIEW_OBU_MESSAGE, /* -------------------------------------------------------------------------- */ @@ -87,6 +87,7 @@ typedef enum : uint16_t VIEW_HEART_RESULT, // 心率结果界面 VIEW_HEART_CHECK, // 心率检测界面 VIEW_HEART, // 心率监测 + VIEW_HEART_CHART, // 心率曲线图检测 VIEW_SAVEELE, // 省电模式 VIEW_SAVEBAT, // 省电模式界面 VIEW_TAKEPHOTOS, // 拍照界面 @@ -113,16 +114,16 @@ typedef enum : uint16_t VIEW_TRAININGAQUATIC, // 水上运动列表 VIEW_TRAININGOTHER, // 其他列表 /* -------------------------------------------------------------------------- */ - VIEW_MAIN_TEMP, // 体温界面(暂时不用) - VIEW_OFFLINEVOICE, // 语音助手界面(暂时不用) - VIEW_MAIN_ACTIVITY, // 记录步数界面(暂时不用) - VIEW_UISAMPLE, // 示例(暂时不用) - VIEW_INDOORWALK, // 室内步行 - VIEW_PHONE, // 电话 - VIEW_PHONECALL, // 拨号 - //VIEW_PHONERING, // 拨号界面 - // VIEW_PHONECALLING, // 来电 - // VIEW_PHONECALLUP, // 通话界面 + VIEW_MAIN_TEMP, // 体温界面(暂时不用) + VIEW_OFFLINEVOICE, // 语音助手界面(暂时不用) + VIEW_MAIN_ACTIVITY, // 记录步数界面(暂时不用) + VIEW_UISAMPLE, // 示例(暂时不用) + VIEW_INDOORWALK, // 室内步行 + VIEW_PHONE, // 电话 + VIEW_PHONECALL, // 拨号 + // VIEW_PHONERING, // 拨号界面 + // VIEW_PHONECALLING, // 来电 + // VIEW_PHONECALLUP, // 通话界面 VIEW_PHONEDIR, // 电话簿 VIEW_MAIN_PHONE, // 主电话Slice VIEW_DIALING_METHOD, // 拨号方式 diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h index 536a7718e..f4e512d56 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h @@ -76,6 +76,7 @@ namespace OHOS void InitBloodResultSlice(void); void InitBloodCheckSlice(void); void InitHeartSlice(void); + void InitHeartChartSlice(void); void InitMainAlipaySlice(void); // void InitDialUpdateSlice(void); void InitSaveEleSlice(void); diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h b/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h index 57c019bc0..3a7807b67 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h +++ b/code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h @@ -1,15 +1,15 @@ -/* -* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved. -* Description: language -* Author: Graphic develop team -* Create: 2021-07-06 -*/ - -#ifndef UI_RESOURCE_STRING_H -#define UI_RESOURCE_STRING_H -#include -namespace OHOS { -enum UIResourceTextId : uint16_t { +/* +* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved. +* Description: language +* Author: Graphic develop team +* Create: 2021-07-06 +*/ + +#ifndef UI_RESOURCE_STRING_H +#define UI_RESOURCE_STRING_H +#include +namespace OHOS { +enum UIResourceTextId : uint16_t { STR_EXERCISE_OUTDOORWALKING = 0, STR_EXERCISE_OUTDOORRUNNING = 1, STR_EXERCISE_OUTDOORBIKING = 2, @@ -525,8 +525,8 @@ enum UIResourceTextId : uint16_t { STR_SCHEDULE_NO_DATA_PROMPT = 512, STR_MAX_ID = 513, }; // UIResourceTextId - -enum FontLanguageId : uint8_t { + +enum FontLanguageId : uint8_t { LANGUAGE_ID_ZH, LANGUAGE_ID_EN, LANGUAGE_ID_MAX diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp index f11b6da63..515ab356c 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp @@ -83,6 +83,7 @@ #include "displaybrightness/include/DisplayBrightnessPresenter.h" #include "displaybrightness/include/DisplayBrightnessView.h" +/* -------------------------------------------------------------------------- */ /*消息通知*/ #include "message/include/MessageView.h" #include "message/include/MessagePresenter.h" @@ -110,7 +111,9 @@ #include "heartrate/include/HeartDetectionPresenter.h" #include "heartrate/include/HeartResultView.h" #include "heartrate/include/HeartResultPresenter.h" - +#include "heartrate/include/HeartChartView.h" +#include "heartrate/include/HeartChartPresenter.h" +/* -------------------------------------------------------------------------- */ #include "secondaryfunction/include/SecondaryFunctionPresenter.h" #include "secondaryfunction/include/SecondaryFunctionView.h" #include "secondaryfunction/include/FastTrainingPresenter.h" @@ -319,7 +322,7 @@ namespace OHOS {VIEW_AI_VOICE, &NativeLauncher::InitAiVoiceSlice}, // Ai Voice(人工智能语音) {VIEW_AI_MODELS, &NativeLauncher::InitAiModelsSlice}, // Ai Models(Ai模型选择界面) {VIEW_REBOOTANDSHUTDOWN, &NativeLauncher::InitRebootAndShutdownSlice}, // 滑动关机和重启带恢复出厂设置 - {VIEW_MUSIC_PLAYER, &NativeLauncher::InitMusicPlayerSlice}, // 音乐播放器 + {VIEW_MUSIC_PLAYER, &NativeLauncher::InitMusicPlayerSlice}, // 音乐播放器 /* -------------------------------------------------------------------------- */ {VIEW_OBU_MESSAGE, &NativeLauncher::InitOBUMessageSlice}, @@ -387,6 +390,7 @@ namespace OHOS /*心率检测*/ {VIEW_HEART_CHECK, &NativeLauncher::InitHeartCheckSlice}, {VIEW_HEART_RESULT, &NativeLauncher::InitHeartResultSlice}, + {VIEW_HEART_CHART, &NativeLauncher::InitHeartChartSlice}, /*设置卡片*/ {VIEW_SET_CARD, &NativeLauncher::InitSetCardSlice}, /*添加卡片*/ @@ -1212,6 +1216,18 @@ namespace OHOS } NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_RESULT, heartResultView); } + // 心率检查图表 + void NativeLauncher::InitHeartChartSlice(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartChartSlice"); + SliceProxy *heartchartView = new AbilitySliceProxy; + if (heartchartView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartchartView is nullptr"); + return; + } + NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_CHART, heartchartView); + } /* -------------------------------------------------------------------------- */ // 查找手机 void NativeLauncher::InitFindPhoneSlice(void) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h new file mode 100644 index 000000000..876166b71 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h @@ -0,0 +1,59 @@ +/*** + * @Date: 2024-07-29 15:33:59 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-07-29 16:28:08 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h + */ + +#ifndef HEART_Chart_PRESENTER_H +#define HEART_Chart_PRESENTER_H + +#include "Presenter.h" +#include "components/ui_list.h" +#include "components/ui_view.h" +#include "KeyInputListener.h" +#include "ModelListenerSample.h" +#include "heartrate/include/HeartChartView.h" +#include "power_display_service.h" + +#define HEART_KEEP_TIME 40000 // 40s + +namespace OHOS +{ + + class HeartChartView; + class HeartChartPresenter : public Presenter, + public ModelListenerSample, + public UIView::OnClickListener, + public UIView::OnDragListener, + public RootView::OnKeyActListener, + public ListScrollListener + { + public: + HeartChartPresenter(); + ~HeartChartPresenter() override; + static HeartChartPresenter *GetInstance(void); + + void OnStart() override; + void OnResume() override; + void OnStop() override; + void OnTickEvent() override; + void Notify() override {} + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + + void NavigateBack(void); + + private: + void ResetTickTimer(void); + uint64_t startTime{0}; + bool HeartCountEvent{false}; + bool HeartCheckState{false}; + + const power_display_svr_api_t *display_api = power_display_svr_get_api(); + uint32_t display_time; + }; +} + +#endif // HEART_Chart_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h new file mode 100644 index 000000000..ce0ba6619 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h @@ -0,0 +1,76 @@ +/*** + * @Date: 2024-08-15 18:38:49 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-15 20:25:38 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h + */ + +#ifndef HEART_Chart_VIEW_H +#define HEART_Chart_VIEW_H + +#include "View.h" +#include "BaseView.h" +#include "wearable_log.h" +#include "UiConfig.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_button.h" +#include "components/ui_label_button.h" +#include "components/ui_image_animator.h" +#include "components/ui_circle_progress.h" +#include "components/ui_view_group.h" + +#include "heartrate/include/HeartChartPresenter.h" + +#include "components/ui_scroll_view.h" +#include "components/ui_label_button_ext.h" + +#include "power_display_service.h" +#include "components/ui_image_animator.h" +#include "components/ui_chart.h" + +#define STOPCHECK "stop_check" +namespace OHOS +{ + class HeartChartPresenter; + class HeartChartView : public View + { + public: + HeartChartView(); + virtual ~HeartChartView(); + void OnStop() override; + void OnSetUpView() override; + void OnTearDownView() override; + void OnStart() override; + static HeartChartView *GetInstance(void); + + UIImageAnimatorView *GetImageAnimator(void); + void UpdateShowHeart(void); + + bool HeartViewInit(); + void InitChartView(void); + void SetDataChart(); + void SetDataTopAndBottom(); + void HeartImageAnimator(); + + private: + UILabelExt *CurrentHeartText{nullptr}; + UILabelExt *MaxHeartText{nullptr}; + UILabelExt *MinHeartText{nullptr}; + UILabelExt *UHeartText{nullptr}; + UILabelExt *RestHeartText{nullptr}; + + UIImageView *TopimageView{nullptr}; + UIImageView *BottomimageView{nullptr}; + UIImageView *CoordinateimageView{nullptr}; + UIImageView *HeartIconView{nullptr}; + + UIImageAnimatorView *imageAnimator{nullptr}; + + Point heartdata[24]; + UIChartDataSerial *heartSerial{nullptr}; + UIChartPolyline *heartchart = nullptr; + }; +} + +#endif // 心率主界面 \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h index a8d92f550..426a97e56 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h @@ -1,27 +1,4 @@ -/*** - * @Date: 2024-07-31 10:27:26 - * @LastEditors: Caisking 3449750381@qq.com - * @LastEditTime: 2024-07-31 14:12:07 - * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h - */ -/*** - * @Date: 2024-07-31 10:27:26 - * @LastEditors: Caisking 3449750381@qq.com - * @LastEditTime: 2024-07-31 10:30:11 - * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h - */ -/*** - * @Date: 2024-07-29 15:38:56 - * @LastEditors: Caisking 3449750381@qq.com - * @LastEditTime: 2024-07-29 15:42:12 - * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.cpp - */ -/* - * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. - * Description: bloodDetection view - * Author: - * Create: 2021-08-01 - */ + #ifndef HEART_Detection_VIEW_H #define HEART_Detection_VIEW_H diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp new file mode 100644 index 000000000..43d07c5f3 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: HeartChartPresenter.cpp + * Author: + * Create: 2021-11-23 + */ + +#include "heartrate/include/HeartChartView.h" +#include "heartrate/include/HeartChartPresenter.h" + +#include "AppViewIDs.h" +#include "NativeAbility.h" +#include "common/key_code.h" +#include "KeyInputListener.h" +#include "custom_utils.h" +#include "displaybrightness/include/DisplayBrightnessModel.h" +#include "heartrate/include/HeartModel.h" +#include "MainModel.h" + +namespace OHOS +{ + + // 当前Presenter属性实例化的内存指针 + static HeartChartPresenter *g_pHeartChartPresenter = nullptr; + + HeartChartPresenter::HeartChartPresenter() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartPresenter::HeartChartPresenter"); + g_pHeartChartPresenter = this; + display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime(); + display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮 + ResetTickTimer(); + } + + HeartChartPresenter::~HeartChartPresenter() + { + display_api->set_screen_auto_off_timeout(display_time); // 恢复 + g_pHeartChartPresenter = nullptr; + } + HeartChartPresenter *HeartChartPresenter::GetInstance() + { + return g_pHeartChartPresenter; + } + void HeartChartPresenter::NavigateBack() + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_ZOOM); + } + void HeartChartPresenter::OnStart() + { + Presenter::OnStart(); + if (!HeartCheckState) + { + HeartModel::GetInstance()->Heart_Start(); + HeartCheckState = true; + } + } + void HeartChartPresenter::OnResume(void) + { + } + + void HeartChartPresenter::OnStop(void) + { + if (HeartCheckState) + { + HeartModel::GetInstance()->Heart_Stop(); + HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 主动检测心率关闭 + HeartCheckState = false; + } + } + + bool HeartChartPresenter::OnDrag(UIView &view, const DragEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartPresenter::OnDrag"); + UNUSED(view); + if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) && (event.GetDeltaX() > X_DRAG_OFFSET) && + (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) + { + NavigateBack(); + } + return false; + } + + bool HeartChartPresenter::OnClick(UIView &view, const ClickEvent &event) + { + if (strcmp(view.GetViewId(), STOPCHECK) == 0) + { + NavigateBack(); + } + return true; + } + + void HeartChartPresenter::OnTickEvent() + { + // 更新显示心率数据 + HeartChartView::GetInstance()->UpdateShowHeart(); + uint64_t current_time = osKernelGetTick2ms(); + if ((startTime != 0) && (current_time - startTime > HEART_KEEP_TIME)) + { + // 超时处理 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 超时处理 HEART_KEEP_TIME: %lld", current_time - startTime); + HeartModel::GetInstance()->SetResult(HeartResult::TIMEOUT); + HeartModel::GetInstance()->Heart_Stop(); + } + } + void HeartChartPresenter::ResetTickTimer(void) + { + startTime = osKernelGetTick2ms(); + } + // 增加按键事件 + bool HeartChartPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + unsigned short keyID = event.GetKeyId(); + unsigned short keyState = event.GetState(); + // 如果是power键,且是亮屏状态,按键释放就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0) + { + NavigateBack(); + } + return true; + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp new file mode 100644 index 000000000..8e7bce409 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp @@ -0,0 +1,256 @@ +/*** + * @Date: 2024-04-15 10:55:58 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-07-29 15:35:06 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp + */ +#include "UiConfig.h" +#include "wearable_log.h" +#include "HeartChartView.h" +#include "HeartModel.h" +#include "ui_image_animator.h" +#include "HeartChartView.h" +#include "ui_resource_string.h" +#include "power_display_service.h" +#include "uicomponents/UIComponents.h" +#include "heart_blood/health_service/health_service.h" +namespace OHOS +{ + static HeartChartView *g_pHeartCheckView = nullptr; + + // 动态刷新设置 + 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 Chart_IMAGE_ANIMATORVIEW_SIZE = 20; + static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SPEED = 40; + // 图片路径 + static constexpr const char *BACKGROUND_IMAGE_PATH = "/user/res/heart_chart/background.bin"; + static constexpr const char *BUTTOM_ICON_PATH = "/user/res/heart_chart/buttomicon.bin"; + static constexpr const char *TOP_ICON_PATH = "/user/res/heart_chart/topicon.bin"; + static constexpr const char *HEART_ICON_PATH = "/user/res/heart_chart/hearticon.bin"; + // 心形心跳 + static constexpr int HEARTBEAT_IMAGE_WIDTH = 92; + static constexpr int HEARTBEAT_IMAGE_HEIGHT = 92; + static constexpr int HEARTBEAT_IMAGE_X = 85; + static constexpr int HEARTBEAT_IMAGE_Y = 50; + static constexpr int HEARTBEAT_IMAGE_NUM = 19; + static constexpr int HEARTBEAT_DELAY = 50; + // 心跳image + static ImageAnimatorInfo g_heartImageInfo[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}, + }; + + HeartChartView::HeartChartView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView"); + g_pHeartCheckView = this; + } + HeartChartView::~HeartChartView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::~HeartChartView"); + imageAnimator->Stop(); + + UIViewGroup *tmpGroup = dynamic_cast(container_); + UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup); + + g_pHeartCheckView = this; + } + HeartChartView *HeartChartView::GetInstance(void) + { + return g_pHeartCheckView; + } + /*更新显示数据*/ + void HeartChartView::UpdateShowHeart() + { + uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata(); + std::string heartrateStr = std::to_string(heart_); + if (CurrentHeartText != nullptr && heart_ != 0) + CurrentHeartText->SetText(heartrateStr.c_str()); + } + /*设置最大最小数据*/ + void HeartChartView::SetDataTopAndBottom() + { + int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax(); + int MinHeart = HeartModel::GetInstance()->GetHeartRateMin(); + + if (MaxHeartText != nullptr) + { + MaxHeartText->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str() : "--"); + } + + if (MinHeartText != nullptr) + { + MinHeartText->SetText(MinHeart > 0 ? (std::to_string(MinHeart)).c_str() : "--"); + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MaxHeart: %d, MinHeart: %d", MaxHeart, MinHeart); + } + /*设置曲线图数据*/ + void HeartChartView::SetDataChart() + { + if (heartchart == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Init_data_Chart new chart fail"); + return; + } + heartSerial = new UIChartDataSerial(); + heartSerial->SetMaxDataCount(24); +#if HEART_DATA_TEST + Point temp[] = { + {0, 150}, {1, 250}, {2, 170}, {3, 0}, {4, 140}, {5, 190}, {6, 100}, {7, 40}, {8, 10}, {9, 100}, {10, 60}, {11, 20}, {12, 150}, {13, 250}, {14, 170}, {15, 140}, {16, 78}, {17, 80}, {18, 100}, {19, 20}, {20, 100}, {21, 100}, {22, 100}, {23, 100}}; + std::copy(std::begin(temp), std::end(temp), heartdata); +#else + for (int serialIndex = 0; serialIndex < 24; serialIndex++) + { + heartdata[serialIndex].x = serialIndex; + heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex); + } +#endif + heartSerial->AddPoints(heartdata, 24); + heartSerial->SetLineColor(Color::Red()); + heartSerial->SetFillColor(Color::Red()); + heartSerial->EnableGradient(true); + + heartchart->AddDataSerial(heartSerial); + heartchart->Invalidate(); + } + /*设置心率动画*/ + void HeartChartView::HeartImageAnimator() + { + 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_heartImageInfo, HEARTBEAT_IMAGE_NUM, HEARTBEAT_DELAY); + imageAnimator->SetRepeat(true); + container_->Add(imageAnimator); + imageAnimator->Start(); + } + /*初始化心率曲线*/ + void HeartChartView::InitChartView(void) + { + if (heartchart == nullptr) + { + heartchart = new UIChartPolyline(); + } + heartchart->SetPosition(95, 178); + heartchart->Resize(320, 110); + heartchart->SetViewId("uiChart"); + heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + + UIXAxis &heartXAxis = heartchart->GetXAxis(); + UIYAxis &heartYAxis = heartchart->GetYAxis(); + heartXAxis.SetMarkNum(1); + heartXAxis.SetDataRange(0, 24); + heartXAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); + heartYAxis.SetMarkNum(1); + heartYAxis.SetDataRange(0, 220); + heartYAxis.SetLineColor(Color::GetColorFromRGBA(0, 0, 0, 0)); + + heartchart->SetGradientOpacity(0, 0); + + container_->Add(heartchart); + } + /*初始化检测界面*/ + bool HeartChartView::HeartViewInit() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartViewInit is begin"); + // 初始化图片 + InitImageView(CoordinateimageView, 38, 130, 390, 200, "CoordinateimageView", BACKGROUND_IMAGE_PATH); + InitImageView(TopimageView, 131, 350, 21, 12, "TopimageView", TOP_ICON_PATH); + InitImageView(BottomimageView, 267, 350, 21, 12, "BottomimageView", BUTTOM_ICON_PATH); + // 初始化心率值 + InitLabel(CurrentHeartText, 172, 62, 102, 79, "CurrentHeartText", "--", GILROY_BOLD_FONT, 65); + InitLabelExt(UHeartText, 283, 85, 100, 35, "UHeartText", STR_TIMES_PER_MIN, DEFAULT_VECTOR_FONT_FILENAME, 30); + InitLabelAdapt(MaxHeartText, 160, 336, 102, 79, "MaxHeartText", "--", DEFAULT_VECTOR_FONT_FILENAME, 35); + InitLabelAdapt(MinHeartText, 295, 336, 102, 79, "MinHeartText", "--", DEFAULT_VECTOR_FONT_FILENAME, 35); + + container_->Add(CoordinateimageView); + container_->Add(TopimageView); + container_->Add(BottomimageView); + container_->Add(CurrentHeartText); + container_->Add(UHeartText); + container_->Add(MaxHeartText); + container_->Add(MinHeartText); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartViewInit is ok"); + return true; + } + + void HeartChartView::OnStart() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStart"); + View::OnStart(); + + SetContainerView(new UIViewGroup()); + container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + + if (!HeartViewInit()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartView::InitHeartView fail"); + } + + HeartImageAnimator(); + InitChartView(); + SetDataChart(); + SetDataTopAndBottom(); + + SetContainerView(container_); + container_->SetDraggable(true); + container_->SetTouchable(true); + container_->SetOnDragListener(presenter_); + + // 增加按键监听 + RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::HeartChartPresenter::GetInstance(); + RootView::GetInstance()->SetOnKeyActListener(keyactListener); + } + void HeartChartView::OnSetUpView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnSetUpView"); + View::OnSetUpView(); + + Draw(); + } + void HeartChartView::OnTearDownView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnTearDownView"); + View::OnTearDownView(); + return; + } + + void HeartChartView::OnStop() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStop"); + View::OnStop(); + if (container_ != nullptr) + { + container_->RemoveAll(); + delete container_; + container_ = nullptr; + } + return; + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index 42dac0d57..d011c80b3 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -22,13 +22,14 @@ #include "heartrate/include/HeartRateView.h" #include "ui_service.h" +#include "battery_hal.h" #ifdef __cplusplus extern "C" { #endif -#define MAX_UNWEAR_COUNT 30 +#define MAX_UNWEAR_COUNT 20 #define MAX_VALID_HRS_COUNT 40 #define MAX_DISVALID_HRS_COUNT 70 #define HEARTTEST 1 //[0 开启测试 1 关闭] @@ -540,6 +541,14 @@ namespace OHOS } else if (state == HeartState::Start && heartstate == false) { + /*充电状态下不进行检测*/ + bool isCharging = get_charge_stat(); // 获取充电状态 + if (isCharging) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测"); + return; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState Start"); uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; send_ppg_cmd_msg(md); @@ -582,7 +591,7 @@ namespace OHOS if (sensorstate) { - Heart_Control(HeartState::End, HeartCheck::INITIATIVE); + // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 不需要关闭 sensorstate = false; Heart_Result(); // 处理结果 } @@ -631,7 +640,8 @@ namespace OHOS case HeartResult::SUCCESS: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功"); Heart_Save(); - NativeAbility::GetInstance().Back(); // 成功 + NativeAbility::GetInstance().ChangeSlice(VIEW_HEART_CHART); + // NativeAbility::GetInstance().Back(); // 成功 心率界面检测成功 不回退 break; case HeartResult::NOT_WORN: // 未佩戴状态 -- 2.17.1