Merge #1243 into sdk602patch0911 from refs/changes/1243/head 1246/target/1
author袁清梦 <3449750381@qq.com>
Thu, 24 Oct 2024 00:17:55 +0000 (00:17 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Thu, 24 Oct 2024 00:17:55 +0000 (00:17 +0000)
Code review from 袁清梦

* refs/changes/1243/head: (8 commits squashed)

  - 系统:增加亮屏函数打印

  - Merge branch &#39;sdk602patch0911&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0911

  - #994 心率界面检测显示有全天心率数据(最大值 ,最小值 )手表重启后,最大值 ,最小值消失显示为--

  - 心率:增加读取控制

  - 血氧:增加读写控制

  - 系统:修改死机文件的生成路径

  - 健康数据:增加存储宏控制

  - 心率:关闭MSG_SAVE_TEST宏

Signed-off-by: Caisking <3449750381@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1243
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
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/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h
code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp
code/sdk/drivers/peripheral/utils/custom_fileoperate_service.c
code/sdk/drivers/peripheral/utils/custom_utils.c

index 3689e36..586273d 100644 (file)
@@ -5,6 +5,7 @@
 #include "wearable_log.h"
 #include "heart_blood/health_service/health_service.h"
 #include "custom_utils.h"
+
 extern "C" errcode_t uapi_get_timestamp_ms(uint32_t *tm);
 
 #include "custom_utils.h"
@@ -141,13 +142,16 @@ namespace OHOS
     // 保存检测数据
     void BloodOxygenModel::Blood_Save()
     {
+        uint32_t timestamp = BloodResultPresenter::GetInstance()->GetCurrentTime();
+        SetCheckTime(timestamp);
+#if MSG_SAVE_TEST
         BloodOxygenData data;
         data.SPO2 = currentspo2;
-        data.timestamp = BloodResultPresenter::GetInstance()->GetCurrentTime();
-        SetCheckTime(data.timestamp);
+        data.timestamp = timestamp_ms;
         HealthService::GetInstance()->UpdateHealthData(data);
-
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentspo2, data.timestamp);
+#else
+        HealthService::GetInstance()->send_blood_save();
+    #endif
     }
 
     // 显示检测结果// 显示检测结果
index 595885f..a19afb1 100644 (file)
@@ -1,34 +1,87 @@
 #include "health_service.h"
-#include <iostream>
-#include "wearable_log.h"
+#include "bloodoxygen/include/BloodOxygenModel.h"
 #include "cJSON.h"
-#include <sys/stat.h>
-#include <ctime>
+#include "heartrate/include/HeartModel.h"
 #include "kv_store.h"
-#include "custom_utils.h"
-#include "custom_runtime.h"
+#include "wearable_log.h"
+#include <cstdint>
+#include <ctime>
 #include <fstream>
+#include <iostream>
 #include <sstream>
 #include <string>
-#include <cstdint>
-#include "heartrate/include/HeartModel.h"
-#include "bloodoxygen/include/BloodOxygenModel.h"
+#include <sys/stat.h>
 
