重构心率血氧存储 412/target/2 414/2 414/head
authorCaisking <3449750381@qq.com>
Sat, 29 Jun 2024 06:08:13 +0000 (14:08 +0800)
committerCaisking <3449750381@qq.com>
Sat, 29 Jun 2024 06:08:13 +0000 (14:08 +0800)
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp

index 7f500d7..4b09d1c 100644 (file)
@@ -29,8 +29,7 @@ namespace OHOS
 #endif
     }
     // static char *JSON_F_buf=NULL;
-    cJSON *heart_root = NULL;
-    cJSON *oxygen_root = NULL;
+
     HealthService::HealthService()
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HealthService::HealthService");
@@ -57,18 +56,6 @@ namespace OHOS
     {
         return HEALTH_JSON_PATH_OXYGEN;
     }
-    // 释放 JSON 数据
-    void HealthService::ReleaseJsonData(uint8_t type)
-    {
-        if (type == HEALTH_TYPE_HEART)
-        {
-            cJSON_Delete(heart_root);
-        }
-        if (type == HEALTH_TYPE_OXYGEN)
-        {
-            cJSON_Delete(oxygen_root);
-        }
-    }
     /* --------------------------------- 文件IO操作 --------------------------------- */
     /*创建文件夹*/
     bool HealthService::CreateHealthFolder()
