for (int i = 0; i < MAX_HOURS; ++i)
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate:: Time is %d Heart is %d", i, dailyHeartRates[i]);
if (!outFile.write(reinterpret_cast<const char *>(&dailyHeartRates[i]), sizeof(dailyHeartRates[i]))) // 保存心率值
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to write heart rate data.");
struct tm *timeInfo = localtime(×tamp); // 使用 localtime 获取本地时间
// 提取小时
- uint8_t hour = static_cast<uint8_t>(timeInfo->tm_hour);
+ uint16_t hour = static_cast<uint16_t>(timeInfo->tm_hour);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Updating heart rate: 小时 %d, 心率值 %d", hour, heartRate);
currenthour = hour;
}
- uint8_t HealthService::GetHourlyHeartRate(uint8_t hour)
+ uint16_t HealthService::GetHourlyHeartRate(uint16_t hour)
{
// 返回指定小时的心率
if (hour < MAX_HOURS)
return 0; // 或者返回一个异常值
}
- uint8_t HealthService::GetCurrentHour()
+ uint16_t HealthService::GetCurrentHour()
{
// 返回目前小时
- return currenthour;
+ return currenthour;
}
}
bool SaveDailyHeartRate();
bool LoadDailyHeartRate();
void UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate);
- uint8_t GetHourlyHeartRate(uint8_t hour);
+ uint16_t GetHourlyHeartRate(uint16_t hour);
void ClearHourlyHeartRates();
- uint8_t GetCurrentHour();
+ uint16_t GetCurrentHour();
private:
static const int MAX_HOURS = 24;
uint16_t dailyHeartRates[MAX_HOURS]; // 使用数组来存储心率值
HealthState healthState_;
time_t lastLoadTime; // 记录最后加载的时间
- uint8_t currenthour = 0;
+ uint16_t currenthour = 0;
};
}
#endif // HEALTH_MODEL_H
\ No newline at end of file
static HeartChartView *GetInstance(void);
UIImageAnimatorView *GetImageAnimator(void);
- void UpdateShowHeart(void);
bool HeartViewInit();
void InitChartView(void);
void SetDataTopAndBottom();
void HeartImageAnimator();
+ void UpdateShowHeart(void);
+ void Update_data_Chart(int serialIndex);
+
private:
UILabelExt *CurrentHeartText{nullptr};
UILabelExt *MaxHeartText{nullptr};
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
bool wearStatus{true};\r
uint16_t index_ = 0;\r
\r
- uint16_t displayheart; // 显示心率\r
- uint16_t currentheart; // 保存心率\r
- uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\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
{
return g_pHeartCheckView;
}
- /*更新显示数据*/
+
+ /* 更新显示数据 */
void HeartChartView::UpdateShowHeart()
{
+ // 获取当前心率
uint16_t heart_ = HeartModel::GetInstance()->GetShowHeartdata();
std::string heartrateStr = std::to_string(heart_);
+
+ // 更新当前心率显示
if (CurrentHeartText != nullptr && heart_ != 0)
+ {
CurrentHeartText->SetText(heartrateStr.c_str());
+ }
+
+ // 获取最大心率
+ uint16_t heartmax_ = HeartModel::GetInstance()->GetShowMaxHeartdata();
+ std::string heartmaxStr = std::to_string(heartmax_);
+
+ // 更新最大心率显示
+ if (MaxHeartText != nullptr && heartmax_ != 0)
+ {
+ MaxHeartText->SetText(heartmaxStr.c_str());
+ }
+
+ // 获取最小心率
+ uint16_t heartmin_ = HeartModel::GetInstance()->GetShowMinHeartdata();
+ std::string heartminStr = std::to_string(heartmin_);
+
+ // 更新最小心率显示
+ if (MinHeartText != nullptr && heartmin_ != 0)
+ {
+ MinHeartText->SetText(heartminStr.c_str());
+ }
+ }
+ void HeartChartView::Update_data_Chart(int serialIndex)
+ {
+ if (heartchart == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Update_data_Chart fail %d", serialIndex);
+ return;
+ }
+
+ heartdata[serialIndex].x = serialIndex;
+ heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
+
+ heartSerial->AddPoints(heartdata, 24);
+ heartSerial->SetLineColor(Color::Red());
+ heartSerial->SetFillColor(Color::Red());
+ heartSerial->EnableGradient(true);
+
+ heartchart->AddDataSerial(heartSerial);
+ heartchart->Invalidate();
}
/*设置最大最小数据*/
void HeartChartView::SetDataTopAndBottom()
#include "heartrate/include/HeartRateView.h"\r
#include "heartrate/include/HeartDetectionPresenter.h"\r
#include "heartrate/include/HeartResultPresenter.h"\r
+#include "heartrate/include/HeartChartView.h"\r
#include "DialModelHeartRate.h"\r
\r
#include <iostream>\r
#include <iostream>\r
#include <memory>\r
\r
-#include "heartrate/include/HeartRateView.h"\r
#include "ui_service.h"\r
#include "battery_hal.h"\r
\r
heartInfo = nullptr;\r
}\r
}\r
+ /* Nextday 刷新*/\r
if (request->msgId == TOPIC_EVENT_NEXTDAY_UPDATE)\r
{\r
OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
}\r
+ /* UTCTIME 刷新*/\r
if (request->msgId == TOPIC_EVENT_UTCTIME_UPDATE)\r
{\r
OHOS::HeartModel::GetInstance()->ClearHeartData();\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(&OHOS::HeartModel::Heart_Update_View, OHOS::HeartModel::GetInstance()));\r
}\r
- if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE)\r
- {\r
- }\r
+ if (request->msgId == TOPIC_EVENT_WEARSTATE_UPDATE){}\r
}\r
\r
#ifdef __cplusplus\r
{\r
return displayheart;\r
}\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
void HeartModel::Heart_Start()\r
{\r
displayheart = 0;\r
- SetResult(HeartResult::NOT_TESTED); // 成功检测\r
+ displayheart_max = 0; // 显示最大心率\r
+ displayheart_min = 0; // 显示最小心率\r
+\r
+ SetResult(HeartResult::NOT_TESTED); // 重置检测\r
// 进行初始化操作\r
if (!sensorstate)\r
{\r
currentheart = displayheart; // 更新 currentheart\r
valid_counter_++; // 增加有效计数器\r
disvalid_counter_ = 0; // 清空无效计数器\r
+ if (displayheart_max == 0 || displayheart_min == 0)\r
+ {\r
+ displayheart_min = displayheart_max = displayheart;\r
+ }\r
+ if (displayheart_max < displayheart)\r
+ displayheart_max = displayheart;\r
+ if (displayheart_min > displayheart)\r
+ displayheart_min = displayheart;\r
}\r
else\r
{\r
\r
void HeartModel::Heart_Update_View(void)\r
{\r
- if (HeartRateView::GetInstance())\r
+ int hour = HealthService::GetInstance()->GetCurrentHour();\r
+ if (HeartRateView::GetInstance() != nullptr)\r
{\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
+ 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
}\r
LabelInfo bottomLabel = {HEART_RATE_LIMIT_FONT_SIZE, BOTTOM_TEXT_X, BOTTOM_TEXT_Y, BOTTOM_TEXT_WIDTH,\r
BOTTOM_TEXT_HEIGHT};\r
\r
- LabelInfo restRateLabel = {REST_HEART_RATE_FONT_SIZE, REST_HEART_RATE_X, REST_HEART_RATE_Y, REST_HEART_RATE_WIDTH,\r
- REST_HEART_RATE_HEIGHT};\r
- LabelInfo restRateTextLabel1 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X1, REST_HEART_TEXT_Y1,\r
- REST_HEART_TEXT_WIDTH1, REST_HEART_TEXT_HEIGHT1};\r
- LabelInfo restRateTextLabel2 = {REST_HEART_TEXT_FONT_SIZE, REST_HEART_TEXT_X2, REST_HEART_TEXT_Y2,\r
- REST_HEART_TEXT_WIDTH2, REST_HEART_TEXT_HEIGHT2};\r
-\r
topRate = new UILabel();\r
bottomRate = new UILabel();\r
ratePerSec = new UILabel();\r
ratePerSecText = new UILabel();\r
- restRate = new UILabel();\r
- restRateText1 = new UILabel();\r
- restRateText2 = new UILabel();\r
\r
- if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr ||\r
- restRate == nullptr || restRateText1 == nullptr || restRateText2 == nullptr)\r
+ if (topRate == nullptr || bottomRate == nullptr || ratePerSec == nullptr || ratePerSecText == nullptr)\r
{\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRateView::[HeartRateLabelDisplay] new UILabel fail");\r
}\r
SetLabel(bottomRate, bottomLabel);\r
topRate->SetText("--");\r
bottomRate->SetText("--");\r
-\r
- // 静息心率\r
- SetLabel(restRate, restRateLabel);\r
- SetLabel(restRateText1, restRateTextLabel1);\r
- SetLabel(restRateText2, restRateTextLabel2);\r
- restRateText1->SetText("静息");\r
- restRate->SetText("--");\r
- restRateText2->SetText("次/分");\r
}\r
\r
void HeartRateView::HeartRateCoordinate(void)\r
return;\r
}\r
\r
+ /*清空原数据*/\r
+ heartchart->DeleteDataSerial(heartSerial);\r
+\r
heartdata[serialIndex].x = serialIndex;\r
heartdata[serialIndex].y = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);\r
\r