-namespace OHOS
-{
-    extern "C"
-    {
-        void uapi_dev_runtime_set_bloodoxygen_storage_status(uint8_t status);
-        void uapi_dev_runtime_set_heartrate_storage_status(uint8_t status);
-
-        void save_heart_data()
-        {
-            printf("save_heart_data\r\n");
-            OHOS::HealthService::GetInstance()->SaveDailyHeartRate();
-            return;
-        }
+#include "custom_runtime.h"
+#include "custom_utils.h"
+
+#include "safemodemanager/include/SafeModeManagerModelC.h"
+namespace OHOS {
+extern "C" {
+void uapi_dev_runtime_set_bloodoxygen_storage_status(uint8_t status);
+void uapi_dev_runtime_set_heartrate_storage_status(uint8_t status);
+
+void save_heart_data() {
+  printf("save_heart_data\r\n");
+  OHOS::HealthService::GetInstance()->SaveDailyHeartRate();
+  return;
+}
+
+void save_heart_maxmin() {
+  printf("save_heart_maxmin\r\n");
+  uint16_t max_heart_data =
+      OHOS::HeartModel::GetInstance()->GetShowMaxHeartdata();
+  uint16_t min_heart_data =
+      OHOS::HeartModel::GetInstance()->GetShowMinHeartdata();
+
+  OHOS::HealthService::GetInstance()->SaveHeartMaxMin(max_heart_data,
+                                                      min_heart_data);
+  return;
+}
+void save_blood_oxygen_data() {
+  OHOS::BloodOxygenData data;
+  data.SPO2 = OHOS::BloodOxygenModel::GetInstance()->GetSPO2data();
+  data.timestamp = OHOS::BloodOxygenModel::GetInstance()->GetCheckTime();
+  // 进行血氧存储 如果处于读取
+  if (uapi_dev_runtime_get_bloodoxygen_storage_status()) {
+    printf("save_blood_oxygen_data is reading\n");
+    //进行延迟
+    LOS_Msleep(100);
+    if (uapi_dev_runtime_get_bloodoxygen_storage_status()) {
+      printf("save_blood_oxygen_data is reading again\n");
+      //重新发送该消息
+      do_custom_fileoperate_service_check_msg(
+          CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0);
+      return;
     }
+  }
+  HealthService::GetInstance()->UpdateHealthData(data);
+  printf("save_blood_oxygen_data success\n");
+  return;
+}
 
+void save_heart_rate_data() {
+  OHOS::HeartRateData data;
+  data.Heart = OHOS::HeartModel::GetInstance()->GetHeartdata();
+  data.timestamp = OHOS::HeartModel::GetInstance()->GetCheckTime();
+  // 进行心率存储 如果处于读取
+  if (uapi_dev_runtime_get_heartrate_storage_status()) {
+    printf("save_heart_rate_data is reading\n");
+    //进行延迟
+    LOS_Msleep(100);
+    if (uapi_dev_runtime_get_heartrate_storage_status()) {
+      printf("save_heart_rate_data is reading again\n");
+      //重新发送该消息
+      do_custom_fileoperate_service_check_msg(
+          CUSTOM_FILEOPERATE_MSG_TYPE_HEARTRATE_SAVE, nullptr, 0);
+      return;
+    }
+  }
+  HealthService::GetInstance()->UpdateHealthData(data);
+  printf("save_heart_rate_data success\n");
+  return;
+}
+}
 static HealthService *g_pHealthService = nullptr;
 /*获取日期*/
 std::string GetCurrentDate() {
@@ -91,490 +144,539 @@ bool HealthService::CreateHealthFolder() {
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                     "mkdir HEALTH_JSON_PATH_OXYGEN is error");
       return false;
-       }
-   }
-
-        return true;
     }
+  }
 
-    /*生成bin*/
-    std::string GetBinFilePath(uint8_t type)
-    {
-        std::string currentDate = GetCurrentDate();
-        const char *healthTypePath = (type == HEALTH_TYPE_HEART) ? HEALTH_JSON_PATH_HEART : HEALTH_JSON_PATH_OXYGEN;
+  return true;
+}
 
