修改血氧和心率的存储json
authorhcj <1224667075@qq.com>
Tue, 11 Jun 2024 07:47:52 +0000 (15:47 +0800)
committerhcj <1224667075@qq.com>
Tue, 11 Jun 2024 07:47:52 +0000 (15:47 +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

index 6ec0faa..75cb9bd 100644 (file)
@@ -8,7 +8,10 @@
 namespace OHOS
 {
     static HealthService *g_pHealthService = nullptr;
-    static constexpr const char *HEALTH_JSON_PATH = "/user/userdata/health/";
+    static constexpr const char *HEALTH_JSON_PATH_HEART = "/user/userdata/health/heart";
+
+    static constexpr const char *HEALTH_JSON_PATH_OXYGEN = "/user/userdata/health/oxygen";
+
     std::string GetCurrentDate()
     {
         time_t now = time(0);
@@ -20,12 +23,11 @@ namespace OHOS
     //static char *JSON_F_buf=NULL;
     const char *GET_HEALTH_JSON_PATH_C_STR()
     {
-        
-        
-        return HEALTH_JSON_PATH;
+        return HEALTH_JSON_PATH_HEART;
     }
 
-    cJSON *root = NULL;
+    cJSON *heart_root = NULL;
+    cJSON *oxygen_root = NULL;
     HealthService::HealthService()
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HealthService::HealthService");
@@ -47,58 +49,89 @@ namespace OHOS
     bool HealthService::CreateHealthFolder()
     {
         struct stat info;
-        if (stat(HEALTH_JSON_PATH, &info) != 0)
+        if (stat(HEALTH_JSON_PATH_HEART, &info) != 0)
+        {
+            if (mkdir(HEALTH_JSON_PATH_HEART, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
+            {
+                return false; // Failed to create folder
+            }
+        }
+        if (stat(HEALTH_JSON_PATH_OXYGEN, &info) != 0)
         {
-            if (mkdir(HEALTH_JSON_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
+            if (mkdir(HEALTH_JSON_PATH_OXYGEN, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
             {
                 return false; // Failed to create folder
             }
         }
+
         return true;
     }
     /*获取日期*/
    
     /*生成文件*/
-    std::string GetJsonFilePath()
+    std::string GetJsonFilePath(uint8_t type)
     {
         std::string currentDate = GetCurrentDate();
-        return std::string(HEALTH_JSON_PATH) + currentDate + ".json";
+        if(type==HEALTH_TYPE_HEART)
+        {
+            return std::string(HEALTH_JSON_PATH_HEART) + currentDate + ".json";
+        }
+        else
+        {
+            return std::string(HEALTH_JSON_PATH_OXYGEN) + currentDate + ".json";
+        }
+      
     }
-    bool HealthService::LoadJsonData()
+
+
+    bool HealthService::LoadJsonData(uint8_t type)
     {
         // 创建健康数据文件夹
-        if (!CreateHealthFolder())
+       
+        if(!CreateHealthFolder())
         {
             return false;
         }
+        
+      
         // 获取当天日期对应的JSON文件路径
-        std::string jsonFilePath = GetJsonFilePath();
+        std::string jsonFilePath = GetJsonFilePath(type);
         std::ifstream inFile(jsonFilePath);
+        cJSON *defaultJson=NULL;
         if (!inFile.is_open())
         {
             // 如果文件不存在,则创建一个包含默认值的JSON文件
-            cJSON *defaultJson = cJSON_Parse("{\
-            \"spo2_latest_data\": {\
-                \"oxygen_value\": 0, \
-                \"timestamp\": 0 \
-            }, \
-            \"spo2_data_list\": [\
-                {\
-                    \"oxygen_value\": 0, \
+            if(type==HEALTH_TYPE_HEART)
+            {
+                defaultJson = cJSON_Parse("{\
+                \"heart_latest_data\": {\
+                    \"value\": 0, \
                     \"timestamp\": 0 \
-                }\
-            ], \
-            \"heart_latest_data\": {\
-                \"heart_value\": 0, \
-                \"timestamp\": 0 \
-            }, \
-            \"heart_data_list\": [\
-                {\
-                    \"heart_value\": 0, \
+                }, \
+                \"heart_data_list\": [\
+                    {\
+                        \"value\": 0, \
+                        \"timestamp\": 0 \
+                    }\
+                ]\
+            }");
+            }
+            else if(type==HEALTH_TYPE_OXYGEN)
+            {
+                defaultJson = cJSON_Parse("{\
+                \"spo2_latest_data\": {\
+                    \"value\": 0, \
                     \"timestamp\": 0 \
-                }\
-            ]\
-        }");
+                }, \
+                \"spo2_data_list\": [\
+                    {\
+                        \"value\": 0, \
+                        \"timestamp\": 0 \
+                    }\
+                ]\
+            }");
+            }
+            
             std::ofstream outFile(jsonFilePath);
             if (!outFile.is_open())
             {
@@ -114,7 +147,16 @@ namespace OHOS
         // 读取JSON文件内容
         std::string jsonDataString((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
         const char *jsonData = jsonDataString.c_str();
-        root = cJSON_Parse(jsonData);
+        if(type==HEALTH_TYPE_HEART)
+        {
+             heart_root = cJSON_Parse(jsonData);
+        }
+        if(type==HEALTH_TYPE_OXYGEN)
+        {
+             oxygen_root = cJSON_Parse(jsonData);
+        }
+
+       
 
         return true;
     }
@@ -134,103 +176,109 @@ namespace OHOS
 #endif
     BloodOxygenData *HealthService::ReadBloodOxygenData()
     {
-        LoadJsonData();
+        LoadJsonData(HEALTH_TYPE_OXYGEN);
         BloodOxygenData *data = new BloodOxygenData();
-        cJSON *latestData = cJSON_GetObjectItem(root, "spo2_latest_data");
-        data->SPO2 = cJSON_GetObjectItem(latestData, "oxygen_value")->valueint;
+        cJSON *latestData = cJSON_GetObjectItem(oxygen_root, "spo2_latest_data");
+        data->SPO2 = cJSON_GetObjectItem(latestData, "value")->valueint;
         data->timestamp = cJSON_GetObjectItem(latestData, "timestamp")->valuedouble;
-        cJSON_Delete(root);
+        cJSON_Delete(oxygen_root);
         return data;
     }
     bool HealthService::UpdateBloodOxygenData(const BloodOxygenData &data)
     {
-        LoadJsonData();
-        cJSON *latestData = cJSON_GetObjectItem(root, "spo2_latest_data");
+        LoadJsonData(HEALTH_TYPE_OXYGEN);
+        cJSON *latestData = cJSON_GetObjectItem(oxygen_root, "spo2_latest_data");
         if (latestData == NULL)
         {
             return false;
         }
-        cJSON_ReplaceItemInObject(latestData, "oxygen_value", cJSON_CreateNumber(data.SPO2));
+        cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.SPO2));
         cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
 
         // 将数据添加到列表的最后
-        cJSON *dataList = cJSON_GetObjectItem(root, "spo2_data_list");
+        cJSON *dataList = cJSON_GetObjectItem(oxygen_root, "spo2_data_list");
         if (dataList != NULL && cJSON_IsArray(dataList))
         {
             cJSON *newData = cJSON_CreateObject();
-            cJSON_AddItemToObject(newData, "oxygen_value", cJSON_CreateNumber(data.SPO2));
+            cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.SPO2));
             cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
             cJSON_AddItemToArray(dataList, newData);
         }
-        if (UpdateJsonData() == false)
+        if (UpdateJsonData(HEALTH_TYPE_OXYGEN) == false)
         {
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateJsonData is error");
-            cJSON_Delete(root);
+            cJSON_Delete(oxygen_root);
             return false;
         }
-        cJSON_Delete(root);
+        cJSON_Delete(oxygen_root);
         return true;
     }
     HeartRateData *HealthService::ReadHeartRateData()
     {
-        LoadJsonData();
+        LoadJsonData(HEALTH_TYPE_HEART);
         HeartRateData *data = new HeartRateData();
-        cJSON *latestData = cJSON_GetObjectItem(root, "heart_latest_data");
-        data->Heart = cJSON_GetObjectItem(latestData, "heart_value")->valueint;
+        cJSON *latestData = cJSON_GetObjectItem(heart_root, "heart_latest_data");
+        data->Heart = cJSON_GetObjectItem(latestData, "value")->valueint;
         data->timestamp = cJSON_GetObjectItem(latestData, "timestamp")->valuedouble;
-        cJSON_Delete(root);
+        cJSON_Delete(heart_root);
         return data;
     }
 
     bool HealthService::UpdateHeartRateData(const HeartRateData &data)
     {
-        LoadJsonData();
-        cJSON *latestData = cJSON_GetObjectItem(root, "heart_latest_data");
+        LoadJsonData(HEALTH_TYPE_HEART);
+        cJSON *latestData = cJSON_GetObjectItem(heart_root, "heart_latest_data");
         if (latestData == NULL)
         {
             return false;
         }
-        cJSON_ReplaceItemInObject(latestData, "heart_value", cJSON_CreateNumber(data.Heart));
+        cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.Heart));
         cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
 
         // 将数据添加到列表的最后
-        cJSON *dataList = cJSON_GetObjectItem(root, "heart_data_list");
+        cJSON *dataList = cJSON_GetObjectItem(heart_root, "heart_data_list");
         // 获取当前数据列表长度
         int numData = cJSON_GetArraySize(dataList);
 
         // 如果数据列表长度已经达到360个,不再添加新数据
         if (numData >= 360)
         {
-            cJSON_Delete(root);
+            cJSON_Delete(heart_root);
             return false;
         }
 
         if (dataList != NULL && cJSON_IsArray(dataList))
         {
             cJSON *newData = cJSON_CreateObject();
-            cJSON_AddItemToObject(newData, "heart_value", cJSON_CreateNumber(data.Heart));
+            cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.Heart));
             cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
             cJSON_AddItemToArray(dataList, newData);
         }
-        if (UpdateJsonData() == false)
+        if (UpdateJsonData(HEALTH_TYPE_HEART) == false)
         {
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateJsonData is error");
-            cJSON_Delete(root);
+            cJSON_Delete(heart_root);
             return false;
         }
-        cJSON_Delete(root);
+        cJSON_Delete(heart_root);
         return true;
     }
 
-    bool HealthService::UpdateJsonData()
+    bool HealthService::UpdateJsonData( uint8_t type)
     {
-        std::string jsonFilePath = GetJsonFilePath();
+        std::string jsonFilePath = GetJsonFilePath(type);
         std::ofstream outFile(jsonFilePath);
         if (!outFile.is_open())
         {
             return false;
         }
-        char *jsonData = cJSON_Print(root);
+        char *jsonData=NULL;
+
+        if(type==HEALTH_TYPE_HEART)
+        jsonData = cJSON_Print(heart_root);
+        else
+        jsonData = cJSON_Print(oxygen_root);
+
         if (jsonData == NULL)
         {
             outFile.close();
@@ -241,4 +289,5 @@ namespace OHOS
         cJSON_free(jsonData);
         return true;
     }
+
 }
\ No newline at end of file
index d297fc5..b6e9901 100644 (file)
@@ -8,6 +8,12 @@
 namespace OHOS
 {
     const char * GET_HEALTH_JSON_PATH_C_STR();
+
+    typedef enum {
+        HEALTH_TYPE_HEART,
+        HEALTH_TYPE_OXYGEN,
+    } HEALTH_TYPE;
+
     typedef struct
     {
         uint8_t SPO2;      // 血氧值
@@ -45,13 +51,13 @@ namespace OHOS
         ~HealthService();
         static HealthService *GetInstance(void);
         bool CreateHealthFolder();
-        bool LoadJsonData();                                     // 加载json
+        bool LoadJsonData(uint8_t type);                                     // 加载json
         BloodOxygenData *ReadBloodOxygenData();                  // 读取血氧数据
         bool UpdateBloodOxygenData(const BloodOxygenData &data); // 更新血氧数据
         HeartRateData *ReadHeartRateData();                      // 读取心率数据
         HeartPoints *ReadHeartRateDataList();                    // 读取心率列表
         bool UpdateHeartRateData(const HeartRateData &data);     // 更新心率数据
-        bool UpdateJsonData();                                   // 更新json
+        bool UpdateJsonData( uint8_t type);                                   // 更新json
     };
 }
 #endif // HEALTH_MODEL_H
\ No newline at end of file