重构心率血氧存储内容 414/1
authorCaisking <3449750381@qq.com>
Fri, 28 Jun 2024 12:20:22 +0000 (20:20 +0800)
committerCaisking <3449750381@qq.com>
Fri, 28 Jun 2024 12:20:22 +0000 (20:20 +0800)
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

index 1dcf25f..c0b2796 100644 (file)
@@ -175,7 +175,7 @@ namespace OHOS
             data->timestamp = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %d", spo2, data->timestamp);
             SetCheckTime(data->timestamp);
-            HealthService::GetInstance()->UpdateBloodOxygenData(*data);
+            HealthService::GetInstance()->UpdateHealthData(*data);
             delete data;
             /* -------------------------------------------------------------------------- */
         }
index 6e8abc5..7f500d7 100644 (file)
@@ -57,6 +57,18 @@ 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()
@@ -105,6 +117,7 @@ namespace OHOS
 
         return healthTypePath + currentDate + ".bin";
     }
+
     // 加载 JSON 数据
     bool HealthService::LoadJsonData(uint8_t type)
     {
@@ -155,24 +168,51 @@ namespace OHOS
         }
 
         // 释放 cJSON 对象内存
-        cJSON_Delete(root);
+        cJSON_free(root);
         // 关闭文件
         inFile.close();
         return true;
     }
-    // 释放 JSON 数据
-    void HealthService::ReleaseJsonData(uint8_t type)
+    // 保存json数据
+    bool HealthService::UpdateJsonData(uint8_t type)
     {
-        if (type == HEALTH_TYPE_HEART)
+        std::string jsonFilePath = GetJsonFilePath(type);
+        std::ofstream outFile(jsonFilePath);
+        if (!outFile.is_open())
         {
-            cJSON_Delete(heart_root);
+            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;
+            }
         }
-        if (type == HEALTH_TYPE_OXYGEN)
+
+        cJSON *root = (type == HEALTH_TYPE_HEART) ? heart_root : oxygen_root;
+        if (root == NULL)
         {
-            cJSON_Delete(oxygen_root);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
+            outFile.close();
+            return false;
+        }
+
+        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;
         }
-    }
 
+        outFile << jsonData;
+        outFile.close();
+        cJSON_free(jsonData);
+
+        return true;
+    }
     // 读取血氧数据
     BloodOxygenData *HealthService::ReadBloodOxygenData()
     {
@@ -182,262 +222,143 @@ namespace OHOS
         }
 
         BloodOxygenData *data = new BloodOxygenData();
-        cJSON *latestData = cJSON_GetObjectItem(oxygen_root, "spo2_latest_data");
-        if (latestData != NULL)
+        if (oxygen_root != NULL)
         {
-            data->SPO2 = cJSON_GetObjectItem(latestData, "value")->valueint;
-            data->timestamp = cJSON_GetObjectItem(latestData, "timestamp")->valuedouble;
+            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))
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadJsonData  is error ");
             return nullptr;
         }
 
         HeartRateData *data = new HeartRateData();
-        cJSON *latestData = cJSON_GetObjectItem(heart_root, "heart_latest_data");
-        if (latestData != NULL)
+        if (heart_root != NULL)
         {
-            // 读取心率值
-            data->Heart = cJSON_GetObjectItem(latestData, "value")->valueint;
-            data->timestamp = static_cast<uint32_t>(cJSON_GetObjectItem(latestData, "timestamp")->valueint);
-
-            char *jsonStr = cJSON_Print(heart_root);
-            if (jsonStr != NULL)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRootJSONData: %s", jsonStr);
-                cJSON_free(jsonStr);
-            }
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
+            data->Heart = cJSON_GetObjectItem(heart_root, "value")->valueint;
+            data->timestamp = cJSON_GetObjectItem(heart_root, "timestamp")->valuedouble;
         }
-        ReleaseJsonData(HEALTH_TYPE_HEART);
 
