心率:优化心率存储读写服务
authorCaisking <3449750381@qq.com>
Tue, 3 Dec 2024 09:48:20 +0000 (17:48 +0800)
committerCaisking <3449750381@qq.com>
Tue, 3 Dec 2024 09:48:20 +0000 (17:48 +0800)
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/drivers/peripheral/utils/custom_utils.c

index 6ca39a1..bf84199 100644 (file)
@@ -85,6 +85,33 @@ void save_heart_rate_data() {
 //进行心率列表保存
 void save_heart_list() { HealthService::GetInstance()->SaveDailyHeartRate(); }
 }
+
+//判断时间戳是否为今日
+bool IsTimestampToday(uint32_t timestamp) {
+  // 获取当前时间
+  struct tm currentTm;
+  time_t seconds;
+  time(&seconds);
+  localtime_r(&seconds, &currentTm);
+  // 将给定时间戳转换为 tm 结构
+  struct tm *timestampTm =
+      localtime(reinterpret_cast<const time_t *>(&timestamp));
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前年月日:%d-%d-%d",
+                currentTm.tm_year + 1900, currentTm.tm_mon + 1,
+                currentTm.tm_mday);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "给定时间戳:%d-%d-%d",
+                timestampTm->tm_year + 1900, timestampTm->tm_mon + 1,
+                timestampTm->tm_mday);
+  // 比较年、月和日
+  if ((currentTm.tm_year == timestampTm->tm_year &&
+       currentTm.tm_mon == timestampTm->tm_mon &&
+       currentTm.tm_mday == timestampTm->tm_mday)) {
+    return true;
+  } else {
+    return false;
+  }
+}
+
 static HealthService *g_pHealthService = nullptr;
 /*获取日期*/
 std::string GetCurrentDate() {
@@ -239,88 +266,14 @@ BloodOxygenData *HealthService::ReadBloodOxygenData() {
 }
 
 // 读取心率数据
-HeartRateData *HealthService::ReadHeartRateData() {
-  // 判断文件夹是否存在
-  if (!CreateHealthFolder()) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");
-    return nullptr;
-  }
-
-  // 读取文件
-  std::ifstream inFile(HEART_JSON_PATH);
-  if (!inFile.is_open()) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "Failed to open JSON file, creating default data");
-
-    // 创建默认值为 0 的数据并存储到 JSON 文件
-    HeartRateData defaultData;
-    defaultData.Heart = 0; // 默认心率值
-    defaultData.timestamp = static_cast<double>(time(nullptr)); // 当前时间戳
-
-    // 创建 JSON 对象并写入文件
-    cJSON *defaultRoot = cJSON_CreateObject();
-    cJSON_AddNumberToObject(defaultRoot, "value", defaultData.Heart);
-    cJSON_AddNumberToObject(defaultRoot, "timestamp", defaultData.timestamp);
-
-    // 写入 JSON 文件
-    FILE *file = fopen(HEART_JSON_PATH, "w");
-    if (file) {
-      char *jsonString = cJSON_Print(defaultRoot);
-      fprintf(file, "%s", jsonString);
-      fclose(file);
-      free(jsonString);
-    }
-    cJSON_Delete(defaultRoot);
-
-    // 返回默认数据
-    HeartRateData *data = new HeartRateData(defaultData);
-    return data;
-  }
-
-  // 读取文件内容到字符串
-  std::stringstream buffer;
-  buffer << inFile.rdbuf();
-  std::string jsonDataString = buffer.str();
-  const char *jsonData = jsonDataString.c_str();
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);
-
-  // 关闭文件
-  inFile.close();
-
-  if (jsonDataString.empty()) {
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
-    return nullptr;
-  }
-
-  cJSON *heart_root = cJSON_Parse(jsonData);
-  if (heart_root == NULL) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");
-    return nullptr;
-  }
-
-  HeartRateData *data = new HeartRateData();
-
-  cJSON *value_item = cJSON_GetObjectItem(heart_root, "value");
-  cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp");
-
-  // 检查是否存在必要字段,并验证数据类型
-  if (value_item && cJSON_IsNumber(value_item) && timestamp_item &&
-      cJSON_IsNumber(timestamp_item)) {
-    data->Heart = value_item->valueint;
-    data->timestamp = timestamp_item->valuedouble;
-  } else {
-    // 读取的数据异常
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");
-    cJSON_Delete(heart_root);
-    delete data;
-    return nullptr;
-  }
-
-  cJSON_Delete(heart_root);
-  return data;
+void HealthService::ReadHeartRateData(HeartRateData &data) {
+  data.timestamp = heart_time;
+  data.Heart = heart_rate;
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heart_time: %d, heart_rate: %d",
+                data.timestamp, data.Heart);
 }
 
