${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartDetectionPresenter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartChartView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartChartPresenter.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/heartrate/src/HeartRateCardView.cpp
#BloodCheck
${CMAKE_CURRENT_SOURCE_DIR}/nativeui/bloodoxygen/src/BloodResultView.cpp
#define APP_DOWNLOAD_DIAL_PATH "/user/userdata/dial" /*表盘市场安装路径*/
#define APP_CUSTOM_DIAL_PATH "/user/userdata/custom_dial" /*自定义表盘安装路径*/
#define APP_LIST_PATH "/user/res/applist_icon"
+#define APP_HEARET_ICON_PATH "/user/res/heart_chart/hearticon"//心率动画
static constexpr const char *CARD_CONFIG_PATH = "/user/cardconfig.bin";
static constexpr const char *ALARM_DELETE_ADD_PATH = APP_RES_PATH "/DELETE.bin";
static constexpr const char *ALARM_TRUE_ADD_PATH = APP_RES_PATH "/TRUE_ADD.bin";
/* ---------------------------------- 心率动画图片 ---------------------------------- */
- static constexpr const char *PNG_A004_070_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_01.bin";
- static constexpr const char *PNG_A004_071_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_02.bin";
- static constexpr const char *PNG_A004_072_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_03.bin";
- static constexpr const char *PNG_A004_073_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_04.bin";
- static constexpr const char *PNG_A004_074_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_05.bin";
- static constexpr const char *PNG_A004_075_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_06.bin";
- static constexpr const char *PNG_A004_076_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_07.bin";
- static constexpr const char *PNG_A004_077_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_08.bin";
- static constexpr const char *PNG_A004_078_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_09.bin";
- static constexpr const char *PNG_A004_079_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_10.bin";
- static constexpr const char *PNG_A004_080_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_11.bin";
- static constexpr const char *PNG_A004_081_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_12.bin";
- static constexpr const char *PNG_A004_082_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_13.bin";
- static constexpr const char *PNG_A004_083_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_14.bin";
- static constexpr const char *PNG_A004_084_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_15.bin";
- static constexpr const char *PNG_A004_085_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_16.bin";
- static constexpr const char *PNG_A004_086_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_17.bin";
- static constexpr const char *PNG_A004_087_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_18.bin";
- static constexpr const char *PNG_A004_088_IMAGE_PATH = APP_RES_PATH "/HEARTBEAT_IMAGE_19.bin";
+ static constexpr const char *PNG_A004_070_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_01.bin";
+ static constexpr const char *PNG_A004_071_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_02.bin";
+ static constexpr const char *PNG_A004_072_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_03.bin";
+ static constexpr const char *PNG_A004_073_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_04.bin";
+ static constexpr const char *PNG_A004_074_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_05.bin";
+ static constexpr const char *PNG_A004_075_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_06.bin";
+ static constexpr const char *PNG_A004_076_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_07.bin";
+ static constexpr const char *PNG_A004_077_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_08.bin";
+ static constexpr const char *PNG_A004_078_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_09.bin";
+ static constexpr const char *PNG_A004_079_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_10.bin";
+ static constexpr const char *PNG_A004_080_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_11.bin";
+ static constexpr const char *PNG_A004_081_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_12.bin";
+ static constexpr const char *PNG_A004_082_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_13.bin";
+ static constexpr const char *PNG_A004_083_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_14.bin";
+ static constexpr const char *PNG_A004_084_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_15.bin";
+ static constexpr const char *PNG_A004_085_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_16.bin";
+ static constexpr const char *PNG_A004_086_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_17.bin";
+ static constexpr const char *PNG_A004_087_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_18.bin";
+ static constexpr const char *PNG_A004_088_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_19.bin";
+ static constexpr const char *PNG_A004_089_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_20.bin";
+ static constexpr const char *PNG_A004_090_IMAGE_PATH = APP_HEARET_ICON_PATH "/HEARTICON_21.bin";
/* -------------------------------- 蓝牙搜索的动画图片 ------------------------------- */
static constexpr const char *PNG_A019_080_IMAGE_PATH = APP_RES_PATH "/BLUETOOTH_IMAGE_01.bin";
static constexpr const char *PNG_A019_081_IMAGE_PATH = APP_RES_PATH "/BLUETOOTH_IMAGE_02.bin";
* @Date: 2024-08-15 18:38:49
* @LastEditors: Caisking 3449750381@qq.com
* @LastEditTime: 2024-08-26 15:17:07
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h
*/
/***
* @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
+ * @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 "View.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_image_animator.h"
+#include "components/ui_label.h"
+#include "components/ui_label_button.h"
+#include "components/ui_label_ext.h"
#include "components/ui_view_group.h"
+#include "wearable_log.h"
#include "heartrate/include/HeartChartPresenter.h"
-#include "components/ui_scroll_view.h"
#include "components/ui_label_button_ext.h"
+#include "components/ui_scroll_view.h"
-#include "power_display_service.h"
-#include "components/ui_image_animator.h"
#include "components/ui_chart.h"
+#include "components/ui_image_animator.h"
+#include "power_display_service.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);
+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);
- UIImageAnimatorView *GetImageAnimator(void);
+ bool HeartViewInit();
+ void InitChartView(void);
+ void InitChartLabel(void);
+ void InitChartImageView(void);
- bool HeartViewInit();
- void InitChartView(void);
- void SetDataChart();
- void SetDataTopAndBottom();
- void HeartImageAnimator();
+ void SetDataChart();
+ void SetDataTopAndBottom();
+ void HeartImageAnimator();
- void UpdateShowHeart(void);
- void Update_data_Chart(int serialIndex);
- void CleanAllDataView();
+ void UpdateShowHeart(void);
+ void Update_data_Chart(int serialIndex);
+ void CleanAllDataView();
+ void UpdateChartConfig();
+ void SetLastHeart();
+ UIViewGroup *GetchartGroup();
- private:
- UILabelExt *CurrentHeartText{nullptr};
- UILabelExt *MaxHeartText{nullptr};
- UILabelExt *MinHeartText{nullptr};
- UILabelExt *UHeartText{nullptr};
- UILabelExt *RestHeartText{nullptr};
+private:
+ UIImageView *maxRateIconView_{nullptr};
+ UIImageView *minRateIconView_{nullptr};
+ UIImageView *chartBackgroundView_{nullptr};
+ UIImageView *heartIconView_{nullptr};
- UIImageView *TopimageView{nullptr};
- UIImageView *BottomimageView{nullptr};
- UIImageView *CoordinateimageView{nullptr};
- UIImageView *HeartIconView{nullptr};
+ UIImageAnimatorView *imageAnimator{nullptr};
- UIImageAnimatorView *imageAnimator{nullptr};
+ Point heartdata[24];
+ UIChartDataSerial *heartSerial{nullptr};
+ UIChartPolyline *heartchart = nullptr;
- Point heartdata[24];
- UIChartDataSerial *heartSerial{nullptr};
- UIChartPolyline *heartchart = nullptr;
- };
-}
+ UILabelExt *displayheart_{nullptr};
+ UILabelExt *uheart_{nullptr};
+ UILabelExt *lastheart_{nullptr};
+ UILabelExt *minheart_{nullptr};
+ UILabelExt *maxheart_{nullptr};
+
+ UILabelExt *maxheart_dynamic_{nullptr};
+ UILabelExt *maxheart_dynamic_3_{nullptr};
+ UILabelExt *maxheart_dynamic_2_{nullptr};
+ UILabelExt *maxheart_dynamic_1_{nullptr};
+ UILabelExt *minheart_dynamic_{nullptr};
+};
+} // namespace OHOS
#endif // 心率主界面
\ No newline at end of file
#ifndef HEART_MODEL_H\r
#define HEART_MODEL_H\r
\r
-#include <ctime>\r
+#include "MainClockView.h"\r
#include "broadcast_feature.h"\r
#include "broadcast_service.h"\r
#include "samgr_lite.h"\r
-#include "MainClockView.h"\r
+#include <ctime>\r
\r
#ifdef __cplusplus\r
-extern "C"\r
-{\r
+extern "C" {\r
#endif\r
\r
- int PushOHOSMsgToHeartModel(Request *request);\r
- void HeartDataSubscribeTopic(Topic topic);\r
- void HearDatatUnsubscribeTopic(Topic topic);\r
+int PushOHOSMsgToHeartModel(Request *request);\r
+void HeartDataSubscribeTopic(Topic topic);\r
+void HearDatatUnsubscribeTopic(Topic topic);\r
\r
#define HEART_ALL_POINTS 360\r
\r
- typedef struct\r
- {\r
- uint16_t x;\r
- uint16_t y;\r
- bool flag;\r
- } Point;\r
-\r
- typedef struct\r
- {\r
- /** X coordinate */\r
- uint16_t x;\r
- /** Y coordinate */\r
- uint16_t y;\r
- } HeartPoint;\r
-\r
- typedef struct\r
- {\r
- uint16_t perSec;\r
- uint16_t rest;\r
- uint16_t minX;\r
- uint16_t minValue;\r
- uint16_t maxX;\r
- uint16_t maxValue;\r
- uint16_t index;\r
- Point value[HEART_ALL_POINTS];\r
- } HeartInfo;\r
+typedef struct {\r
+ uint16_t x;\r
+ uint16_t y;\r
+ bool flag;\r
+} Point;\r
+\r
+typedef struct {\r
+ /** X coordinate */\r
+ uint16_t x;\r
+ /** Y coordinate */\r
+ uint16_t y;\r
+} HeartPoint;\r
+\r
+typedef struct {\r
+ uint16_t perSec;\r
+ uint16_t rest;\r
+ uint16_t minX;\r
+ uint16_t minValue;\r
+ uint16_t maxX;\r
+ uint16_t maxValue;\r
+ uint16_t index;\r
+ Point value[HEART_ALL_POINTS];\r
+} HeartInfo;\r
\r
#pragma pack(4)\r
- typedef struct\r
- {\r
- uint16_t perSec;\r
- uint16_t rest;\r
- uint16_t minX;\r
- uint16_t minValue;\r
- uint16_t maxX;\r
- uint16_t maxValue;\r
- uint16_t index;\r
- HeartPoint value[HEART_ALL_POINTS];\r
- } HeartDatas;\r
+typedef struct {\r
+ uint16_t perSec;\r
+ uint16_t rest;\r
+ uint16_t minX;\r
+ uint16_t minValue;\r
+ uint16_t maxX;\r
+ uint16_t maxValue;\r
+ uint16_t index;\r
+ HeartPoint value[HEART_ALL_POINTS];\r
+} HeartDatas;\r
\r
#pragma pack()\r
\r
- namespace OHOS\r
- {\r
+namespace OHOS {\r
#define HEART_AVE_NUM 360\r
#define HEART_RATE_LIMIT_UPPER 200\r
#define HEART_RATE_LIMIT_LOWER 0\r
#define NUM_7 7\r
#define NUM_16 16\r
#define NUM_99 99\r
- // 心率检测状态\r
- enum class HeartState\r
- {\r
- End = 0,\r
- Start,\r
- };\r
- enum class HeartCheck\r
- {\r
- RESTSTSTE = 0, // 未检测状态\r
- PASSIVITY, // 被动检测心率\r
- CARDCHECK, // 卡片检测\r
- INITIATIVE, // 主动检测心率\r
- EXERCISE, // 运动心率\r
- };\r
- enum class HeartResult\r
- {\r
- NOT_TESTED = 0, // 未检测\r
- SUCCESS, // 检测成功\r
- NOT_WORN, // 未佩戴检测\r
- TIMEOUT, // 检测超时\r
- HIGH_RESULT, // 检测结果过高\r
- LOW_RESULT, // 检测结果过低\r
- INVALID_DATA // 无效数据\r
- };\r
- // 控制心率检测\r
- typedef struct\r
- {\r
- uint32_t heartRatePerSec;\r
- Point heartRateAvg[HEART_AVE_NUM];\r
- uint32_t heartRateRest;\r
- Point heartRateMax;\r
- Point heartRateMin;\r
- } HealthAllDatas;\r
-\r
- class HeartModel\r
- {\r
- public:\r
- HeartModel();\r
- ~HeartModel();\r
- static HeartModel *GetInstance(void);\r
- void ObtainingHeartRateData(void);\r
- void PushHealthDatas(HealthMsg healthMsg);\r
- Point *GetAveHeartRate(void);\r
- uint16_t GetAveHeartRateCount(void);\r
- void SetAveHeartRateCount(uint16_t value);\r
- Point *GetMaximumHeartRate(void);\r
- void Init(void);\r
- void HeartRatePros(HeartDatas *heartInfo);\r
- void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate);\r
- void ClearHeartData(void);\r
- void HandleMaxHeart(uint16_t coord, uint16_t value);\r
- void HandleMinHeart(uint16_t coord, uint16_t value);\r
- void SetHeartRatePerSec(uint32_t sec);\r
- uint16_t GetHeartRateMax(void);\r
- uint16_t GetHeartRateMin(void);\r
- /* -------------------------------------------------------------------------- */\r
- void UpHeartdata(uint16_t heart);\r
- uint16_t GetHeartdata();\r
- uint16_t GetShowHeartdata();\r
- uint16_t GetShowMaxHeartdata();\r
- uint16_t GetShowMinHeartdata();\r
-\r
- uint16_t GetIndex();\r
- void SetIndex(uint16_t index);\r
-\r
- uint32_t GetCheckTime(void);\r
- void SetCheckTime(uint32_t time);\r
- void SetWearStatus(int32_t wear);\r
- void SetResult(HeartResult result);\r
- HeartResult GetResult();\r
-\r
- void Heart_Start(void);\r
- void Heart_Stop(void);\r
- void Heart_Save(void);\r
- void Heart_Result(void);\r
-\r
- void Heart_Control(HeartState state, HeartCheck check);\r
- void ClearDisplayData();\r
- void Heart_Update_View(void);\r
- void CleanAllData(void);\r
-\r
- private:\r
- HealthAllDatas healthDatas;\r
- uint16_t pretime{0};\r
- uint16_t entryTimes{0};\r
- uint16_t aveCount{0};\r
- uint16_t preMaxValue{0};\r
- uint16_t preMaxX{NUM_1};\r
- uint16_t preMinValue{HEART_RATE_LIMIT_UPPER};\r
- uint16_t preMinX{NUM_1};\r
- uint16_t countMax{0};\r
- uint16_t countMin{0};\r
- bool wearStatus{true};\r
- uint16_t index_ = 0;\r
-\r
- uint16_t displayheart; // 显示心率\r
- uint16_t currentheart; // 保存心率\r
- uint16_t displayheart_max; // 显示最大心率\r
- uint16_t displayheart_min; // 显示最小心率\r
-\r
- uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
-\r
- bool initstatus = true;\r
- bool heartstate = false;\r
- bool sensorstate{false};\r
-\r
- uint16_t wear_;\r
- uint16_t valid_counter_ = 0; // 有效数计数器\r
- uint16_t disvalid_counter_ = 0; // 无效数计数器\r
- uint16_t unwear_counter_ = 0; // 佩戴错误计数器\r
-\r
- HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
- HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
- };\r
- }\r
+// 心率检测状态\r
+enum class HeartState {\r
+ End = 0,\r
+ Start,\r
+};\r
+enum class HeartCheck {\r
+ RESTSTSTE = 0, // 未检测状态\r
+ PASSIVITY, // 被动检测心率\r
+ CARDCHECK, // 卡片检测\r
+ INITIATIVE, // 主动检测心率\r
+ EXERCISE, // 运动心率\r
+};\r
+enum class HeartResult {\r
+ NOT_TESTED = 0, // 未检测\r
+ SUCCESS, // 检测成功\r
+ NOT_WORN, // 未佩戴检测\r
+ TIMEOUT, // 检测超时\r
+ HIGH_RESULT, // 检测结果过高\r
+ LOW_RESULT, // 检测结果过低\r
+ INVALID_DATA // 无效数据\r
+};\r
+// 控制心率检测\r
+typedef struct {\r
+ uint32_t heartRatePerSec;\r
+ Point heartRateAvg[HEART_AVE_NUM];\r
+ uint32_t heartRateRest;\r
+ Point heartRateMax;\r
+ Point heartRateMin;\r
+} HealthAllDatas;\r
+\r
+class HeartModel {\r
+public:\r
+ HeartModel();\r
+ ~HeartModel();\r
+ static HeartModel *GetInstance(void);\r
+ void ObtainingHeartRateData(void);\r
+ void PushHealthDatas(HealthMsg healthMsg);\r
+ Point *GetAveHeartRate(void);\r
+ uint16_t GetAveHeartRateCount(void);\r
+ void SetAveHeartRateCount(uint16_t value);\r
+ Point *GetMaximumHeartRate(void);\r
+ void Init(void);\r
+ void HeartRatePros(HeartDatas *heartInfo);\r
+ void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate,\r
+ uint16_t minRate);\r
+ void ClearHeartData(void);\r
+ void HandleMaxHeart(uint16_t coord, uint16_t value);\r
+ void HandleMinHeart(uint16_t coord, uint16_t value);\r
+ void SetHeartRatePerSec(uint32_t sec);\r
+ uint16_t GetHeartRateMax(void);\r
+ uint16_t GetHeartRateMin(void);\r
+ /* --------------------------------------------------------------------------\r
+ */\r
+ void UpHeartdata(uint16_t heart);\r
+ uint16_t GetHeartdata();\r
+ uint16_t GetShowHeartdata();\r
+ uint16_t GetShowMaxHeartdata();\r
+ uint16_t GetShowMinHeartdata();\r
+\r
+ uint16_t GetIndex();\r
+ void SetIndex(uint16_t index);\r
+\r
+ uint32_t GetCheckTime(void);\r
+ void SetCheckTime(uint32_t time);\r
+ void SetWearStatus(int32_t wear);\r
+ void SetResult(HeartResult result);\r
+ HeartResult GetResult();\r
+\r
+ void Heart_Start(void);\r
+ void Heart_Stop(void);\r
+ void Heart_Save(void);\r
+ void Heart_Result(void);\r
+\r
+ void Heart_Control(HeartState state, HeartCheck check);\r
+ void ClearDisplayData();\r
+ void Heart_Update_View(void);\r
+ void CleanAllData(void);\r
+\r
+ std::string GetCheckString();\r
+ uint16_t *GetArrayData();\r
+ void SetArrayData();\r
+\r
+private:\r
+ HealthAllDatas healthDatas;\r
+ uint16_t pretime{0};\r
+ uint16_t entryTimes{0};\r
+ uint16_t aveCount{0};\r
+ uint16_t preMaxValue{0};\r
+ uint16_t preMaxX{NUM_1};\r
+ uint16_t preMinValue{HEART_RATE_LIMIT_UPPER};\r
+ uint16_t preMinX{NUM_1};\r
+ uint16_t countMax{0};\r
+ uint16_t countMin{0};\r
+ bool wearStatus{true};\r
+ uint16_t index_ = 0;\r
+\r
+ uint16_t displayheart; // 显示心率\r
+ uint16_t currentheart; // 保存心率\r
+ uint16_t displayheart_max; // 显示最大心率\r
+ uint16_t displayheart_min; // 显示最小心率\r
+\r
+ uint32\r
+ timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+\r
+ bool initstatus = true;\r
+ bool heartstate = false;\r
+ bool sensorstate{false};\r
+\r
+ uint16_t wear_;\r
+ uint16_t valid_counter_ = 0; // 有效数计数器\r
+ uint16_t disvalid_counter_ = 0; // 无效数计数器\r
+ uint16_t unwear_counter_ = 0; // 佩戴错误计数器\r
+\r
+ HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果\r
+ HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
+\r
+ uint16_t dynamic_heartrate[5]; //动态心率配置项\r
+};\r
+} // namespace OHOS\r
\r
#ifdef __cplusplus\r
}\r
--- /dev/null
+#ifndef HEART_RATECARD_VIEW_H
+#define HEART_RATECARD_VIEW_H
+
+#include "components/root_view.h"
+#include "components/ui_card_page.h"
+#include "heartrate/include/HeartChartView.h"
+#include "wearable_log.h"
+namespace OHOS {
+
+class HeartRateCardView : public UICardPage {
+public:
+ HeartRateCardView();
+ virtual ~HeartRateCardView();
+ static HeartRateCardView *GetInstance(void);
+
+ bool InitView(void);
+ void PreLoad(void) override;
+ void UnLoad(void) override;
+ UIViewGroup *GetHeartRateCardView();
+
+private:
+ HeartChartView *heartRateCardView{nullptr};
+ UIViewGroup *heartRateGroupView{nullptr};
+ void ClearAll(void);
+ bool viewiInitStatus{false};
+};
+
+} // namespace OHOS
+#endif
\ No newline at end of file
* @Date: 2024-08-15 18:39:02
* @LastEditors: Caisking 3449750381@qq.com
* @LastEditTime: 2024-09-05 14:36:17
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartChartView.cpp
*/
/***
* @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
+ * @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 "UiConfig.h"
+#include "heart_blood/health_service/health_service.h"
+#include "power_display_service.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);
- */
-
- delete CurrentHeartText;
- CurrentHeartText = nullptr;
- delete MaxHeartText;
- MaxHeartText = nullptr;
- delete MinHeartText;
- MinHeartText = nullptr;
- delete UHeartText;
- UHeartText = nullptr;
- delete RestHeartText;
- RestHeartText = nullptr;
- delete TopimageView;
- TopimageView = nullptr;
- delete BottomimageView;
- BottomimageView = nullptr;
- delete CoordinateimageView;
- CoordinateimageView = nullptr;
- delete HeartIconView;
- HeartIconView = nullptr;
- delete imageAnimator;
- imageAnimator = nullptr;
-
- heartchart->ClearDataSerial();
- delete heartSerial;
- heartSerial = nullptr;
- delete heartchart;
- heartchart = nullptr;
-
- g_pHeartCheckView = this;
- }
- HeartChartView *HeartChartView::GetInstance(void)
- {
- return g_pHeartCheckView;
- }
-
- /* 更新显示数据 */
- void HeartChartView::UpdateShowHeart()
- {
- // 获取当前心率
- uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
- std::string heartrateStr = (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_));
-
- // 更新当前心率显示
- if (CurrentHeartText != nullptr)
- {
- CurrentHeartText->SetText(heartrateStr.c_str());
- }
-
- // 获取最大心率
- uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
- std::string heartmaxStr = (heartmax_ == 0) ? "--" : (heartmax_ < 50 ? "--" : std::to_string(heartmax_));
-
- // 更新最大心率显示
- if (MaxHeartText != nullptr)
- {
- MaxHeartText->SetText(heartmaxStr.c_str());
- }
-
- // 获取最小心率
- uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
- std::string heartminStr = (heartmin_ == 0) ? "--" : (heartmin_ < 50 ? "--" : std::to_string(heartmin_));
-
- // 更新最小心率显示
- if (MinHeartText != nullptr)
- {
- MinHeartText->SetText(heartminStr.c_str());
- }
- }
- void HeartChartView::Update_data_Chart(int serialIndex)
- {
- if (heartchart == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);
- return;
- }
- /*清除原数据*/
- heartSerial->ClearData();
-
- /*设置单个项*/
- heartdata[serialIndex].x = serialIndex;
- heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
-
- /*重新添加*/
- heartSerial->AddPoints(heartdata, 24);
- heartSerial->SetLineColor(Color::Red());
- heartSerial->SetFillColor(Color::Red());
- heartSerial->EnableGradient(true);
-
- heartchart->AddDataSerial(heartSerial);
- heartchart->Invalidate();
- }
- void HeartChartView::CleanAllDataView()
- {
- if (heartchart == nullptr || MaxHeartText == nullptr || MinHeartText == nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail");
- return;
- }
- for (int serialIndex = 0; serialIndex < 24; serialIndex++)
- {
- heartdata[serialIndex].x = serialIndex;
- heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
- }
-
- /*清空原数据*/
- heartSerial->ClearData();
- heartSerial->AddPoints(heartdata, 24);
- heartSerial->SetLineColor(Color::Red());
- heartSerial->SetFillColor(Color::Red());
- heartSerial->EnableGradient(true);
-
- heartchart->AddDataSerial(heartSerial);
- // heartchart->RefreshChart();
-
- /*更新最大最小值*/
- SetDataTopAndBottom();
- }
- /*设置最大最小数据*/
- 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);
+#include "wearable_log.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 = 54;
+static constexpr int HEARTBEAT_IMAGE_HEIGHT = 50;
+static constexpr int HEARTBEAT_IMAGE_X = 111;
+static constexpr int HEARTBEAT_IMAGE_Y = 57;
+static constexpr int HEARTBEAT_IMAGE_NUM = 21;
+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},
+ {PNG_A004_089_IMAGE_PATH,
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},
+ HEARTBEAT_IMAGE_WIDTH,
+ HEARTBEAT_IMAGE_HEIGHT,
+ IMG_SRC_FILE_PATH},
+ {PNG_A004_090_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");
+
+ /*
+ UIViewGroup *tmpGroup = dynamic_cast<UIViewGroup *>(container_);
+ UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup);
+ */
+
+ delete displayheart_;
+ displayheart_ = nullptr;
+ delete maxheart_;
+ maxheart_ = nullptr;
+ delete minheart_;
+ minheart_ = nullptr;
+ delete uheart_;
+ uheart_ = nullptr;
+ delete lastheart_;
+ lastheart_ = nullptr;
+ delete maxheart_dynamic_;
+ maxheart_dynamic_ = nullptr;
+ delete maxheart_dynamic_3_;
+ maxheart_dynamic_3_ = nullptr;
+ delete maxheart_dynamic_2_;
+ maxheart_dynamic_2_ = nullptr;
+ delete maxheart_dynamic_1_;
+ maxheart_dynamic_1_ = nullptr;
+ delete minheart_dynamic_;
+ minheart_dynamic_ = nullptr;
+
+ delete maxRateIconView_;
+ maxRateIconView_ = nullptr;
+ delete minRateIconView_;
+ minRateIconView_ = nullptr;
+ delete chartBackgroundView_;
+ chartBackgroundView_ = nullptr;
+ delete heartIconView_;
+ heartIconView_ = nullptr;
+
+ // imageAnimator->Stop();
+ // delete imageAnimator;
+ // imageAnimator = nullptr;
+
+ heartchart->ClearDataSerial();
+ delete heartSerial;
+ heartSerial = nullptr;
+ delete heartchart;
+ heartchart = nullptr;
+
+ g_pHeartCheckView = this;
+}
+HeartChartView *HeartChartView::GetInstance(void) { return g_pHeartCheckView; }
+
+/* 更新显示数据 */
+void HeartChartView::UpdateShowHeart() {
+ // 获取当前心率
+ uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
+ std::string heartrateStr =
+ (heart_ == 0) ? "--" : (heart_ < 50 ? "--" : std::to_string(heart_));
+
+ // 更新当前心率显示
+ if (displayheart_ != nullptr) {
+ displayheart_->SetText(heartrateStr.c_str());
+ }
+
+ // 获取最大心率
+ uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
+ std::string heartmaxStr =
+ (heartmax_ == 0) ? "--"
+ : (heartmax_ < 50 ? "--" : std::to_string(heartmax_));
+
+ // 更新最大心率显示
+ if (maxheart_ != nullptr) {
+ maxheart_->SetText(heartmaxStr.c_str());
+ }
+
+ // 获取最小心率
+ uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
+ std::string heartminStr =
+ (heartmin_ == 0) ? "--"
+ : (heartmin_ < 50 ? "--" : std::to_string(heartmin_));
+
+ // 更新最小心率显示
+ if (minheart_ != nullptr) {
+ minheart_->SetText(heartminStr.c_str());
+ }
+}
+void HeartChartView::Update_data_Chart(int serialIndex) {
+ if (heartchart == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d",
+ serialIndex);
+ return;
+ }
+ /*清除原数据*/
+ heartSerial->ClearData();
+
+ /*设置单个项*/
+ heartdata[serialIndex].x = serialIndex;
+ heartdata[serialIndex].y =
+ HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+
+ /*重新添加*/
+ heartSerial->AddPoints(heartdata, 24);
+ heartSerial->SetLineColor(Color::Red());
+ heartSerial->SetFillColor(Color::Red());
+ heartSerial->EnableGradient(true);
+
+ heartchart->AddDataSerial(heartSerial);
+ heartchart->Invalidate();
+
+ //更新为刚刚检测
+ SetLastHeart();
+}
+void HeartChartView::CleanAllDataView() {
+ if (heartchart == nullptr || maxheart_ == nullptr || minheart_ == nullptr) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " CleanAllDataView fail");
+ return;
+ }
+ for (int serialIndex = 0; serialIndex < 24; serialIndex++) {
+ heartdata[serialIndex].x = serialIndex;
+ heartdata[serialIndex].y =
+ HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+ }
+
+ /*清空原数据*/
+ heartSerial->ClearData();
+ heartSerial->AddPoints(heartdata, 24);
+ heartSerial->SetLineColor(Color::Red());
+ heartSerial->SetFillColor(Color::Red());
+ heartSerial->EnableGradient(true);
+
+ heartchart->AddDataSerial(heartSerial);
+ // heartchart->RefreshChart();
+
+ /*更新最大最小值*/
+ SetDataTopAndBottom();
+}
+/*设置最大最小数据*/
+void HeartChartView::SetDataTopAndBottom() {
+ int MaxHeart = HeartModel::GetInstance()->GetHeartRateMax();
+ int MinHeart = HeartModel::GetInstance()->GetHeartRateMin();
+
+ if (maxheart_ != nullptr) {
+ maxheart_->SetText(MaxHeart > 0 ? (std::to_string(MaxHeart)).c_str()
+ : "--");
+ }
+
+ if (minheart_ != nullptr) {
+ minheart_->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);
+ 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);
- }
+ 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(80, 199);
+ heartchart->Resize(313, 122);
+ heartchart->SetViewId("uiChart1");
+ heartchart->SetStyle(STYLE_BACKGROUND_OPA, 0x00);
+
+ UIXAxis &heartXAxis = heartchart->GetXAxis();
+ heartXAxis.SetMarkNum(24);
+ heartXAxis.SetDataRange(0, 24);
+ heartXAxis.SetLineColor(Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+
+ UIYAxis &heartYAxis = heartchart->GetYAxis();
+ heartYAxis.SetMarkNum(4);
+ heartYAxis.SetDataRange(0, 220);
+ heartYAxis.SetLineColor(Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+
+ heartchart->SetGradientOpacity(78, 64);
+
+ // Add to rootView
+ container_->Add(heartchart);
+}
+
+//初始化label
+/*
+需要显示一个动态心率的效果
+有5个label代表 曲线图的y轴
+ 最大心率+10
+ 最大心率+10-(最小心率-10)*3/4
+ 最大心率+10-(最小心率-10)*2/4
+ 最大心率+10-(最小心率-10)*1/4
+ 最小心率-10
+*/
+void HeartChartView::InitChartLabel() {
+ //当前心率值
+ InitLabel(displayheart_, 133, 32, 200, 100, "label", "--", GILROY_BOLD_FONT,
+ 65);
+ // 单位
+ InitRollLabel(uheart_, 283, 52, 100, 60, "label", STR_TIMES_PER_MIN,
+ DEFAULT_VECTOR_FONT_FILENAME, 30);
+ uheart_->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));
+ //上一次检测信息
+ InitLabel(lastheart_, 53, 130, 360, 35, "label", "--",
+ DEFAULT_VECTOR_FONT_FILENAME, 30);
+ //最小心率 不居中
+ InitLabelAdapt(minheart_, 293, 380, 200, 35, "label", "--",
+ DEFAULT_VECTOR_FONT_FILENAME, 35);
+ //最大心率 不居中
+ InitLabelAdapt(maxheart_, 158, 380, 200, 35, "label", "--",
+ DEFAULT_VECTOR_FONT_FILENAME, 35);
+
+ //动态心率最大
+ InitLabel(maxheart_dynamic_, 30, 190, 50, 20, "label", "220",
+ DEFAULT_VECTOR_FONT_FILENAME, 20);
+ maxheart_dynamic_->SetTextColor(
+ Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+ //动态心率3/4
+ InitLabel(maxheart_dynamic_3_, 30, 218, 50, 20, "label", "160",
+ DEFAULT_VECTOR_FONT_FILENAME, 20);
+ maxheart_dynamic_3_->SetTextColor(
+ Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+ //动态心率2/4
+ InitLabel(maxheart_dynamic_2_, 30, 247, 50, 20, "label", "100",
+ DEFAULT_VECTOR_FONT_FILENAME, 20);
+ maxheart_dynamic_2_->SetTextColor(
+ Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+ //动态心率1/4
+ InitLabel(maxheart_dynamic_1_, 30, 277, 50, 20, "label", "40",
+ DEFAULT_VECTOR_FONT_FILENAME, 20);
+ maxheart_dynamic_1_->SetTextColor(
+ Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+ //动态心率最小
+ InitLabel(minheart_dynamic_, 30, 306, 50, 20, "label", "0",
+ DEFAULT_VECTOR_FONT_FILENAME, 20);
+ minheart_dynamic_->SetTextColor(
+ Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+
+ container_->Add(displayheart_);
+ container_->Add(uheart_);
+ container_->Add(lastheart_);
+ container_->Add(minheart_);
+ container_->Add(maxheart_);
+ container_->Add(maxheart_dynamic_);
+ container_->Add(maxheart_dynamic_3_);
+ container_->Add(maxheart_dynamic_2_);
+ container_->Add(maxheart_dynamic_1_);
+ container_->Add(minheart_dynamic_);
+}
+
+void HeartChartView::InitChartImageView() {
+
+ if (minRateIconView_ == nullptr) {
+ minRateIconView_ = new UIImageView();
+ }
+ minRateIconView_->SetPosition(266, 394);
+ minRateIconView_->Resize(100, 100);
+ minRateIconView_->SetViewId("minRateIcon");
+ minRateIconView_->SetSrc(BUTTOM_ICON_PATH);
+ if (maxRateIconView_ == nullptr) {
+ maxRateIconView_ = new UIImageView();
+ }
+ maxRateIconView_->SetPosition(129, 394);
+ maxRateIconView_->Resize(100, 100);
+ maxRateIconView_->SetViewId("maxRateIcon");
+ maxRateIconView_->SetSrc(TOP_ICON_PATH);
+
+ if (chartBackgroundView_ == nullptr) {
+ chartBackgroundView_ = new UIImageView();
+ }
+ chartBackgroundView_->SetPosition(30, 160);
+ chartBackgroundView_->Resize(100, 100);
+ chartBackgroundView_->SetViewId("chartBackground");
+ chartBackgroundView_->SetSrc(BACKGROUND_IMAGE_PATH);
+
+ container_->Add(chartBackgroundView_);
+ container_->Add(minRateIconView_);
+ container_->Add(maxRateIconView_);
+
+ if (heartIconView_ == nullptr) {
+ heartIconView_ = new UIImageView();
+ }
+ heartIconView_->SetPosition(111, 57);
+ heartIconView_->Resize(100, 100);
+ heartIconView_->SetViewId("heartIcon");
+ heartIconView_->SetSrc(HEART_ICON_PATH);
+
+ container_->Add(heartIconView_);
+ heartIconView_->SetVisible(true);
+#if 0
+ if (lineView_ == nullptr) {
+ lineView_ = new UIImageView();
+ }
+ lineView_->SetPosition(230, 385);
+ lineView_->Resize(1, 26);
+ lineView_->SetViewId("lineView");
+ lineView_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff666666);
+ lineView_->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+
+ container_->Add(lineView_);
+ lineView_->SetVisible(true);
#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(25, 180);
- // heartchart->SetGradientOpacity(255, 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);
- InitRollLabel(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;
- }
}
+
+//更新图表配置
+void HeartChartView::UpdateChartConfig() {
+ if (minheart_dynamic_ == nullptr || maxheart_dynamic_1_ == nullptr ||
+ maxheart_dynamic_2_ == nullptr || maxheart_dynamic_3_ == nullptr ||
+ heartchart == nullptr) {
+ return;
+ }
+
+ // 获取动态心率数据
+ HeartModel::GetInstance()->SetArrayData();
+ uint16_t *dynamicArray = HeartModel::GetInstance()->GetArrayData();
+
+ //更新label
+ if (dynamicArray) {
+ minheart_dynamic_->SetText(std::to_string(dynamicArray[0]).c_str());
+ maxheart_dynamic_1_->SetText(std::to_string(dynamicArray[1]).c_str());
+ maxheart_dynamic_2_->SetText(std::to_string(dynamicArray[2]).c_str());
+ maxheart_dynamic_3_->SetText(std::to_string(dynamicArray[3]).c_str());
+ maxheart_dynamic_->SetText(std::to_string(dynamicArray[4]).c_str());
+ }
+ //更新chart
+ UIYAxis &heartYAxis = heartchart->GetYAxis();
+ heartYAxis.SetMarkNum(4);
+ heartYAxis.SetDataRange(dynamicArray[0], dynamicArray[4]);
+ heartYAxis.SetLineColor(Color::GetColorFromRGBA(0x33, 0x33, 0x33, 0xff));
+ heartchart->Invalidate();
+}
+//更新上一次检测信息
+void HeartChartView::SetLastHeart() {
+ if (lastheart_ == nullptr)
+ return;
+ std::string lastStr = HeartModel::GetInstance()->GetCheckString();
+ lastheart_->SetText(lastStr.c_str());
+}
+/*初始化检测界面*/
+bool HeartChartView::HeartViewInit() {
+
+ //图片
+ InitChartImageView();
+ //标签
+ InitChartLabel();
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartChartViewInit is ok");
+ return true;
+}
+UIViewGroup *HeartChartView::GetchartGroup() {
+ 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();
+ UpdateChartConfig();
+ SetDataChart();
+ SetLastHeart();
+ SetDataTopAndBottom();
+ return container_;
+}
+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();
+ UpdateChartConfig();
+ SetDataChart();
+ SetLastHeart();
+ 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;
+}
+} // namespace OHOS
#include "heartrate/include/HeartModel.h"\r
-#include "wearable_log.h"\r
-#include "graphic_service.h"\r
#include "IndoorWalkPreparedView.h"\r
#include "IndoorWalkPresenter.h"\r
#include "MainViewSample.h"\r
+#include "graphic_service.h"\r
+#include "wearable_log.h"\r
\r
-#include "heartrate/include/HeartRateView.h"\r
+#include "DialModelHeartRate.h"\r
+#include "heartrate/include/HeartChartView.h"\r
#include "heartrate/include/HeartDetectionPresenter.h"\r
+#include "heartrate/include/HeartRateView.h"\r
#include "heartrate/include/HeartResultPresenter.h"\r
-#include "heartrate/include/HeartChartView.h"\r
-#include "DialModelHeartRate.h"\r
\r
-#include <iostream>\r
-#include <random>\r
#include "DialModelHeartRate.h"\r
-#include "health_service.h"\r
+#include "custom_runtime.h"\r
#include "custom_utils.h"\r
+#include "health_service.h"\r
#include "ppg_service.h"\r
-#include "custom_runtime.h"\r
+#include <algorithm>\r
#include <iostream>\r
#include <memory>\r
-#include <algorithm>\r
+#include <random>\r
\r
-#include "ui_service.h"\r
#include "battery_hal.h"\r
+#include "ui_service.h"\r
\r
#ifdef __cplusplus\r
-extern "C"\r
-{\r
+extern "C" {\r
#endif\r
\r
#define MAX_UNWEAR_COUNT 30\r
#define MIN_DISPLAY_HEART 60\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
\r
- /* 佩戴检测结果 */\r
- enum\r
- {\r
- SENSOR_WEAR_ON = 0,\r
- SENSOR_WEAR_OFF,\r
- SENSOR_WEAR_UNKNOW,\r
- SENSOR_WEAR_MAX\r
- };\r
+/* 佩戴检测结果 */\r
+enum {\r
+ SENSOR_WEAR_ON = 0,\r
+ SENSOR_WEAR_OFF,\r
+ SENSOR_WEAR_UNKNOW,\r
+ SENSOR_WEAR_MAX\r
+};\r
\r
- using namespace OHOS;\r
+using namespace OHOS;\r
#define LEN 32\r
\r
- static void Notify(void *args, const Topic topic, Request *request);\r
-\r
- Subscriber heartSubscirber = {\r
- .identity = nullptr,\r
- .args = nullptr,\r
- .Notify = Notify,\r
- };\r
- static void ProcessHeartRateUpdate(Request *request);\r
- static void RefreshHeartData();\r
- void HeartDataSubscribeTopic(Topic topic)\r
- {\r
- BroadcastApi *broadcastApi = nullptr;\r
- IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
- if (api == nullptr)\r
- {\r
- return;\r
- }\r
- int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
- if (result != 0 || broadcastApi == nullptr)\r
- {\r
- return;\r
- }\r
- int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret = %d, topic = %u", ret, topic);\r
- broadcastApi->Release((IUnknown *)broadcastApi);\r
- }\r
-\r
- void HearDatatUnsubscribeTopic(Topic topic)\r
- {\r
- BroadcastApi *broadcastApi = nullptr;\r
- IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);\r
- if (api == nullptr)\r
- {\r
- return;\r
- }\r
- int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
- if (result != 0 || broadcastApi == nullptr)\r
- {\r
- return;\r
- }\r
- broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber);\r
- broadcastApi->Release((IUnknown *)broadcastApi);\r
- }\r
+static void Notify(void *args, const Topic topic, Request *request);\r
+\r
+Subscriber heartSubscirber = {\r
+ .identity = nullptr,\r
+ .args = nullptr,\r
+ .Notify = Notify,\r
+};\r
+static void ProcessHeartRateUpdate(Request *request);\r
+static void RefreshHeartData();\r
+void HeartDataSubscribeTopic(Topic topic) {\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,\r
+ BROADCAST_FEATURE_NAME);\r
+ if (api == nullptr) {\r
+ return;\r
+ }\r
+ int result =\r
+ api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (result != 0 || broadcastApi == nullptr) {\r
+ return;\r
+ }\r
+ int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic,\r
+ &heartSubscirber);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+ "HeartSubscribeTopic ret = %d, topic = %u", ret, topic);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+}\r
\r
- static void Notify(void *args, const Topic topic, Request *request)\r
- {\r
- UNUSED(args);\r
- UNUSED(topic);\r
+void HearDatatUnsubscribeTopic(Topic topic) {\r
+ BroadcastApi *broadcastApi = nullptr;\r
+ IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,\r
+ BROADCAST_FEATURE_NAME);\r
+ if (api == nullptr) {\r
+ return;\r
+ }\r
+ int result =\r
+ api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);\r
+ if (result != 0 || broadcastApi == nullptr) {\r
+ return;\r
+ }\r
+ broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic,\r
+ &heartSubscirber);\r
+ broadcastApi->Release((IUnknown *)broadcastApi);\r
+}\r
\r
- // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
- if (uapi_dev_runtime_get_train_status() == 1 || request == NULL)\r
- {\r
- return;\r
- }\r
+static void Notify(void *args, const Topic topic, Request *request) {\r
+ UNUSED(args);\r
+ UNUSED(topic);\r
\r
- switch (request->msgId)\r
- {\r
- case TOPIC_EVENT_HEARTRATE_UPDATA:\r
- // ProcessHeartRateUpdate(request);\r
- break;\r
+ // 训练过程中不需要判断数据准确性,不需要存储心率数据\r
+ if (uapi_dev_runtime_get_train_status() == 1 || request == NULL) {\r
+ return;\r
+ }\r
\r
- case TOPIC_EVENT_NEXTDAY_UPDATE:\r
- case TOPIC_EVENT_UTCTIME_UPDATE:\r
- RefreshHeartData();\r
- break;\r
+ switch (request->msgId) {\r
+ case TOPIC_EVENT_HEARTRATE_UPDATA:\r
+ // ProcessHeartRateUpdate(request);\r
+ break;\r
\r
- case TOPIC_EVENT_WEARSTATE_UPDATE:\r
- break;\r
+ case TOPIC_EVENT_NEXTDAY_UPDATE:\r
+ case TOPIC_EVENT_UTCTIME_UPDATE:\r
+ RefreshHeartData();\r
+ break;\r
\r
- default:\r
- break;\r
- }\r
- }\r
+ case TOPIC_EVENT_WEARSTATE_UPDATE:\r
+ break;\r
\r
- static void ProcessHeartRateUpdate(Request *request)\r
- {\r
- uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
-\r
- // 直接处理心率数据,不进行筛选\r
- uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
- HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
- if (heartInfo == NULL)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
- return;\r
- }\r
+ default:\r
+ break;\r
+ }\r
+}\r
\r
- heartInfo->index = index_;\r
- heartInfo->maxX = index_;\r
- heartInfo->minX = index_;\r
- heartInfo->perSec = preheart;\r
- heartInfo->rest = preheart;\r
- /*最大最小值不为0*/\r
- heartInfo->maxValue = preheart;\r
- heartInfo->minValue = preheart;\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart);\r
- OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
-\r
- free(heartInfo); // 释放内存\r
- heartInfo = nullptr;\r
- }\r
+static void ProcessHeartRateUpdate(Request *request) {\r
+ uint16_t preheart = *reinterpret_cast<uint16_t *>(request->data);\r
+\r
+ // 直接处理心率数据,不进行筛选\r
+ uint16_t index_ = HeartModel::GetInstance()->GetIndex();\r
+ HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas));\r
+ if (heartInfo == NULL) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail");\r
+ return;\r
+ }\r
+\r
+ heartInfo->index = index_;\r
+ heartInfo->maxX = index_;\r
+ heartInfo->minX = index_;\r
+ heartInfo->perSec = preheart;\r
+ heartInfo->rest = preheart;\r
+ /*最大最小值不为0*/\r
+ heartInfo->maxValue = preheart;\r
+ heartInfo->minValue = preheart;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d",\r
+ heartInfo->index, preheart);\r
+ OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo);\r
+\r
+ free(heartInfo); // 释放内存\r
+ heartInfo = nullptr;\r
+}\r
\r
- static void RefreshHeartData()\r
- {\r
- OHOS::HeartModel::GetInstance()->ClearHeartData();\r
- GraphicService::GetInstance()->PostGraphicEvent(\r
- std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
- }\r
+static void RefreshHeartData() {\r
+ OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(\r
+ &OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
+}\r
\r
#ifdef __cplusplus\r
}\r
#endif\r
\r
-namespace OHOS\r
-{\r
- void HeartModel::ClearHeartData(void)\r
- {\r
- pretime = 0;\r
- entryTimes = 0;\r
- aveCount = 0;\r
- preMaxValue = 0;\r
- preMaxX = NUM_1;\r
- preMinValue = HEART_RATE_LIMIT_UPPER;\r
- preMinX = NUM_1;\r
- countMax = 0;\r
- countMin = 0;\r
- healthDatas.heartRateMax.x = (uint16_t)0XFFFF;\r
- healthDatas.heartRateMax.y = 0;\r
- healthDatas.heartRateMin.x = (uint16_t)0XFFFF;\r
- healthDatas.heartRateMin.y = (uint16_t)0XFFFF;\r
- for (int i = 0; i < HEART_AVE_NUM; i++)\r
- {\r
- healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF;\r
- healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF;\r
- }\r
- if (HeartRateView::GetInstance() != nullptr)\r
- {\r
- HeartRateView::GetInstance()->ClearElectrocardiogram();\r
- }\r
- SetAveHeartRateCount(0);\r
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
- healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
- }\r
-\r
- HeartModel::HeartModel()\r
- {\r
- /*初始化读取文件*/\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
- HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
- /*初始化历史文件*/\r
- HealthService::GetInstance()->LoadDailyHeartRate();\r
- if (data != nullptr)\r
- {\r
- currentheart = data->Heart;\r
- timestamp_ms = data->timestamp;\r
- // 更新表盘心率数据\r
- DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart);\r
- delete data;\r
- }\r
- else\r
- {\r
- currentheart = 0;\r
- timestamp_ms = 0;\r
- }\r
- }\r
-\r
- HeartModel::~HeartModel()\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()");\r
- HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
- HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
- HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
- HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
- }\r
-\r
- HeartModel *HeartModel::GetInstance(void)\r
- {\r
- static HeartModel heartModel;\r
- return &heartModel;\r
- }\r
- uint16_t HeartModel::GetIndex()\r
- {\r
- return index_;\r
- }\r
- void HeartModel::SetIndex(uint16_t index)\r
- {\r
- index_ = index;\r
- }\r
-\r
- void HeartModel::Init(void)\r
- {\r
- HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
- HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
- HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
- HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
- }\r
-\r
- Point *HeartModel::GetAveHeartRate(void)\r
- {\r
- return healthDatas.heartRateAvg;\r
- }\r
-\r
- void HeartModel::HandleMaxHeart(uint16 coord, uint16 value)\r
- {\r
- healthDatas.heartRateMax.x = coord;\r
- healthDatas.heartRateMax.y = value;\r
- // 插入最大心率 countMax 数据个数\r
- if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM)\r
- {\r
- if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM)\r
- {\r
- healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y;\r
- }\r
- else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x == healthDatas.heartRateAvg[aveCount - 1].x))\r
- {\r
- healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y;\r
- }\r
- else\r
- {\r
- healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax;\r
- countMax = aveCount;\r
- aveCount++;\r
- }\r
- if (healthDatas.heartRateMax.x != 0)\r
- {\r
- if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0)\r
- {\r
- for (int i = 1; i < (aveCount - 1); i++)\r
- {\r
- healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
- }\r
- aveCount--;\r
- countMax--;\r
- }\r
- }\r
- }\r
- preMaxValue = healthDatas.heartRateMax.y;\r
- preMaxX = healthDatas.heartRateMax.x;\r
- }\r
-\r
- void HeartModel::HandleMinHeart(uint16 coord, uint16 value)\r
- {\r
- // 最小心率\r
- healthDatas.heartRateMin.x = coord;\r
- healthDatas.heartRateMin.y = value;\r
- // 插入最小心率\r
- // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题???\r
- // preMinValue 上一个心率最小值\r
- // preMinX 上一个最小值对应的坐标\r
- // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理\r
- if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM)\r
- {\r
-\r
- if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM)\r
- {\r
- // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据 countMin 即可\r
- healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y;\r
- }\r
- else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x == healthDatas.heartRateAvg[aveCount - 1].x))\r
- {\r
- // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值\r
- healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y;\r
- }\r
- else\r
- {\r
- healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin;\r
- countMin = aveCount;\r
- aveCount++;\r
- }\r
-\r
- // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。\r
- if (healthDatas.heartRateMin.x != 0)\r
- {\r
- if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0)\r
- {\r
- for (int i = 0; i < (aveCount - 1); i++)\r
- {\r
- healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
- }\r
- aveCount--;\r
- countMin--;\r
- }\r
- }\r
- }\r
- preMinValue = healthDatas.heartRateMin.y;\r
- preMinX = healthDatas.heartRateMin.x;\r
- }\r
-\r
- void HeartModel::HeartRatePros(HeartDatas *heartInfo)\r
- {\r
- uint16_t perSecHeartRate = 0;\r
- uint16_t restHeartRate = 0;\r
-\r
- // 每秒心率\r
- perSecHeartRate = heartInfo->perSec;\r
- if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER)\r
- {\r
- healthDatas.heartRatePerSec = perSecHeartRate;\r
- }\r
-\r
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
- healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
- }\r
-\r
- uint16_t HeartModel::GetAveHeartRateCount(void)\r
- {\r
- return aveCount;\r
- }\r
+namespace OHOS {\r
+void HeartModel::ClearHeartData(void) {\r
+ pretime = 0;\r
+ entryTimes = 0;\r
+ aveCount = 0;\r
+ preMaxValue = 0;\r
+ preMaxX = NUM_1;\r
+ preMinValue = HEART_RATE_LIMIT_UPPER;\r
+ preMinX = NUM_1;\r
+ countMax = 0;\r
+ countMin = 0;\r
+ healthDatas.heartRateMax.x = (uint16_t)0XFFFF;\r
+ healthDatas.heartRateMax.y = 0;\r
+ healthDatas.heartRateMin.x = (uint16_t)0XFFFF;\r
+ healthDatas.heartRateMin.y = (uint16_t)0XFFFF;\r
+ for (int i = 0; i < HEART_AVE_NUM; i++) {\r
+ healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF;\r
+ healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF;\r
+ }\r
+ if (HeartRateView::GetInstance() != nullptr) {\r
+ HeartRateView::GetInstance()->ClearElectrocardiogram();\r
+ }\r
+ SetAveHeartRateCount(0);\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+ healthDatas.heartRatePerSec, healthDatas.heartRateRest,\r
+ healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
+}\r
\r
- uint16_t HeartModel::GetHeartRateMax(void)\r
- {\r
- return healthDatas.heartRateMax.y;\r
- }\r
+HeartModel::HeartModel() {\r
+ /*初始化读取文件*/\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
+ HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
+ /*初始化历史文件*/\r
+ HealthService::GetInstance()->LoadDailyHeartRate();\r
+ if (data != nullptr) {\r
+ currentheart = data->Heart;\r
+ timestamp_ms = data->timestamp;\r
+ // 更新表盘心率数据\r
+ DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart);\r
+ delete data;\r
+ } else {\r
+ currentheart = 0;\r
+ timestamp_ms = 0;\r
+ }\r
+ //配置动态数组\r
+ SetArrayData();\r
+}\r
\r
- uint16_t HeartModel::GetHeartRateMin(void)\r
- {\r
- return healthDatas.heartRateMin.y;\r
- }\r
+HeartModel::~HeartModel() {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()");\r
+ HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+ HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
+ HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
+ HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
+}\r
\r
- void HeartModel::SetHeartRatePerSec(uint32 sec)\r
- {\r
- healthDatas.heartRatePerSec = sec;\r
- if (HeartRateView::GetInstance() == nullptr)\r
- {\r
- return;\r
- }\r
- HeartRateView::GetInstance()->RefreshHeartRatePerSec(healthDatas.heartRatePerSec);\r
- }\r
+HeartModel *HeartModel::GetInstance(void) {\r
+ static HeartModel heartModel;\r
+ return &heartModel;\r
+}\r
+uint16_t HeartModel::GetIndex() { return index_; }\r
+void HeartModel::SetIndex(uint16_t index) { index_ = index; }\r
+\r
+void HeartModel::Init(void) {\r
+ HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA);\r
+ HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE);\r
+ HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE);\r
+ HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE);\r
+}\r
\r
- void HeartModel::SetAveHeartRateCount(uint16_t value)\r
- {\r
- aveCount = value;\r
- }\r
+Point *HeartModel::GetAveHeartRate(void) { return healthDatas.heartRateAvg; }\r
+\r
+void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) {\r
+ healthDatas.heartRateMax.x = coord;\r
+ healthDatas.heartRateMax.y = value;\r
+ // 插入最大心率 countMax 数据个数\r
+ if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) {\r
+ if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) {\r
+ healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y;\r
+ } else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x ==\r
+ healthDatas.heartRateAvg[aveCount - 1].x)) {\r
+ healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y;\r
+ } else {\r
+ healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax;\r
+ countMax = aveCount;\r
+ aveCount++;\r
+ }\r
+ if (healthDatas.heartRateMax.x != 0) {\r
+ if (healthDatas.heartRateAvg[0].x == 0 &&\r
+ healthDatas.heartRateAvg[1].x == 0) {\r
+ for (int i = 1; i < (aveCount - 1); i++) {\r
+ healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
+ }\r
+ aveCount--;\r
+ countMax--;\r
+ }\r
+ }\r
+ }\r
+ preMaxValue = healthDatas.heartRateMax.y;\r
+ preMaxX = healthDatas.heartRateMax.x;\r
+}\r
\r
- void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate)\r
- {\r
- uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
- /*主界面刷新心率*/\r
- if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr)\r
- {\r
- MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
- }\r
- /*心率卡片刷新心率数据*/\r
- if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
- {\r
- if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
- {\r
- HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
- HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
- HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
- }\r
- }\r
- /*applist心率刷新心率数据*/\r
- if (HeartChartView::GetInstance() != nullptr)\r
- {\r
- HeartChartView::GetInstance()->UpdateShowHeart();\r
- }\r
- }\r
- /* ---------------------------------- 状态检测 ---------------------------------- */\r
-\r
- // 重新初始化\r
- void HeartModel::ClearDisplayData()\r
- {\r
- /*显示的心率数据清空*/\r
- currentheart = 0;\r
- timestamp_ms = 0;\r
- displayheart = 0;\r
- displayheart_max = 0; // 显示最大心率\r
- displayheart_min = 0; // 显示最小心率\r
- }\r
- // 获取心率数据\r
- uint16_t HeartModel::GetHeartdata()\r
- {\r
- return currentheart;\r
- }\r
+void HeartModel::HandleMinHeart(uint16 coord, uint16 value) {\r
+ // 最小心率\r
+ healthDatas.heartRateMin.x = coord;\r
+ healthDatas.heartRateMin.y = value;\r
+ // 插入最小心率\r
+ // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题???\r
+ // preMinValue 上一个心率最小值\r
+ // preMinX 上一个最小值对应的坐标\r
+ // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理\r
+ if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) {\r
+\r
+ if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) {\r
+ // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据\r
+ // countMin 即可\r
+ healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y;\r
+ } else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x ==\r
+ healthDatas.heartRateAvg[aveCount - 1].x)) {\r
+ // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值\r
+ healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y;\r
+ } else {\r
+ healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin;\r
+ countMin = aveCount;\r
+ aveCount++;\r
+ }\r
+\r
+ // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。\r
+ if (healthDatas.heartRateMin.x != 0) {\r
+ if (healthDatas.heartRateAvg[0].x == 0 &&\r
+ healthDatas.heartRateAvg[1].x == 0) {\r
+ for (int i = 0; i < (aveCount - 1); i++) {\r
+ healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1];\r
+ }\r
+ aveCount--;\r
+ countMin--;\r
+ }\r
+ }\r
+ }\r
+ preMinValue = healthDatas.heartRateMin.y;\r
+ preMinX = healthDatas.heartRateMin.x;\r
+}\r
\r
- uint16_t HeartModel::GetShowHeartdata()\r
- {\r
- return displayheart;\r
- }\r
- uint16_t HeartModel::GetShowMaxHeartdata()\r
- {\r
- return displayheart_max;\r
- }\r
- uint16_t HeartModel::GetShowMinHeartdata()\r
- {\r
- return displayheart_min;\r
- }\r
- uint32_t HeartModel::GetCheckTime()\r
- {\r
- return timestamp_ms;\r
- }\r
+void HeartModel::HeartRatePros(HeartDatas *heartInfo) {\r
+ uint16_t perSecHeartRate = 0;\r
+ uint16_t restHeartRate = 0;\r
+\r
+ // 每秒心率\r
+ perSecHeartRate = heartInfo->perSec;\r
+ if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER &&\r
+ perSecHeartRate <= HEART_RATE_LIMIT_UPPER) {\r
+ healthDatas.heartRatePerSec = perSecHeartRate;\r
+ }\r
+\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+ healthDatas.heartRatePerSec, healthDatas.heartRateRest,\r
+ healthDatas.heartRateMax.y, healthDatas.heartRateMin.y));\r
+}\r
\r
- void HeartModel::SetCheckTime(uint32_t time)\r
- {\r
- timestamp_ms = time;\r
- }\r
- void HeartModel::SetResult(HeartResult result)\r
- {\r
- heartresult_ = result;\r
- }\r
- HeartResult HeartModel::GetResult()\r
- {\r
- return heartresult_;\r
- }\r
- // 控制心率检测\r
- void HeartModel::Heart_Control(HeartState state, HeartCheck check)\r
- {\r
- if (check < checkstate)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Higher execution instruction exists");\r
- return;\r
- }\r
- if (state == HeartState::End && heartstate == true)\r
- {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState End");\r
- uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
- send_ppg_cmd_msg(md);\r
- heartstate = false;\r
- // 复原检测状态\r
- checkstate = HeartCheck::RESTSTSTE;\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
- heartstate = true;\r
- checkstate = check;\r
- }\r
- }\r
- // 开始检测\r
- void HeartModel::Heart_Start()\r
- {\r
- displayheart = 0;\r
- // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
- // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
-\r
- SetResult(HeartResult::NOT_TESTED); // 重置检测\r
- // 进行初始化操作\r
- if (!sensorstate)\r
- {\r
- Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
- sensorstate = true;\r
- }\r
- }\r
+uint16_t HeartModel::GetAveHeartRateCount(void) { return aveCount; }\r
\r
- // 结束检测\r
- void HeartModel::Heart_Stop()\r
- {\r
- valid_counter_ = 0;\r
- disvalid_counter_ = 0;\r
- unwear_counter_ = 0;\r
-\r
- /*主界面卡片检测 或者 被动检测*/\r
- if (checkstate == HeartCheck::CARDCHECK || checkstate == HeartCheck::PASSIVITY)\r
- {\r
- if (heartresult_ == HeartResult::SUCCESS)\r
- {\r
- Heart_Save();\r
- /*更新曲线*/\r
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
- }\r
- /*关闭被动检测*/\r
- Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
- return;\r
- }\r
+uint16_t HeartModel::GetHeartRateMax(void) {\r
+ return healthDatas.heartRateMax.y;\r
+}\r
\r
- if (sensorstate)\r
- {\r
- // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 不需要关闭\r
- sensorstate = false;\r
- Heart_Result(); // 处理结果\r
- }\r
- }\r
- // 保存检测数据\r
- void HeartModel::Heart_Save()\r
- {\r
- HeartRateData data;\r
- data.Heart = currentheart;\r
- data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
- SetCheckTime(data.timestamp);\r
- HealthService::GetInstance()->UpdateHealthData(data);\r
-\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", currentheart, data.timestamp);\r
- }\r
+uint16_t HeartModel::GetHeartRateMin(void) {\r
+ return healthDatas.heartRateMin.y;\r
+}\r
\r
- // 显示检测结果// 显示检测结果\r
- void HeartModel::Heart_Result()\r
- {\r
- // 心率提醒(0开 1关)\r
- uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
- uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
-\r
- if (HeartRemindState)\r
- {\r
- // 检查当前心率是否高于或低于阈值\r
- uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
-\r
- if (ThresholdState == 0 && currentheart < ThresholdValue && currentheart != 0)\r
- {\r
- // 当前心率低于阈值\r
- heartresult_ = HeartResult::LOW_RESULT;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
- }\r
- else if (ThresholdState == 1 && currentheart > ThresholdValue)\r
- {\r
- // 当前心率高于阈值\r
- heartresult_ = HeartResult::HIGH_RESULT;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue);\r
- }\r
- }\r
+void HeartModel::SetHeartRatePerSec(uint32 sec) {\r
+ healthDatas.heartRatePerSec = sec;\r
+ if (HeartRateView::GetInstance() == nullptr) {\r
+ return;\r
+ }\r
+ HeartRateView::GetInstance()->RefreshHeartRatePerSec(\r
+ healthDatas.heartRatePerSec);\r
+}\r
\r
- // 根据结果进行处理\r
- switch (heartresult_)\r
- {\r
- case HeartResult::SUCCESS:\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
- Heart_Save();\r
- /*更新曲线*/\r
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
- break;\r
-\r
- case HeartResult::NOT_WORN: // 未佩戴状态\r
- case HeartResult::TIMEOUT: // 超时情况\r
- case HeartResult::INVALID_DATA: // 无效数据情况\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况",\r
- heartresult_ == HeartResult::NOT_WORN ? "未佩戴状态" : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
- : "无效数据");\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
- break;\r
-\r
- case HeartResult::LOW_RESULT:\r
- // 低心率结果处理\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");\r
- HealthState lowHealthState;\r
- lowHealthState.checkType = BLOOD_CHECK;\r
- lowHealthState.resultStatus = LOW;\r
- lowHealthState.checkResult = ThresholdValue;\r
- HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
- break;\r
-\r
- case HeartResult::HIGH_RESULT:\r
- // 高心率结果处理\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况");\r
- HealthState highHealthState;\r
- highHealthState.checkType = BLOOD_CHECK;\r
- highHealthState.resultStatus = HIGH;\r
- highHealthState.checkResult = ThresholdValue;\r
- HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
- break;\r
-\r
- default:\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");\r
- break;\r
- }\r
- }\r
- void HeartModel::SetWearStatus(int32_t wear)\r
- {\r
- // 设置佩戴状态\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
-\r
- // 计数更新\r
- if (wear_ != 1 && wear != 1)\r
- {\r
- unwear_counter_++; // 佩戴错误计时器计数\r
- }\r
- else\r
- {\r
- unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
- }\r
- wear_ = wear;\r
- // 检查是否达到了最大未佩戴计数限制\r
- if (unwear_counter_ >= MAX_UNWEAR_COUNT)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_);\r
- SetResult(HeartResult::NOT_WORN);\r
- Heart_Stop();\r
- }\r
- }\r
+void HeartModel::SetAveHeartRateCount(uint16_t value) { aveCount = value; }\r
+\r
+void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest,\r
+ uint16_t maxRate, uint16_t minRate) {\r
+ uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();\r
+ /*主界面刷新心率*/\r
+ if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) {\r
+ MainClockView::GetInstance()->RefreshHeartRate(perSec);\r
+ }\r
+ /*心率卡片刷新心率数据*/\r
+ if (MainViewSample::GetInstance() != nullptr &&\r
+ HeartRateView::GetInstance() != nullptr) {\r
+ if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) {\r
+ HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec);\r
+ HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate);\r
+ HeartRateView::GetInstance()->RefreshHeartRateMin(minRate);\r
+ }\r
+ }\r
+ /*applist心率刷新心率数据*/\r
+ if (HeartChartView::GetInstance() != nullptr) {\r
+ HeartChartView::GetInstance()->UpdateShowHeart();\r
+ }\r
+}\r
+/* ---------------------------------- 状态检测\r
+ * ---------------------------------- */\r
+\r
+// 重新初始化\r
+void HeartModel::ClearDisplayData() {\r
+ /*显示的心率数据清空*/\r
+ currentheart = 0;\r
+ timestamp_ms = 0;\r
+ displayheart = 0;\r
+ displayheart_max = 0; // 显示最大心率\r
+ displayheart_min = 0; // 显示最小心率\r
+}\r
+// 获取心率数据\r
+uint16_t HeartModel::GetHeartdata() { return currentheart; }\r
+\r
+uint16_t HeartModel::GetShowHeartdata() { return displayheart; }\r
+uint16_t HeartModel::GetShowMaxHeartdata() { return displayheart_max; }\r
+uint16_t HeartModel::GetShowMinHeartdata() { return displayheart_min; }\r
+uint32_t HeartModel::GetCheckTime() { return timestamp_ms; }\r
+\r
+void HeartModel::SetCheckTime(uint32_t time) { timestamp_ms = time; }\r
+void HeartModel::SetResult(HeartResult result) { heartresult_ = result; }\r
+HeartResult HeartModel::GetResult() { return heartresult_; }\r
+// 控制心率检测\r
+void HeartModel::Heart_Control(HeartState state, HeartCheck check) {\r
+ if (check < checkstate) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
+ "Higher execution instruction exists");\r
+ return;\r
+ }\r
+ if (state == HeartState::End && heartstate == true) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState End");\r
+ uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST;\r
+ send_ppg_cmd_msg(md);\r
+ heartstate = false;\r
+ // 复原检测状态\r
+ checkstate = HeartCheck::RESTSTSTE;\r
+ } else if (state == HeartState::Start && heartstate == false) {\r
+ /*充电状态下不进行检测*/\r
+ bool isCharging = get_charge_stat(); // 获取充电状态\r
+ if (isCharging) {\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
+ heartstate = true;\r
+ checkstate = check;\r
+ }\r
+}\r
+// 开始检测\r
+void HeartModel::Heart_Start() {\r
+ displayheart = 0;\r
+ // displayheart_max = 0; // 显示最大心率 [每次检测进行清除]\r
+ // displayheart_min = 0; // 显示最小心率 [每次检测进行清除]\r
+\r
+ SetResult(HeartResult::NOT_TESTED); // 重置检测\r
+ // 进行初始化操作\r
+ if (!sensorstate) {\r
+ Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+ sensorstate = true;\r
+ }\r
+}\r
\r
- void HeartModel::UpHeartdata(uint16_t heart)\r
- {\r
- // 如果处于训练模式,提前返回\r
- if (uapi_dev_runtime_get_train_status() == 1)\r
- return;\r
-\r
- displayheart = heart;\r
-\r
- // 更新心率和计数器\r
- if (displayheart != 0)\r
- {\r
- currentheart = displayheart; // 更新当前心率\r
- valid_counter_++; // 增加有效计数器\r
- disvalid_counter_ = 0; // 清空无效计数器\r
-\r
- // 更新最大和最小心率\r
- displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max);\r
-\r
- // 确保最小心率的第一次赋值大于50\r
- if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART)\r
- {\r
- displayheart_min = displayheart; // 初始化最小心率\r
- }\r
- else\r
- {\r
- displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
- ? displayheart\r
- : displayheart_min;\r
- }\r
- }\r
- else\r
- {\r
- disvalid_counter_++; // 增加无效计数器\r
- valid_counter_ = 0; // 清零有效计数器\r
- }\r
+// 结束检测\r
+void HeartModel::Heart_Stop() {\r
+ valid_counter_ = 0;\r
+ disvalid_counter_ = 0;\r
+ unwear_counter_ = 0;\r
+\r
+ /*主界面卡片检测 或者 被动检测*/\r
+ if (checkstate == HeartCheck::CARDCHECK ||\r
+ checkstate == HeartCheck::PASSIVITY) {\r
+ if (heartresult_ == HeartResult::SUCCESS) {\r
+ Heart_Save();\r
+ /*更新曲线*/\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
+ }\r
+ /*关闭被动检测*/\r
+ Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
+ return;\r
+ }\r
+\r
+ if (sensorstate) {\r
+ // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率\r
+ // 不需要关闭\r
+ sensorstate = false;\r
+ Heart_Result(); // 处理结果\r
+ }\r
+}\r
+// 保存检测数据\r
+void HeartModel::Heart_Save() {\r
+ HeartRateData data;\r
+ data.Heart = currentheart;\r
+ data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
+ SetCheckTime(data.timestamp);\r
+ HealthService::GetInstance()->UpdateHealthData(data);\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld",\r
+ currentheart, data.timestamp);\r
+}\r
\r
- // 检查无效计数器是否达标\r
- if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_);\r
- SetResult(HeartResult::INVALID_DATA); // 标记为无效数据\r
- Heart_Stop();\r
- return;\r
- }\r
+// 显示检测结果// 显示检测结果\r
+void HeartModel::Heart_Result() {\r
+ // 心率提醒(0开 1关)\r
+ uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
+ ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
+ uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
+ ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
+\r
+ if (HeartRemindState) {\r
+ // 检查当前心率是否高于或低于阈值\r
+ uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(\r
+ ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
+\r
+ if (ThresholdState == 0 && currentheart < ThresholdValue &&\r
+ currentheart != 0) {\r
+ // 当前心率低于阈值\r
+ heartresult_ = HeartResult::LOW_RESULT;\r
+ WEARABLE_LOGE(\r
+ WEARABLE_LOG_MODULE_APP,\r
+ "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d",\r
+ currentheart, ThresholdValue);\r
+ } else if (ThresholdState == 1 && currentheart > ThresholdValue) {\r
+ // 当前心率高于阈值\r
+ heartresult_ = HeartResult::HIGH_RESULT;\r
+ WEARABLE_LOGE(\r
+ WEARABLE_LOG_MODULE_APP,\r
+ "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d",\r
+ currentheart, ThresholdValue);\r
+ }\r
+ }\r
+\r
+ // 根据结果进行处理\r
+ switch (heartresult_) {\r
+ case HeartResult::SUCCESS:\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功");\r
+ Heart_Save();\r
+ /*更新曲线*/\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
+ break;\r
+\r
+ case HeartResult::NOT_WORN: // 未佩戴状态\r
+ case HeartResult::TIMEOUT: // 超时情况\r
+ case HeartResult::INVALID_DATA: // 无效数据情况\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况",\r
+ heartresult_ == HeartResult::NOT_WORN\r
+ ? "未佩戴状态"\r
+ : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
+ : "无效数据");\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+ break;\r
+\r
+ case HeartResult::LOW_RESULT:\r
+ // 低心率结果处理\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况");\r
+ HealthState lowHealthState;\r
+ lowHealthState.checkType = BLOOD_CHECK;\r
+ lowHealthState.resultStatus = LOW;\r
+ lowHealthState.checkResult = ThresholdValue;\r
+ HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ break;\r
+\r
+ case HeartResult::HIGH_RESULT:\r
+ // 高心率结果处理\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况");\r
+ HealthState highHealthState;\r
+ highHealthState.checkType = BLOOD_CHECK;\r
+ highHealthState.resultStatus = HIGH;\r
+ highHealthState.checkResult = ThresholdValue;\r
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ break;\r
+\r
+ default:\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态");\r
+ break;\r
+ }\r
+}\r
+void HeartModel::SetWearStatus(int32_t wear) {\r
+ // 设置佩戴状态\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear);\r
+\r
+ // 计数更新\r
+ if (wear_ != 1 && wear != 1) {\r
+ unwear_counter_++; // 佩戴错误计时器计数\r
+ } else {\r
+ unwear_counter_ = 0; // 佩戴正常情况下清零计数器\r
+ }\r
+ wear_ = wear;\r
+ // 检查是否达到了最大未佩戴计数限制\r
+ if (unwear_counter_ >= MAX_UNWEAR_COUNT) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "检测结果: 未佩戴计数最大 unwear_counter: %d",\r
+ unwear_counter_);\r
+ SetResult(HeartResult::NOT_WORN);\r
+ Heart_Stop();\r
+ }\r
+}\r
\r
- // 检查有效计数器是否达标\r
- if (valid_counter_ >= MAX_VALID_HRS_COUNT)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart);\r
- SetResult(HeartResult::SUCCESS); // 标记为成功检测\r
- Heart_Stop();\r
- return;\r
- }\r
+void HeartModel::UpHeartdata(uint16_t heart) {\r
+ // 如果处于训练模式,提前返回\r
+ if (uapi_dev_runtime_get_train_status() == 1)\r
+ return;\r
+\r
+ displayheart = heart;\r
+\r
+ // 更新心率和计数器\r
+ if (displayheart != 0) {\r
+ currentheart = displayheart; // 更新当前心率\r
+ valid_counter_++; // 增加有效计数器\r
+ disvalid_counter_ = 0; // 清空无效计数器\r
+\r
+ // 更新最大和最小心率\r
+ displayheart_max =\r
+ (displayheart_max < displayheart ? displayheart : displayheart_max);\r
+\r
+ // 确保最小心率的第一次赋值大于50\r
+ if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART) {\r
+ displayheart_min = displayheart; // 初始化最小心率\r
+ } else {\r
+ displayheart_min =\r
+ (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART)\r
+ ? displayheart\r
+ : displayheart_min;\r
+ }\r
+ } else {\r
+ disvalid_counter_++; // 增加无效计数器\r
+ valid_counter_ = 0; // 清零有效计数器\r
+ }\r
+\r
+ // 检查无效计数器是否达标\r
+ if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "检测结果: 无效数达标 disvalid_counter: %d",\r
+ disvalid_counter_);\r
+ SetResult(HeartResult::INVALID_DATA); // 标记为无效数据\r
+ Heart_Stop();\r
+ return;\r
+ }\r
+\r
+ // 检查有效计数器是否达标\r
+ if (valid_counter_ >= MAX_VALID_HRS_COUNT) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "检测结果: 成功 valid_counter: %d currentheart: %d",\r
+ valid_counter_, currentheart);\r
+ SetResult(HeartResult::SUCCESS); // 标记为成功检测\r
+ Heart_Stop();\r
+ return;\r
+ }\r
+\r
+ // 刷新心率显示\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "[heart data update displayheart %d displayheart_max %d "\r
+ "displayheart_min %d]",\r
+ displayheart, displayheart_max, displayheart_min);\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
+ displayheart, 0, displayheart_max, displayheart_min));\r
+}\r
\r
- // 刷新心率显示\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[heart data update displayheart %d displayheart_max %d displayheart_min %d]", displayheart,\r
- displayheart_max, displayheart_min);\r
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(),\r
- displayheart, 0, displayheart_max, displayheart_min));\r
- }\r
+void HeartModel::Heart_Update_View(void) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新心率界面");\r
+ int hour = HealthService::GetInstance()->GetCurrentHour();\r
+ if (HeartRateView::GetInstance() != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");\r
+ HeartRateView::GetInstance()->Update_data_Chart(hour);\r
+ }\r
+ if (HeartChartView::GetInstance() != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+ HeartChartView::GetInstance()->Update_data_Chart(hour);\r
+ }\r
+}\r
\r
- void HeartModel::Heart_Update_View(void)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新心率界面");\r
- int hour = HealthService::GetInstance()->GetCurrentHour();\r
- if (HeartRateView::GetInstance() != nullptr)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片");\r
- HeartRateView::GetInstance()->Update_data_Chart(hour);\r
- }\r
- if (HeartChartView::GetInstance() != nullptr)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
- HeartChartView::GetInstance()->Update_data_Chart(hour);\r
- }\r
- }\r
+void HeartModel::CleanAllData(void) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
+ if (MainViewSample::GetInstance() != nullptr &&\r
+ HeartRateView::GetInstance() != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
+ HeartRateView::GetInstance()->CleanAllDataView();\r
+ }\r
+ if (HeartChartView::GetInstance() != nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
+ HeartChartView::GetInstance()->CleanAllDataView();\r
+ }\r
+}\r
\r
- void HeartModel::CleanAllData(void)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!");\r
- if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片");\r
- HeartRateView::GetInstance()->CleanAllDataView();\r
- }\r
- if (HeartChartView::GetInstance() != nullptr)\r
- {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片");\r
- HeartChartView::GetInstance()->CleanAllDataView();\r
- }\r
- }\r
+//配置5个动态心率数据\r
+//最大 最小\r
+void HeartModel::SetArrayData() {\r
+ // 如果没有进行心率检测,则默认为0-220\r
+ if (displayheart_max == 0 || displayheart_min == 0) {\r
+ dynamic_heartrate[0] = 0;\r
+ dynamic_heartrate[1] = 40;\r
+ dynamic_heartrate[2] = 100;\r
+ dynamic_heartrate[3] = 160;\r
+ dynamic_heartrate[4] = 220;\r
+ return; // 直接返回\r
+ }\r
+\r
+ // 计算心率范围并添加缓冲\r
+ uint16_t adjusted_min =\r
+ (displayheart_min > 10) ? (displayheart_min / 2) : displayheart_min;\r
+ uint16_t adjusted_max =\r
+ (displayheart_max < 210) ? (displayheart_max + 10) : displayheart_max;\r
+\r
+ uint16_t range = adjusted_max - adjusted_min;\r
+ uint16_t interval = range / 4; // 每个部分的宽度\r
+\r
+ // 设置动态心率数据\r
+ dynamic_heartrate[0] = adjusted_min;\r
+ dynamic_heartrate[1] = adjusted_min + interval;\r
+ dynamic_heartrate[2] = adjusted_min + 2 * interval;\r
+ dynamic_heartrate[3] = adjusted_min + 3 * interval;\r
+ dynamic_heartrate[4] = adjusted_max;\r
+\r
+ // 确保所有值为整数\r
+ for (int i = 0; i < 5; i++) {\r
+ dynamic_heartrate[i] = static_cast<uint16_t>(round(dynamic_heartrate[i]));\r
+ }\r
+\r
+ // 打印动态心率数据\r
+ for (int i = 0; i < 5; i++) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dynamic_heartrate[%d] = %d", i,\r
+ dynamic_heartrate[i]);\r
+ }\r
+}\r
+//获取动态心率配置数组\r
+uint16_t *HeartModel::GetArrayData() { return dynamic_heartrate; }\r
+\r
+// 获取检测字符串\r
+// 获取检测字符串\r
+std::string HeartModel::GetCheckString() {\r
+ std::string check_string = "检测结果未知"; // 默认返回值\r
+\r
+ // 获取检测数据\r
+ if (currentheart == 0) {\r
+ check_string = "暂无检测数据";\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测数据: %s",\r
+ check_string.c_str()); // 打印无检测数据信息\r
+ return check_string; // 直接返回,无需继续处理\r
+ }\r
+\r
+ // 获取目前的时间戳\r
+ uint32_t currentTime;\r
+ if (uapi_get_timestampe_ss(¤tTime) != ERRCODE_SUCC) {\r
+ check_string = "获取当前时间戳失败"; // 如果获取时间戳失败,返回相应的信息\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "获取当前时间戳失败"); // 打印错误信息\r
+ return check_string; // 直接返回,无法进行后续计算\r
+ }\r
+\r
+ // 检查时间戳是否有效\r
+ if (timestamp_ms == 0) {\r
+ check_string = std::to_string(currentheart) + " " + "时间戳无效,无法检测";\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间戳无效,无法检测: %s",\r
+ check_string.c_str());\r
+ return check_string; // 直接返回,无需继续处理\r
+ }\r
+\r
+ // 进行时间戳相减计算\r
+ uint32_t diff = currentTime - timestamp_ms;\r
+ uint32_t diff_min = diff / 60; // 计算分钟差\r
+ uint32_t diff_hour = diff_min / 60; // 计算小时差\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前时间: %d, 上次检测时间: %d",\r
+ currentTime, timestamp_ms); // 打印时间信息\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "时间差 (秒): %d, 时间差 (分钟): %d, 时间差 (小时): %d", diff,\r
+ diff_min, diff_hour); // 打印时间差信息\r
+\r
+ // 根据时间差生成检测字符串\r
+ if (diff_min < 1) {\r
+ check_string = std::to_string(currentheart) + "次/分 " + "刚刚检测";\r
+ } else if (diff_hour < 1) { // 一个小时内\r
+ check_string = std::to_string(currentheart) + "次/分 " +\r
+ std::to_string(diff_min) + "分钟前";\r
+ } else {\r
+ check_string = std::to_string(currentheart) + "次/分 " + "超过一个小时前";\r
+ }\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s",\r
+ check_string.c_str()); // 打印最终检测结果\r
+ return check_string;\r
}\r
+} // namespace OHOS\r
--- /dev/null
+#include "heartrate/include/HeartRateCardView.h"
+#include "heartrate/include/HeartChartView.h"
+
+namespace OHOS {
+static HeartRateCardView *g_pHeartRateCardView = nullptr;
+HeartRateCardView::HeartRateCardView() {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "HeartRateCardView::HeartRateCardView");
+ SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+ g_pHeartRateCardView = this;
+}
+HeartRateCardView::~HeartRateCardView() {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "HeartRateCardView::~HeartRateCardView");
+ ClearAll();
+ g_pHeartRateCardView = nullptr;
+}
+HeartRateCardView *HeartRateCardView::GetInstance() {
+ return g_pHeartRateCardView;
+}
+void HeartRateCardView::ClearAll(void) {
+ if (viewiInitStatus == true) {
+ RemoveAll();
+ if (heartRateGroupView != nullptr) {
+ delete heartRateGroupView;
+ heartRateGroupView = nullptr;
+ }
+ }
+}
+
+bool HeartRateCardView::InitView(void) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateCardView::InitView");
+ heartRateCardView = new HeartChartView();
+ if (heartRateCardView == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "HeartChartView::new HeartChartView fail!");
+ return false;
+ }
+
+ heartRateGroupView =
+ dynamic_cast<UIViewGroup *>(heartRateCardView->GetchartGroup());
+ if (heartRateGroupView == nullptr) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "HeartChartView->HeartChartViewInit() == nullptr!!");
+ return false;
+ }
+
+ Add(heartRateGroupView);
+ return true;
+}
+UIViewGroup *HeartRateCardView::GetHeartRateCardView() {
+ return heartRateGroupView;
+}
+void HeartRateCardView::PreLoad(void) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateCardView::PreLoad");
+ if (!viewiInitStatus) {
+ InitView();
+ viewiInitStatus = true;
+ }
+}
+void HeartRateCardView::UnLoad(void) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateCardView::UnLoad");
+}
+} // namespace OHOS
\ No newline at end of file
#define COORDINATE_GRAD_MAX_OPA 180\r
\r
// 心形心跳\r
-#define HEARTBEAT_IMAGE_WIDTH 92\r
-#define HEARTBEAT_IMAGE_HEIGHT 92\r
-#define HEARTBEAT_IMAGE_X 105\r
-#define HEARTBEAT_IMAGE_Y 50\r
-#define HEARTBEAT_IMAGE_NUM 19\r
-#define HEARTBEAT_DELAY 50\r
-\r
+static constexpr int HEARTBEAT_IMAGE_WIDTH = 54;\r
+static constexpr int HEARTBEAT_IMAGE_HEIGHT = 50;\r
+static constexpr int HEARTBEAT_IMAGE_X = 111;\r
+static constexpr int HEARTBEAT_IMAGE_Y = 57;\r
+static constexpr int HEARTBEAT_IMAGE_NUM = 21;\r
+static constexpr int HEARTBEAT_DELAY = 50;\r
+// 心跳image\r
+static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
+ {PNG_A004_070_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_071_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_072_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_073_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_074_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_075_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_076_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_077_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_078_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_079_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_080_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_081_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_082_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_083_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_084_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_085_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_086_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_087_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_088_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_089_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+ {PNG_A004_090_IMAGE_PATH,\r
+ {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y},\r
+ HEARTBEAT_IMAGE_WIDTH,\r
+ HEARTBEAT_IMAGE_HEIGHT,\r
+ IMG_SRC_FILE_PATH},\r
+};\r
// 最高心率\r
#define TOP_IMAGE_WIDTH 32\r
#define TOP_IMAGE_HEIGHT 32\r
#define PERSEC_HEART_TEXT_WIDTH 75\r
#define PERSEC_HEART_TEXT_HEIGHT (PERSEC_HEART_TEXT_FONT_SIZE + 5)\r
\r
- // 心跳image\r
- static ImageAnimatorInfo g_heartBeatImageInfo[HEARTBEAT_IMAGE_NUM] = {\r
- {PNG_A004_070_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_071_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_072_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_073_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_074_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_075_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_076_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_077_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_078_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_079_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
-\r
- {PNG_A004_080_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_081_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_082_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_083_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_084_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_085_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_086_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_087_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- {PNG_A004_088_IMAGE_PATH, {HEARTBEAT_IMAGE_X, HEARTBEAT_IMAGE_Y}, HEARTBEAT_IMAGE_WIDTH, HEARTBEAT_IMAGE_HEIGHT, IMG_SRC_FILE_PATH},\r
- };\r
\r
HeartRateView::HeartRateView()\r
{\r
#include "message/include/MessageControlView.h"
#include "sleep/include/SleepCardView.h"
#include "set_card/include/SetMainView.h"
+#include "heartrate/include/HeartRateCardView.h"
namespace OHOS
{
class MainPresenterSample;
PlayersView *playersView{nullptr};
CompassControlView *compassControlView{nullptr};
- HeartRateView *heartRateView{nullptr};
+ HeartRateCardView *heartRateView{nullptr};
BloodCardView *bloodView{nullptr};
SleepCardView *sleepView{nullptr};
Training_CardView *traingView{nullptr};
UICardPage *MainViewSample::InitHeartRatePage(void)
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::InitHeartRatePage");
- heartRateView = new HeartRateView();
+ heartRateView = new HeartRateCardView();
if (heartRateView == nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heartRateView new fail");
--- /dev/null
+
+#ifndef SAFE_MODE_MANAGER_MODEL_C_H
+#define SAFE_MODE_MANAGER_MODEL_C_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//进行修复开始
+void repari_file_start(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
\ No newline at end of file
#include "safemodemanager/include/RepairView.h"
#include "safemodemanager/include/ResourceCheckView.h"
#include "safemodemanager/include/SafeModeManagerModel.h"
+#include "safemodemanager/include/SafeModeManagerModelC.h"
#include "safemodemanager/include/SafeModeManagerView.h"
#include "broadcast_feature.h"
}
static const char *CHECK_DIFFERENTIAL_FILE = "/system/check_differential.txt";
+
+void repari_file_start() {
+ OHOS::SafeModeManagerModel::GetInstance()->RepairStart();
+}
+
namespace OHOS {
SafeModeManagerModel *SafeModeManagerModel::GetInstance(void) {
"srv_res %d, err %d\n",
httpc_result, rx_content_len, srv_res, err);
if (httpc_result == HTTPC_RESULT_OK) {
- http_single_download_stop();
OHOS::SafeModeManagerModel::GetInstance()->AddRepairCount();
- //å¼\80å§\8bä¸\8bä¸\80个æ\96\87ä»¶
- OHOS::SafeModeManagerModel::GetInstance()->RepairStart();
+ //å\8f\91æ¶\88æ\81¯è¿\9bè¡\8cé\87\8dæ\96°å¼\80å§\8b
+ do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_DOWNLOAD_RES, nullptr, 0);
} else {
//结束
OHOS::SafeModeManagerModel::GetInstance()->RepairEnd();
}
+ http_single_download_stop();
file_total_len = 0;
return;
}
version https://git-lfs.github.com/spec/v1
-oid sha256:ab68b0439d276fdf0f5d839281e44a516a6fb44d3bf4843101b3578acdd6d68e
+oid sha256:efc0bb2ab65d0ad5bb1469bf529b32e0f0f8cde2b9256def4001c365da2ec845
size 52024
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbbfb65f766ee8de8840e15812abb1d31035dfe2f1e7d63b23dac073896f5600
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:13a516df219bf7246ec34ca65171bfa9000988907e7c9151584bd85efaddc19d
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:b108813a68df254a3cebda9f3e938a5d76188133211fa974184b2a607bc689ac
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:dbda3ff00bd54d277acc2a86ed3210f3a069302c2363cbafefd60d0379b9d25b
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:8fd2d8818d0cc756e065e6a872b029081bc38662e05283aca9cc75fedeeab206
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:be60c395114125059579cafdd42e9e8c6a5372d4123e5204d1315026bce8e736
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:60fef533bd4c8a68cc5ced7d1d51a4af7d2868ca6099564dac103fcc70f79593
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1370669175f3ea04c455839c377ec9f6eade73ea04fb88820cb9b2717a76ed1
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:56e11c8370939aa63e41851bee4b39f1de58035f63c0ed9ed090fd04e546bcb0
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:4add68c802082e008168c41c47c8a8ac4d494d9a8ef36fd0116252ca0b54c899
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:b38bd661e9db76946670deca370c4e7cf12411f82be9c6ca5d185752efe54e01
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:c528e0e0aaa44eaf902c117c023000eb7843aa967aa245a64bd75b92338ec9f1
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2758f2d5973d4afabbf26c765ca46fd025bcbeb27d9849a226ca261d82ed5aa
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:f1a9c8e3f967f84b44b140735cd3ae23768531b0f552585b0f6d9326ffa2d12a
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae604513790f3f29fb2efe5d1077785c361b962a3877f1050df9d3fb91851a5c
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:4e00d958a71ff06fa866c5b3cc46dc6e5a7b193e8681d84e1b60bad542db7fbc
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:e27f49f08cefb628db2aacc319e2ffbbcfab9eb7afc945630254824adf510343
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:5afb9b60880657ad7092445e90fddc488cc4087eeb1452c0a82df8f31443d78f
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac0505e5357f162a082c9675acb47094e9251883ad6289364133e8c52c8ae6eb
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae4c188da2acee2a817c130543bf3be085676cdf6a108881dae341faf2a78a37
+size 1896
--- /dev/null
+version https://git-lfs.github.com/spec/v1
+oid sha256:fbbfb65f766ee8de8840e15812abb1d31035dfe2f1e7d63b23dac073896f5600
+size 1896
#include "bletest.h"
+#include "safemodemanager/include/SafeModeManagerModelC.h"
+
typedef struct
{
uint8_t cmd;
case CUSTOM_CMD_MSG_CHECK_RES:
resfile_checksum_thread();
break;
+ case CUSTOM_CMD_MSG_DOWNLOAD_RES:
+ repari_file_start();
+ break;
default:
PRINT("Unknown CUSTOM_CMD_MSG cmd 0x%02X \r\n", mail.cmd);
break;
#define CUSTOM_CMD_MSG_BR_CONNECT 0x0C
#define CUSTOM_CMD_MSG_CHECK_RES 0x0D
+#define CUSTOM_CMD_MSG_DOWNLOAD_RES 0x0E
typedef enum {
BR_HFP_CONNECT=1,
BR_HFP_DISCONNECT,
--- /dev/null
+import argparse\rimport subprocess\rimport shutil\rimport os\r\rdef main():\r parser = argparse.ArgumentParser(description='Process paths.')\r parser.add_argument('-c', '--config', help='Config file path', required=True)\r parser.add_argument('-i', '--input', help='Input path', required=True)\r parser.add_argument('-o', '--output', help='Output path', required=True)\r args = parser.parse_args()\r\r print(f"Config path: {args.config}")\r print(f"Input path: {args.input}")\r print(f"Output path: {args.output}")\r\r # 定义命令和参数\r command = [\r "python", "images_tool.py",\r "-p", "file",\r "-d", "cmp",\r "-c", args.config,\r "-i", args.input,\r "-o", args.output\r ]\r\r print(f"Executing command: {' '.join(command)}")\r\r # 执行命令\r try:\r subprocess.run(command, check=True)\r print("Command executed successfully.")\r except subprocess.CalledProcessError as e:\r print(f"An error occurred while executing the command: {e}")\r\r # 构建目标路径\r target_dir = os.path.join('FD230', 'code', 'sdk', 'build', 'config', 'target_config', 'brandy', 'mk_fs_image', 'fd230', 'fs', 'user', 'res')\r\r print(f"Source directory: {args.output}")\r print(f"Target directory: {target_dir}")\r\r # 复制文件夹\r try:\r if os.path.exists(target_dir):\r shutil.rmtree(target_dir) # 删除目标文件夹(如果存在)\r shutil.copytree(args.output, target_dir)\r print(f"Copied {args.output} to {target_dir}.")\r except Exception as e:\r print(f"An error occurred while copying the directory: {e}")\r\rif __name__ == "__main__":\r main()\r
\ No newline at end of file