-        return healthTypePath + currentDate + ".bin";
-    }
+/*生成bin*/
+std::string GetBinFilePath(uint8_t type) {
+  std::string currentDate = GetCurrentDate();
+  const char *healthTypePath = (type == HEALTH_TYPE_HEART)
+                                   ? HEALTH_JSON_PATH_HEART
+                                   : HEALTH_JSON_PATH_OXYGEN;
 
-    /* --------------------------------- json操作 --------------------------------- */
-    static constexpr const char *HEART_JSON_PATH = "/user/userdata/health/heart.json";
-    static constexpr const char *BLOOD_JSON_PATH = "/user/userdata/health/blood.json";
-
-    // 读取血氧数据  
-    BloodOxygenData *HealthService::ReadBloodOxygenData()  
-    {  
-        // 判断文件夹是否存在  
-        if (!CreateHealthFolder())  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");  
-            return nullptr;  
-        }  
-
-        // 读取文件  
-        std::ifstream inFile(BLOOD_JSON_PATH);  
-        if (!inFile.is_open())  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");  
-            return nullptr;  
-        }  
-
-        // 读取文件内容到字符串  
-        std::stringstream buffer;  
-        buffer << inFile.rdbuf();  
-        std::string jsonDataString = buffer.str();  
-        const char *jsonData = jsonDataString.c_str();  
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);  
-
-        // 关闭文件  
-        inFile.close();  
-
-        if (jsonDataString.empty())  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");  
-            return nullptr;  
-        }  
-
-        cJSON *oxygen_root = cJSON_Parse(jsonData);  
-        if (oxygen_root == NULL)  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");  
-            return nullptr;  
-        }  
-
-        BloodOxygenData *data = new BloodOxygenData();  
-
-        cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value");  
-        cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp");  
-
-        // 检查是否存在必要字段,并验证数据类型  
-        if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item))  
-        {  
-            data->SPO2 = value_item->valueint;  
-            data->timestamp = timestamp_item->valuedouble;  
-
-            // 进一步验证数据的合理性  
-            if (data->SPO2 < 0 || data->SPO2 > 100)  // 血氧饱和度范围是0-100  
-            {  
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid SPO2 value: %d", data->SPO2);  
-                cJSON_Delete(oxygen_root);  
-                delete data;  
-                return nullptr;  
-            }  
-        }  
-        else  
-        {  
-            // 读取的数据异常  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");  
-            cJSON_Delete(oxygen_root);  
-            delete data;  
-            return nullptr;  
-        }  
-
-        cJSON_Delete(oxygen_root);  
-        return data;  
-    }
+  return healthTypePath + currentDate + ".bin";
+}
 
-    // 读取心率数据  
-    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_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);  
-
-        // 关闭文件  
-        inFile.close();  
-
-        if (jsonDataString.empty())  
-        {  
-            WEARABLE_LOGE(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;  
-    }
+/* --------------------------------- json操作 ---------------------------------
+ */
+static constexpr const char *HEART_JSON_PATH =
+    "/user/userdata/health/heart.json";
+static constexpr const char *BLOOD_JSON_PATH =
+    "/user/userdata/health/blood.json";
+
+// 读取血氧数据
+BloodOxygenData *HealthService::ReadBloodOxygenData() {
+  // 判断文件夹是否存在
+  if (!CreateHealthFolder()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");
+    return nullptr;
+  }
 
-    // 保存血氧数据
-    bool HealthService::UpdateHealthData(const BloodOxygenData &data)  
-    {  
-        // 配置血氧存储状态  
-        uapi_dev_runtime_set_bloodoxygen_storage_status(1);  
-
-        // 判断文件夹是否存在  
-        if (!CreateHealthFolder())  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");  
-            uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态  
-            return false;  
-        }  
-
-        // 判断文件是否存在,不存在即创建并打开以输出模式  
-        std::ofstream outFile(BLOOD_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_bloodoxygen_storage_status(0); // 恢复状态  
-            return false;  
-        }  
-
-        // 创建一个 JSON 对象  
-        cJSON *oxygen_root = cJSON_CreateObject();  
-        if (oxygen_root == NULL)  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create JSON object");  
-            outFile.close();  
-            uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态  
-            return false;  
-        }  
-
-        cJSON_AddItemToObject(oxygen_root, "value", cJSON_CreateNumber(data.SPO2));  
-        cJSON_AddItemToObject(oxygen_root, "timestamp", cJSON_CreateNumber(data.timestamp));  
-
-        char *jsonData = cJSON_Print(oxygen_root);  
-        if (jsonData == NULL)  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");  
-            cJSON_Delete(oxygen_root); // 释放内存  
-            outFile.close();  
-            uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态  
-            return false;  
-        }  
-
-        // 写入 JSON 数据到文件  
-        outFile << jsonData;  
-
-        // 释放资源  
-        cJSON_Delete(oxygen_root);  
-        free(jsonData);  
-        outFile.close();  
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData SPO2 JSON is ok");  
-
-        /* 存储bin文件[协议使用] */  
-        std::string binFilePath = GetBinFilePath(HEALTH_TYPE_OXYGEN);  
-        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_bloodoxygen_storage_status(0); // 恢复状态  
-            return false;  
-        }  
-
-        // 写入数据  
-        if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 ||  
-            fwrite(&data.SPO2, sizeof(data.SPO2), 1, fp) != 1)  
-        {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write data to binary file");  
-            fclose(fp);  
-            uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态  
-            return false;  
-        }  
-
-        fclose(fp);  
-
-
-        uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态  
-        return true;  
-    }
+  // 读取文件
+  std::ifstream inFile(BLOOD_JSON_PATH);
+  if (!inFile.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
+    return nullptr;
+  }
 
