增加心率检测applsit中Slice
authorCaisking <3449750381@qq.com>
Fri, 16 Aug 2024 08:51:19 +0000 (16:51 +0800)
committerCaisking <3449750381@qq.com>
Fri, 16 Aug 2024 08:51:19 +0000 (16:51 +0800)
code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h
code/sdk/application/wearable/fd230app/nativelauncher/include/ui_resource_string.h
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp

index 1df389f..87607a7 100644 (file)
@@ -68,7 +68,7 @@ typedef enum : uint16_t
     VIEW_AI_MODELS,                 // AI模型选择界面
     VIEW_REBOOTANDSHUTDOWN,         //(滑动关机和重启带恢复出厂设置)
     VIEW_RECORD,
-    VIEW_MUSIC_PLAYER,              //音乐播放器
+    VIEW_MUSIC_PLAYER, // 音乐播放器
     /* -------------------------------------------------------------------------- */
     VIEW_OBU_MESSAGE,
     /* -------------------------------------------------------------------------- */
@@ -87,6 +87,7 @@ typedef enum : uint16_t
     VIEW_HEART_RESULT,   // 心率结果界面
     VIEW_HEART_CHECK,    // 心率检测界面
     VIEW_HEART,          // 心率监测
+    VIEW_HEART_CHART,    // 心率曲线图检测
     VIEW_SAVEELE,        // 省电模式
     VIEW_SAVEBAT,        // 省电模式界面
     VIEW_TAKEPHOTOS,     // 拍照界面
@@ -113,16 +114,16 @@ typedef enum : uint16_t
     VIEW_TRAININGAQUATIC, // 水上运动列表
     VIEW_TRAININGOTHER,   // 其他列表
     /* -------------------------------------------------------------------------- */
-    VIEW_MAIN_TEMP,      // 体温界面(暂时不用)
-    VIEW_OFFLINEVOICE,   // 语音助手界面(暂时不用)
-    VIEW_MAIN_ACTIVITY,  // 记录步数界面(暂时不用)
-    VIEW_UISAMPLE,       // 示例(暂时不用)
-    VIEW_INDOORWALK,     // 室内步行
-    VIEW_PHONE,          // 电话
-    VIEW_PHONECALL,      // 拨号
-    //VIEW_PHONERING,      // 拨号界面
-    // VIEW_PHONECALLING,   // 来电
-    // VIEW_PHONECALLUP,    // 通话界面
+    VIEW_MAIN_TEMP,     // 体温界面(暂时不用)
+    VIEW_OFFLINEVOICE,  // 语音助手界面(暂时不用)
+    VIEW_MAIN_ACTIVITY, // 记录步数界面(暂时不用)
+    VIEW_UISAMPLE,      // 示例(暂时不用)
+    VIEW_INDOORWALK,    // 室内步行
+    VIEW_PHONE,         // 电话
+    VIEW_PHONECALL,     // 拨号
+    // VIEW_PHONERING,      // 拨号界面
+    //  VIEW_PHONECALLING,   // 来电
+    //  VIEW_PHONECALLUP,    // 通话界面
     VIEW_PHONEDIR,       // 电话簿
     VIEW_MAIN_PHONE,     // 主电话Slice
     VIEW_DIALING_METHOD, // 拨号方式
index 536a771..f4e512d 100644 (file)
@@ -76,6 +76,7 @@ namespace OHOS
         void InitBloodResultSlice(void);
         void InitBloodCheckSlice(void);
         void InitHeartSlice(void);
+        void InitHeartChartSlice(void);
         void InitMainAlipaySlice(void);
         // void InitDialUpdateSlice(void);
         void InitSaveEleSlice(void);