+        ReleaseJsonData(HEALTH_TYPE_HEART);
         return data;
     }
-
-    bool HealthService::UpdateBloodOxygenData(const BloodOxygenData &data)
+    bool HealthService::UpdateHealthData(const BloodOxygenData &data)
     {
         if (!LoadJsonData(HEALTH_TYPE_OXYGEN))
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadJsonData is error");
-            // return false;
-        }
-
-        if (oxygen_root == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "oxygen_root is first");
+            //  加载不出文件时,创建新的cJSON对象
             oxygen_root = cJSON_CreateObject();
-            if (oxygen_root == nullptr)
+            if (oxygen_root == NULL)
             {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create cJSON object for oxygen_root");
                 return false;
             }
-            cJSON_AddItemToObject(oxygen_root, "spo2_latest_data", cJSON_CreateObject());
-            cJSON_AddItemToObject(oxygen_root, "spo2_data_list", cJSON_CreateArray());
         }
 
-        cJSON *latestData = cJSON_GetObjectItemCaseSensitive(oxygen_root, "spo2_latest_data");
-        if (latestData == NULL || !cJSON_IsObject(latestData))
+        cJSON *root = oxygen_root;
+        if (root == NULL)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get spo2_latest_data object");
-            cJSON_Delete(oxygen_root);
-            oxygen_root = nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
             return false;
         }
 
-        cJSON *SPO2 = cJSON_GetObjectItemCaseSensitive(latestData, "value");
-        if (SPO2 == nullptr && !cJSON_IsNumber(SPO2))
+        cJSON *valueItem = cJSON_GetObjectItemCaseSensitive(root, "value");
+        cJSON *timestampItem = cJSON_GetObjectItemCaseSensitive(root, "timestamp");
+
+        if (valueItem == nullptr || !cJSON_IsNumber(valueItem))
         {
-            // Add spo2_latest_data
-            cJSON_AddItemToObject(latestData, "value", cJSON_CreateNumber(data.SPO2));
-            cJSON_AddItemToObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+            cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(data.SPO2));
+            cJSON_AddItemToObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
         }
         else
         {
-            cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.SPO2));
-            cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
-        }
-
-        // Update or add to spo2_data_list
-        cJSON *dataList = cJSON_GetObjectItem(oxygen_root, "spo2_data_list");
-        if (dataList != NULL && cJSON_IsArray(dataList))
-        {
-            // Check if data already exists in the list
-            bool dataExists = false;
-            cJSON *dataItem = NULL;
-            cJSON_ArrayForEach(dataItem, dataList)
-            {
-                cJSON *timestampItem = cJSON_GetObjectItemCaseSensitive(dataItem, "timestamp");
-                if (timestampItem != NULL && cJSON_IsNumber(timestampItem) && timestampItem->valuedouble == data.timestamp)
-                {
-                    cJSON_ReplaceItemInObject(dataItem, "value", cJSON_CreateNumber(data.SPO2));
-                    dataExists = true;
-                    break;
-                }
-            }
-
-            if (!dataExists)
-            {
-                cJSON *newData = cJSON_CreateObject();
-                cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.SPO2));
-                cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
-                cJSON_AddItemToArray(dataList, newData);
-            }
+            cJSON_ReplaceItemInObject(root, "value", cJSON_CreateNumber(data.SPO2));
+            cJSON_ReplaceItemInObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
         }
 
         if (!UpdateJsonData(HEALTH_TYPE_OXYGEN))
         {
-            printf("UpdateJsonData failed.\r\n");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to update JSON data");
+            cJSON_Delete(root);
             ReleaseJsonData(HEALTH_TYPE_OXYGEN);
             return false;
         }
-        /*存储bin*/
-        std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
+
+        ReleaseJsonData(HEALTH_TYPE_OXYGEN);
+
+        std::string binFilePath = GetBinFilePath(HEALTH_TYPE_OXYGEN);
         FILE *fp = fopen(binFilePath.c_str(), "ab+");
         if (fp == NULL)