-// 保存血氧数据
+// 保存血氧数据X
 bool HealthService::UpdateHealthData(const BloodOxygenData &data) {
   // 配置血氧存储状态
   uapi_dev_runtime_set_bloodoxygen_storage_status(1);
@@ -398,76 +351,6 @@ bool HealthService::UpdateHealthData(const BloodOxygenData &data) {
   return true;
 }
 
-//存储心率
-bool HealthService::UpdateHealthData(const HeartRateData &data) {
-  // 配置心率存储状态
-  uapi_dev_runtime_set_heartrate_storage_status(1);
-
-  // 判断文件夹是否存在
-  if (!CreateHealthFolder()) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
-    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-    return false;
-  }
-
-  // 判断文件是否存在,不存在即创建并打开以输出模式
-  std::ofstream outFile(HEART_JSON_PATH, std::ios::trunc);
-  if (!outFile.is_open()) {
-    // 文件创建失败
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "Failed to create or open JSON file for writing");
-    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-    return false;
-  }
-
-  // 创建一个 JSON 对象
-  cJSON *heart_root = cJSON_CreateObject();
-  if (heart_root == NULL) {
-    outFile.close();
-    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-    return false;
-  }
-
-  cJSON_AddItemToObject(heart_root, "value", cJSON_CreateNumber(data.Heart));
-  cJSON_AddItemToObject(heart_root, "timestamp",
-                        cJSON_CreateNumber(data.timestamp));
-
-  char *jsonData = cJSON_Print(heart_root);
-  if (jsonData == NULL) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");
-    cJSON_Delete(heart_root); // 使用 cJSON_Delete 释放内存
-    outFile.close();
-    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-    return false;
-  }
-
-  // 写入 JSON 数据到文件
-  outFile << jsonData;
-
-  // 释放资源
-  cJSON_Delete(heart_root);
-  free(jsonData);
-  outFile.close();
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok");
-
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok");
-
-  if (!SaveDailyHeartRate()) // 进行心率历史数据文件存储
-  {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed");
-    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-    return false;
-  }
-
-  if (!save_bin_heart(data)) { // 存储bin文件[协议使用]
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed");
-    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-    return false;
-  }
-
-  uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
-  return true;
-}
 // 清空健康数据
 bool HealthService::CleanHealthData() {
   //清空心率数组
@@ -500,75 +383,6 @@ void HealthService::ClearHourlyHeartRates() {
   }
 }
 