-    //存储心率
-    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_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok");  
-
-        // 写入文件到当天历史数据  
-        UpdateHourlyHeartRate(data.timestamp, data.Heart);
-
-        WEARABLE_LOGE(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;  
-        }  
-
-        /* 存储 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);  
-        uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态  
-        return false;  
-        }  
-
-        fclose(fp);  
-
-        uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态  
-        return true;  
-    }
-    // 清空健康数据
-    bool HealthService::CleanHealthData() {
-        //清空心率数组
-        ClearHourlyHeartRates();
-        //进行数据存储
-        SaveDailyHeartRate();
-
-        HeartModel::GetInstance()->ClearDisplayData();
-        // BloodOxygenModel::GetInstance()->ClearDisplayData();
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData  is ok");
-        return true;
-    }
+  // 读取文件内容到字符串
+  std::stringstream buffer;
+  buffer << inFile.rdbuf();
+  std::string jsonDataString = buffer.str();
+  const char *jsonData = jsonDataString.c_str();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);
 
-    HealthState HealthService::GetHealthCurrent()
-    {
-        return healthState_;
-    }
-    void HealthService::SetHealthCurrent(HealthState healthState)
+  // 关闭文件
+  inFile.close();
+
+  if (jsonDataString.empty()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
+    return nullptr;
+  }
+
+  cJSON *oxygen_root = cJSON_Parse(jsonData);
+  if (oxygen_root == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");
+    return nullptr;
+  }
+
+  BloodOxygenData *data = new BloodOxygenData();
+
+  cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value");
+  cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp");
+
+  // 检查是否存在必要字段,并验证数据类型
+  if (value_item && cJSON_IsNumber(value_item) && timestamp_item &&
+      cJSON_IsNumber(timestamp_item)) {
+    data->SPO2 = value_item->valueint;
+    data->timestamp = timestamp_item->valuedouble;
+
+    // 进一步验证数据的合理性
+    if (data->SPO2 < 0 || data->SPO2 > 100) // 血氧饱和度范围是0-100
     {
-        healthState_ = healthState;
-    }
-    /* ------------------------------- 心率当天历史数据处理 ------------------------------ */
-    static constexpr const char *HEART_DATA_PATH =  "/user/userdata/health/heart_history.bin";
-
-    //清空数组
-    void HealthService::ClearHourlyHeartRates() {  
-        for (int i = 0; i < MAX_HOURS; ++i) {  
-            dailyHeartRates[i].Heart = 0;  
-            dailyHeartRates[i].timestamp = 0;  
-        }
-    }
-    
-    // 加载心率列表  
-    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_LOGE(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_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate is ok");  
-        return true; // 成功保存  
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid SPO2 value: %d",
+                    data->SPO2);
+      cJSON_Delete(oxygen_root);
+      delete data;
+      return nullptr;
     }
+  } else {
+    // 读取的数据异常
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");
+    cJSON_Delete(oxygen_root);
+    delete data;
+    return nullptr;
+  }
 
