From bb4a2b8fc9432e6c8e83fa0a0e9cc82c1a44c811 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Tue, 11 Jun 2024 15:47:52 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E8=A1=80=E6=B0=A7=E5=92=8C?= =?utf8?q?=E5=BF=83=E7=8E=87=E7=9A=84=E5=AD=98=E5=82=A8json?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../health_service/health_service.cpp | 171 +++++++++++------- .../health_service/health_service.h | 10 +- 2 files changed, 118 insertions(+), 63 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp index 6ec0faa2a..75cb9bdf4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp @@ -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(inFile)), std::istreambuf_iterator()); 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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h index d297fc5d9..b6e990196 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h @@ -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 -- 2.17.1