-// 加载心率列表
-bool HealthService::LoadDailyHeartRate() {
-  ClearHourlyHeartRates(); // 清空数组
-
-  // 使用 RAII 管理文件流
-  std::ifstream file(HEART_DATA_PATH, std::ios::binary);
-  if (!file.is_open()) {
-    std::cerr << "Error: Unable to open heart rate data file for reading"
-              << std::endl;
-    return false;
-  }
-
-  // 读取时间戳
-  file.read(reinterpret_cast<char *>(&lastLoadTime), sizeof(lastLoadTime));
-  if (lastLoadTime == 0) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate is not today");
-    return false; // 无有效数据
-  }
-
-  // 判断时间戳是否为今天
-  tm *lastTm = localtime(&lastLoadTime);
-  time_t now = time(nullptr);
-  tm *currentTm = localtime(&now);
-  if (currentTm->tm_year == lastTm->tm_year &&
-      currentTm->tm_yday == lastTm->tm_yday) {
-    // 今天:进行数据读取
-    for (int i = 0; i < MAX_HOURS; ++i) {
-      HeartRateData rate; // 假设您有一个 HeartRateData 结构体
-      if (!file.read(reinterpret_cast<char *>(&rate), sizeof(rate))) {
-        std::cerr << "Error: Failed to read heart rate data." << std::endl;
-        return false; // 读取失败
-      }
-      dailyHeartRates[i] = rate; // 保存心率和时间戳
-      std::cout << "Hour " << i << ": Heart Rate " << rate.Heart << std::endl;
-    }
-    return true; // 成功读取
-  }
-
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate is not today");
-  return false; // 不是今日
-}
-
-// 保存今日心率列表
-bool HealthService::SaveDailyHeartRate() {
-  std::ofstream outFile(HEART_DATA_PATH, std::ios::binary | std::ios::trunc);
-  if (!outFile.is_open()) {
-    std::cerr << "Error: Unable to open heart rate data file for writing"
-              << std::endl;
-    return false; // 文件打开失败
-  }
-
-  // 存储时间戳
-  time_t currentTime = time(nullptr);
-  outFile.write(reinterpret_cast<const char *>(&currentTime),
-                sizeof(currentTime));
-
-  // 存储心率数据
-  for (const auto &rate : dailyHeartRates) {
-    if (!outFile.write(reinterpret_cast<const char *>(&rate), sizeof(rate))) {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                    "Failed to write heart rate data to file");
-      return false; // 写入失败
-    }
-  }
-
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate is ok");
-  return true; // 成功保存
-}
-
 // 更新心率列表项
 void HealthService::UpdateHourlyHeartRate(time_t timestamp,
                                           uint16_t heartRate) {
@@ -645,27 +459,11 @@ bool HealthService::SaveHeartMaxMin(uint16_t max, uint16_t min) {
 }
 // 加载最大最小值
 void HealthService::LoadHeartMaxMin(uint16_t &max, uint16_t &min) {
-  std::ifstream inFile(HEART_MAX_MIN_PATH, std::ios::binary);
-  if (!inFile.is_open()) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file %s",
-                  HEART_MAX_MIN_PATH);
-    return;
-  }
-
-  inFile.read(reinterpret_cast<char *>(&max), sizeof(max));
-  if (!inFile) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to read max value");
-    return;
-  }
-
-  inFile.read(reinterpret_cast<char *>(&min), sizeof(min));
-  if (!inFile) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to read min value");
-    return;
-  }
-
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadHeartMaxMin is ok max %d, min %d",
-                max, min);
+  max = heart_max;
+  if (heart_min == 255)
+    min = 0;
+  else
+    min = heart_min;
 }
 
 //进行消息发送
@@ -678,9 +476,8 @@ void HealthService::send_blood_save() {
       CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0);
 }
 
