#include "heartrate/include/HeartModel.h"
#include "kv_store.h"
#include "wearable_log.h"
+
#include <cstdint>
#include <ctime>
#include <fstream>
return false;
}
- /* 存储 bin 文件 [协议使用] */
- std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
- FILE *fp = fopen(binFilePath.c_str(), "ab+");
- if (fp == NULL) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "Failed to open binary file for writing");
- uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
- return false;
- }
-
- // 写入数据
- if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 ||
- fwrite(&data.Heart, sizeof(data.Heart), 1, fp) != 1) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "Failed to write data to binary file");
- fclose(fp);
+ if (!save_bin_heart(data)) { // 存储bin文件[协议使用]
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed");
uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
return false;
}
- fclose(fp);
-
uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
return true;
}
CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0);
}
+uint32_t HealthService::GetListTime() {
+ return lastLoadTime;
+}
+
std::string HealthService::formatTime(uint32_t time) {
char labelTime[20];
- if (uapi_get_TIME_STR(time, labelTime, '.', ':', DATE_Y_M_D_H_M) !=
+ if (uapi_get_TIME_STR(time, labelTime, '.', ':', DATE_TIME_DEFULL) !=
ERRCODE_SUCC) {
return "--"; // 默认值
- } else {
- return labelTime; // 成功获取时间
}
+ return labelTime; // 成功获取时间
}
-// 读取心率数据
+
+bool HealthService::save_bin_heart(const HeartRateData &data) {
+ /* 存储 bin 文件 [协议使用] */
+ std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
+ FILE *fp = fopen(binFilePath.c_str(), "ab+");
+ if (fp == NULL) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Failed to open binary file for writing");
+ return false;
+ }
+
+ // 检查时间戳是否有效
+ if (data.timestamp < 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp: %d",
+ data.timestamp);
+ fclose(fp);
+ return false; // 返回错误
+ }
+
+ // 写入数据
+ if (fwrite(&data, sizeof(HeartRateData), 1, fp) != 1) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Failed to write data to binary file");
+ fclose(fp);
+ return false;
+ }
+
+ fclose(fp);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+ "Saved heart data: timestamp = %d, Heart = %d", data.timestamp,
+ data.Heart);
+ return true;
+}
+
std::string HealthService::get_heart_data() {
std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "binFilePath %s", binFilePath.c_str());
- FILE *fp = fopen(binFilePath.c_str(), "rb"); // 以二进制读取模式打开文件
- if (fp == NULL) {
+
+ std::ifstream ifs(binFilePath, std::ios::binary); // 以二进制读取模式打开文件
+ if (!ifs.is_open()) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
"Failed to open binary file for reading");
return "Error: Unable to open file \n"; // 返回错误信息
}
- std::string result;
+ std::stringstream result;
+ result << "file: " << binFilePath << "\n";
HeartRateData data;
- result += "file:" + binFilePath + "\n";
-
// 读取数据直到文件结束
- while (fread(&data, sizeof(HeartRateData), 1, fp) == 1) {
+ while (ifs.read(reinterpret_cast<char *>(&data), sizeof(HeartRateData))) {
+ // 检查时间戳的有效性
+ if (data.timestamp < 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp read: %d",
+ data.timestamp);
+ continue; // 跳过无效的数据
+ }
+
// 将数据格式化为字符串,拼接到结果中
- result +=
- formatTime(data.timestamp) + "," + std::to_string(data.Heart) + "\n";
+ result << formatTime(data.timestamp) << "," << std::to_string(data.Heart) << "\n";
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get_heart_data %d %d",
+ data.timestamp, data.Heart);
}
- if (ferror(fp)) {
+ if (ifs.bad()) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
"Error reading data from binary file");
- fclose(fp);
return "Error: Reading error \n"; // 返回读取错误信息
}
- fclose(fp); // 关闭文件
- return result.empty() ? "No data found \n" : result; // 检查是否读取到数据
+ return result.str().empty() ? "No data found \n"
+ : result.str(); // 检查是否读取到数据
}
+
+// 存储血氧数据
+// bool HealthService::save_bin_blood(const BloodOxygenData &bloodoxygen) {
+// /* 存储bin文件[协议使用] */
+// std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
+// FILE *fp = fopen(binFilePath.c_str(), "ab+");
+// if (fp == NULL) {
+// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+// "Failed to open binary file for writing");
+// return false;
+// }
+// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "binFilePath %s",
+// binFilePath.c_str());
+
+// if (fwrite(&bloodoxygen, sizeof(bloodoxygen), 1, fp) != 1) {
+// WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+// "Failed to write data to binary file");
+// fclose(fp);
+// return false;
+// }
+// fclose(fp);
+// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "save_bin_blood is ok");
+// return true;
+// }
} // namespace OHOS
#include "vibrator_service.h"
#include "wearable_log.h"
#include <array>
+
#include <cmsis_os2.h>
#include <cstdint>
#include <custom_runtime.h>
// 格式化时间的辅助函数
std::string formatTime(uint32_t time) {
char labelTime[20];
- if (uapi_get_TIME_STR(time, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC) {
+ if (uapi_get_TIME_STR(time, labelTime, '.', ':', DATE_TIME_DEFULL) != ERRCODE_SUCC) {
return "--"; // 默认值
} else {
return labelTime; // 成功获取时间
// 3.读取文件里面的心率数据
auto healthService = HealthService::GetInstance();
result << healthService->get_heart_data();
+
result << "=====================\n";
- // 4. 获取一天的心率列表
- result << "Today's HeartRate list\n";
+ // 4. 获取一天的心率列表
+ uint32_t listtime = healthService->GetListTime();
+ std::string listtimestr;
+ if (listtime == 0) {
+ listtimestr = "--"; // 默认值
+ } else {
+ listtimestr = formatTime(listtime);
+ }
+ result << "listt_ime: " << listtimestr << "\n";
for (int serialIndex = 0; serialIndex < 24; ++serialIndex) {
uint32_t heartRate = HealthService::GetInstance()->GetHourlyHeartRate(serialIndex);
uint32_t time = HealthService::GetInstance()->GetHourlyTimestamp(serialIndex);
timestr = formatTime(time);
}
- result << "time " << timestr << ""<<"\n" <<"heart " << heartRate <<""<< "\n"; // 输出每小时的心率
+ result << timestr <<" "<< heartRate << "\n"; // 输出每小时的心率
}
result << "=====================\n";