VIEW_AI_MODELS, // AI模型选择界面
VIEW_REBOOTANDSHUTDOWN, //(滑动关机和重启带恢复出厂设置)
VIEW_RECORD,
- VIEW_MUSIC_PLAYER, //音乐播放器
+ VIEW_MUSIC_PLAYER, // 音乐播放器
/* -------------------------------------------------------------------------- */
VIEW_OBU_MESSAGE,
/* -------------------------------------------------------------------------- */
VIEW_HEART_RESULT, // 心率结果界面
VIEW_HEART_CHECK, // 心率检测界面
VIEW_HEART, // 心率监测
+ VIEW_HEART_CHART, // 心率曲线图检测
VIEW_SAVEELE, // 省电模式
VIEW_SAVEBAT, // 省电模式界面
VIEW_TAKEPHOTOS, // 拍照界面
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, // 拨号方式
void InitBloodResultSlice(void);
void InitBloodCheckSlice(void);
void InitHeartSlice(void);
+ void InitHeartChartSlice(void);
void InitMainAlipaySlice(void);
// void InitDialUpdateSlice(void);
void InitSaveEleSlice(void);
-/*\r
-* Copyright (c) xxxxxxxx Technologies Co., Ltd. 2021-2021. All rights reserved.\r
-* Description: language\r
-* Author: Graphic develop team\r
-* Create: 2021-07-06\r
-*/\r
-\r
-#ifndef UI_RESOURCE_STRING_H\r
-#define UI_RESOURCE_STRING_H\r
-#include <cstdint>\r
-namespace OHOS {\r
-enum UIResourceTextId : uint16_t {\r
+/*
+* 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 <cstdint>
+namespace OHOS {
+enum UIResourceTextId : uint16_t {
STR_EXERCISE_OUTDOORWALKING = 0,\r
STR_EXERCISE_OUTDOORRUNNING = 1,\r
STR_EXERCISE_OUTDOORBIKING = 2,\r
STR_SCHEDULE_NO_DATA_PROMPT = 512,\r
STR_MAX_ID = 513,\r
}; // UIResourceTextId\r
-\r
-enum FontLanguageId : uint8_t {\r
+
+enum FontLanguageId : uint8_t {
LANGUAGE_ID_ZH,\r
LANGUAGE_ID_EN,\r
LANGUAGE_ID_MAX\r
#include "displaybrightness/include/DisplayBrightnessPresenter.h"
#include "displaybrightness/include/DisplayBrightnessView.h"
+/* -------------------------------------------------------------------------- */
/*消息通知*/
#include "message/include/MessageView.h"
#include "message/include/MessagePresenter.h"
#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"
{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},
/*心率检测*/
{VIEW_HEART_CHECK, &NativeLauncher::InitHeartCheckSlice},
{VIEW_HEART_RESULT, &NativeLauncher::InitHeartResultSlice},
+ {VIEW_HEART_CHART, &NativeLauncher::InitHeartChartSlice},
/*设置卡片*/
{VIEW_SET_CARD, &NativeLauncher::InitSetCardSlice},
/*添加卡片*/
}
NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_RESULT, heartResultView);
}
+ // 心率检查图表
+ void NativeLauncher::InitHeartChartSlice(void)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartChartSlice");
+ SliceProxy *heartchartView = new AbilitySliceProxy<HeartChartView, HeartChartPresenter>;
+ if (heartchartView == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartchartView is nullptr");
+ return;
+ }
+ NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_CHART, heartchartView);
+ }
/* -------------------------------------------------------------------------- */
// 查找手机
void NativeLauncher::InitFindPhoneSlice(void)
--- /dev/null
+/***
+ * @Date: 2024-07-29 15:33:59
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 16:28:08
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/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<HeartChartView>,
+ 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
--- /dev/null
+/***
+ * @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<HeartChartPresenter>
+ {
+ 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
-/***
- * @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
--- /dev/null
+/*
+ * 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<HeartChartView>::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<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
+ {
+ NavigateBack();
+ }
+ return true;
+ }
+}
--- /dev/null
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 15:35:06
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/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<UIViewGroup *>(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<HeartChartPresenter>::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<HeartChartPresenter>::OnSetUpView();
+
+ Draw();
+ }
+ void HeartChartView::OnTearDownView()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnTearDownView");
+ View<HeartChartPresenter>::OnTearDownView();
+ return;
+ }
+
+ void HeartChartView::OnStop()
+ {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::OnStop");
+ View<HeartChartPresenter>::OnStop();
+ if (container_ != nullptr)
+ {
+ container_->RemoveAll();
+ delete container_;
+ container_ = nullptr;
+ }
+ return;
+ }
+}
\r
#include "heartrate/include/HeartRateView.h"\r
#include "ui_service.h"\r
+#include "battery_hal.h"\r
\r
#ifdef __cplusplus\r
extern "C"\r
{\r
#endif\r
\r
-#define MAX_UNWEAR_COUNT 30\r
+#define MAX_UNWEAR_COUNT 20\r
#define MAX_VALID_HRS_COUNT 40\r
#define MAX_DISVALID_HRS_COUNT 70\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
}\r
else if (state == HeartState::Start && heartstate == false)\r
{\r
+ /*充电状态下不进行检测*/\r
+ bool isCharging = get_charge_stat(); // 获取充电状态\r
+ if (isCharging)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测");\r
+ return;\r
+ }\r
+\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState Start");\r
uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST;\r
send_ppg_cmd_msg(md);\r
\r
if (sensorstate)\r
{\r
- Heart_Control(HeartState::End, HeartCheck::INITIATIVE);\r
+ // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 不需要关闭\r
sensorstate = false;\r
Heart_Result(); // 处理结果\r
}\r
case HeartResult::SUCCESS:\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
Heart_Save();\r
- NativeAbility::GetInstance().Back(); // 成功\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_HEART_CHART);\r
+ // NativeAbility::GetInstance().Back(); // 成功 心率界面检测成功 不回退\r
break;\r
\r
case HeartResult::NOT_WORN: // 未佩戴状态\r