-uint32_t HealthService::GetListTime() {
-  return lastLoadTime;
-}
+//获取list文件
+uint32_t HealthService::GetListTime() { return lastLoadTime; }
 
 std::string HealthService::formatTime(uint32_t time) {
   char labelTime[20];
@@ -691,9 +488,42 @@ std::string HealthService::formatTime(uint32_t time) {
   return labelTime; // 成功获取时间
 }
 
+/********************************************************************************************/
+/*******************************************************************************************
+ */
+//存储心率
+bool HealthService::UpdateHealthData(const HeartRateData &data) {
+  // 配置心率存储状态
+  uapi_dev_runtime_set_heartrate_storage_status(1);
+
+  // 判断文件夹是否存在
+  if (!CreateHealthFolder()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
+    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  if (data.timestamp < 0 || (!IsTimestampToday(data.timestamp))) {
+    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp %d",
+                  data.timestamp);
+    return false;
+  }
+  if (!save_bin_heart(data)) { // 存储bin文件[协议使用]
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed");
+    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
+  return true;
+}
+//存储bin文件
 bool HealthService::save_bin_heart(const HeartRateData &data) {
   /* 存储 bin 文件 [协议使用] */
   std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "save_bin_heart binFilePath %s",
+                binFilePath.c_str());
   FILE *fp = fopen(binFilePath.c_str(), "ab+");
   if (fp == NULL) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
@@ -701,16 +531,9 @@ bool HealthService::save_bin_heart(const HeartRateData &data) {
     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_LOGD(WEARABLE_LOG_MODULE_APP, "sizeof(HeartRateData) %d", sizeof(HeartRateData));
+  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);
@@ -723,7 +546,84 @@ bool HealthService::save_bin_heart(const HeartRateData &data) {
                 data.Heart);
   return true;
 }
-
+// 加载心率数据 24小时数据
+bool HealthService::LoadDailyHeartRate() {  
+  ClearHourlyHeartRates(); // 清空数组 赋0操作  
+  std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);  
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate");  
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "binFilePath %s", binFilePath.c_str());  
+
+  // 配置心率存储状态  
+  uapi_dev_runtime_set_heartrate_storage_status(1);  
+
+  std::ifstream ifs(binFilePath, std::ios::binary);  
+  if (!ifs.is_open()) {  
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,  
+                  "Failed to open binary file for reading");  
+    uapi_dev_runtime_set_heartrate_storage_status(0);  
+    return false;  
+  }  
+
+  HeartRateData data;  
+
+  // 选取每个小时的最新数据  
+  while (true) {  
+    // 先读取时间戳  
+    if (!ifs.read(reinterpret_cast<char *>(&data.timestamp), sizeof(data.timestamp))) {  
+      break; // 如果读取失败,退出循环  
+    }  
+
+    // 再读取心率值  
+    if (!ifs.read(reinterpret_cast<char *>(&data.Heart), sizeof(data.Heart))) {  
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,  
+                    "Failed to read heart rate value");  
+      break; // 如果读取失败,退出循环  
+    }  
+
+    // 检查时间戳是否为当天  
+    if (IsTimestampToday(data.timestamp)) {  
+      // 计算当前小时  
+      time_t rawTime = static_cast<time_t>(data.timestamp);  
+      struct tm *timeInfo = localtime(&rawTime);  
+      int hour = timeInfo->tm_hour; // 获取小时数  
+
+      // 更新每小时最新心率数据  
+      if (dailyHeartRates[hour].timestamp < data.timestamp) {  
+        dailyHeartRates[hour].Heart = data.Heart; // 更新最新数据  
+        dailyHeartRates[hour].timestamp = data.timestamp;  
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "hour %d %d %d", hour,  
+                      data.timestamp, data.Heart);  
+      }  
+
+      // 更新最高、最低心率  
+      if (data.Heart > heart_max) {  
+        heart_max = data.Heart;  
+      }  
+      if (data.Heart < heart_min) {  
+        heart_min = data.Heart;  
+      }  
+      // 更新最新心率数据  
+      heart_time = data.timestamp;  
+      heart_rate = data.Heart;  
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,  
+                    "Loaded heart data: timestamp = %d, Heart = %d",  
+                    data.timestamp, data.Heart);  
+    } else {  
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,  
+                    "error data: timestamp = %d, Heart = %d", data.timestamp,  
+                    data.Heart);  
+    }  
+  }
+
+  // 打印list内容
+  // for (int i = 0; i < MAX_HOURS; i++) {
+  //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dailyHeartRates[%d] %d %d", i,
+  //                 dailyHeartRates[i].timestamp, dailyHeartRates[i].Heart);
+  // }
+  
+  uapi_dev_runtime_set_heartrate_storage_status(0);  
+  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());
@@ -749,7 +649,8 @@ std::string HealthService::get_heart_data() {
     }
 
     // 将数据格式化为字符串,拼接到结果中
-    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);
   }
index a2fa5d2..6c4fe38 100644 (file)
@@ -23,11 +23,12 @@ namespace OHOS
     const char *GET_HEALTH_JSON_PATH_C_STR_HEART();
     const char *GET_HEALTH_JSON_PATH_C_STR_OXYGEN();
 
