#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
#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