+        {
             return false;
+        }
+
         fwrite(&data.timestamp, 1, 4, fp);
         fwrite(&data.SPO2, 1, 1, fp);
         fclose(fp);
 
-        ReleaseJsonData(HEALTH_TYPE_OXYGEN);
-
         return true;
     }
-
-    bool HealthService::UpdateHeartRateData(const HeartRateData &data)
+    bool HealthService::UpdateHealthData(const HeartRateData &data)
     {
         if (!LoadJsonData(HEALTH_TYPE_HEART))
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadJsonData is error");
-            // return false;
-        }
-
-        if (heart_root == nullptr)
-        {
+            //  加载不出文件时,创建新的cJSON对象
             heart_root = cJSON_CreateObject();
-            if (heart_root == nullptr)
+            if (heart_root == NULL)
             {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create cJSON object for heart_root");
                 return false;
             }
-
-            cJSON_AddItemToObject(heart_root, "heart_latest_data", cJSON_CreateObject());
-            cJSON_AddItemToObject(heart_root, "heart_data_list", cJSON_CreateArray());
         }
 
-        cJSON *latestData = cJSON_GetObjectItemCaseSensitive(heart_root, "heart_latest_data");
-        if (latestData == NULL || !cJSON_IsObject(latestData))
+        cJSON *root = heart_root;
+        if (root == NULL)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get heart_latest_data object");
-            cJSON_Delete(heart_root);
-            heart_root = nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
             return false;
         }
 
-        cJSON *Heart = cJSON_GetObjectItemCaseSensitive(latestData, "value");
-        if (Heart == nullptr && !cJSON_IsNumber(Heart))
+        cJSON *valueItem = cJSON_GetObjectItemCaseSensitive(root, "value");
+        cJSON *timestampItem = cJSON_GetObjectItemCaseSensitive(root, "timestamp");
+
+        if (valueItem == nullptr || !cJSON_IsNumber(valueItem))
         {
-            // Add heart_latest_data
-            cJSON_AddItemToObject(latestData, "value", cJSON_CreateNumber(data.Heart));
-            cJSON_AddItemToObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+            cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(data.Heart));
+            cJSON_AddItemToObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
         }
         else
         {
-            cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.Heart));
-            cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+            cJSON_ReplaceItemInObject(root, "value", cJSON_CreateNumber(data.Heart));
+            cJSON_ReplaceItemInObject(root, "timestamp", cJSON_CreateNumber(data.timestamp));
         }
 
-        // // 更新heart_latest_data中的value和timestamp值
-        // cJSON_AddItemToObject(latestData, "value", cJSON_CreateNumber(data.Heart));
-        // cJSON_AddItemToObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
-
-        cJSON *dataList = cJSON_GetObjectItem(heart_root, "heart_data_list");
-        if (dataList == NULL || !cJSON_IsArray(dataList))
+        if (!UpdateJsonData(HEALTH_TYPE_HEART))
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_data_list is null or not an array");
-            cJSON_Delete(heart_root);
-            heart_root = nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to update JSON data");
+            cJSON_Delete(root);
+            ReleaseJsonData(HEALTH_TYPE_HEART);
             return false;
         }
 
-        int numData = cJSON_GetArraySize(dataList);
-        if (numData >= 360)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Data list is full (360 items)");
-            return false;
-        }
-
-        // 添加新数据到dataList中
-        cJSON *newData = cJSON_CreateObject();
-        cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.Heart));
-        cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
-        cJSON_AddItemToArray(dataList, newData);
+        ReleaseJsonData(HEALTH_TYPE_HEART);
 