-    typedef enum
-    {
-        HEALTH_TYPE_HEART,
-        HEALTH_TYPE_OXYGEN,
+    typedef enum {
+      HEALTH_TYPE_HEART,
+      HEALTH_TYPE_OXYGEN,
     } HEALTH_TYPE;
+
+#pragma pack(push, 1) // 设置对齐为1字节  
     typedef struct
     {
         uint8_t SPO2;       // 血氧值
@@ -37,8 +38,8 @@ namespace OHOS
     {
         uint8_t Heart;      // 心率值
         uint32_t timestamp; // 最近一次检测时间
-    } HeartRateData;
-
+    }  HeartRateData;
+#pragma pack(pop) // 恢复默认对齐
     // 检查类
     typedef enum
     {
@@ -71,7 +72,7 @@ namespace OHOS
         bool CreateHealthFolder();
         bool LoadJsonData(uint8_t type);                  // 加载json
         BloodOxygenData *ReadBloodOxygenData();           // 读取血氧数据
-        HeartRateData *ReadHeartRateData();               // 读取心率数据
+        void ReadHeartRateData( HeartRateData &data);               // 读取心率数据
         bool UpdateHealthData(const HeartRateData &data); // 更新心率数据
         bool UpdateHealthData(const BloodOxygenData &data);
         void ReleaseJsonData(uint8_t type); // 释放json
@@ -110,13 +111,21 @@ namespace OHOS
         bool save_bin_heart(const HeartRateData &heart);
         bool save_bin_blood(const BloodOxygenData &bloodoxygen);
 
-    private:
+      private:
+        //曲线显示数据
         static const int MAX_HOURS = 24;
-        HeartRateData dailyHeartRates[MAX_HOURS]; // 存储心率值,检测时间戳?使用结构体?
+        HeartRateData dailyHeartRates[MAX_HOURS];
+        //最大最小心率
+        uint8_t heart_max = 0;
+        uint8_t heart_min = 255;
+        //最新一次检测的时间与心率值
+        uint32_t heart_time = 0;
+        uint8_t heart_rate = 0;
+
+        //健康状态
         HealthState healthState_;
         time_t lastLoadTime; // 记录最后加载的时间
         uint16_t currenthour = 0;
-
     };
 }
 #endif // HEALTH_MODEL_H
\ No newline at end of file
index 466a2a2..00809cf 100644 (file)
@@ -178,8 +178,7 @@ private:
   uint16_t displayheart_max = 0; // 显示最大心率\r
   uint16_t displayheart_min = 0; // 显示最小心率\r
 \r
-  uint32\r
-      timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
+  uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
 \r
   bool initstatus = true;\r
   bool heartstate = false;\r
index ee2c95a..26b589f 100644 (file)
@@ -195,20 +195,19 @@ void HeartModel::ClearHeartData(void) {
 \r
 HeartModel::HeartModel() {\r
   /*初始化读取文件*/\r
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\r
-  HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()");\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
+  HeartRateData data;\r
+  HealthService::GetInstance()->ReadHeartRateData(data);\r
+  currentheart = data.Heart;\r
+  timestamp_ms = data.timestamp;\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentheart %d timestamp_ms %d",\r
+                currentheart, timestamp_ms);\r
+  // 更新表盘心率数据\r
+  DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart);\r
+\r
   //读取最大最小值\r
   HealthService::GetInstance()->LoadHeartMaxMin(displayheart_max,\r
                                                 displayheart_min);\r
@@ -502,17 +501,26 @@ void HeartModel::Heart_Save() {
 \r
   uint32_t timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
   SetCheckTime(timestamp);\r
-#if MSG_SAVE_TEST\r
-  HeartRateData data;\r
-  data.Heart = currentheart;\r
-  data.timestamp = timestamp_ms;\r
-  HealthService::GetInstance()->UpdateHealthData(data);\r
-#else\r
+\r
   HealthService::GetInstance()->send_heart_save();\r
+  \r
+  // 更新最大和最小心率\r
+  displayheart_max =\r
+      (displayheart_max < currentheart ? currentheart : displayheart_max);\r
+\r
+  // 确保最小心率的第一次赋值大于50\r
+  if (displayheart_min == 0 && currentheart > MIN_DISPLAY_HEART) {\r
+    displayheart_min = currentheart; // 初始化最小心率\r
+  } else {\r
+    displayheart_min =\r
+        (displayheart_min > currentheart && currentheart > MIN_DISPLAY_HEART)\r
+            ? currentheart\r
+            : displayheart_min;\r
+  }\r
+\r
   // 将更新曲线写到这里提前更新\r
   HealthService::GetInstance()->UpdateHourlyHeartRate(timestamp_ms,\r
                                                       currentheart);\r
-#endif\r
   // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld",\r
   // currentheart,data.timestamp);\r
 }\r
@@ -596,7 +604,12 @@ void HeartModel::logAndChangeSlice(HeartResult result) {
           : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据";\r
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg);\r
   uapi_set_screen_on_api(); // 亮屏\r
