From: Caisking <3449750381@qq.com> Date: Sat, 14 Sep 2024 12:36:49 +0000 (+0800) Subject: 心率:修改心率UI;增加上一次检测数据以及检测间隔 X-Git-Tag: release_V1.2.70_20241020_135402~472 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=9da7186c1cc8f2d72c5424be5775ed489450db3f;p=mirrors%2FFD230.git 心率:修改心率UI;增加上一次检测数据以及检测间隔 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h index b2e7676b4..4430a2323 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartChartView.h @@ -2,84 +2,95 @@ * @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 - { - 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 { +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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index 491904d1b..4827a8abc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -1,67 +1,61 @@ #ifndef HEART_MODEL_H #define HEART_MODEL_H -#include +#include "MainClockView.h" #include "broadcast_feature.h" #include "broadcast_service.h" #include "samgr_lite.h" -#include "MainClockView.h" +#include #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - int PushOHOSMsgToHeartModel(Request *request); - void HeartDataSubscribeTopic(Topic topic); - void HearDatatUnsubscribeTopic(Topic topic); +int PushOHOSMsgToHeartModel(Request *request); +void HeartDataSubscribeTopic(Topic topic); +void HearDatatUnsubscribeTopic(Topic topic); #define HEART_ALL_POINTS 360 - typedef struct - { - uint16_t x; - uint16_t y; - bool flag; - } Point; - - typedef struct - { - /** X coordinate */ - uint16_t x; - /** Y coordinate */ - uint16_t y; - } HeartPoint; - - typedef struct - { - uint16_t perSec; - uint16_t rest; - uint16_t minX; - uint16_t minValue; - uint16_t maxX; - uint16_t maxValue; - uint16_t index; - Point value[HEART_ALL_POINTS]; - } HeartInfo; +typedef struct { + uint16_t x; + uint16_t y; + bool flag; +} Point; + +typedef struct { + /** X coordinate */ + uint16_t x; + /** Y coordinate */ + uint16_t y; +} HeartPoint; + +typedef struct { + uint16_t perSec; + uint16_t rest; + uint16_t minX; + uint16_t minValue; + uint16_t maxX; + uint16_t maxValue; + uint16_t index; + Point value[HEART_ALL_POINTS]; +} HeartInfo; #pragma pack(4) - typedef struct - { - uint16_t perSec; - uint16_t rest; - uint16_t minX; - uint16_t minValue; - uint16_t maxX; - uint16_t maxValue; - uint16_t index; - HeartPoint value[HEART_ALL_POINTS]; - } HeartDatas; +typedef struct { + uint16_t perSec; + uint16_t rest; + uint16_t minX; + uint16_t minValue; + uint16_t maxX; + uint16_t maxValue; + uint16_t index; + HeartPoint value[HEART_ALL_POINTS]; +} HeartDatas; #pragma pack() - namespace OHOS - { +namespace OHOS { #define HEART_AVE_NUM 360 #define HEART_RATE_LIMIT_UPPER 200 #define HEART_RATE_LIMIT_LOWER 0 @@ -75,121 +69,125 @@ extern "C" #define NUM_7 7 #define NUM_16 16 #define NUM_99 99 - // 心率检测状态 - enum class HeartState - { - End = 0, - Start, - }; - enum class HeartCheck - { - RESTSTSTE = 0, // 未检测状态 - PASSIVITY, // 被动检测心率 - CARDCHECK, // 卡片检测 - INITIATIVE, // 主动检测心率 - EXERCISE, // 运动心率 - }; - enum class HeartResult - { - NOT_TESTED = 0, // 未检测 - SUCCESS, // 检测成功 - NOT_WORN, // 未佩戴检测 - TIMEOUT, // 检测超时 - HIGH_RESULT, // 检测结果过高 - LOW_RESULT, // 检测结果过低 - INVALID_DATA // 无效数据 - }; - // 控制心率检测 - typedef struct - { - uint32_t heartRatePerSec; - Point heartRateAvg[HEART_AVE_NUM]; - uint32_t heartRateRest; - Point heartRateMax; - Point heartRateMin; - } HealthAllDatas; - - class HeartModel - { - public: - HeartModel(); - ~HeartModel(); - static HeartModel *GetInstance(void); - void ObtainingHeartRateData(void); - void PushHealthDatas(HealthMsg healthMsg); - Point *GetAveHeartRate(void); - uint16_t GetAveHeartRateCount(void); - void SetAveHeartRateCount(uint16_t value); - Point *GetMaximumHeartRate(void); - void Init(void); - void HeartRatePros(HeartDatas *heartInfo); - void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate); - void ClearHeartData(void); - void HandleMaxHeart(uint16_t coord, uint16_t value); - void HandleMinHeart(uint16_t coord, uint16_t value); - void SetHeartRatePerSec(uint32_t sec); - uint16_t GetHeartRateMax(void); - uint16_t GetHeartRateMin(void); - /* -------------------------------------------------------------------------- */ - void UpHeartdata(uint16_t heart); - uint16_t GetHeartdata(); - uint16_t GetShowHeartdata(); - uint16_t GetShowMaxHeartdata(); - uint16_t GetShowMinHeartdata(); - - uint16_t GetIndex(); - void SetIndex(uint16_t index); - - uint32_t GetCheckTime(void); - void SetCheckTime(uint32_t time); - void SetWearStatus(int32_t wear); - void SetResult(HeartResult result); - HeartResult GetResult(); - - void Heart_Start(void); - void Heart_Stop(void); - void Heart_Save(void); - void Heart_Result(void); - - void Heart_Control(HeartState state, HeartCheck check); - void ClearDisplayData(); - void Heart_Update_View(void); - void CleanAllData(void); - - private: - HealthAllDatas healthDatas; - uint16_t pretime{0}; - uint16_t entryTimes{0}; - uint16_t aveCount{0}; - uint16_t preMaxValue{0}; - uint16_t preMaxX{NUM_1}; - uint16_t preMinValue{HEART_RATE_LIMIT_UPPER}; - uint16_t preMinX{NUM_1}; - uint16_t countMax{0}; - uint16_t countMin{0}; - bool wearStatus{true}; - uint16_t index_ = 0; - - uint16_t displayheart; // 显示心率 - uint16_t currentheart; // 保存心率 - uint16_t displayheart_max; // 显示最大心率 - uint16_t displayheart_min; // 显示最小心率 - - uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) - - bool initstatus = true; - bool heartstate = false; - bool sensorstate{false}; - - uint16_t wear_; - uint16_t valid_counter_ = 0; // 有效数计数器 - uint16_t disvalid_counter_ = 0; // 无效数计数器 - uint16_t unwear_counter_ = 0; // 佩戴错误计数器 - - HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果 - HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态 - }; - } +// 心率检测状态 +enum class HeartState { + End = 0, + Start, +}; +enum class HeartCheck { + RESTSTSTE = 0, // 未检测状态 + PASSIVITY, // 被动检测心率 + CARDCHECK, // 卡片检测 + INITIATIVE, // 主动检测心率 + EXERCISE, // 运动心率 +}; +enum class HeartResult { + NOT_TESTED = 0, // 未检测 + SUCCESS, // 检测成功 + NOT_WORN, // 未佩戴检测 + TIMEOUT, // 检测超时 + HIGH_RESULT, // 检测结果过高 + LOW_RESULT, // 检测结果过低 + INVALID_DATA // 无效数据 +}; +// 控制心率检测 +typedef struct { + uint32_t heartRatePerSec; + Point heartRateAvg[HEART_AVE_NUM]; + uint32_t heartRateRest; + Point heartRateMax; + Point heartRateMin; +} HealthAllDatas; + +class HeartModel { +public: + HeartModel(); + ~HeartModel(); + static HeartModel *GetInstance(void); + void ObtainingHeartRateData(void); + void PushHealthDatas(HealthMsg healthMsg); + Point *GetAveHeartRate(void); + uint16_t GetAveHeartRateCount(void); + void SetAveHeartRateCount(uint16_t value); + Point *GetMaximumHeartRate(void); + void Init(void); + void HeartRatePros(HeartDatas *heartInfo); + void RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, + uint16_t minRate); + void ClearHeartData(void); + void HandleMaxHeart(uint16_t coord, uint16_t value); + void HandleMinHeart(uint16_t coord, uint16_t value); + void SetHeartRatePerSec(uint32_t sec); + uint16_t GetHeartRateMax(void); + uint16_t GetHeartRateMin(void); + /* -------------------------------------------------------------------------- + */ + void UpHeartdata(uint16_t heart); + uint16_t GetHeartdata(); + uint16_t GetShowHeartdata(); + uint16_t GetShowMaxHeartdata(); + uint16_t GetShowMinHeartdata(); + + uint16_t GetIndex(); + void SetIndex(uint16_t index); + + uint32_t GetCheckTime(void); + void SetCheckTime(uint32_t time); + void SetWearStatus(int32_t wear); + void SetResult(HeartResult result); + HeartResult GetResult(); + + void Heart_Start(void); + void Heart_Stop(void); + void Heart_Save(void); + void Heart_Result(void); + + void Heart_Control(HeartState state, HeartCheck check); + void ClearDisplayData(); + void Heart_Update_View(void); + void CleanAllData(void); + + std::string GetCheckString(); + uint16_t *GetArrayData(); + void SetArrayData(); + +private: + HealthAllDatas healthDatas; + uint16_t pretime{0}; + uint16_t entryTimes{0}; + uint16_t aveCount{0}; + uint16_t preMaxValue{0}; + uint16_t preMaxX{NUM_1}; + uint16_t preMinValue{HEART_RATE_LIMIT_UPPER}; + uint16_t preMinX{NUM_1}; + uint16_t countMax{0}; + uint16_t countMin{0}; + bool wearStatus{true}; + uint16_t index_ = 0; + + uint16_t displayheart; // 显示心率 + uint16_t currentheart; // 保存心率 + uint16_t displayheart_max; // 显示最大心率 + uint16_t displayheart_min; // 显示最小心率 + + uint32 + timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) + + bool initstatus = true; + bool heartstate = false; + bool sensorstate{false}; + + uint16_t wear_; + uint16_t valid_counter_ = 0; // 有效数计数器 + uint16_t disvalid_counter_ = 0; // 无效数计数器 + uint16_t unwear_counter_ = 0; // 佩戴错误计数器 + + HeartResult heartresult_ = HeartResult::NOT_TESTED; // 检测结果 + HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态 + + uint16_t dynamic_heartrate[5]; //动态心率配置项 +}; +} // namespace OHOS #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index e87e4b6fb..f21f91f53 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -1,33 +1,31 @@ #include "heartrate/include/HeartModel.h" -#include "wearable_log.h" -#include "graphic_service.h" #include "IndoorWalkPreparedView.h" #include "IndoorWalkPresenter.h" #include "MainViewSample.h" +#include "graphic_service.h" +#include "wearable_log.h" -#include "heartrate/include/HeartRateView.h" +#include "DialModelHeartRate.h" +#include "heartrate/include/HeartChartView.h" #include "heartrate/include/HeartDetectionPresenter.h" +#include "heartrate/include/HeartRateView.h" #include "heartrate/include/HeartResultPresenter.h" -#include "heartrate/include/HeartChartView.h" -#include "DialModelHeartRate.h" -#include -#include #include "DialModelHeartRate.h" -#include "health_service.h" +#include "custom_runtime.h" #include "custom_utils.h" +#include "health_service.h" #include "ppg_service.h" -#include "custom_runtime.h" +#include #include #include -#include +#include -#include "ui_service.h" #include "battery_hal.h" +#include "ui_service.h" #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #define MAX_UNWEAR_COUNT 30 @@ -36,698 +34,717 @@ extern "C" #define MIN_DISPLAY_HEART 60 #define HEARTTEST 1 //[0 开启测试 1 关闭] - /* 佩戴检测结果 */ - enum - { - SENSOR_WEAR_ON = 0, - SENSOR_WEAR_OFF, - SENSOR_WEAR_UNKNOW, - SENSOR_WEAR_MAX - }; +/* 佩戴检测结果 */ +enum { + SENSOR_WEAR_ON = 0, + SENSOR_WEAR_OFF, + SENSOR_WEAR_UNKNOW, + SENSOR_WEAR_MAX +}; - using namespace OHOS; +using namespace OHOS; #define LEN 32 - static void Notify(void *args, const Topic topic, Request *request); - - Subscriber heartSubscirber = { - .identity = nullptr, - .args = nullptr, - .Notify = Notify, - }; - static void ProcessHeartRateUpdate(Request *request); - static void RefreshHeartData(); - void HeartDataSubscribeTopic(Topic topic) - { - BroadcastApi *broadcastApi = nullptr; - IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); - if (api == nullptr) - { - return; - } - int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); - if (result != 0 || broadcastApi == nullptr) - { - return; - } - int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartSubscribeTopic ret = %d, topic = %u", ret, topic); - broadcastApi->Release((IUnknown *)broadcastApi); - } - - void HearDatatUnsubscribeTopic(Topic topic) - { - BroadcastApi *broadcastApi = nullptr; - IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); - if (api == nullptr) - { - return; - } - int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); - if (result != 0 || broadcastApi == nullptr) - { - return; - } - broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &heartSubscirber); - broadcastApi->Release((IUnknown *)broadcastApi); - } +static void Notify(void *args, const Topic topic, Request *request); + +Subscriber heartSubscirber = { + .identity = nullptr, + .args = nullptr, + .Notify = Notify, +}; +static void ProcessHeartRateUpdate(Request *request); +static void RefreshHeartData(); +void HeartDataSubscribeTopic(Topic topic) { + BroadcastApi *broadcastApi = nullptr; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, + BROADCAST_FEATURE_NAME); + if (api == nullptr) { + return; + } + int result = + api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == nullptr) { + return; + } + int ret = broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, + &heartSubscirber); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "HeartSubscribeTopic ret = %d, topic = %u", ret, topic); + broadcastApi->Release((IUnknown *)broadcastApi); +} - static void Notify(void *args, const Topic topic, Request *request) - { - UNUSED(args); - UNUSED(topic); +void HearDatatUnsubscribeTopic(Topic topic) { + BroadcastApi *broadcastApi = nullptr; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, + BROADCAST_FEATURE_NAME); + if (api == nullptr) { + return; + } + int result = + api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == nullptr) { + return; + } + broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, + &heartSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); +} - // 训练过程中不需要判断数据准确性,不需要存储心率数据 - if (uapi_dev_runtime_get_train_status() == 1 || request == NULL) - { - return; - } +static void Notify(void *args, const Topic topic, Request *request) { + UNUSED(args); + UNUSED(topic); - switch (request->msgId) - { - case TOPIC_EVENT_HEARTRATE_UPDATA: - // ProcessHeartRateUpdate(request); - break; + // 训练过程中不需要判断数据准确性,不需要存储心率数据 + if (uapi_dev_runtime_get_train_status() == 1 || request == NULL) { + return; + } - case TOPIC_EVENT_NEXTDAY_UPDATE: - case TOPIC_EVENT_UTCTIME_UPDATE: - RefreshHeartData(); - break; + switch (request->msgId) { + case TOPIC_EVENT_HEARTRATE_UPDATA: + // ProcessHeartRateUpdate(request); + break; - case TOPIC_EVENT_WEARSTATE_UPDATE: - break; + case TOPIC_EVENT_NEXTDAY_UPDATE: + case TOPIC_EVENT_UTCTIME_UPDATE: + RefreshHeartData(); + break; - default: - break; - } - } + case TOPIC_EVENT_WEARSTATE_UPDATE: + break; - static void ProcessHeartRateUpdate(Request *request) - { - uint16_t preheart = *reinterpret_cast(request->data); - - // 直接处理心率数据,不进行筛选 - uint16_t index_ = HeartModel::GetInstance()->GetIndex(); - HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas)); - if (heartInfo == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail"); - return; - } + default: + break; + } +} - heartInfo->index = index_; - heartInfo->maxX = index_; - heartInfo->minX = index_; - heartInfo->perSec = preheart; - heartInfo->rest = preheart; - /*最大最小值不为0*/ - heartInfo->maxValue = preheart; - heartInfo->minValue = preheart; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", heartInfo->index, preheart); - OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); - - free(heartInfo); // 释放内存 - heartInfo = nullptr; - } +static void ProcessHeartRateUpdate(Request *request) { + uint16_t preheart = *reinterpret_cast(request->data); + + // 直接处理心率数据,不进行筛选 + uint16_t index_ = HeartModel::GetInstance()->GetIndex(); + HeartDatas *heartInfo = (HeartDatas *)malloc(sizeof(HeartDatas)); + if (heartInfo == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Notify] malloc fail"); + return; + } + + heartInfo->index = index_; + heartInfo->maxX = index_; + heartInfo->minX = index_; + heartInfo->perSec = preheart; + heartInfo->rest = preheart; + /*最大最小值不为0*/ + heartInfo->maxValue = preheart; + heartInfo->minValue = preheart; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartRateData = %d %d", + heartInfo->index, preheart); + OHOS::HeartModel::GetInstance()->HeartRatePros(heartInfo); + + free(heartInfo); // 释放内存 + heartInfo = nullptr; +} - static void RefreshHeartData() - { - OHOS::HeartModel::GetInstance()->ClearHeartData(); - GraphicService::GetInstance()->PostGraphicEvent( - std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance())); - } +static void RefreshHeartData() { + OHOS::HeartModel::GetInstance()->ClearHeartData(); + GraphicService::GetInstance()->PostGraphicEvent(std::bind( + &OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance())); +} #ifdef __cplusplus } #endif -namespace OHOS -{ - void HeartModel::ClearHeartData(void) - { - pretime = 0; - entryTimes = 0; - aveCount = 0; - preMaxValue = 0; - preMaxX = NUM_1; - preMinValue = HEART_RATE_LIMIT_UPPER; - preMinX = NUM_1; - countMax = 0; - countMin = 0; - healthDatas.heartRateMax.x = (uint16_t)0XFFFF; - healthDatas.heartRateMax.y = 0; - healthDatas.heartRateMin.x = (uint16_t)0XFFFF; - healthDatas.heartRateMin.y = (uint16_t)0XFFFF; - for (int i = 0; i < HEART_AVE_NUM; i++) - { - healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF; - healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF; - } - if (HeartRateView::GetInstance() != nullptr) - { - HeartRateView::GetInstance()->ClearElectrocardiogram(); - } - SetAveHeartRateCount(0); - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); - } - - HeartModel::HeartModel() - { - /*初始化读取文件*/ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); - HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData(); - /*初始化历史文件*/ - HealthService::GetInstance()->LoadDailyHeartRate(); - if (data != nullptr) - { - currentheart = data->Heart; - timestamp_ms = data->timestamp; - // 更新表盘心率数据 - DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart); - delete data; - } - else - { - currentheart = 0; - timestamp_ms = 0; - } - } - - HeartModel::~HeartModel() - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()"); - HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); - HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); - HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); - HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); - } - - HeartModel *HeartModel::GetInstance(void) - { - static HeartModel heartModel; - return &heartModel; - } - uint16_t HeartModel::GetIndex() - { - return index_; - } - void HeartModel::SetIndex(uint16_t index) - { - index_ = index; - } - - void HeartModel::Init(void) - { - HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); - HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); - HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); - HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); - } - - Point *HeartModel::GetAveHeartRate(void) - { - return healthDatas.heartRateAvg; - } - - void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) - { - healthDatas.heartRateMax.x = coord; - healthDatas.heartRateMax.y = value; - // 插入最大心率 countMax 数据个数 - if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) - { - if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) - { - healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y; - } - else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x == healthDatas.heartRateAvg[aveCount - 1].x)) - { - healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y; - } - else - { - healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax; - countMax = aveCount; - aveCount++; - } - if (healthDatas.heartRateMax.x != 0) - { - if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0) - { - for (int i = 1; i < (aveCount - 1); i++) - { - healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; - } - aveCount--; - countMax--; - } - } - } - preMaxValue = healthDatas.heartRateMax.y; - preMaxX = healthDatas.heartRateMax.x; - } - - void HeartModel::HandleMinHeart(uint16 coord, uint16 value) - { - // 最小心率 - healthDatas.heartRateMin.x = coord; - healthDatas.heartRateMin.y = value; - // 插入最小心率 - // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题??? - // preMinValue 上一个心率最小值 - // preMinX 上一个最小值对应的坐标 - // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理 - if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) - { - - if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) - { - // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据 countMin 即可 - healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y; - } - else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x == healthDatas.heartRateAvg[aveCount - 1].x)) - { - // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值 - healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y; - } - else - { - healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin; - countMin = aveCount; - aveCount++; - } - - // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。 - if (healthDatas.heartRateMin.x != 0) - { - if (healthDatas.heartRateAvg[0].x == 0 && healthDatas.heartRateAvg[1].x == 0) - { - for (int i = 0; i < (aveCount - 1); i++) - { - healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; - } - aveCount--; - countMin--; - } - } - } - preMinValue = healthDatas.heartRateMin.y; - preMinX = healthDatas.heartRateMin.x; - } - - void HeartModel::HeartRatePros(HeartDatas *heartInfo) - { - uint16_t perSecHeartRate = 0; - uint16_t restHeartRate = 0; - - // 每秒心率 - perSecHeartRate = heartInfo->perSec; - if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && perSecHeartRate <= HEART_RATE_LIMIT_UPPER) - { - healthDatas.heartRatePerSec = perSecHeartRate; - } - - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - healthDatas.heartRatePerSec, healthDatas.heartRateRest, healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); - } - - uint16_t HeartModel::GetAveHeartRateCount(void) - { - return aveCount; - } +namespace OHOS { +void HeartModel::ClearHeartData(void) { + pretime = 0; + entryTimes = 0; + aveCount = 0; + preMaxValue = 0; + preMaxX = NUM_1; + preMinValue = HEART_RATE_LIMIT_UPPER; + preMinX = NUM_1; + countMax = 0; + countMin = 0; + healthDatas.heartRateMax.x = (uint16_t)0XFFFF; + healthDatas.heartRateMax.y = 0; + healthDatas.heartRateMin.x = (uint16_t)0XFFFF; + healthDatas.heartRateMin.y = (uint16_t)0XFFFF; + for (int i = 0; i < HEART_AVE_NUM; i++) { + healthDatas.heartRateAvg[i].x = (uint16_t)0XFFFF; + healthDatas.heartRateAvg[i].y = (uint16_t)0XFFFF; + } + if (HeartRateView::GetInstance() != nullptr) { + HeartRateView::GetInstance()->ClearElectrocardiogram(); + } + SetAveHeartRateCount(0); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), + healthDatas.heartRatePerSec, healthDatas.heartRateRest, + healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); +} - uint16_t HeartModel::GetHeartRateMax(void) - { - return healthDatas.heartRateMax.y; - } +HeartModel::HeartModel() { + /*初始化读取文件*/ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); + HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData(); + /*初始化历史文件*/ + HealthService::GetInstance()->LoadDailyHeartRate(); + if (data != nullptr) { + currentheart = data->Heart; + timestamp_ms = data->timestamp; + // 更新表盘心率数据 + DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart); + delete data; + } else { + currentheart = 0; + timestamp_ms = 0; + } + //配置动态数组 + SetArrayData(); +} - uint16_t HeartModel::GetHeartRateMin(void) - { - return healthDatas.heartRateMin.y; - } +HeartModel::~HeartModel() { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::~HeartModel()"); + HearDatatUnsubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); + HearDatatUnsubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); + HearDatatUnsubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); + HearDatatUnsubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); +} - void HeartModel::SetHeartRatePerSec(uint32 sec) - { - healthDatas.heartRatePerSec = sec; - if (HeartRateView::GetInstance() == nullptr) - { - return; - } - HeartRateView::GetInstance()->RefreshHeartRatePerSec(healthDatas.heartRatePerSec); - } +HeartModel *HeartModel::GetInstance(void) { + static HeartModel heartModel; + return &heartModel; +} +uint16_t HeartModel::GetIndex() { return index_; } +void HeartModel::SetIndex(uint16_t index) { index_ = index; } + +void HeartModel::Init(void) { + HeartDataSubscribeTopic(TOPIC_EVENT_HEARTRATE_UPDATA); + HeartDataSubscribeTopic(TOPIC_EVENT_NEXTDAY_UPDATE); + HeartDataSubscribeTopic(TOPIC_EVENT_UTCTIME_UPDATE); + HeartDataSubscribeTopic(TOPIC_EVENT_WEARSTATE_UPDATE); +} - void HeartModel::SetAveHeartRateCount(uint16_t value) - { - aveCount = value; - } +Point *HeartModel::GetAveHeartRate(void) { return healthDatas.heartRateAvg; } + +void HeartModel::HandleMaxHeart(uint16 coord, uint16 value) { + healthDatas.heartRateMax.x = coord; + healthDatas.heartRateMax.y = value; + // 插入最大心率 countMax 数据个数 + if (preMaxValue != healthDatas.heartRateMax.y && aveCount < HEART_AVE_NUM) { + if (preMaxX == healthDatas.heartRateMax.x && countMax < HEART_AVE_NUM) { + healthDatas.heartRateAvg[countMax].y = healthDatas.heartRateMax.y; + } else if (aveCount > NUM_2 && (healthDatas.heartRateMax.x == + healthDatas.heartRateAvg[aveCount - 1].x)) { + healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMax.y; + } else { + healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMax; + countMax = aveCount; + aveCount++; + } + if (healthDatas.heartRateMax.x != 0) { + if (healthDatas.heartRateAvg[0].x == 0 && + healthDatas.heartRateAvg[1].x == 0) { + for (int i = 1; i < (aveCount - 1); i++) { + healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; + } + aveCount--; + countMax--; + } + } + } + preMaxValue = healthDatas.heartRateMax.y; + preMaxX = healthDatas.heartRateMax.x; +} - void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, uint16_t maxRate, uint16_t minRate) - { - uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId(); - /*主界面刷新心率*/ - if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) - { - MainClockView::GetInstance()->RefreshHeartRate(perSec); - } - /*心率卡片刷新心率数据*/ - if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) - { - if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) - { - HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); - HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); - HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); - } - } - /*applist心率刷新心率数据*/ - if (HeartChartView::GetInstance() != nullptr) - { - HeartChartView::GetInstance()->UpdateShowHeart(); - } - } - /* ---------------------------------- 状态检测 ---------------------------------- */ - - // 重新初始化 - void HeartModel::ClearDisplayData() - { - /*显示的心率数据清空*/ - currentheart = 0; - timestamp_ms = 0; - displayheart = 0; - displayheart_max = 0; // 显示最大心率 - displayheart_min = 0; // 显示最小心率 - } - // 获取心率数据 - uint16_t HeartModel::GetHeartdata() - { - return currentheart; - } +void HeartModel::HandleMinHeart(uint16 coord, uint16 value) { + // 最小心率 + healthDatas.heartRateMin.x = coord; + healthDatas.heartRateMin.y = value; + // 插入最小心率 + // avecount 当下有效数据个数,在MaxHeart中也用到,看起来似乎有问题??? + // preMinValue 上一个心率最小值 + // preMinX 上一个最小值对应的坐标 + // 当上一个值与当前值不等,且没有超过总数限制,则进行数据处理 + if (preMinValue != healthDatas.heartRateMin.y && aveCount < HEART_AVE_NUM) { + + if (preMinX == healthDatas.heartRateMin.x && countMin < HEART_AVE_NUM) { + // 上一个最小坐标和当前值一致,且数据没超过限制,则直接赋值给有效数据 + // countMin 即可 + healthDatas.heartRateAvg[countMin].y = healthDatas.heartRateMin.y; + } else if (aveCount > NUM_2 && (healthDatas.heartRateMin.x == + healthDatas.heartRateAvg[aveCount - 1].x)) { + // 有效数据大于2,且当前x值与原始数据最后一个x一致,最后一个数据赋值 + healthDatas.heartRateAvg[aveCount - 1].y = healthDatas.heartRateMin.y; + } else { + healthDatas.heartRateAvg[aveCount] = healthDatas.heartRateMin; + countMin = aveCount; + aveCount++; + } + + // 最初的值一直是0 ,则只显示1个 ,不会在后面增加数据。 + if (healthDatas.heartRateMin.x != 0) { + if (healthDatas.heartRateAvg[0].x == 0 && + healthDatas.heartRateAvg[1].x == 0) { + for (int i = 0; i < (aveCount - 1); i++) { + healthDatas.heartRateAvg[i] = healthDatas.heartRateAvg[i + 1]; + } + aveCount--; + countMin--; + } + } + } + preMinValue = healthDatas.heartRateMin.y; + preMinX = healthDatas.heartRateMin.x; +} - uint16_t HeartModel::GetShowHeartdata() - { - return displayheart; - } - uint16_t HeartModel::GetShowMaxHeartdata() - { - return displayheart_max; - } - uint16_t HeartModel::GetShowMinHeartdata() - { - return displayheart_min; - } - uint32_t HeartModel::GetCheckTime() - { - return timestamp_ms; - } +void HeartModel::HeartRatePros(HeartDatas *heartInfo) { + uint16_t perSecHeartRate = 0; + uint16_t restHeartRate = 0; + + // 每秒心率 + perSecHeartRate = heartInfo->perSec; + if (perSecHeartRate >= HEART_RATE_LIMIT_LOWER && + perSecHeartRate <= HEART_RATE_LIMIT_UPPER) { + healthDatas.heartRatePerSec = perSecHeartRate; + } + + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), + healthDatas.heartRatePerSec, healthDatas.heartRateRest, + healthDatas.heartRateMax.y, healthDatas.heartRateMin.y)); +} - void HeartModel::SetCheckTime(uint32_t time) - { - timestamp_ms = time; - } - void HeartModel::SetResult(HeartResult result) - { - heartresult_ = result; - } - HeartResult HeartModel::GetResult() - { - return heartresult_; - } - // 控制心率检测 - void HeartModel::Heart_Control(HeartState state, HeartCheck check) - { - if (check < checkstate) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Higher execution instruction exists"); - return; - } - if (state == HeartState::End && heartstate == true) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState End"); - uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST; - send_ppg_cmd_msg(md); - heartstate = false; - // 复原检测状态 - checkstate = HeartCheck::RESTSTSTE; - } - else if (state == HeartState::Start && heartstate == false) - { - /*充电状态下不进行检测*/ - bool isCharging = get_charge_stat(); // 获取充电状态 - if (isCharging) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测"); - return; - } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState Start"); - uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; - send_ppg_cmd_msg(md); - heartstate = true; - checkstate = check; - } - } - // 开始检测 - void HeartModel::Heart_Start() - { - displayheart = 0; - // displayheart_max = 0; // 显示最大心率 [每次检测进行清除] - // displayheart_min = 0; // 显示最小心率 [每次检测进行清除] - - SetResult(HeartResult::NOT_TESTED); // 重置检测 - // 进行初始化操作 - if (!sensorstate) - { - Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); - sensorstate = true; - } - } +uint16_t HeartModel::GetAveHeartRateCount(void) { return aveCount; } - // 结束检测 - void HeartModel::Heart_Stop() - { - valid_counter_ = 0; - disvalid_counter_ = 0; - unwear_counter_ = 0; - - /*主界面卡片检测 或者 被动检测*/ - if (checkstate == HeartCheck::CARDCHECK || checkstate == HeartCheck::PASSIVITY) - { - if (heartresult_ == HeartResult::SUCCESS) - { - Heart_Save(); - /*更新曲线*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); - } - /*关闭被动检测*/ - Heart_Control(HeartState::End, HeartCheck::PASSIVITY); - return; - } +uint16_t HeartModel::GetHeartRateMax(void) { + return healthDatas.heartRateMax.y; +} - if (sensorstate) - { - // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 不需要关闭 - sensorstate = false; - Heart_Result(); // 处理结果 - } - } - // 保存检测数据 - void HeartModel::Heart_Save() - { - HeartRateData data; - data.Heart = currentheart; - data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime(); - SetCheckTime(data.timestamp); - HealthService::GetInstance()->UpdateHealthData(data); - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", currentheart, data.timestamp); - } +uint16_t HeartModel::GetHeartRateMin(void) { + return healthDatas.heartRateMin.y; +} - // 显示检测结果// 显示检测结果 - void HeartModel::Heart_Result() - { - // 心率提醒(0开 1关) - uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND); - uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE); - - if (HeartRemindState) - { - // 检查当前心率是否高于或低于阈值 - uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN); - - if (ThresholdState == 0 && currentheart < ThresholdValue && currentheart != 0) - { - // 当前心率低于阈值 - heartresult_ = HeartResult::LOW_RESULT; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue); - } - else if (ThresholdState == 1 && currentheart > ThresholdValue) - { - // 当前心率高于阈值 - heartresult_ = HeartResult::HIGH_RESULT; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", currentheart, ThresholdValue); - } - } +void HeartModel::SetHeartRatePerSec(uint32 sec) { + healthDatas.heartRatePerSec = sec; + if (HeartRateView::GetInstance() == nullptr) { + return; + } + HeartRateView::GetInstance()->RefreshHeartRatePerSec( + healthDatas.heartRatePerSec); +} - // 根据结果进行处理 - switch (heartresult_) - { - case HeartResult::SUCCESS: - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功"); - Heart_Save(); - /*更新曲线*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); - break; - - case HeartResult::NOT_WORN: // 未佩戴状态 - case HeartResult::TIMEOUT: // 超时情况 - case HeartResult::INVALID_DATA: // 无效数据情况 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况", - heartresult_ == HeartResult::NOT_WORN ? "未佩戴状态" : heartresult_ == HeartResult::TIMEOUT ? "超时" - : "无效数据"); - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); - break; - - case HeartResult::LOW_RESULT: - // 低心率结果处理 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况"); - HealthState lowHealthState; - lowHealthState.checkType = BLOOD_CHECK; - lowHealthState.resultStatus = LOW; - lowHealthState.checkResult = ThresholdValue; - HealthService::GetInstance()->SetHealthCurrent(lowHealthState); - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); - break; - - case HeartResult::HIGH_RESULT: - // 高心率结果处理 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况"); - HealthState highHealthState; - highHealthState.checkType = BLOOD_CHECK; - highHealthState.resultStatus = HIGH; - highHealthState.checkResult = ThresholdValue; - HealthService::GetInstance()->SetHealthCurrent(highHealthState); - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); - break; - - default: - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态"); - break; - } - } - void HeartModel::SetWearStatus(int32_t wear) - { - // 设置佩戴状态 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear); - - // 计数更新 - if (wear_ != 1 && wear != 1) - { - unwear_counter_++; // 佩戴错误计时器计数 - } - else - { - unwear_counter_ = 0; // 佩戴正常情况下清零计数器 - } - wear_ = wear; - // 检查是否达到了最大未佩戴计数限制 - if (unwear_counter_ >= MAX_UNWEAR_COUNT) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未佩戴计数最大 unwear_counter: %d", unwear_counter_); - SetResult(HeartResult::NOT_WORN); - Heart_Stop(); - } - } +void HeartModel::SetAveHeartRateCount(uint16_t value) { aveCount = value; } + +void HeartModel::RefreshHeartRateScreen(uint16_t perSec, uint16_t rest, + uint16_t maxRate, uint16_t minRate) { + uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId(); + /*主界面刷新心率*/ + if (currentViewId == VIEW_MAIN && MainClockView::GetInstance() != nullptr) { + MainClockView::GetInstance()->RefreshHeartRate(perSec); + } + /*心率卡片刷新心率数据*/ + if (MainViewSample::GetInstance() != nullptr && + HeartRateView::GetInstance() != nullptr) { + if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) { + HeartRateView::GetInstance()->RefreshHeartRatePerSec(perSec); + HeartRateView::GetInstance()->RefreshHeartRateMax(maxRate); + HeartRateView::GetInstance()->RefreshHeartRateMin(minRate); + } + } + /*applist心率刷新心率数据*/ + if (HeartChartView::GetInstance() != nullptr) { + HeartChartView::GetInstance()->UpdateShowHeart(); + } +} +/* ---------------------------------- 状态检测 + * ---------------------------------- */ + +// 重新初始化 +void HeartModel::ClearDisplayData() { + /*显示的心率数据清空*/ + currentheart = 0; + timestamp_ms = 0; + displayheart = 0; + displayheart_max = 0; // 显示最大心率 + displayheart_min = 0; // 显示最小心率 +} +// 获取心率数据 +uint16_t HeartModel::GetHeartdata() { return currentheart; } + +uint16_t HeartModel::GetShowHeartdata() { return displayheart; } +uint16_t HeartModel::GetShowMaxHeartdata() { return displayheart_max; } +uint16_t HeartModel::GetShowMinHeartdata() { return displayheart_min; } +uint32_t HeartModel::GetCheckTime() { return timestamp_ms; } + +void HeartModel::SetCheckTime(uint32_t time) { timestamp_ms = time; } +void HeartModel::SetResult(HeartResult result) { heartresult_ = result; } +HeartResult HeartModel::GetResult() { return heartresult_; } +// 控制心率检测 +void HeartModel::Heart_Control(HeartState state, HeartCheck check) { + if (check < checkstate) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "Higher execution instruction exists"); + return; + } + if (state == HeartState::End && heartstate == true) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState End"); + uint8_t md = PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST; + send_ppg_cmd_msg(md); + heartstate = false; + // 复原检测状态 + checkstate = HeartCheck::RESTSTSTE; + } else if (state == HeartState::Start && heartstate == false) { + /*充电状态下不进行检测*/ + bool isCharging = get_charge_stat(); // 获取充电状态 + if (isCharging) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "充电不能检测"); + return; + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartState Start"); + uint8_t md = PPG_SERVICE_CMD_TYPE_DO_PPG_TEST; + send_ppg_cmd_msg(md); + heartstate = true; + checkstate = check; + } +} +// 开始检测 +void HeartModel::Heart_Start() { + displayheart = 0; + // displayheart_max = 0; // 显示最大心率 [每次检测进行清除] + // displayheart_min = 0; // 显示最小心率 [每次检测进行清除] + + SetResult(HeartResult::NOT_TESTED); // 重置检测 + // 进行初始化操作 + if (!sensorstate) { + Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); + sensorstate = true; + } +} - void HeartModel::UpHeartdata(uint16_t heart) - { - // 如果处于训练模式,提前返回 - if (uapi_dev_runtime_get_train_status() == 1) - return; - - displayheart = heart; - - // 更新心率和计数器 - if (displayheart != 0) - { - currentheart = displayheart; // 更新当前心率 - valid_counter_++; // 增加有效计数器 - disvalid_counter_ = 0; // 清空无效计数器 - - // 更新最大和最小心率 - displayheart_max = (displayheart_max < displayheart ? displayheart : displayheart_max); - - // 确保最小心率的第一次赋值大于50 - if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART) - { - displayheart_min = displayheart; // 初始化最小心率 - } - else - { - displayheart_min = (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART) - ? displayheart - : displayheart_min; - } - } - else - { - disvalid_counter_++; // 增加无效计数器 - valid_counter_ = 0; // 清零有效计数器 - } +// 结束检测 +void HeartModel::Heart_Stop() { + valid_counter_ = 0; + disvalid_counter_ = 0; + unwear_counter_ = 0; + + /*主界面卡片检测 或者 被动检测*/ + if (checkstate == HeartCheck::CARDCHECK || + checkstate == HeartCheck::PASSIVITY) { + if (heartresult_ == HeartResult::SUCCESS) { + Heart_Save(); + /*更新曲线*/ + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); + } + /*关闭被动检测*/ + Heart_Control(HeartState::End, HeartCheck::PASSIVITY); + return; + } + + if (sensorstate) { + // Heart_Control(HeartState::End, HeartCheck::INITIATIVE); 主动检测心率 + // 不需要关闭 + sensorstate = false; + Heart_Result(); // 处理结果 + } +} +// 保存检测数据 +void HeartModel::Heart_Save() { + HeartRateData data; + data.Heart = currentheart; + data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime(); + SetCheckTime(data.timestamp); + HealthService::GetInstance()->UpdateHealthData(data); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据: %d %ld", + currentheart, data.timestamp); +} - // 检查无效计数器是否达标 - if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 无效数达标 disvalid_counter: %d", disvalid_counter_); - SetResult(HeartResult::INVALID_DATA); // 标记为无效数据 - Heart_Stop(); - return; - } +// 显示检测结果// 显示检测结果 +void HeartModel::Heart_Result() { + // 心率提醒(0开 1关) + uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int( + ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND); + uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int( + ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE); + + if (HeartRemindState) { + // 检查当前心率是否高于或低于阈值 + uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int( + ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN); + + if (ThresholdState == 0 && currentheart < ThresholdValue && + currentheart != 0) { + // 当前心率低于阈值 + heartresult_ = HeartResult::LOW_RESULT; + WEARABLE_LOGE( + WEARABLE_LOG_MODULE_APP, + "检测结果: 低结果情况, currentheart = %d, ThresholdValue = %d", + currentheart, ThresholdValue); + } else if (ThresholdState == 1 && currentheart > ThresholdValue) { + // 当前心率高于阈值 + heartresult_ = HeartResult::HIGH_RESULT; + WEARABLE_LOGE( + WEARABLE_LOG_MODULE_APP, + "检测结果: 高结果情况, currentheart = %d, ThresholdValue = %d", + currentheart, ThresholdValue); + } + } + + // 根据结果进行处理 + switch (heartresult_) { + case HeartResult::SUCCESS: + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功"); + Heart_Save(); + /*更新曲线*/ + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); + break; + + case HeartResult::NOT_WORN: // 未佩戴状态 + case HeartResult::TIMEOUT: // 超时情况 + case HeartResult::INVALID_DATA: // 无效数据情况 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s情况", + heartresult_ == HeartResult::NOT_WORN + ? "未佩戴状态" + : heartresult_ == HeartResult::TIMEOUT ? "超时" + : "无效数据"); + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); + break; + + case HeartResult::LOW_RESULT: + // 低心率结果处理 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况"); + HealthState lowHealthState; + lowHealthState.checkType = BLOOD_CHECK; + lowHealthState.resultStatus = LOW; + lowHealthState.checkResult = ThresholdValue; + HealthService::GetInstance()->SetHealthCurrent(lowHealthState); + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + break; + + case HeartResult::HIGH_RESULT: + // 高心率结果处理 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 高结果情况"); + HealthState highHealthState; + highHealthState.checkType = BLOOD_CHECK; + highHealthState.resultStatus = HIGH; + highHealthState.checkResult = ThresholdValue; + HealthService::GetInstance()->SetHealthCurrent(highHealthState); + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + break; + + default: + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 未知状态"); + break; + } +} +void HeartModel::SetWearStatus(int32_t wear) { + // 设置佩戴状态 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel Weartest::%d", wear); + + // 计数更新 + if (wear_ != 1 && wear != 1) { + unwear_counter_++; // 佩戴错误计时器计数 + } else { + unwear_counter_ = 0; // 佩戴正常情况下清零计数器 + } + wear_ = wear; + // 检查是否达到了最大未佩戴计数限制 + if (unwear_counter_ >= MAX_UNWEAR_COUNT) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果: 未佩戴计数最大 unwear_counter: %d", + unwear_counter_); + SetResult(HeartResult::NOT_WORN); + Heart_Stop(); + } +} - // 检查有效计数器是否达标 - if (valid_counter_ >= MAX_VALID_HRS_COUNT) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 成功 valid_counter: %d currentheart: %d", valid_counter_, currentheart); - SetResult(HeartResult::SUCCESS); // 标记为成功检测 - Heart_Stop(); - return; - } +void HeartModel::UpHeartdata(uint16_t heart) { + // 如果处于训练模式,提前返回 + if (uapi_dev_runtime_get_train_status() == 1) + return; + + displayheart = heart; + + // 更新心率和计数器 + if (displayheart != 0) { + currentheart = displayheart; // 更新当前心率 + valid_counter_++; // 增加有效计数器 + disvalid_counter_ = 0; // 清空无效计数器 + + // 更新最大和最小心率 + displayheart_max = + (displayheart_max < displayheart ? displayheart : displayheart_max); + + // 确保最小心率的第一次赋值大于50 + if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART) { + displayheart_min = displayheart; // 初始化最小心率 + } else { + displayheart_min = + (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART) + ? displayheart + : displayheart_min; + } + } else { + disvalid_counter_++; // 增加无效计数器 + valid_counter_ = 0; // 清零有效计数器 + } + + // 检查无效计数器是否达标 + if (disvalid_counter_ >= MAX_DISVALID_HRS_COUNT) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果: 无效数达标 disvalid_counter: %d", + disvalid_counter_); + SetResult(HeartResult::INVALID_DATA); // 标记为无效数据 + Heart_Stop(); + return; + } + + // 检查有效计数器是否达标 + if (valid_counter_ >= MAX_VALID_HRS_COUNT) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果: 成功 valid_counter: %d currentheart: %d", + valid_counter_, currentheart); + SetResult(HeartResult::SUCCESS); // 标记为成功检测 + Heart_Stop(); + return; + } + + // 刷新心率显示 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "[heart data update displayheart %d displayheart_max %d " + "displayheart_min %d]", + displayheart, displayheart_max, displayheart_min); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), + displayheart, 0, displayheart_max, displayheart_min)); +} - // 刷新心率显示 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[heart data update displayheart %d displayheart_max %d displayheart_min %d]", displayheart, - displayheart_max, displayheart_min); - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&HeartModel::RefreshHeartRateScreen, HeartModel::GetInstance(), - displayheart, 0, displayheart_max, displayheart_min)); - } +void HeartModel::Heart_Update_View(void) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新心率界面"); + int hour = HealthService::GetInstance()->GetCurrentHour(); + if (HeartRateView::GetInstance() != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片"); + HeartRateView::GetInstance()->Update_data_Chart(hour); + } + if (HeartChartView::GetInstance() != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片"); + HeartChartView::GetInstance()->Update_data_Chart(hour); + } +} - void HeartModel::Heart_Update_View(void) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新心率界面"); - int hour = HealthService::GetInstance()->GetCurrentHour(); - if (HeartRateView::GetInstance() != nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面卡片"); - HeartRateView::GetInstance()->Update_data_Chart(hour); - } - if (HeartChartView::GetInstance() != nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片"); - HeartChartView::GetInstance()->Update_data_Chart(hour); - } - } +void HeartModel::CleanAllData(void) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!"); + if (MainViewSample::GetInstance() != nullptr && + HeartRateView::GetInstance() != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片"); + HeartRateView::GetInstance()->CleanAllDataView(); + } + if (HeartChartView::GetInstance() != nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片"); + HeartChartView::GetInstance()->CleanAllDataView(); + } +} - void HeartModel::CleanAllData(void) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Nextday!"); - if (MainViewSample::GetInstance() != nullptr && HeartRateView::GetInstance() != nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新主界面心率卡片"); - HeartRateView::GetInstance()->CleanAllDataView(); - } - if (HeartChartView::GetInstance() != nullptr) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "更新测量心率卡片"); - HeartChartView::GetInstance()->CleanAllDataView(); - } - } +//配置5个动态心率数据 +//最大 最小 +void HeartModel::SetArrayData() { + // 如果没有进行心率检测,则默认为0-220 + if (displayheart_max == 0 || displayheart_min == 0) { + dynamic_heartrate[0] = 0; + dynamic_heartrate[1] = 40; + dynamic_heartrate[2] = 100; + dynamic_heartrate[3] = 160; + dynamic_heartrate[4] = 220; + return; // 直接返回 + } + + // 计算心率范围并添加缓冲 + uint16_t adjusted_min = + (displayheart_min > 10) ? (displayheart_min / 2) : displayheart_min; + uint16_t adjusted_max = + (displayheart_max < 210) ? (displayheart_max + 10) : displayheart_max; + + uint16_t range = adjusted_max - adjusted_min; + uint16_t interval = range / 4; // 每个部分的宽度 + + // 设置动态心率数据 + dynamic_heartrate[0] = adjusted_min; + dynamic_heartrate[1] = adjusted_min + interval; + dynamic_heartrate[2] = adjusted_min + 2 * interval; + dynamic_heartrate[3] = adjusted_min + 3 * interval; + dynamic_heartrate[4] = adjusted_max; + + // 确保所有值为整数 + for (int i = 0; i < 5; i++) { + dynamic_heartrate[i] = static_cast(round(dynamic_heartrate[i])); + } + + // 打印动态心率数据 + for (int i = 0; i < 5; i++) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dynamic_heartrate[%d] = %d", i, + dynamic_heartrate[i]); + } +} +//获取动态心率配置数组 +uint16_t *HeartModel::GetArrayData() { return dynamic_heartrate; } + +// 获取检测字符串 +// 获取检测字符串 +std::string HeartModel::GetCheckString() { + std::string check_string = "检测结果未知"; // 默认返回值 + + // 获取检测数据 + if (currentheart == 0) { + check_string = "暂无检测数据"; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测数据: %s", + check_string.c_str()); // 打印无检测数据信息 + return check_string; // 直接返回,无需继续处理 + } + + // 获取目前的时间戳 + uint32_t currentTime; + if (uapi_get_timestampe_ss(¤tTime) != ERRCODE_SUCC) { + check_string = "获取当前时间戳失败"; // 如果获取时间戳失败,返回相应的信息 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "获取当前时间戳失败"); // 打印错误信息 + return check_string; // 直接返回,无法进行后续计算 + } + + // 检查时间戳是否有效 + if (timestamp_ms == 0) { + check_string = std::to_string(currentheart) + " " + "时间戳无效,无法检测"; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间戳无效,无法检测: %s", + check_string.c_str()); + return check_string; // 直接返回,无需继续处理 + } + + // 进行时间戳相减计算 + uint32_t diff = currentTime - timestamp_ms; + uint32_t diff_min = diff / 60; // 计算分钟差 + uint32_t diff_hour = diff_min / 60; // 计算小时差 + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前时间: %d, 上次检测时间: %d", + currentTime, timestamp_ms); // 打印时间信息 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "时间差 (秒): %d, 时间差 (分钟): %d, 时间差 (小时): %d", diff, + diff_min, diff_hour); // 打印时间差信息 + + // 根据时间差生成检测字符串 + if (diff_min < 1) { + check_string = std::to_string(currentheart) + "次/分 " + "刚刚检测"; + } else if (diff_hour < 1) { // 一个小时内 + check_string = std::to_string(currentheart) + "次/分 " + + std::to_string(diff_min) + "分钟前"; + } else { + check_string = std::to_string(currentheart) + "次/分 " + "超过一个小时前"; + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: %s", + check_string.c_str()); // 打印最终检测结果 + return check_string; } +} // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp new file mode 100644 index 000000000..b85a86986 --- /dev/null +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartRateCardView.cpp @@ -0,0 +1,64 @@ +#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(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