-        if (UpdateJsonData(HEALTH_TYPE_HEART) == false)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to update JSON data for heart rate");
-            cJSON_Delete(heart_root);
-            heart_root = nullptr;
-            return false;
-        }
-        /*存储bin*/
         std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART);
         FILE *fp = fopen(binFilePath.c_str(), "ab+");
         if (fp == NULL)
-            return false;
-        fwrite(&data.timestamp, 1, 4, fp);
-        fwrite(&data.Heart, 1, 1, fp);
-        fclose(fp);
-
-        return true;
-    }
-
-    bool HealthService::UpdateJsonData(uint8_t type)
-    {
-        std::string jsonFilePath = GetJsonFilePath(type);
-        std::ofstream outFile(jsonFilePath);
-
-        if (!outFile.is_open())
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file %s", jsonFilePath.c_str());
-            // 创建新文件
-            outFile.open(jsonFilePath);
-            if (!outFile.is_open())
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create file %s", jsonFilePath.c_str());
-                return false;
-            }
-        }
-
-        char *jsonData = NULL;
-        cJSON *root = (type == HEALTH_TYPE_HEART) ? heart_root : oxygen_root;
-        if (root == NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "JSON root is NULL");
-            outFile.close();
             return false;
         }
 
-        jsonData = cJSON_Print(root);
-        printf("jsonData:%s\r\n", jsonData);
-        if (jsonData == NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to generate JSON data");
-            outFile.close();
-            return false;
-        }
-
-        outFile << jsonData;
-        outFile.close();
+        fwrite(&data.timestamp, 1, 4, fp);
+        fwrite(&data.Heart, 1, 1, fp);
+        fclose(fp);
 
-        cJSON_free(jsonData);
         return true;
     }
 
index a83c82a..5d1b797 100644 (file)
@@ -1,4 +1,10 @@
-/*** 
+/***
+ * @Date: 2024-06-14 11:34:19
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-28 19:49:27
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h
+ */
+/***
  * @Date: 2024-06-14 11:34:19
  * @LastEditors: Caisking 3449750381@qq.com
  * @LastEditTime: 2024-06-24 16:08:36
@@ -59,14 +65,13 @@ namespace OHOS
         ~HealthService();
         static HealthService *GetInstance(void);
         bool CreateHealthFolder();
-        bool LoadJsonData(uint8_t type);                         // 加载json
-        BloodOxygenData *ReadBloodOxygenData();                  // 读取血氧数据
-        bool UpdateBloodOxygenData(const BloodOxygenData &data); // 更新血氧数据
-        HeartRateData *ReadHeartRateData();                      // 读取心率数据
-        HeartPoints *ReadHeartRateDataList();                    // 读取心率列表
-        bool UpdateHeartRateData(const HeartRateData &data);     // 更新心率数据
-        void ReleaseJsonData(uint8_t type);                      // 释放json
-        bool UpdateJsonData(uint8_t type);                       // 更新json
+        bool LoadJsonData(uint8_t type);                                // 加载json
+        BloodOxygenData *ReadBloodOxygenData();                         // 读取血氧数据
+        HeartRateData *ReadHeartRateData();                             // 读取心率数据
+        bool UpdateHealthData(const HeartRateData &data); // 更新心率数据
+        bool UpdateHealthData(const BloodOxygenData &data);
+        void ReleaseJsonData(uint8_t type); // 释放json
+        bool UpdateJsonData(uint8_t type);  // 更新json
     };
 }
 #endif // HEALTH_MODEL_H
\ No newline at end of file
index a19f7a4..14dc31d 100644 (file)
@@ -639,7 +639,7 @@ namespace OHOS
             data->timestamp = HeartPresenter::GetInstance()->GetCurrentTime();\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp);\r
             SetCheckTime(data->timestamp);\r
-            HealthService::GetInstance()->UpdateHeartRateData(*data);\r
+            HealthService::GetInstance()->UpdateHealthData(*data);\r
             // 更新卡片心率值\r
             // SetHeartRatePerSec(heart);\r
         }\r