-  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+  //需要先判断界面 心率卡片界面\r
+  if (MainViewSample::GetInstance()) {\r
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
+      NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+  } else\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
 }\r
 // 处理低心率情况\r
 void HeartModel::handleLowHeartRate() {\r
@@ -604,7 +617,11 @@ void HeartModel::handleLowHeartRate() {
   HealthState lowHealthState = {HEART_CHECK, LOW, thresholdValue};\r
   HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
   uapi_set_screen_on_api(); // 亮屏\r
-  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+  if (MainViewSample::GetInstance()) {\r
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
+      NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+  } else\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
 }\r
 // 处理高心率情况\r
 void HeartModel::handleHighHeartRate() {\r
@@ -612,7 +629,11 @@ void HeartModel::handleHighHeartRate() {
   HealthState highHealthState = {HEART_CHECK, HIGH, thresholdValue};\r
   HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
   uapi_set_screen_on_api(); // 亮屏\r
-  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+  if (MainViewSample::GetInstance()) {\r
+    if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE)\r
+      NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+  } else\r
+    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
 }\r
 // 设置佩戴状态\r
 void HeartModel::SetWearStatus() {\r
@@ -670,19 +691,6 @@ void HeartModel::UpHeartdata(uint16_t heart) {
     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
index 87de1e3..816445a 100644 (file)
@@ -400,15 +400,10 @@ bool get_lcd_state(void)
 
 uint8_t ble_get_heart_data()
 {
-    OHOS::HeartRateData *data=(OHOS::HeartRateData*)malloc(sizeof(OHOS::HeartRateData));
-    data=OHOS::HealthService ::GetInstance()->ReadHeartRateData();
+    OHOS::HeartRateData data;
+    OHOS::HealthService ::GetInstance()->ReadHeartRateData(data);
     uint8_t heart=0;
-    if(data==NULL)
-    heart=0;
-    else
-    heart=data->Heart;
-
-    free(data);
+    heart=data.Heart;
     return heart;
 }
 
@@ -2364,7 +2359,7 @@ void get_health_HEART_data_path(char *path, uint8_t day,uint16_t max_size)
  
     char timeday[12] = {0};
     uapi_get_YYMMDD_Time_extend(timeday,'\0',day);
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",timeday);
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%s\r\n",timeday);
 
     sprintf_s(path,max_size,"%s%s.bin",OHOS::GET_HEALTH_JSON_PATH_C_STR_HEART(),timeday);
 
index 506b47c..c8177f5 100644 (file)
@@ -448,15 +448,15 @@ void send_big_data(ble_data_type type,char *data, uint16 datalen)
         memcpy(buf + 17, data, datalen); // 复制数据到缓冲区\r
         buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC\r
     }\r
-     #ifdef BLE_LOG\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");\r
+\r
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"data:\r\n");\r
     \r
     for(int i=0;i<17 + datalen + 1;i++)\r
     {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);\r
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);\r
     }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");\r
-    #endif\r
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"end\r\n");\r
+\r
     // 根据标志位选择发送数据的方式\r
   if(type.type==6)\r
     {\r
@@ -6108,7 +6108,7 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i
     FILE *fp= fopen(path,"r+");\r
     if(fp==NULL)\r
     {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
         return false;\r
     }\r
     fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
@@ -6118,7 +6118,8 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i
     int num_check=file_size%5;\r
     if(num_check!=0)\r
     {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据有误 %d %d \r\n", file_size, num);\r
+        fclose(fp);\r
         return false;\r
     }\r
     \r
@@ -6139,7 +6140,8 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i
         if(read_size!=0)\r
         {\r
             ble_data_type type_={0x01,id,file_size,pack,pack_id};\r
-            send_big_data(type_,buf,read_size);\r
+            send_big_data(type_, buf, read_size);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%d %d %d %d %s\r\n",read_size,file_size,pack_id,pack);\r
         }\r
         \r
 \r
@@ -6180,7 +6182,7 @@ void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)
     int check_num=data_len%single_data;\r
     if(check_num!=0)\r
     {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);\r
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);\r
 \r
         ble_data_type type_={0x01,id,0,1,1};\r
         send_big_data(type_,NULL,0);\r
index 992bb12..98f1aac 100644 (file)
@@ -286,7 +286,7 @@ void shutdown_reboot_prejobs_task(void)
     saveancsdata(); //接收到信息进行保存 暂时不修改
     //保存当天心率数据
     // save_heart_data();//测量完成保存
-    save_heart_maxmin();//存储最大最小状态值
+    // save_heart_maxmin();//存储最大最小状态值
 
     //表盘配置
     // dial_file_save();