From cf69c1e6de7979658e9f13806206bcc187f108f3 Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Sat, 29 Jun 2024 14:08:13 +0800 Subject: [PATCH] =?utf8?q?=E9=87=8D=E6=9E=84=E5=BF=83=E7=8E=87=E8=A1=80?= =?utf8?q?=E6=B0=A7=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../health_service/health_service.cpp | 307 +++++++++--------- 1 file changed, 148 insertions(+), 159 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 7f500d7e6..4b09d1c5e 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 @@ -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; -- 2.17.1