index 57c019b..3a7807b 100644 (file)
@@ -1,15 +1,15 @@
-/*\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
@@ -525,8 +525,8 @@ enum UIResourceTextId : uint16_t {
     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
index f11b6da..515ab35 100644 (file)
@@ -83,6 +83,7 @@
 
 #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"
@@ -319,7 +322,7 @@ namespace OHOS
         {VIEW_AI_VOICE, &NativeLauncher::InitAiVoiceSlice},                                  //  Ai Voice(人工智能语音)
         {VIEW_AI_MODELS, &NativeLauncher::InitAiModelsSlice},                                //  Ai Models(Ai模型选择界面)
         {VIEW_REBOOTANDSHUTDOWN, &NativeLauncher::InitRebootAndShutdownSlice},               //  滑动关机和重启带恢复出厂设置
-        {VIEW_MUSIC_PLAYER, &NativeLauncher::InitMusicPlayerSlice},               //  音乐播放器
+        {VIEW_MUSIC_PLAYER, &NativeLauncher::InitMusicPlayerSlice},                          //  音乐播放器
 
         /* -------------------------------------------------------------------------- */
         {VIEW_OBU_MESSAGE, &NativeLauncher::InitOBUMessageSlice},
@@ -387,6 +390,7 @@ namespace OHOS
         /*心率检测*/
         {VIEW_HEART_CHECK, &NativeLauncher::InitHeartCheckSlice},
         {VIEW_HEART_RESULT, &NativeLauncher::InitHeartResultSlice},
+        {VIEW_HEART_CHART, &NativeLauncher::InitHeartChartSlice},
         /*设置卡片*/
         {VIEW_SET_CARD, &NativeLauncher::InitSetCardSlice},
         /*添加卡片*/
@@ -1212,6 +1216,18 @@ namespace OHOS
         }
         NativeAbility::GetInstance().AddSliceProxy(VIEW_HEART_RESULT, heartResultView);
     }