-    // 更新心率列表项
-    void HealthService::UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate) {  
-        struct tm *timeInfo = localtime(&timestamp);  
-        uint16_t hour = static_cast<uint16_t>(timeInfo->tm_hour);  
-
-        if (hour < MAX_HOURS && heartRate > 0) {  
-            dailyHeartRates[hour] = {heartRate, timestamp}; // 更新心率和时间戳
-            currenthour = hour; // 记录当前小时
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok");
-        }
-        else {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid hour or heart rate value %d",hour);
-        }
+  cJSON_Delete(oxygen_root);
+  return data;
+}
+
+// 读取心率数据
+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_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);
+
+  // 关闭文件
+  inFile.close();
 
-    // 获取指定小时的心率
-    uint16_t HealthService::GetHourlyHeartRate(uint16_t hour) {  
-        if (hour < MAX_HOURS) {  
-            return dailyHeartRates[hour].Heart; // 默认为 0 如果未更新  
-        }  
-        return 0; // 或者返回一个异常值
+  if (jsonDataString.empty()) {
+    WEARABLE_LOGE(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;
+}
+
+// 保存血氧数据
+bool HealthService::UpdateHealthData(const BloodOxygenData &data) {
+  // 配置血氧存储状态
+  uapi_dev_runtime_set_bloodoxygen_storage_status(1);
+
+  // 判断文件夹是否存在
+  if (!CreateHealthFolder()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
+    uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  // 判断文件是否存在,不存在即创建并打开以输出模式
+  std::ofstream outFile(BLOOD_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_bloodoxygen_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  // 创建一个 JSON 对象
+  cJSON *oxygen_root = cJSON_CreateObject();
+  if (oxygen_root == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create JSON object");
+    outFile.close();
+    uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  cJSON_AddItemToObject(oxygen_root, "value", cJSON_CreateNumber(data.SPO2));
+  cJSON_AddItemToObject(oxygen_root, "timestamp",
+                        cJSON_CreateNumber(data.timestamp));
+
+  char *jsonData = cJSON_Print(oxygen_root);
+  if (jsonData == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");
+    cJSON_Delete(oxygen_root); // 释放内存
+    outFile.close();
+    uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  // 写入 JSON 数据到文件
+  outFile << jsonData;
+
+  // 释放资源
+  cJSON_Delete(oxygen_root);
+  free(jsonData);
+  outFile.close();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData SPO2 JSON is ok");
+
+  /* 存储bin文件[协议使用] */
+  std::string binFilePath = GetBinFilePath(HEALTH_TYPE_OXYGEN);
+  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_bloodoxygen_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  // 写入数据
+  if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 ||
+      fwrite(&data.SPO2, sizeof(data.SPO2), 1, fp) != 1) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Failed to write data to binary file");
+    fclose(fp);
+    uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  fclose(fp);
+
+  uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态
+  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_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok");
+
+  // 写入文件到当天历史数据
+  UpdateHourlyHeartRate(data.timestamp, data.Heart);
+
+  WEARABLE_LOGE(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;
+  }
+
+  /* 存储 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);
+    uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
+    return false;
+  }
+
+  fclose(fp);
+
+  uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态
+  return true;
+}
+// 清空健康数据
+bool HealthService::CleanHealthData() {
+  //清空心率数组
+  ClearHourlyHeartRates();
+  //进行数据存储
+  SaveDailyHeartRate();
+
+  HeartModel::GetInstance()->ClearDisplayData();
+  // BloodOxygenModel::GetInstance()->ClearDisplayData();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData  is ok");
+  return true;
+}
+
+HealthState HealthService::GetHealthCurrent() { return healthState_; }
+void HealthService::SetHealthCurrent(HealthState healthState) {
+  healthState_ = healthState;
+}
+/* ------------------------------- 心率当天历史数据处理
+ * ------------------------------ */
+static constexpr const char *HEART_DATA_PATH =
+    "/user/userdata/health/heart_history.bin";
+
+//清空数组
+void HealthService::ClearHourlyHeartRates() {
+  for (int i = 0; i < MAX_HOURS; ++i) {
+    dailyHeartRates[i].Heart = 0;
+    dailyHeartRates[i].timestamp = 0;
+  }
+}
+
+// 加载心率列表
+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;
     }
-    //获取指定小时的时间戳
-    time_t HealthService::GetHourlyTimestamp(uint16_t hour) {  
-        if (hour < MAX_HOURS) {  
-            return dailyHeartRates[hour].timestamp; // 默认为 0 如果未更新  
-        }  
-        return 0; // 或者返回一个异常值
+    return true; // 成功读取
+  }
+
+  WEARABLE_LOGE(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_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate is ok");
+  return true; // 成功保存
+}
+
+// 更新心率列表项
+void HealthService::UpdateHourlyHeartRate(time_t timestamp,
+                                          uint16_t heartRate) {
+  struct tm *timeInfo = localtime(&timestamp);
+  uint16_t hour = static_cast<uint16_t>(timeInfo->tm_hour);
+
+  if (hour < MAX_HOURS && heartRate > 0) {
+    dailyHeartRates[hour] = {heartRate, timestamp}; // 更新心率和时间戳
+    currenthour = hour;                             // 记录当前小时
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok");
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Invalid hour or heart rate value %d", hour);
+  }
+}
 
-    // 获取当前小时
-    uint16_t HealthService::GetCurrentHour() {  
-        return currenthour;  
-    }  
+// 获取指定小时的心率
+uint16_t HealthService::GetHourlyHeartRate(uint16_t hour) {
+  if (hour < MAX_HOURS) {
+    return dailyHeartRates[hour].Heart; // 默认为 0 如果未更新
+  }
+  return 0; // 或者返回一个异常值
+}
+//获取指定小时的时间戳
+time_t HealthService::GetHourlyTimestamp(uint16_t hour) {
+  if (hour < MAX_HOURS) {
+    return dailyHeartRates[hour].timestamp; // 默认为 0 如果未更新
+  }
+  return 0; // 或者返回一个异常值
+}
+
+// 获取当前小时
+uint16_t HealthService::GetCurrentHour() { return currenthour; }
+/*
+心率最大最小值存储
+关机存储
+*/
+#define HEART_MAX_MIN_PATH "/user/userdata/health/heart_max_min.bin"
+// 保存最大最小值
+bool HealthService::SaveHeartMaxMin(uint16_t max, uint16_t min) {
+  std::ofstream outFile(HEART_MAX_MIN_PATH, std::ios::binary | std::ios::trunc);
+  if (!outFile.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file");
+    return false;
+  }
+
+  outFile.write(reinterpret_cast<const char *>(&max), sizeof(max));
+  if (!outFile) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write max value");
+    return false;
+  }
+
+  outFile.write(reinterpret_cast<const char *>(&min), sizeof(min));
+  if (!outFile) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write min value");
+    return false;
+  }
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveHeartMaxMin is ok max %d, min %d",
+                max, min);
+  return true;
+}
+// 加载最大最小值
+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_LOGE(WEARABLE_LOG_MODULE_APP, "LoadHeartMaxMin is ok max %d, min %d",
+                max, min);
+}
+
+//进行消息发送
+void HealthService::send_heart_save() {
+    do_custom_fileoperate_service_check_msg(
+        CUSTOM_FILEOPERATE_MSG_TYPE_HEARTRATE_SAVE, nullptr, 0);
+}
+void HealthService::send_blood_save() {
+     do_custom_fileoperate_service_check_msg(
+        CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0);
+}
 } // namespace OHOS
