VIEW_MAIN_ALIPAY, // 支付宝
#endif
VIEW_HEART_CHART, // 心率曲线图检测
+ VIEW_HRV, // 心率变异性
VIEW_ADD_NEW_ID = 250,
/* -------------------------------------------------------------------------- */
VIEW_RECENT_APP,
STR_STRESS_WARNING = 728,\r
STR_STRESS_NORMAL = 729,\r
STR_STRESS_EXCELLENT = 730,\r
- STR_MAX_ID = 731,\r
+ STR_HRV_LAST_NIGHT_AVG = 731,\r
+ STR_HRV_BASELINE = 732,\r
+ STR_HRV_7DAY_AVG = 733,\r
+ STR_HRV_BALANCED = 734,\r
+ STR_HRV_UNBALANCED = 735,\r
+ STR_HRV_TOO_LOW = 736,\r
+ STR_MAX_ID = 737,\r
}; // UIResourceTextId\r
enum FontLanguageId : uint8_t {
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HrvModel.h
+ * Author:
+ * Create: 2021-10-12
+ */
+#ifndef HRV_MODEL_H
+#define HRV_MODEL_H
+
+namespace OHOS {
+
+class HrvModel {
+public:
+ static HrvModel *GetInstance(void);
+
+private:
+ HrvModel();
+ HrvModel(const HrvModel &);
+ virtual ~HrvModel();
+
+};
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HrvPresenter.h
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#ifndef HRV_PRESENTER_H
+#define HRV_PRESENTER_H
+
+#include "key/include/KeyInputListener.h"
+#include "Presenter.h"
+#include "ohos_types.h"
+
+#include "cmsis_os.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "NativeAbility.h"
+
+namespace OHOS {
+class HrvView;
+class HrvPresenter : public Presenter<HrvView>,
+ public UIView::OnClickListener,
+ public UIView::OnDragListener,
+ public RootView::OnKeyActListener
+{
+public:
+ HrvPresenter();
+ ~HrvPresenter() override;
+
+ void OnStart() override;
+ void OnResume() override;
+ static HrvPresenter *GetInstance(void);
+ bool OnClick(UIView &view, const ClickEvent &event) override;
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override;
+ bool OnDragEnd(UIView &view, const DragEvent &event) override;
+
+private:
+
+};
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HrvView.h
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#ifndef HRV_VIEW_H
+#define HRV_VIEW_H
+
+#include "View.h"
+
+#include "components/ui_view_group.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_label_button.h"
+#include "components/ui_list.h"
+#include "components/abstract_adapter.h"
+#include "components/ui_image_view.h"
+
+#include "hrv/include/HrvPresenter.h"
+
+namespace OHOS {
+
+class HrvView : public View<HrvPresenter>
+{
+public:
+ HrvView();
+ ~HrvView();
+
+ void OnStart() override;
+ static HrvView *GetInstance();
+ bool update_hrv_data(int8_t type);
+
+private:
+ bool Label_init();
+ bool Image_init();
+ UIViewGroup *group{nullptr};
+ UIView:: OnDragListener* dragListener{nullptr};
+ //7天平均值提示
+ UILabelExt *hrv_average_reminder_label{nullptr};
+ //7天平均值
+ UILabel *hrv_average_value_label{nullptr};
+ //单位标签
+ UILabel *unit_label{nullptr};
+ //结果标签
+ UILabelExt *result_label{nullptr};
+ //基准线标签
+ UILabelExt *baseline_label{nullptr};
+ //昨晚平均值提示标签
+ UILabelExt *last_average_value_label{nullptr};
+ //昨晚平均值标签
+ UILabelExt *last_average_reminder_value_label{nullptr};
+ //进度条
+ UIImageView *imageview{nullptr};
+ //白点
+ UIImageView *white_point_imageview{nullptr};
+ //绿点
+ UIImageView *green_point_imageview{nullptr};
+
+ UIImageAnimatorView *PullUpAnimatorView{nullptr}; // 上拉动画
+
+ ImageAnimatorInfo PullUpimageAnimatorInfo[70]{0};
+
+ const ImageInfo** PullUpimageAnimator_imageInfo{nullptr};
+
+ uint32_t current_hrv_value = 0;
+ uint32_t measurement_time = 0;
+};
+
+}
+#endif
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HrvModel.cpp
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#include "hrv/include/HrvModel.h"
+#include "gfx_utils/mem_check.h"
+
+namespace OHOS
+{
+
+static HrvModel *g_pHrvModel = nullptr;
+
+HrvModel::HrvModel()
+{
+ g_pHrvModel = this;
+#ifdef MEM_CHECK
+ MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+}
+
+HrvModel::~HrvModel()
+{
+ g_pHrvModel = nullptr;
+#ifdef MEM_CHECK
+ MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+}
+
+HrvModel *HrvModel::GetInstance(void)
+{
+ if (g_pHrvModel == nullptr)
+ {
+ g_pHrvModel = new HrvModel();
+ }
+ return g_pHrvModel;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HrvPresenter.cpp
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#include "hrv/include/HrvView.h"
+#include "hrv/include/HrvModel.h"
+#include "gfx_utils/mem_check.h"
+#include "common/key_code.h"
+#include "hrv/include/HrvPresenter.h"
+#include "custom_utils.h"
+#include "NativeRegisterManager.h"
+
+namespace OHOS
+{
+
+REGIST_MENU_PRO(VIEW_HRV, HrvView, HrvPresenter,
+ PNG_APPLIST_HRV_IMAGE_BIG, PNG_APPLIST_HRV_IMAGE, PNG_APPLIST_HRV_IMAGE, "HRV", STR_HRV);
+
+static HrvPresenter *g_pMainView = nullptr;
+HrvPresenter::HrvPresenter()
+{
+ g_pMainView = this;
+#ifdef MEM_CHECK
+ MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+}
+
+HrvPresenter::~HrvPresenter()
+{
+ g_pMainView = nullptr;
+#ifdef MEM_CHECK
+ MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+}
+
+HrvPresenter *HrvPresenter::GetInstance(void)
+{
+ return g_pMainView;
+}
+
+void HrvPresenter::OnStart()
+{
+}
+
+void HrvPresenter::OnResume()
+{
+ RootView::GetInstance()->SetOnKeyActListener(this);
+}
+
+bool HrvPresenter::OnClick(UIView &view, const ClickEvent &event)
+{
+ UNUSED(event);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvPresenter::OnClick");
+
+ return false;
+}
+
+bool HrvPresenter::OnDragEnd(OHOS::UIView &view, const OHOS::DragEvent &event)
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvPresenter::OnDragEnd");
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
+ {
+ if (event.GetPreLastPoint().x - event.GetStartPoint().x > 100)
+ NativeAbility::GetInstance().Back();
+ }
+ if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP)
+ {
+ // 上拉更新HRV数据
+ HrvView::GetInstance()->update_hrv_data(1);
+ }
+ if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM)
+ {
+ // 下拉刷新HRV数据
+ HrvView::GetInstance()->update_hrv_data(2);
+ }
+ return true;
+}
+
+bool HrvPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvPresenter::OnKeyAct");
+ uint16 keyID = event.GetKeyId();
+ uint16_t keyState = event.GetState();
+ // 如果是power键就返回上一级
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)
+ {
+ uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+ NativeAbility::GetInstance().Back();
+ }
+ return true;
+}
+}
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HrvView.cpp
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#include "hrv/include/HrvView.h"
+#include "hrv/include/HrvPresenter.h"
+#include "gfx_utils/mem_check.h"
+#include "common/key_code.h"
+#include "custom_utils.h"
+#include "ui_resource_string.h"
+namespace OHOS
+{
+
+static HrvView *g_pHrvView = nullptr;
+
+HrvView::HrvView()
+{
+ g_pHrvView = this;
+#ifdef MEM_CHECK
+ MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+}
+
+HrvView::~HrvView()
+{
+ g_pHrvView = nullptr;
+#ifdef MEM_CHECK
+ MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+}
+
+HrvView *HrvView::GetInstance()
+{
+ return g_pHrvView;
+}
+
+void HrvView::OnStart()
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvView::OnStart");
+
+ if (group == nullptr)
+ {
+ group = new UIViewGroup();
+ group->SetPosition(0, 0, 466, 466);
+ group->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);
+ group->SetStyle(STYLE_BACKGROUND_OPA, 0xD0);
+ RootView::GetInstance()->Add(group);
+
+ Label_init();
+ Image_init();
+ }
+}
+
+bool HrvView::Label_init()
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvView::Label_init");
+
+ // 初始化7天平均值提示标签
+ if (hrv_average_reminder_label == nullptr)
+ {
+ hrv_average_reminder_label = new UILabelExt();
+ hrv_average_reminder_label->SetPosition(83, 74, 300, 35);
+ hrv_average_reminder_label->SetTextId(STR_HRV_7DAY_AVG);
+ hrv_average_reminder_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ hrv_average_reminder_label->SetStyle(STYLE_TEXT_COLOR, 0xFFFFFFFF);
+ hrv_average_reminder_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(hrv_average_reminder_label);
+ }
+
+ // 初始化7天平均值标签
+ if (hrv_average_value_label == nullptr)
+ {
+ hrv_average_value_label = new UILabel();
+ hrv_average_value_label->SetPosition(149, 115, 96, 97);
+ hrv_average_value_label->SetText("--");
+ hrv_average_value_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 80);
+ hrv_average_value_label->SetStyle(STYLE_TEXT_COLOR, 0xFFFFFFFF);
+ hrv_average_value_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(hrv_average_value_label);
+ }
+
+ // 初始化单位标签
+ if (unit_label == nullptr)
+ {
+ unit_label = new UILabel();
+ unit_label->SetPosition(257, 140, 59, 47);
+ unit_label->SetText("ms");
+ unit_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40);
+ unit_label->SetStyle(STYLE_TEXT_COLOR, 0xFF999999);
+ unit_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(unit_label);
+ }
+
+ // 初始化结果标签
+ if (result_label == nullptr)
+ {
+ result_label = new UILabelExt();
+ result_label->SetPosition(83, 218, 300, 47);
+ result_label->SetTextId(STR_HRV_BALANCED);
+ result_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40);
+ result_label->SetStyle(STYLE_TEXT_COLOR, 0xFF00FF00);//根据结果修改
+ result_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(result_label);
+ }
+
+ // 初始化基准线标签
+ if (baseline_label == nullptr)
+ {
+ baseline_label = new UILabelExt();
+ baseline_label->SetPosition(130, 285, 234, 35);
+ baseline_label->SetTextId(STR_HRV_BASELINE);
+ baseline_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ baseline_label->SetStyle(STYLE_TEXT_COLOR, 0xFFFFFFFF);
+ baseline_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(baseline_label);
+ }
+
+ // 初始化昨晚平均值提示标签
+ if (last_average_reminder_value_label == nullptr)
+ {
+ last_average_reminder_value_label = new UILabelExt();
+ last_average_reminder_value_label->SetPosition(83, 340, 300, 35);
+ last_average_reminder_value_label->SetTextId(STR_HRV_LAST_NIGHT_AVG);
+ last_average_reminder_value_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ last_average_reminder_value_label->SetStyle(STYLE_TEXT_COLOR, 0xFFFFFFFF);
+ last_average_reminder_value_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(last_average_reminder_value_label);
+ }
+
+ // 初始化昨晚平均值标签
+ if (last_average_value_label == nullptr)
+ {
+ last_average_value_label = new UILabelExt();
+ last_average_value_label->SetPosition(83, 391, 300, 35);
+ last_average_value_label->SetText("-- ms");
+ last_average_value_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ last_average_value_label->SetStyle(STYLE_TEXT_COLOR, 0xFFFFFFFF);
+ last_average_value_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ group->Add(last_average_value_label);
+ }
+
+ return true;
+}
+
+bool HrvView::Image_init()
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvView::Image_init");
+
+ // 初始化进度条图片
+ if (imageview == nullptr)
+ {
+ imageview = new UIImageView();
+ imageview->SetAutoEnable(false);
+ imageview->SetPosition(10, 10, 446, 223);
+ imageview->SetSrc("/user/res/hrv/progress_bar.bin"); // 假设的进度条图片路径
+ imageview->SetResizeMode(UIImageView::ImageResizeMode::CONTAIN);
+ imageview->SetVisible(true);
+ group->Add(imageview);
+ }
+
+ // 初始化白点图片
+ if (white_point_imageview == nullptr)
+ {
+ white_point_imageview = new UIImageView();
+ white_point_imageview->SetPosition(60, 98, 20, 20);
+ white_point_imageview->SetSrc("/user/res/hrv/white_point.bin"); // 假设的白点图片路径
+ white_point_imageview->SetVisible(true);
+ group->Add(white_point_imageview);
+ }
+
+ // 初始化绿点图片
+ if (green_point_imageview == nullptr)
+ {
+ green_point_imageview = new UIImageView();
+ green_point_imageview->SetPosition(102, 293, 18, 18);
+ green_point_imageview->SetSrc("/user/res/hrv/green_point.bin"); // 假设的绿点图片路径
+ green_point_imageview->SetVisible(true);
+ group->Add(green_point_imageview);
+ }
+
+ return true;
+}
+
+bool HrvView::update_hrv_data(int8_t type)
+{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HrvView::update_hrv_data type=%d", type);
+
+ switch (type)
+ {
+ case 1:
+ white_point_imageview->SetPosition(30, 170, 20, 20);
+ break;
+ case 2:
+ white_point_imageview->SetPosition(62, 96, 20, 20);
+ break;
+ case 3:
+ white_point_imageview->SetPosition(223, 12, 20, 20);
+ break;
+ case 4:
+ white_point_imageview->SetPosition(410, 139, 20, 20);
+ break;
+ default:
+ break;
+ }
+
+ return true;
+}
+}
STR_STRESS_OVERLOAD$The current stress level is too high. It is recommended to pause work and practice breathing exercises or meditation.\r
STR_STRESS_WARNING$There is slight stress. It is recommended to try 1 minute of deep breathing or look into the distance.\r
STR_STRESS_NORMAL$The stress level is within the healthy range. It is recommended to continue maintaining a regular schedule, as your condition is good.\r
-STR_STRESS_EXCELLENT$The current stress level is extremely low. It is recommended to maintain your current state and enjoy the relaxing moment.
\ No newline at end of file
+STR_STRESS_EXCELLENT$The current stress level is extremely low. It is recommended to maintain your current state and enjoy the relaxing moment.\r
+STR_HRV_LAST_NIGHT_AVG $Last Night's Average\r
+STR_HRV_BASELINE $Baseline:65-85ms\r
+STR_HRV_7DAY_AVG $7-Day Average HRV\r
+STR_HRV_BALANCED $Balanced\r
+STR_HRV_UNBALANCED $Unbalanced\r
+STR_HRV_TOO_LOW $Too Low
\ No newline at end of file
STR_STRESS_OVERLOAD$当前压力过高,建议暂停工作,进行呼吸训练或冥想\r
STR_STRESS_WARNING$存在轻微压力,建议试试1分钟深呼吸或远眺\r
STR_STRESS_NORMAL$压力在健康范围,建议继续保持规律作息,状态良好\r
-STR_STRESS_EXCELLENT$当前压力极低,建议保持当前状态,享受放松时刻
\ No newline at end of file
+STR_STRESS_EXCELLENT$当前压力极低,建议保持当前状态,享受放松时刻\r
+STR_HRV_LAST_NIGHT_AVG $昨晚平均值\r
+STR_HRV_BASELINE $基准线65-85ms\r
+STR_HRV_7DAY_AVG $7天平均 HRV\r
+STR_HRV_BALANCED $平衡\r
+STR_HRV_UNBALANCED $不平衡\r
+STR_HRV_TOO_LOW $过低
\ No newline at end of file
<lanstr id="STR_STRESS_WARNING" value="There is slight stress. It is recommended to try 1 minute of deep breathing or look into the distance."/>
<lanstr id="STR_STRESS_NORMAL" value="The stress level is within the healthy range. It is recommended to continue maintaining a regular schedule, as your condition is good."/>
<lanstr id="STR_STRESS_EXCELLENT" value="The current stress level is extremely low. It is recommended to maintain your current state and enjoy the relaxing moment."/>
+ <lanstr id="STR_HRV_LAST_NIGHT_AVG " value="Last Night's Average"/>
+ <lanstr id="STR_HRV_BASELINE " value="Baseline:65-85ms"/>
+ <lanstr id="STR_HRV_7DAY_AVG " value="7-Day Average HRV"/>
+ <lanstr id="STR_HRV_BALANCED " value="Balanced"/>
+ <lanstr id="STR_HRV_UNBALANCED " value="Unbalanced"/>
+ <lanstr id="STR_HRV_TOO_LOW " value="Too Low"/>
</language>
<lanstr id="STR_STRESS_WARNING" value="存在轻微压力,建议试试1分钟深呼吸或远眺"/>
<lanstr id="STR_STRESS_NORMAL" value="压力在健康范围,建议继续保持规律作息,状态良好"/>
<lanstr id="STR_STRESS_EXCELLENT" value="当前压力极低,建议保持当前状态,享受放松时刻"/>
+ <lanstr id="STR_HRV_LAST_NIGHT_AVG " value="昨晚平均值"/>
+ <lanstr id="STR_HRV_BASELINE " value="基准线65-85ms"/>
+ <lanstr id="STR_HRV_7DAY_AVG " value="7天平均 HRV"/>
+ <lanstr id="STR_HRV_BALANCED " value="平衡"/>
+ <lanstr id="STR_HRV_UNBALANCED " value="不平衡"/>
+ <lanstr id="STR_HRV_TOO_LOW " value="过低"/>
</language>
STR_STRESS_WARNING = 728,\r
STR_STRESS_NORMAL = 729,\r
STR_STRESS_EXCELLENT = 730,\r
- STR_MAX_ID = 731,\r
+ STR_HRV_LAST_NIGHT_AVG = 731,\r
+ STR_HRV_BASELINE = 732,\r
+ STR_HRV_7DAY_AVG = 733,\r
+ STR_HRV_BALANCED = 734,\r
+ STR_HRV_UNBALANCED = 735,\r
+ STR_HRV_TOO_LOW = 736,\r
+ STR_MAX_ID = 737,\r
}; // UIResourceTextId\r
enum FontLanguageId : uint8_t {