@@ -79,7 +66,7 @@ namespace OHOS
             if (mkdir(HEALTH_JSON_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
             {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir HEALTH_JSON_PATH is error");
-                return false; // Failed to create folder
+                return false;
             }
         }
         if (stat(HEALTH_JSON_PATH_HEART, &info) != 0)
@@ -87,7 +74,7 @@ namespace OHOS
             if (mkdir(HEALTH_JSON_PATH_HEART, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
             {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir HEALTH_JSON_PATH_HEART is error");
-                return false; // Failed to create folder
+                return false;
             }
         }
         if (stat(HEALTH_JSON_PATH_OXYGEN, &info) != 0)
@@ -95,20 +82,13 @@ namespace OHOS
             if (mkdir(HEALTH_JSON_PATH_OXYGEN, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
             {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir HEALTH_JSON_PATH_OXYGEN is error");
-                return false; // Failed to create folder
+                return false;
             }
         }
 
         return true;
     }
-    /*生成文件*/
-    std::string GetJsonFilePath(uint8_t type)
-    {
-        std::string currentDate = GetCurrentDate();
-        const char *healthTypePath = (type == HEALTH_TYPE_HEART) ? HEALTH_JSON_PATH_HEART : HEALTH_JSON_PATH_OXYGEN;
 
-        return healthTypePath + currentDate + ".json";
-    }
     /*生成bin*/
     std::string GetBinFilePath(uint8_t type)
     {
@@ -118,22 +98,26 @@ namespace OHOS
         return healthTypePath + currentDate + ".bin";
     }
 
-    // 加载 JSON 数据
-    bool HealthService::LoadJsonData(uint8_t type)
+    /* --------------------------------- 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())
         {
-            return false;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
+            return nullptr;
         }
 
-        std::string jsonFilePath = GetJsonFilePath(type);
-        printf("GetJsonFilePath:%s\r\n", jsonFilePath.c_str());
-
-        std::ifstream inFile(jsonFilePath);
+        // 读取文件
+        std::ifstream inFile(BLOOD_JSON_PATH);
         if (!inFile.is_open())
         {
-            printf("Failed to open JSON file.\r\n");
-            return false;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
+            return nullptr;
         }
 
         // 读取文件内容到字符串
@@ -141,157 +125,154 @@ namespace OHOS
         buffer << inFile.rdbuf();
         std::string jsonDataString = buffer.str();
         const char *jsonData = jsonDataString.c_str();
-        printf("jsonData:%s\r\n", jsonData);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);
+
+        // 关闭文件
+        inFile.close();
 
         if (jsonDataString.empty())
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
-            inFile.close();
-            return false;
+            return nullptr;
         }
 
-        cJSON *root = cJSON_Parse(jsonData);
-        if (root == NULL)
+        cJSON *oxygen_root = cJSON_Parse(jsonData);
+        if (oxygen_root == NULL)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");
-            inFile.close();
-            return false;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "oxygen_root is empty");
+            return nullptr;
         }
 
-        if (type == HEALTH_TYPE_HEART)
+        BloodOxygenData *data = new BloodOxygenData();
+
+        cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value");
+        cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp");
+
+        if (value_item && timestamp_item)
         {
-            heart_root = root;
+            data->SPO2 = value_item->valueint;
+            data->timestamp = timestamp_item->valuedouble;
         }
-        else if (type == HEALTH_TYPE_OXYGEN)
+        else
         {
-            oxygen_root = root;
+            // 读取的数据异常
+            cJSON_Delete(oxygen_root);
+            delete data;
+            return nullptr;
         }
-
-        // 释放 cJSON 对象内存
-        cJSON_free(root);
-        // 关闭文件
-        inFile.close();
-        return true;
+        cJSON_Delete(oxygen_root);
+        return data;
     }
-    // 保存json数据
-    bool HealthService::UpdateJsonData(uint8_t type)
+    // 读取心率数据
+    HeartRateData *HealthService::ReadHeartRateData()
     {
-        std::string jsonFilePath = GetJsonFilePath(type);
-        std::ofstream outFile(jsonFilePath);
-        if (!outFile.is_open())
+        // 判断文件夹是否存在
+        if (!CreateHealthFolder())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file %s", jsonFilePath.c_str());
-            outFile.close();
-            outFile.open(jsonFilePath);
-            if (!outFile.is_open())
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create file %s", jsonFilePath.c_str());
-                return false;
-            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
+            return nullptr;
         }
 
-        cJSON *root = (type == HEALTH_TYPE_HEART) ? heart_root : oxygen_root;
-        if (root == NULL)
+        // 读取文件
+        std::ifstream inFile(HEART_JSON_PATH);
+        if (!inFile.is_open())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
-            outFile.close();
-            return false;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
+            // 创建一个默认值为 0的数据 存储到json里面 ?
+            return nullptr;
         }
 
-        char *jsonData = cJSON_Print(root);
-        if (jsonData == NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");
-            cJSON_free(jsonData);
-            outFile.close();
-            return false;
-        }
+        // 读取文件内容到字符串
+        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);
 
-        outFile << jsonData;
-        outFile.close();
-        cJSON_free(jsonData);
+        // 关闭文件
+        inFile.close();
 
-        return true;
-    }
-    // 读取血氧数据
-    BloodOxygenData *HealthService::ReadBloodOxygenData()
-    {
-        if (!LoadJsonData(HEALTH_TYPE_OXYGEN))
+        if (jsonDataString.empty())
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
             return nullptr;
         }
 
-        BloodOxygenData *data = new BloodOxygenData();
-        if (oxygen_root != NULL)
-        {
-            data->SPO2 = cJSON_GetObjectItem(oxygen_root, "value")->valueint;
-            data->timestamp = cJSON_GetObjectItem(oxygen_root, "timestamp")->valuedouble;
-        }
-
-        ReleaseJsonData(HEALTH_TYPE_OXYGEN);
-        return data;
-    }
-    // 读取心率数据
-    HeartRateData *HealthService::ReadHeartRateData()
-    {
-        if (!LoadJsonData(HEALTH_TYPE_HEART))
+        cJSON *heart_root = cJSON_Parse(jsonData);
+        if (heart_root == NULL)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_root is empty");
             return nullptr;
         }
 
         HeartRateData *data = new HeartRateData();
-        if (heart_root != NULL)
+
+        cJSON *value_item = cJSON_GetObjectItem(heart_root, "value");
+        cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp");
+
+        if (value_item && timestamp_item)
         {
-            data->Heart = cJSON_GetObjectItem(heart_root, "value")->valueint;
-            data->timestamp = cJSON_GetObjectItem(heart_root, "timestamp")->valuedouble;
+            data->Heart = value_item->valueint;
+            data->timestamp = timestamp_item->valuedouble;
         }
-
-        ReleaseJsonData(HEALTH_TYPE_HEART);
+        else
+        {
+            // 读取的数据异常
+            cJSON_Delete(heart_root);
+            delete data;
+            return nullptr;
+        }
+        cJSON_Delete(heart_root);
         return data;
     }
+    // 保存血氧数据
     bool HealthService::UpdateHealthData(const BloodOxygenData &data)
     {
-        if (!LoadJsonData(HEALTH_TYPE_OXYGEN))
+        // 判断文件夹是否存在
+        if (!CreateHealthFolder())
         {
-            //  加载不出文件时,创建新的cJSON对象
-            oxygen_root = cJSON_CreateObject();
-            if (oxygen_root == NULL)
-            {
-                return false;
-            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
+            return false;
         }
 
-        cJSON *root = oxygen_root;
-        if (root == NULL)
+        // 判断文件是否存在 不存在即创建 并打开以输出模式
+        std::ofstream outFile(BLOOD_JSON_PATH, std::ios::app);
+        if (!outFile.is_open())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
+            // 文件创建失败
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create or open JSON file for writing");
             return false;
         }
 
-        cJSON *valueItem = cJSON_GetObjectItemCaseSensitive(root, "value");
-        cJSON *timestampItem = cJSON_GetObjectItemCaseSensitive(root, "timestamp");
-
-        if (valueItem == nullptr || !cJSON_IsNumber(valueItem))
+        // 创建一个 JSON 对象
+        cJSON *oxygen_root = cJSON_CreateObject();
+        if (oxygen_root == NULL)
         {
-            cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(data.SPO2));
-            cJSON_AddItemToObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
-        }
-        else
-        {
-            cJSON_ReplaceItemInObject(root, "value", cJSON_CreateNumber(data.SPO2));
-            cJSON_ReplaceItemInObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
+            outFile.close();
+            return false;
         }
 
-        if (!UpdateJsonData(HEALTH_TYPE_OXYGEN))
+        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 update JSON data");
-            cJSON_Delete(root);
-            ReleaseJsonData(HEALTH_TYPE_OXYGEN);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");
+            cJSON_free(oxygen_root);
+            outFile.close();
             return false;
         }
 
-        ReleaseJsonData(HEALTH_TYPE_OXYGEN);
+        // 写入 JSON 数据到文件
+        outFile << jsonData;
 
+        cJSON_free(oxygen_root);
+        free(jsonData);
+        outFile.close();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData JSON is ok");
+
+        /* 存储bin文件[协议使用] */
         std::string binFilePath = GetBinFilePath(HEALTH_TYPE_OXYGEN);
         FILE *fp = fopen(binFilePath.c_str(), "ab+");
         if (fp == NULL)
@@ -299,55 +280,62 @@ namespace OHOS
             return false;
         }
 
-        fwrite(&data.timestamp, 1, 4, fp);
+        fwrite(&data.timestamp, 4, 1, fp);
         fwrite(&data.SPO2, 1, 1, fp);
+
         fclose(fp);
 
         return true;
     }