index 7aa6a07..4ab119d 100644 (file)
@@ -15,6 +15,7 @@
 #include <cstdint>
 
 #define HEART_MAX_POINTS 360
+#define MSG_SAVE_TEST 0
 namespace OHOS
 {
     const char *GET_HEALTH_JSON_PATH_C_STR_HEART();
@@ -93,6 +94,11 @@ namespace OHOS
         void ClearHourlyHeartRates();
         uint16_t GetCurrentHour();
 
+        bool SaveHeartMaxMin(uint16_t max, uint16_t min);
+        void LoadHeartMaxMin(uint16_t &max, uint16_t &min);
+
+        void send_heart_save();
+        void send_blood_save();
 
     private:
         static const int MAX_HOURS = 24;
index bbdfd0e..77271ca 100644 (file)
@@ -70,6 +70,7 @@ Subscriber heartSubscirber = {
 };\r
 static void ProcessHeartRateUpdate(Request *request);\r
 static void RefreshHeartData();\r
+void save_heart_maxmin();\r
 void HeartDataSubscribeTopic(Topic topic) {\r
   BroadcastApi *broadcastApi = nullptr;\r
   IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,\r
@@ -219,6 +220,9 @@ HeartModel::HeartModel() {
     currentheart = 0;\r
     timestamp_ms = 0;\r
   }\r
+  //读取最大最小值\r
+  HealthService::GetInstance()->LoadHeartMaxMin(displayheart_max,\r
+                                               displayheart_min);\r
   // 配置动态数组\r
   SetArrayData();\r
 }\r
@@ -498,15 +502,19 @@ void HeartModel::Heart_Stop() {
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
 }\r
 // 保存检测数据\r
-void HeartModel::Heart_Save() {\r
+void HeartModel::Heart_Save(){\r
+\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 = HeartResultPresenter::GetInstance()->GetCurrentTime();\r
-  SetCheckTime(data.timestamp);\r
+  data.timestamp = timestamp_ms;\r
   HealthService::GetInstance()->UpdateHealthData(data);\r
-\r
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld", currentheart,\r
-                data.timestamp);\r
+#else\r
+  HealthService::GetInstance()->send_heart_save();\r
+#endif\r
+  //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld", currentheart,data.timestamp);\r
 }\r
 \r
 void HeartModel::Heart_Result() {\r
@@ -668,11 +676,11 @@ void HeartModel::UpHeartdata(uint16_t heart) {
   }\r
 \r
   // 检查无效计数器是否达标\r
-  if(uapi_dev_runtime_get_sleep_monitoring_status()) //睡眠监测模式下,增加未佩戴个数最大值,避免误判\r
-      max_valid_count = MAX_DISVALID_HRS_COUNT * 2;\r
+  if (uapi_dev_runtime_get_sleep_monitoring_status()) //睡眠监测模式下,增加未佩戴个数最大值,避免误判\r
+    max_valid_count = MAX_DISVALID_HRS_COUNT * 2;\r
   else\r
-      max_valid_count = MAX_DISVALID_HRS_COUNT;\r
-      \r
+    max_valid_count = MAX_DISVALID_HRS_COUNT;\r
+\r
   if (disvalid_counter_ >= max_valid_count) {\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
                   "检测结果:无效数达标 disvalid_counter:%d", disvalid_counter_);\r
index d38e535..3e539e4 100644 (file)
@@ -10,6 +10,10 @@ extern "C" {
 void repair_file_start(void);
 //进行运动存储
 void store_sport_data(void);
+//进行心率存储
+void save_heart_rate_data(void);
+//进行血氧存储
+void save_blood_oxygen_data(void);
 
 #ifdef __cplusplus
 }
index 701d7b6..20d5029 100644 (file)
@@ -382,13 +382,12 @@ private:
 
   std::vector<HeartRateEntry> heartRateTable; // 心率表
   std::vector<PaceEntry> paceTable;           // 配速表
-  const size_t MAX_ENTRIES = 100000;           // 规定最大进场条目数
-
+  const size_t MAX_ENTRIES = 100000;          // 规定最大进场条目数
 
   int user_maxHeart{190}; // 用户最高心率
-  int user_Age{20};      // 用户年龄
-  int user_autoget{1};  // 自动获取设置
-  int user_freq{10};     // 训练频率
+  int user_Age{20};       // 用户年龄
+  int user_autoget{1};    // 自动获取设置
+  int user_freq{10};      // 训练频率
   int user_Intensity{160};
 };
 } // namespace OHOS
