From 742eab3cc76c84a1587d2f751bdc2eb0c657a4d3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E7=BD=97=E6=AD=A3?= <1732036298@qq.com> Date: Fri, 4 Oct 2024 12:51:21 +0000 Subject: [PATCH] Merge #1102 into sdk602patch0626 from refs/changes/1102/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 罗正 * refs/changes/1102/head: (4 commits squashed) - 完成#128,手表,呼吸训练,现在呼吸训练没有训练时长选择(需求) - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626 - 解决呼吸训练的时长选择界面最后一个组件被遮住bug Signed-off-by: 罗正 <1732036298@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1102 --- .../wearable/fd230app/CMakeLists.txt | 1 + ...RespiratoryTrainingDurationSelectionView.h | 66 ++++ .../include/RespiratoryTrainingModel.h | 14 +- .../include/RespiratoryTrainingPresenter.h | 5 +- .../include/RespiratoryTrainingView.h | 26 +- .../src/RespiratoryTrainingCompletedView.cpp | 12 +- ...spiratoryTrainingDurationSelectionView.cpp | 228 +++++++++++ .../src/RespiratoryTrainingModel.cpp | 104 ++++- .../src/RespiratoryTrainingPresenter.cpp | 91 ++++- .../src/RespiratoryTrainingView.cpp | 356 ++++++++++-------- .../msg_center/src/msg_center_customer.cpp | 8 +- .../RespiratoryTraining_BG.bin | 3 + .../peripheral/config/include/ConfigModel.h | 2 + 13 files changed, 715 insertions(+), 201 deletions(-) create mode 100644 code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h create mode 100644 code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp create mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin diff --git a/code/sdk/application/wearable/fd230app/CMakeLists.txt b/code/sdk/application/wearable/fd230app/CMakeLists.txt index 7ab720879..c35a0a118 100644 --- a/code/sdk/application/wearable/fd230app/CMakeLists.txt +++ b/code/sdk/application/wearable/fd230app/CMakeLists.txt @@ -412,6 +412,7 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp #显示方式 ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/themestyle/src/ThemeStyleModel.cpp diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h new file mode 100644 index 000000000..50629e335 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h @@ -0,0 +1,66 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-09-29 17:51:20 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-10-04 17:47:43 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h + */ +#ifndef RESPIRATORY_TRAINING_DURATION_SELECTION_VIEW_H +#define RESPIRATORY_TRAINING_DURATION_SELECTION_VIEW_H +#include "components/ui_scroll_view.h" +#include "components/ui_label_ext.h" +#include "components/ui_label_button_ext.h" +#include "BaseView.h" +#include "components/ui_image_view.h" +namespace OHOS +{ +#define MAX_NUM_TRAINING_DURATION 5 + + static constexpr const char *RESPIRATORYTRAINING_DURATIONSELECTION_VIEW = "RespiratoryTrainingDurationSelectionView"; + static constexpr const char *TRAINING_DURATION_ONE_MIN = "training_duration_one_min"; + static constexpr const char *TRAINING_DURATION_TWO_MIN = "training_duration_two_min"; + static constexpr const char *TRAINING_DURATION_THREE_MIN = "training_duration_three_min"; + static constexpr const char *TRAINING_DURATION_FOUR_MIN = "training_duration_four_min"; + static constexpr const char *TRAINING_DURATION_FIVE_MIN = "training_duration_five_min"; + class RespiratoryTrainingDurationSelectionView + { + public: + struct LabelButtonConfig + { + int16_t left; + int16_t top; + int16_t width; + int16_t height; + const char *viewId; + }; + struct LabelConfig + { + int16_t left; + int16_t top; + int16_t width; + int16_t height; + int16_t fontSize; + int16_t lineHeigh; + const char *text; + int16_t textId; + uint8_t lineBreakMode; + }; + RespiratoryTrainingDurationSelectionView(/* args */); + ~RespiratoryTrainingDurationSelectionView(); + static RespiratoryTrainingDurationSelectionView *GetInstance(void); + UIScrollView *RespiratoryTrainingDurationSelectionViewInit(void); + void UpdateRespiratoryTrainingDurationSelectionView(void); + + private: + UILabelExt *LabelViewinit(LabelConfig &labelconfig); + UILabelButtonExt *LabelButtonViewInit(LabelButtonConfig &labelbuttonconfig); + void ClearAll(void); + UIScrollView *scrollView = nullptr; + UILabelExt *TitleLabel = nullptr; // 标题 + UILabelExt *DurationLabel[MAX_NUM_TRAINING_DURATION]{nullptr}; // 亮屏时长标签 + UILabelButtonExt *DurationButton[MAX_NUM_TRAINING_DURATION]{nullptr}; // 放置组件的按钮 + UIImageView *temp{nullptr}; + }; + +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h index fe7ac2f8a..41e978783 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-11 16:26:13 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-28 20:13:17 + * @LastEditTime: 2024-10-04 19:59:41 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h */ #ifndef RESPIRATORY_TRAINING_MODEL_H @@ -18,14 +18,19 @@ namespace OHOS public: static RespiratoryTrainingModel &GetInstance(void); void AddRespiratoryTrainingTimes(void); - std::string GetRespiratoryTrainingTotalTime(void) ; + std::string GetRespiratoryTrainingTotalTime(void); int GetAverageHeartRate(void); void calculateHeartrateTotal(void); void ResumeStatus(); - + void RT_StartTimer(uint32_t interval); void RT_StopTimer(void); + int GetRespiratoryTrainingSelectTime(); + void SetRespiratoryTrainingSelectTime(int time); + uint64_t GetRespiratoryTrainingTime(); + void ClearTotalRespiratoryTrainingTime(void); + private: RespiratoryTrainingModel(); ~RespiratoryTrainingModel(); @@ -33,10 +38,11 @@ namespace OHOS RespiratoryTrainingModel &operator=(const RespiratoryTrainingModel &) = delete; int RespiratoryTrainingTimes{0}; // 呼吸训练次数 - std::string RespiratoryTrainingTime{nullptr}; + int RespiratoryTrainingTime{0}; std::string HeartRateValue{nullptr}; int count{0}; float heartTotal{0}; + int selectTime{1}; }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h index c1fd99429..7ae41b754 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-08 09:36:33 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-06-08 11:00:44 + * @LastEditTime: 2024-10-04 18:26:41 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h */ @@ -32,6 +32,9 @@ namespace OHOS static RespiratoryTrainingPresenter *GetInstance(); + std::string GetRespiratoryTrainingSelectTime(); + std::string GetRespiratoryTrainingSelectTime1(); + private: bool OnClick(UIView &view, const ClickEvent &event) override; bool OnDrag(UIView &view, const DragEvent &event) override; diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h index 0ff35846e..39a8796c8 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-08 09:36:01 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-06-13 09:22:22 + * @LastEditTime: 2024-10-04 17:47:26 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h */ @@ -19,6 +19,7 @@ #include "hal_tick.h" #include "components/ui_scroll_view.h" #include "respiratorytraining/include/RespiratoryTrainingCompletedView.h" +#include "respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h" namespace OHOS { @@ -26,6 +27,7 @@ namespace OHOS { RESPIRATORYTRAINING = 0, RESPIRATORYTRAININGCOMPLETED, + RESPIRATORY_TRAINING_DURATION_SELECTION, // 训练时长选择 MAX_RESPIRATORYTRAININGID, } RESPIRATORYTRAININGVIEWID; @@ -78,6 +80,7 @@ namespace OHOS void ChangeView(int16_t hideView, int16_t showView); bool ChangeRespiratoryTrainingView(int16_t thisView); bool ChangeRespiratoryTrainingCompletedView(int16_t thisView); + bool ChangeRespiratoryTrainingDurationSelectionView(int16_t thisView); Animator *GetRespiratoryTrainingAnimator_(); bool StartRespiratoryTraining(); void OnStart() override; @@ -90,28 +93,27 @@ namespace OHOS private: void RespiratoryTrainingViewInit(void); void ClearAll(void); -#if 0 - void InitializeRespiratoryTrainingImageInfo(); - void SetAnimatorViewProperties(); - void CreateRespiratoryTrainingAnimatorView(); - void CreateRespiratoryTrainingLabelView(); - void SetLabelViewProperties(); - UILabelExt *RespiratoryTrainingLabelView{nullptr}; - UIImageAnimatorView *RespiratoryTrainingAnimatorView{nullptr}; // 呼吸训练动画 - const char **RespiratoryTrainingArray{nullptr}; -#endif bool InitRespiratoryTrainingElements(); + bool InitRespiratoryTrainingElements2(); bool InitRespiratoryTrainingCallBackAndAnimator(); bool InitRespiratoryTrainingScrollView(); + void HandStartRespiratoryTraining(); UIScrollView *RespiratoryTrainingScrollView[MAX_RESPIRATORYTRAININGID]{nullptr}; RespiratoryTrainingCompletedView *p_RespiratoryTrainingCompletedView{nullptr}; + RespiratoryTrainingDurationSelectionView *p_RespiratoryTrainingDurationSelectionView{nullptr}; RespiratoryTrainingCallback *RespiratoryTrainingCallBack_ = nullptr; Animator *RespiratoryTrainingAnimator_ = nullptr; UIImageView *RespiratoryTrainingImg_ = nullptr; - // UILabelButton *RespiratoryTrainingStart_ = nullptr; UILabelExt *RespiratoryTrainingStartNote_ = nullptr; UILabelExt *RespiratoryTrainingLabel_ = nullptr; bool animateStart_ = false; + /* -------------------------------------------------------------------------- */ + UILabelExt *titlelabel{nullptr}; // 标题 + UILabelExt *TrainingDurationSelectiontitlelabel{nullptr}; // 选择的训练时长 + UIImageView *Image{nullptr}; + UILabelButton *RespiratoryTrainingStartButton = nullptr; // 训练开始按钮 + UILabelExt *RespiratoryTrainingStartLabel = nullptr; // 训练开始标签 + /* -------------------------------------------------------------------------- */ }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp index ef42461ab..d216594e3 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-05-07 11:25:58 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-28 20:06:40 + * @LastEditTime: 2024-10-04 19:53:55 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTrainingCompleted/src/RespiratoryTrainingCompletedView.cpp */ @@ -197,9 +197,14 @@ namespace OHOS int y1 = 248, y2 = 286; const int textId[MAX_NUM] = {STR_THIS_BREATH, STR_MEAN_HEART_RATE_MIN, STR_TODAYS_BREATHING_TRAINING}; int value = RespiratoryTrainingModel::GetInstance().GetAverageHeartRate(); - std::string heartRateValue = std::to_string(value); + std::string select_time; + if (RespiratoryTrainingPresenter::GetInstance()) + { + select_time = RespiratoryTrainingPresenter::GetInstance()->GetRespiratoryTrainingSelectTime1(); + } + std::string heartRateValue = (value == 0 ? "--" : std::to_string(value)); std::string trainingTotalTime = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingTotalTime(); - const char *text[MAX_NUM] = {"01:00", heartRateValue.c_str(), trainingTotalTime.c_str()}; + const char *text[MAX_NUM] = {select_time.c_str(), heartRateValue.c_str(), trainingTotalTime.c_str()}; OHOS::ColorType RTCDynamicLabelTextColor[MAX_NUM] = { Color::GetColorFromRGBA(0x1d, 0xda, 0xc4, 0xff), Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff), @@ -237,6 +242,7 @@ namespace OHOS return false; } RTCDynamicLabelView[i]->SetTextColor(RTCDynamicLabelTextColor[i]); + RTCDynamicLabelView[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30); ScrollView->Add(RTCDynamicLabelView[i]); } return true; diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp new file mode 100644 index 000000000..ea0517ee3 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp @@ -0,0 +1,228 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-09-29 15:57:59 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-10-04 20:24:42 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp + */ +#include "respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h" +#include "respiratorytraining/include/RespiratoryTrainingPresenter.h" +#include "respiratorytraining/include/RespiratoryTrainingModel.h" +#include "wearable_log.h" +#include "UiConfig.h" +#include "dock/focus_manager.h" +namespace OHOS +{ + + static RespiratoryTrainingDurationSelectionView *g_pRespiratoryTrainingDurationSelectionView{nullptr}; + RespiratoryTrainingDurationSelectionView::RespiratoryTrainingDurationSelectionView(/* args */) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingDurationSelectionView::RespiratoryTrainingDurationSelectionView"); + g_pRespiratoryTrainingDurationSelectionView = this; + } + + RespiratoryTrainingDurationSelectionView::~RespiratoryTrainingDurationSelectionView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingDurationSelectionView::~RespiratoryTrainingDurationSelectionView"); + ClearAll(); + g_pRespiratoryTrainingDurationSelectionView = nullptr; + } + + RespiratoryTrainingDurationSelectionView *RespiratoryTrainingDurationSelectionView::GetInstance(void) + { + return g_pRespiratoryTrainingDurationSelectionView; + } + + void RespiratoryTrainingDurationSelectionView::ClearAll(void) + { + if (scrollView) + { + scrollView->RemoveAll(); + delete TitleLabel; + TitleLabel = nullptr; + for (int i = 0; i < MAX_NUM_TRAINING_DURATION; i++) + { + delete DurationLabel[i]; + DurationLabel[i] = nullptr; + delete DurationButton[i]; + DurationButton[i] = nullptr; + } + delete temp; + temp = nullptr; + delete scrollView; + scrollView = nullptr; + } + } + + UILabelExt *RespiratoryTrainingDurationSelectionView::LabelViewinit(LabelConfig &labelconfig) + { + UILabelExt *label = new UILabelExt(); + if (label == nullptr) + { + return nullptr; + } + label->SetPosition(labelconfig.left, labelconfig.top, labelconfig.width, labelconfig.height); + label->SetStyle(STYLE_TEXT_FONT, labelconfig.fontSize); + label->SetStyle(STYLE_LINE_HEIGHT, labelconfig.lineHeigh); + // label->SetTextId(labelconfig.textId); + label->SetText(labelconfig.text); + label->SetLineBreakMode(labelconfig.lineBreakMode); + label->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER); + label->SetRollSpeed(70); + label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize); + return label; + } + + UILabelButtonExt *RespiratoryTrainingDurationSelectionView::LabelButtonViewInit(LabelButtonConfig &labelbuttonconfig) + { + UILabelButtonExt *labelButton = new UILabelButtonExt(); + if (labelButton == nullptr) + { + return nullptr; + } + labelButton->SetPosition(labelbuttonconfig.left, labelbuttonconfig.top); + labelButton->Resize(labelbuttonconfig.width, labelbuttonconfig.height); + labelButton->SetViewId(labelbuttonconfig.viewId); + labelButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); + labelButton->SetImagePosition(300, 30); + labelButton->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE); + // labelButton->SetTextId(labelbuttonconfig.textId); + // labelButton->SetAlign(TEXT_ALIGNMENT_LEFT); + // labelButton->SetLabelPosition(100, 0); + // labelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelbuttonconfig.fontSize); + // labelButton->SetStyle(STYLE_LINE_HEIGHT, labelbuttonconfig.lineHeigh); + labelButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); + return labelButton; + } + + UIScrollView *RespiratoryTrainingDurationSelectionView::RespiratoryTrainingDurationSelectionViewInit(void) + { + if (scrollView == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::InitThemeStyleScrollView"); + scrollView = new UIScrollView(); + if (scrollView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView new fail!"); + return nullptr; + } + scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + scrollView->SetViewId(RESPIRATORYTRAINING_DURATIONSELECTION_VIEW); + scrollView->SetScrollBlankSize(30); + scrollView->SetReboundSize(30); + scrollView->SetDirection(1); + scrollView->SetTouchable(true); + scrollView->SetDraggable(true); + scrollView->SetThrowDrag(true); // 设置手指抬起屏幕后是否继续滚动。 + scrollView->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。 + scrollView->SetSwipeACCLevel(800); /*设置手指抬起屏幕后的补偿距离。*/ + scrollView->SetRotateFactor(1.0); + FocusManager::GetInstance()->RequestFocus(scrollView); + FocusManager::GetInstance()->RequestFocusByDirection(FOCUS_DIRECTION_UP); + UIView::OnDragListener *dragListener = static_cast(RespiratoryTrainingPresenter::GetInstance()); + if (dragListener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dragListener is nullptr!"); + return nullptr; + } + scrollView->SetOnDragListener(dragListener); + /* -------------------------------------------------------------------------- */ + TitleLabel = new UILabelExt(); + if (TitleLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TitleLabel new fail!"); + return nullptr; + } + TitleLabel->SetPosition(83, 50, 300, 35); + TitleLabel->SetText("时长设置"); // 时长设置 + TitleLabel->SetStyle(STYLE_TEXT_FONT, 30); + TitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + TitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + TitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + TitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + scrollView->Add(TitleLabel); + /* -------------------------------------------------------------------------- */ + UIView::OnClickListener *clickListener = static_cast(RespiratoryTrainingPresenter::GetInstance()); + if (clickListener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener is nullptr!"); + return nullptr; + } + LabelButtonConfig labelbuttonconfig; + const char *viewId[MAX_NUM_TRAINING_DURATION] = {TRAINING_DURATION_ONE_MIN, TRAINING_DURATION_TWO_MIN, TRAINING_DURATION_THREE_MIN, TRAINING_DURATION_FOUR_MIN, TRAINING_DURATION_FIVE_MIN}; + for (int i = 0; i < MAX_NUM_TRAINING_DURATION; i++) + { + labelbuttonconfig.left = 43; + labelbuttonconfig.top = 120 + 120 * i; + labelbuttonconfig.width = 380; + labelbuttonconfig.height = 100; + labelbuttonconfig.viewId = viewId[i]; + DurationButton[i] = LabelButtonViewInit(labelbuttonconfig); + if (DurationButton[i] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DurationButton[%d] is nullptr", i); + return nullptr; + } + DurationButton[i]->SetOnClickListener(clickListener); + scrollView->Add(DurationButton[i]); + } + /* -------------------------------------------------------------------------- */ + // int16_t textId[MAX_NUM_TRAINING_DURATION] = {STR_1_MIN, STR_CELLULAR_DISPLAY, STR_5_MIN}; + const char *text[MAX_NUM_TRAINING_DURATION] = {"1分钟", "2分钟", "3分钟", "4分钟", "5分钟"}; + LabelConfig labelConfig = { + .left = 103, + .top = 153, + .width = 210, + .height = 35, + .fontSize = 30, + .lineHeigh = 35, + .textId = 0, + .lineBreakMode = UILabel::LINE_BREAK_OSCILLATION, + }; + for (int16_t i = 0; i < MAX_NUM_TRAINING_DURATION; i++) + { + labelConfig.top = 153 + 120 * i; + // labelConfig.textId = textId[i]; + labelConfig.text = text[i]; + DurationLabel[i] = LabelViewinit(labelConfig); + if (DurationLabel[i] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DurationLabel[%d] is nullptr", i); + return nullptr; + } + scrollView->Add(DurationLabel[i]); + } + /* -------------------------------------------------------------------------- */ + if (temp == nullptr) + { + temp = new UIImageView(); + if (temp == nullptr) + { + return nullptr; + } + int y = DurationButton[MAX_NUM_TRAINING_DURATION - 1]->GetY() + DurationButton[MAX_NUM_TRAINING_DURATION - 1]->GetHeight(); + temp->SetPosition(43, y, 380, 40); + temp->SetVisible(false); + scrollView->Add(temp); + } + } + UpdateRespiratoryTrainingDurationSelectionView(); + return scrollView; + } + + void RespiratoryTrainingDurationSelectionView::UpdateRespiratoryTrainingDurationSelectionView(void) + { + for (int i = 0; i < MAX_NUM_TRAINING_DURATION; i++) + { + if (i == RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime() - 1) + { + DurationButton[i]->SetImageSrc(PNG_CHECKBOX_ON_IMAGE, PNG_CHECKBOX_ON_IMAGE); + } + else + { + DurationButton[i]->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE); + } + DurationButton[i]->Invalidate(); + } + } +} diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp index 3c154156f..47a4435c1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-11 16:26:20 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-28 20:12:26 + * @LastEditTime: 2024-10-04 20:05:04 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp */ #include "respiratorytraining/include/RespiratoryTrainingModel.h" @@ -16,13 +16,23 @@ #include "heartrate/include/HeartModel.h" #include #include "gfx_utils/mem_check.h" +#include "ConfigModel.h" + +#include +#include +#include +#include +#include +#include namespace OHOS { // 声明定时器变量 static osTimerId_t g_timer = NULL; - static int Time = 0; - static constexpr int ONE_MINUTE = 60; // 一分钟 - static bool START_FLAG = false; + static constexpr uint64_t ONE_MIN = 60000 * 1; // 1分钟 + static constexpr uint64_t TWO_MIN = 60000 * 2; // 2分钟 + static constexpr uint64_t THREE_MIN = 60000 * 3; // 3分钟 + static constexpr uint64_t FOUR_MIN = 60000 * 4; // 4分钟 + static constexpr uint64_t FIVE_MIN = 60000 * 5; // 5分钟 RespiratoryTrainingModel::RespiratoryTrainingModel() {} @@ -34,6 +44,46 @@ namespace OHOS return instance; } + // 获取训练时长,单位min + int RespiratoryTrainingModel::GetRespiratoryTrainingSelectTime() + { + return ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION); + } + + // 设置训练时长,单位min + void RespiratoryTrainingModel::SetRespiratoryTrainingSelectTime(int time) + { + ConfigModel::GetInstance()->set_condigData_Int(ConfigModel::CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION, time); + } + + uint64_t RespiratoryTrainingModel::GetRespiratoryTrainingTime() + { + int time = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime(); + uint64_t time_; + switch (time_) + { + case 1: + time_ = ONE_MIN; + break; + case 2: + time_ = TWO_MIN; + break; + case 3: + time_ = THREE_MIN; + break; + case 4: + time_ = FOUR_MIN; + break; + case 5: + time_ = FIVE_MIN; + break; + default: + time_ = ONE_MIN; + break; + } + return time_; + } + // 每进行一次呼吸训练,呼吸训练次数自加1 void RespiratoryTrainingModel::AddRespiratoryTrainingTimes() { @@ -43,36 +93,64 @@ namespace OHOS // 获取呼吸训练总时间 std::string RespiratoryTrainingModel::GetRespiratoryTrainingTotalTime(void) { - RespiratoryTrainingTime = std::to_string(RespiratoryTrainingTimes) + "min"; - return RespiratoryTrainingTime; + RespiratoryTrainingTime += GetRespiratoryTrainingSelectTime(); + return (std::to_string(RespiratoryTrainingTime) + "min"); } - //获取平均心率值 + // 获取平均心率值 int RespiratoryTrainingModel::GetAverageHeartRate(void) { - if(count != 0) { + if (count != 0) + { return heartTotal / count; } return 0; } + // 清除当日的呼吸训练时间 + void RespiratoryTrainingModel::ClearTotalRespiratoryTrainingTime(void) + { + if (RespiratoryTrainingTime != 0) + { + RespiratoryTrainingTime = 0; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClearTotalRespiratoryTrainingTime success!!"); + } + } + void RespiratoryTrainingModel::calculateHeartrateTotal(void) { - heartTotal += HeartModel::GetInstance()->GetShowHeartdata(); - count++; + // 获取当前时间(以微秒为单位) + uint32_t currentTime = static_cast(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + + // 记录和检查上一次调用的时间 + static uint32_t lastCallTime = 0; + if (currentTime - lastCallTime < 1000000) + { + // 小于1秒 + return; + } + lastCallTime = currentTime; // 更新最后调用时间 + + uint16_t heartrate = HeartModel::GetInstance()->GetShowHeartdata(); + if (heartrate != 0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartrate = %d", heartrate); + heartTotal += heartrate; + count++; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartTotal = %0.f,count = %d,h_rate = %d", heartTotal, count, heartrate); + } } void RespiratoryTrainingModel::ResumeStatus() { - Time = 5; - START_FLAG = false; + heartTotal = 0; + count = 0; HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 关闭心率检测 } /* -------------------------------------------------------------------------- */ /*定时器到期时的处理*/ static void RT_TimerCallbackProc(int data) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RT_TimerCallbackProc,Time = %d", Time); RespiratoryTrainingView *p_RespiratoryTrainingView = RespiratoryTrainingView::GetInstance(); if (p_RespiratoryTrainingView == nullptr) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp index 18129cb73..ecbd14797 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-05-07 11:26:06 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-08-14 10:24:30 + * @LastEditTime: 2024-10-04 18:05:11 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTraining/src/RespiratoryTrainingPresenter.cpp */ @@ -17,6 +17,7 @@ #include #include "respiratorytraining/include/RespiratoryTrainingModel.h" #include "gfx_utils/mem_check.h" +#include "map" namespace OHOS { @@ -75,6 +76,27 @@ namespace OHOS if (viewId == RTCLABELBUTTON) { NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + return true; + } + std::map viewMap = { + {TRAINING_DURATION_ONE_MIN, 1}, + {TRAINING_DURATION_TWO_MIN, 2}, + {TRAINING_DURATION_THREE_MIN, 3}, + {TRAINING_DURATION_FOUR_MIN, 4}, + {TRAINING_DURATION_FIVE_MIN, 5}, + }; + auto it = viewMap.find(viewId); + if (it != viewMap.end()) + { + if (viewId == it->first) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "select time = %d", it->second); + RespiratoryTrainingModel::GetInstance().SetRespiratoryTrainingSelectTime(it->second); + if (RespiratoryTrainingDurationSelectionView::GetInstance()) + { + RespiratoryTrainingDurationSelectionView::GetInstance()->UpdateRespiratoryTrainingDurationSelectionView(); + } + } } return true; } @@ -92,11 +114,18 @@ namespace OHOS bool RespiratoryTrainingPresenter::OnDragEnd(UIView &view, const DragEvent &event) { - UNUSED(view); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingPresenter::OnDragEnd"); if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && RespiratoryTrainingPresenter::X_DRAG_FLAG) { - NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + std::string viewId = view.GetViewId(); + if (viewId == RESPIRATORYTRAINING_DURATIONSELECTION_VIEW) + { + view_->ChangeView(RESPIRATORY_TRAINING_DURATION_SELECTION, RESPIRATORYTRAINING); + } + else + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } RespiratoryTrainingPresenter::X_DRAG_FLAG = false; } return true; @@ -115,4 +144,60 @@ namespace OHOS } return true; } + + std::string RespiratoryTrainingPresenter::GetRespiratoryTrainingSelectTime() + { + int time = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime(); + std::string text; + switch (time) + { + case 1: + text = "1分钟 >"; + break; + case 2: + text = "2分钟 >"; + break; + case 3: + text = "3分钟 >"; + break; + case 4: + text = "4分钟 >"; + break; + case 5: + text = "5分钟 >"; + break; + default: + text = "1分钟 >"; + break; + } + return text; + } + + std::string RespiratoryTrainingPresenter::GetRespiratoryTrainingSelectTime1() + { + int time = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime(); + std::string text; + switch (time) + { + case 1: + text = "1min"; + break; + case 2: + text = "2min"; + break; + case 3: + text = "3min"; + break; + case 4: + text = "4min"; + break; + case 5: + text = "5min"; + break; + default: + text = "1min"; + break; + } + return text; + } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp index 181d06745..a6e39d6fa 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-05-07 11:25:58 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-28 20:13:37 + * @LastEditTime: 2024-10-04 18:26:22 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTraining/src/RespiratoryTrainingView.cpp */ @@ -46,6 +46,10 @@ namespace OHOS { container_->Add(RespiratoryTrainingScrollView[thisView]); } + if (TrainingDurationSelectiontitlelabel) + { + TrainingDurationSelectiontitlelabel->SetText(presenter_->GetRespiratoryTrainingSelectTime().c_str()); + } return true; } @@ -60,7 +64,36 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new scrollView[%d] fail", thisView); return false; } - RespiratoryTrainingScrollView[thisView] = p_RespiratoryTrainingCompletedView->RespiratoryTrainingCompletedViewInit(); + UIScrollView *scrollView = p_RespiratoryTrainingCompletedView->RespiratoryTrainingCompletedViewInit(); + if (scrollView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingCompletedViewInit fail!!"); + return false; + } + RespiratoryTrainingScrollView[thisView] = scrollView; + container_->Add(RespiratoryTrainingScrollView[thisView]); + } + return true; + } + + bool RespiratoryTrainingView::ChangeRespiratoryTrainingDurationSelectionView(int16_t thisView) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingView::ChangeRespiratoryTrainingCompletedView"); + if (RespiratoryTrainingScrollView[thisView] == nullptr) + { + p_RespiratoryTrainingDurationSelectionView = new RespiratoryTrainingDurationSelectionView(); + if (p_RespiratoryTrainingDurationSelectionView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new scrollView[%d] fail", thisView); + return false; + } + UIScrollView *scrollView = p_RespiratoryTrainingDurationSelectionView->RespiratoryTrainingDurationSelectionViewInit(); + if (scrollView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingDurationSelectionViewInit fail!!"); + return false; + } + RespiratoryTrainingScrollView[thisView] = scrollView; container_->Add(RespiratoryTrainingScrollView[thisView]); } return true; @@ -75,6 +108,7 @@ namespace OHOS static const RespiratoryTrainingViewMapper ViewMapper[] = { {RESPIRATORYTRAINING, &RespiratoryTrainingView::ChangeRespiratoryTrainingView}, {RESPIRATORYTRAININGCOMPLETED, &RespiratoryTrainingView::ChangeRespiratoryTrainingCompletedView}, + {RESPIRATORY_TRAINING_DURATION_SELECTION, &RespiratoryTrainingView::ChangeRespiratoryTrainingDurationSelectionView}, }; bool RespiratoryTrainingView::ClickFunc(int16_t interface) @@ -128,124 +162,16 @@ namespace OHOS RootView::GetInstance()->SetOnKeyActListener(keyactListener); } -#if 0 - void RespiratoryTrainingView::ClearAll(void) - { - if (container_ != nullptr) - { - container_->RemoveAll(); - delete container_; - container_ = nullptr; - } - - if (RespiratoryTrainingAnimator_ != nullptr) - { - RespiratoryTrainingAnimator_->Stop(); - delete RespiratoryTrainingAnimator_; - RespiratoryTrainingAnimator_ = nullptr; - } - - if (RespiratoryTrainingCallBack_ != nullptr) - { - delete RespiratoryTrainingCallBack_; - RespiratoryTrainingCallBack_ = nullptr; - } - - if (RespiratoryTrainingImg_ != nullptr) - { - ImageCacheManager::GetInstance().UnloadSingleRes(RespiratoryTrainingImagePath); - delete RespiratoryTrainingImg_; - RespiratoryTrainingImg_ = nullptr; - } - - if (RespiratoryTrainingLabel_ != nullptr) - { - delete RespiratoryTrainingLabel_; - RespiratoryTrainingLabel_ = nullptr; - } - } - - // 初始化呼吸训练动画图片信息 - void RespiratoryTrainingView::InitializeRespiratoryTrainingImageInfo() - { - for (uint8_t i = 0; i < RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES; i++) - { - RespiratoryTrainingImageInfo[i].imagePath = (RespiratoryTrainingArray[i]); - RespiratoryTrainingImageInfo[i].imageType = RespiratoryTrainingImg_SRC_FILE_PATH; - RespiratoryTrainingImageInfo[i].pos.x = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_X; - RespiratoryTrainingImageInfo[i].pos.y = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_Y; - RespiratoryTrainingImageInfo[i].width = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_W; - RespiratoryTrainingImageInfo[i].height = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_H; - } - } - - // 设置动画属性 - void RespiratoryTrainingView::SetAnimatorViewProperties() - { - RespiratoryTrainingAnimatorView->SetPosition(RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_X, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_Y); - RespiratoryTrainingAnimatorView->Resize(RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_W, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_H); - RespiratoryTrainingAnimatorView->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); - RespiratoryTrainingAnimatorView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); - RespiratoryTrainingAnimatorView->SetImageAnimatorSrc(RespiratoryTrainingImageInfo, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_TIMEOFUPDATE); - RespiratoryTrainingAnimatorView->SetRepeat(true); - RespiratoryTrainingAnimatorView->Start(); - } - - // 创建呼吸训练动画视图 - void RespiratoryTrainingView::CreateRespiratoryTrainingAnimatorView() - { - RespiratoryTrainingArray = RespiratoryTrainingView::GetInstance()->CreateImagePathsArray("/user/res/remind/RESPIRATORY_TRAINING_/", "bin", RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES); - - if (RespiratoryTrainingAnimatorView == nullptr) - { - RespiratoryTrainingAnimatorView = new UIImageAnimatorView(); - if (RespiratoryTrainingAnimatorView == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateDeviceRESPIRATORY_TRAINING_ingView]RespiratoryTrainingAnimatorView new fail"); - return; - } - - InitializeRespiratoryTrainingImageInfo(); - SetAnimatorViewProperties(); - } - } - - // 创建呼吸训练标签视图 - void RespiratoryTrainingView::CreateRespiratoryTrainingLabelView() - { - if (RespiratoryTrainingLabelView == nullptr) - { - RespiratoryTrainingLabelView = new UILabelExt(); - if (RespiratoryTrainingLabelView == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateDeviceRESPIRATORY_TRAINING_ingView]RespiratoryTrainingLabelView new fail"); - return; - } - SetLabelViewProperties(); - } - } - - void RespiratoryTrainingView::SetLabelViewProperties() - { - RespiratoryTrainingLabelView->SetPosition(83, 320, 360, 70); - } - - void RespiratoryTrainingView::RespiratoryTrainingViewInit(void) - { - CreateRespiratoryTrainingAnimatorView(); - CreateRespiratoryTrainingLabelView(); - } -#endif - const static int16_t BUTTON_WIDTH = 320; const static int16_t BUTTON_HEIGHT = 100; const static int16_t INTERVAL_STEP = 80; const Vector2 VIEW_CENTER = {120, 120}; static constexpr const char *RespiratoryTrainingImagePath = "/user/res/RespiratoryTraining/RespiratoryTraining.bin"; + static constexpr const char *RespiratoryTrainingImageBGPath = "/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin"; void RespiratoryTrainingCallback::Callback(UIView *view) { - RespiratoryTrainingModel::GetInstance().calculateHeartrateTotal(); + RespiratoryTrainingModel::GetInstance().calculateHeartrateTotal(); // 1.计算当前时间与开始时间的差值,用于控制动画的时间。 uint32_t currentTime = HALTick::GetInstance().GetTime(); curTime = currentTime - startTimestamp; @@ -299,43 +225,42 @@ namespace OHOS img_->Invalidate(); } + void RespiratoryTrainingView::HandStartRespiratoryTraining() + { + if (titlelabel && TrainingDurationSelectiontitlelabel && Image && RespiratoryTrainingStartButton && RespiratoryTrainingStartLabel) + { + titlelabel->SetVisible(false); + TrainingDurationSelectiontitlelabel->SetVisible(false); + Image->SetVisible(false); + RespiratoryTrainingStartButton->SetVisible(false); + RespiratoryTrainingStartLabel->SetVisible(false); + } + + if (RespiratoryTrainingStartNote_ && RespiratoryTrainingImg_) + { + RespiratoryTrainingStartNote_->SetVisible(true); + RespiratoryTrainingImg_->SetVisible(true); + } + + StartRespiratoryTraining(); // 开始呼吸训练 + HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测 + RespiratoryTrainingModel::GetInstance().RT_StartTimer(RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingTime()); // 开启定时器 + ui_api_vibrate_once_func(); // 震动 + } + bool RespiratoryTrainingView::OnClick(UIView &view, const ClickEvent &event) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingView::OnClick"); - UNUSED(view); UNUSED(event); -#if 0 - if (!animateStart_) + + if (&view == RespiratoryTrainingStartButton) { - RespiratoryTrainingAnimator_->Start(); - animateStart_ = false; - if (RespiratoryTrainingStart_ != nullptr) - { - RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Remove(RespiratoryTrainingStart_); - delete RespiratoryTrainingStart_; - RespiratoryTrainingStart_ = nullptr; - } - RespiratoryTrainingLabel_ = new UILabelExt(); - if (RespiratoryTrainingLabel_ == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingLabel_ new fail"); - return false; - } - RespiratoryTrainingLabel_->SetPosition(53, 320, 360, 70); // 180, 380, 100, 50: left, right, width, height - // RespiratoryTrainingLabel_->SetText("现在呼气"); - RespiratoryTrainingLabel_->SetTextId(STR_EXHALE_NOW); - RespiratoryTrainingLabel_->SetStyle(STYLE_TEXT_FONT, 30); - RespiratoryTrainingLabel_->SetStyle(STYLE_LINE_HEIGHT, 35); - RespiratoryTrainingLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); - RespiratoryTrainingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); - RespiratoryTrainingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); - RespiratoryTrainingLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); - RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingLabel_); - RespiratoryTrainingCallBack_->SetTextView(RespiratoryTrainingLabel_); - RespiratoryTrainingCallBack_->startTimestamp = HALTick::GetInstance().GetTime(); - RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Invalidate(); + HandStartRespiratoryTraining(); + } + else if (&view == TrainingDurationSelectiontitlelabel) + { + ChangeView(RESPIRATORYTRAINING, RESPIRATORY_TRAINING_DURATION_SELECTION); } -#endif return true; } @@ -399,23 +324,9 @@ namespace OHOS RespiratoryTrainingImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); RespiratoryTrainingImg_->SetAutoEnable(false); RespiratoryTrainingImg_->SetResizeMode(UIImageView::ImageResizeMode::CENTER); + RespiratoryTrainingImg_->SetVisible(false); RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingImg_); - -#if 0 - // 创建并设置呼吸训练开始按钮 - RespiratoryTrainingStart_ = new UILabelButton(); - if (RespiratoryTrainingStart_ == nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingStart_ new failed!"); - return false; - } - RespiratoryTrainingStart_->SetPosition(158, 320, 150, 75); - RespiratoryTrainingStart_->SetText("Start"); - RespiratoryTrainingStart_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); - RespiratoryTrainingStart_->SetOnClickListener(this); - RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStart_); -#else - + /* -------------------------------------------------------------------------- */ RespiratoryTrainingStartNote_ = new UILabelExt(); if (RespiratoryTrainingStartNote_ == nullptr) { @@ -430,9 +341,88 @@ namespace OHOS RespiratoryTrainingStartNote_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); RespiratoryTrainingStartNote_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); RespiratoryTrainingStartNote_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + RespiratoryTrainingStartNote_->SetVisible(false); RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStartNote_); return true; -#endif + } + + bool RespiratoryTrainingView::InitRespiratoryTrainingElements2() + { + titlelabel = new UILabelExt(); + if (titlelabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titlelabel new failed!"); + return false; + } + titlelabel->SetPosition(83, 50, 300, 35); + titlelabel->SetStyle(STYLE_TEXT_FONT, 30); + titlelabel->SetStyle(STYLE_LINE_HEIGHT, 35); + titlelabel->SetTextId(STR_BREATH_TRAINING); + titlelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + titlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + titlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(titlelabel); + /* -------------------------------------------------------------------------- */ + TrainingDurationSelectiontitlelabel = new UILabelExt(); + if (TrainingDurationSelectiontitlelabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingDurationSelectiontitlelabel new failed!"); + return false; + } + TrainingDurationSelectiontitlelabel->SetPosition(83, 95, 300, 35); + TrainingDurationSelectiontitlelabel->SetStyle(STYLE_TEXT_FONT, 30); + TrainingDurationSelectiontitlelabel->SetStyle(STYLE_LINE_HEIGHT, 35); + TrainingDurationSelectiontitlelabel->SetText(presenter_->GetRespiratoryTrainingSelectTime().c_str()); + TrainingDurationSelectiontitlelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + TrainingDurationSelectiontitlelabel->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff)); + TrainingDurationSelectiontitlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + TrainingDurationSelectiontitlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + TrainingDurationSelectiontitlelabel->SetTouchable(true); + TrainingDurationSelectiontitlelabel->SetOnClickListener(this); + RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(TrainingDurationSelectiontitlelabel); + /* -------------------------------------------------------------------------- */ + Image = new UIImageView(); + if (Image == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Image new failed!"); + return false; + } + Image->SetSrc(RespiratoryTrainingImageBGPath); + Image->SetPosition(133, 133, 200, 200); + Image->SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + Image->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + Image->SetAutoEnable(false); + Image->SetResizeMode(UIImageView::CENTER); + RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(Image); + /* -------------------------------------------------------------------------- */ + RespiratoryTrainingStartButton = new UILabelButtonExt(); + if (RespiratoryTrainingStartButton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Image new failed!"); + return false; + } + RespiratoryTrainingStartButton->SetPosition(93, 330, 280, 90); + RespiratoryTrainingStartButton->SetOnClickListener(this); + RespiratoryTrainingStartButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff4fc34c); + RespiratoryTrainingStartButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + RespiratoryTrainingStartButton->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED); + RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStartButton); + /* -------------------------------------------------------------------------- */ + RespiratoryTrainingStartLabel = new UILabelExt(); + if (RespiratoryTrainingStartLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingStartLabel new failed!"); + return false; + } + RespiratoryTrainingStartLabel->SetPosition(143, 358, 180, 35); + RespiratoryTrainingStartLabel->SetStyle(STYLE_TEXT_FONT, 30); + RespiratoryTrainingStartLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + RespiratoryTrainingStartLabel->SetTextId(STR_START); // 开始 + RespiratoryTrainingStartLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + RespiratoryTrainingStartLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + RespiratoryTrainingStartLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStartLabel); + return true; } bool RespiratoryTrainingView::InitRespiratoryTrainingCallBackAndAnimator() @@ -469,8 +459,8 @@ namespace OHOS return false; } RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); - RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetScrollBlankSize(50); - RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetReboundSize(35); + // RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetScrollBlankSize(50); + // RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetReboundSize(35); RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetHorizontalScrollState(false); RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetTouchable(true); RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetDraggable(true); @@ -483,15 +473,17 @@ namespace OHOS { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingView::RespiratoryTrainingViewInit"); if (!InitRespiratoryTrainingScrollView() || !InitRespiratoryTrainingElements() || - !InitRespiratoryTrainingCallBackAndAnimator()) + !InitRespiratoryTrainingElements2() || !InitRespiratoryTrainingCallBackAndAnimator()) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordListViewInit fail!!"); return; } +#if 0 StartRespiratoryTraining(); // 开始呼吸训练 HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测 RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_MIN); // 开启一个一分钟的定时器 ui_api_vibrate_once_func(); // 震动提醒 +#endif } void RespiratoryTrainingView::ClearAll(void) @@ -536,15 +528,51 @@ namespace OHOS delete RespiratoryTrainingLabel_; RespiratoryTrainingLabel_ = nullptr; } + if (RespiratoryTrainingStartNote_ != nullptr) + { + delete RespiratoryTrainingStartNote_; + RespiratoryTrainingStartNote_ = nullptr; + } + if (titlelabel != nullptr) + { + delete titlelabel; + titlelabel = nullptr; + } + if (TrainingDurationSelectiontitlelabel != nullptr) + { + delete TrainingDurationSelectiontitlelabel; + TrainingDurationSelectiontitlelabel = nullptr; + } + if (Image != nullptr) + { + delete Image; + Image = nullptr; + } + if (RespiratoryTrainingStartButton != nullptr) + { + delete RespiratoryTrainingStartButton; + RespiratoryTrainingStartButton = nullptr; + } + if (RespiratoryTrainingStartLabel != nullptr) + { + delete RespiratoryTrainingStartLabel; + RespiratoryTrainingStartLabel = nullptr; + } if (p_RespiratoryTrainingCompletedView != nullptr) { delete p_RespiratoryTrainingCompletedView; p_RespiratoryTrainingCompletedView = nullptr; - RespiratoryTrainingScrollView[RESPIRATORYTRAININGCOMPLETED] = nullptr; } + if (p_RespiratoryTrainingDurationSelectionView != nullptr) + { + delete p_RespiratoryTrainingDurationSelectionView; + p_RespiratoryTrainingDurationSelectionView = nullptr; + RespiratoryTrainingScrollView[RESPIRATORY_TRAINING_DURATION_SELECTION] = nullptr; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RespiratoryTrainingView]ClearAll end!!"); } diff --git a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp index b50a69594..de9b71212 100644 --- a/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp @@ -66,6 +66,7 @@ #include "ConfigModelC.h" #include "heart_blood/health_service/health_service.h" #include "vibrator_service.h" +#include "respiratorytraining/include/RespiratoryTrainingModel.h" #define DIALDATASET 1 //#include "Systemupgrade.h" @@ -637,6 +638,7 @@ void MsgCenterNotifyNextDayProc(const Topic topic, Request *req) /* ---------------------------------- 健康数据相关 ---------------------------------- */ // 清空当日的心率血氧数据 HealthService::GetInstance()->CleanHealthData(); + RespiratoryTrainingModel::GetInstance().ClearTotalRespiratoryTrainingTime(); // 通知UI更新 GraphicService::GetInstance()->PostGraphicEvent( std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance())); @@ -1262,7 +1264,11 @@ void MsgCenterNotifyDebugOutProc(const Topic topic, Request *req) { unused(req); WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDebugOutProc !"); - NotificationManager::GetInstance()->ShowNotify(showDebugOutputNotify, (uint16_t)topic, true); + if (CheckPriority(topic)) + { + NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE); + NotificationManager::GetInstance()->ShowNotify(showDebugOutputNotify, (uint16_t)topic, true); + } } //每日训练数据刷新 void MsgCenterNotifyActivityProc(const Topic topic, Request* req) diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin new file mode 100644 index 000000000..bdcb5a3fe --- /dev/null +++ b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b510277397ae32dea9d06e919cd012b66e3054a5f567e328d14a72e7e3c4054b +size 38424 diff --git a/code/sdk/drivers/peripheral/config/include/ConfigModel.h b/code/sdk/drivers/peripheral/config/include/ConfigModel.h index 9cd1bdfc0..360de80be 100644 --- a/code/sdk/drivers/peripheral/config/include/ConfigModel.h +++ b/code/sdk/drivers/peripheral/config/include/ConfigModel.h @@ -141,6 +141,7 @@ namespace OHOS CONFIGMODEL_ITEM_FLASHLIGHT_COLOR_VALUE, // color value CONFIGMODEL_ITEM_FLASHLIGHT_FLASHING_LEVEL, // flashing level + CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION, // 呼吸训练时长选择 CONFIGMODEL_ITEM_MAX, @@ -397,6 +398,7 @@ namespace OHOS {ConfigDataType::DATATYPE_INT, "color_index", "0" }, // CONFIGMODEL_ITEM_FLASHLIGHT_COLOR_INDEX, // color index {ConfigDataType::DATATYPE_INT, "color_value", "0" }, // CONFIGMODEL_ITEM_FLASHLIGHT_COLOR_VALUE, // color value {ConfigDataType::DATATYPE_INT, "flashing_level", "0" }, // CONFIGMODEL_ITEM_FLASHLIGHT_FLASHING_LEVEL, // flashing level + {ConfigDataType::DATATYPE_INT, "rt_select_time", "1" }, // CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION,呼吸训练选择的时长 }; ConfigModel(); // 私有构造函数,确保无法在外部实例化 -- 2.17.1