+    // 心率检查图表
+    void NativeLauncher::InitHeartChartSlice(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NativeLauncher::InitHeartChartSlice");
+        SliceProxy *heartchartView = new AbilitySliceProxy<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)
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h
new file mode 100644 (file)
index 0000000..876166b
--- /dev/null
@@ -0,0 +1,59 @@
+/***
+ * @Date: 2024-07-29 15:33:59
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 16:28:08
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartPresenter.h
+ */
+
+#ifndef HEART_Chart_PRESENTER_H
+#define HEART_Chart_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_list.h"
+#include "components/ui_view.h"
+#include "KeyInputListener.h"
+#include "ModelListenerSample.h"
+#include "heartrate/include/HeartChartView.h"
+#include "power_display_service.h"
+
+#define HEART_KEEP_TIME 40000 // 40s
+
+namespace OHOS
+{
+
+    class HeartChartView;
+    class HeartChartPresenter : public Presenter<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
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
new file mode 100644 (file)
index 0000000..ce0ba66
--- /dev/null
@@ -0,0 +1,76 @@
+/***
+ * @Date: 2024-08-15 18:38:49
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-15 20:25:38
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
+ */
+
+#ifndef HEART_Chart_VIEW_H
+#define HEART_Chart_VIEW_H
+
+#include "View.h"
+#include "BaseView.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_button.h"
+#include "components/ui_label_button.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_circle_progress.h"
+#include "components/ui_view_group.h"
+
+#include "heartrate/include/HeartChartPresenter.h"
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_button_ext.h"
+
+#include "power_display_service.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_chart.h"
+
+#define STOPCHECK "stop_check"
+namespace OHOS
+{
+    class HeartChartPresenter;
+    class HeartChartView : public View<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
index a8d92f5..426a97e 100644 (file)
@@ -1,27 +1,4 @@
-/*** 
- * @Date: 2024-07-31 10:27:26
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-31 14:12:07
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
- */
-/***
- * @Date: 2024-07-31 10:27:26
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-31 10:30:11
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.h
- */
-/***
- * @Date: 2024-07-29 15:38:56
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-29 15:42:12
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartDetectionView.cpp
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: bloodDetection view
- * Author:
- * Create: 2021-08-01
- */
+
 
 #ifndef HEART_Detection_VIEW_H
 #define HEART_Detection_VIEW_H
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartPresenter.cpp
new file mode 100644 (file)
index 0000000..43d07c5
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: HeartChartPresenter.cpp
+ * Author:
+ * Create: 2021-11-23
+ */
+
+#include "heartrate/include/HeartChartView.h"
+#include "heartrate/include/HeartChartPresenter.h"
+
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include "KeyInputListener.h"
+#include "custom_utils.h"
+#include "displaybrightness/include/DisplayBrightnessModel.h"
+#include "heartrate/include/HeartModel.h"
+#include "MainModel.h"
+
+namespace OHOS
+{
+
+    // 当前Presenter属性实例化的内存指针
+    static HeartChartPresenter *g_pHeartChartPresenter = nullptr;
+
+    HeartChartPresenter::HeartChartPresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartPresenter::HeartChartPresenter");
+        g_pHeartChartPresenter = this;
+        display_time = DisplayBrightnessModel::GetInstance()->GetScreenDurationTime();
+        display_api->set_screen_auto_off_timeout(300 * 1000); // 设置常亮
+        ResetTickTimer();
+    }
+
+    HeartChartPresenter::~HeartChartPresenter()
+    {
+        display_api->set_screen_auto_off_timeout(display_time); // 恢复
+        g_pHeartChartPresenter = nullptr;
+    }
+    HeartChartPresenter *HeartChartPresenter::GetInstance()
+    {
+        return g_pHeartChartPresenter;
+    }
+    void HeartChartPresenter::NavigateBack()
+    {
+        NativeAbility::GetInstance().Back(TransitionType::TRANSITION_ZOOM);
+    }
+    void HeartChartPresenter::OnStart()
+    {
+        Presenter<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;
+    }
+}
diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
new file mode 100644 (file)
index 0000000..8e7bce4
--- /dev/null
@@ -0,0 +1,256 @@
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-29 15:35:06
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
+ */
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "HeartChartView.h"
+#include "HeartModel.h"
+#include "ui_image_animator.h"
+#include "HeartChartView.h"
+#include "ui_resource_string.h"
+#include "power_display_service.h"
+#include "uicomponents/UIComponents.h"
+#include "heart_blood/health_service/health_service.h"
+namespace OHOS
+{
+    static HeartChartView *g_pHeartCheckView = nullptr;
+
+    // 动态刷新设置
+    static constexpr uint16_t IMAGE_SIZE = 180;
+    static constexpr uint16_t IMAGE_POSITION_Y = 134;
+    static constexpr uint16_t IMAGE_POSITION_X = 150;
+    static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SIZE = 20;
+    static constexpr uint16_t Chart_IMAGE_ANIMATORVIEW_SPEED = 40;
+    // 图片路径
+    static constexpr const char *BACKGROUND_IMAGE_PATH = "/user/res/heart_chart/background.bin";
+    static constexpr const char *BUTTOM_ICON_PATH = "/user/res/heart_chart/buttomicon.bin";
+    static constexpr const char *TOP_ICON_PATH = "/user/res/heart_chart/topicon.bin";
+    static constexpr const char *HEART_ICON_PATH = "/user/res/heart_chart/hearticon.bin";
+    // 心形心跳
+    static constexpr int HEARTBEAT_IMAGE_WIDTH = 92;
+    static constexpr int HEARTBEAT_IMAGE_HEIGHT = 92;
+    static constexpr int HEARTBEAT_IMAGE_X = 85;
+    static constexpr int HEARTBEAT_IMAGE_Y = 50;
+    static constexpr int HEARTBEAT_IMAGE_NUM = 19;
+    static constexpr int HEARTBEAT_DELAY = 50;
+    // 心跳image
+    static ImageAnimatorInfo g_heartImageInfo[HEARTBEAT_IMAGE_NUM] = {
+        {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+
+        {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+        {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},
+    };
+
+    HeartChartView::HeartChartView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartBandoffView::HeartBandoffView");
+        g_pHeartCheckView = this;
+    }
+    HeartChartView::~HeartChartView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartChartView::~HeartChartView");
+        imageAnimator->Stop();
+
+        UIViewGroup *tmpGroup = dynamic_cast<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;
+    }
+}
index 42dac0d..d011c80 100644 (file)
 \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
@@ -540,6 +541,14 @@ namespace OHOS
         }\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
@@ -582,7 +591,7 @@ namespace OHOS
 \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
@@ -631,7 +640,8 @@ namespace OHOS
         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