index 7bdc5e8..f95a61c 100644 (file)
@@ -625,9 +625,9 @@ void TraingModel::SetTimestamp() {
     Endstate = true;
 
 #if 0
-            // 重置训练目标 [发生在训练前]
-            sportTag_ = 0;
-            sportTagType_ = ExerciseTag::UNKNOW;
+      // 重置训练目标 [发生在训练前]
+      sportTag_ = 0;
+      sportTagType_ = ExerciseTag::UNKNOW;
 #endif
     /*运动结束并且是手表发起的运动*/
     if (Openingway == false) {
@@ -964,7 +964,8 @@ int TraingModel::GetGoaldegree() {
 
 /* 训练目标校验 */
 void TraingModel::CheckSportTag() {
-  if (sportdata->tag) {
+  // 运动开始才计算
+  if (sportdata->tag && sportState_!= ExerciseState::General) {
     sportdata->goaldegree = GetGoaldegree();
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d",
                   sportdata->goaldegree);
index fae1fe1..87d4b2c 100644 (file)
@@ -360,7 +360,7 @@ namespace OHOS
     }
 
     // 获取死机列表
-    static const char *SHUTDOWN_PATH = "/user/tar";
+    static const char *SHUTDOWN_PATH = "/user/system/tar";
     std::string DebugOutputViewEventListener::get_shutdown_info()
     {
         std::ostringstream oss;
index 7842fe8..8ba44f0 100644 (file)
@@ -118,8 +118,10 @@ static void custom_fileoperate_service_check_task(void const *arg)
             store_sport_data();
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_HEARTRATE_SAVE:
+            save_heart_rate_data();
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE:
+            save_blood_oxygen_data();
             break;
         case CUSTOM_FILEOPERATE_MSG_TYPE_MESSAGEDATA_SAVE:
             break;
index 26cb5ea..5cdabe7 100644 (file)
@@ -217,6 +217,7 @@ void shutdown_reboot_prejobs_task(void)
     saveancsdata(); //接收到信息进行保存 暂时不修改
     //保存当天心率数据
     // save_heart_data();//测量完成保存
+    save_heart_maxmin();//存储最大最小状态值
 
     //表盘配置
     // dial_file_save();
@@ -1199,14 +1200,17 @@ int32_t uapi_get_screen_state(void)
 /**
  * @brief 亮屏函数
  */
-void uapi_set_screen_on_api(void)
-{
+void uapi_set_screen_on_api(void) {
+    PRINT("执行亮屏函数!\n");
     const power_display_svr_api_t *display_api = power_display_svr_get_api();
-    display_api->set_screen_set_keepon_timeout(0);
-    if (display_api->get_screen_state() != SCREEN_ON)
-    {
+    // display_api->set_screen_set_keepon_timeout(0);
+    PRINT("目前屏幕状态:%d\n",display_api->get_screen_state());
+    if (display_api->get_screen_state() != SCREEN_ON) {
+        PRINT("执行亮屏操作!\n");
         display_api->turn_on_screen();
+        return;
     }
+    PRINT("亮屏函数执行失败!\n");
     // 设置屏幕亮5000
     // display_api->set_screen_set_keepon_timeout(5000);
 }
@@ -2047,7 +2051,7 @@ int uapi_tar_file(const char *src_path,const char *tar_path,char *tarfilename)
     }
     else
     {
-        uapi_check_tar_file_count("/user/tar"); //有新的tar文件生成则检查tar文件数量
+        uapi_check_tar_file_count("/user/system/tar"); //有新的tar文件生成则检查tar文件数量
     }
     free(buffer);
     return ret;
@@ -2062,7 +2066,7 @@ int uapi_save_exc(void)
     char buildversion[64]={0};
     uapi_get_buildversion((uint8_t*)&buildversion[0],sizeof(buildversion));
     sprintf(str, tarfilePath,buildversion,timestamp);
-    return uapi_tar_file("/user/exc","/user/tar",str);
+    return uapi_tar_file("/user/exc","/user/system/tar",str);
 }
 
 void uapi_restore_factory_setting(void)