+
+    // 存储心率
     bool HealthService::UpdateHealthData(const HeartRateData &data)
     {
-        if (!LoadJsonData(HEALTH_TYPE_HEART))
+        // 判断文件夹是否存在
+        if (!CreateHealthFolder())
         {
-            //  加载不出文件时,创建新的cJSON对象
-            heart_root = cJSON_CreateObject();
-            if (heart_root == NULL)
-            {
-                return false;
-            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
+            return false;
         }
 
-        cJSON *root = heart_root;
-        if (root == NULL)
+        // 判断文件是否存在 不存在即创建 并打开以输出模式
+        std::ofstream outFile(HEART_JSON_PATH, std::ios::app);
+        if (!outFile.is_open())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
+            // 文件创建失败
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create or open JSON file for writing");
             return false;
         }
 
-        cJSON *valueItem = cJSON_GetObjectItemCaseSensitive(root, "value");
-        cJSON *timestampItem = cJSON_GetObjectItemCaseSensitive(root, "timestamp");
-
-        if (valueItem == nullptr || !cJSON_IsNumber(valueItem))
-        {
-            cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(data.Heart));
-            cJSON_AddItemToObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
-        }
-        else
+        // 创建一个 JSON 对象
+        cJSON *heart_root = cJSON_CreateObject();
+        if (heart_root == NULL)
         {
-            cJSON_ReplaceItemInObject(root, "value", cJSON_CreateNumber(data.Heart));
-            cJSON_ReplaceItemInObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
+            outFile.close();
+            return false;
         }
 
-        if (!UpdateJsonData(HEALTH_TYPE_HEART))
+        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 update JSON data");
-            cJSON_Delete(root);
-            ReleaseJsonData(HEALTH_TYPE_HEART);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");
+            cJSON_free(heart_root);
+            outFile.close();
             return false;
         }
 
-        ReleaseJsonData(HEALTH_TYPE_HEART);
+        // 写入 JSON 数据到文件
+        outFile << jsonData;
+
+        cJSON_free(heart_root);
+        free(jsonData);
+        outFile.close();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData JSON is ok");
 
+        /* 存储bin文件[协议使用] */
         std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
         FILE *fp = fopen(binFilePath.c_str(), "ab+");
         if (fp == NULL)
@@ -355,8 +343,9 @@ namespace OHOS
             return false;
         }
 
-        fwrite(&data.timestamp, 1, 4, fp);
+        fwrite(&data.timestamp, 4, 1, fp);
         fwrite(&data.Heart, 1, 1, fp);
+
         fclose(fp);
 
         return true;