From a6e71548f5c818d80cfceb360c468298ebfee77f Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Fri, 28 Jun 2024 20:20:22 +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=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../bloodoxygen/src/BloodOxygenModel.cpp | 2 +- .../health_service/health_service.cpp | 281 +++++++----------- .../health_service/health_service.h | 23 +- .../nativeui/heartrate/src/HeartModel.cpp | 2 +- 4 files changed, 117 insertions(+), 191 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp index 1dcf25f05..c0b2796b9 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp @@ -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; /* -------------------------------------------------------------------------- */ } 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 6e8abc5c9..7f500d7e6 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 @@ -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(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; } 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 a83c82ad4..5d1b797b8 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 @@ -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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index a19f7a4f3..14dc31d3b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -639,7 +639,7 @@ namespace OHOS data->timestamp = HeartPresenter::GetInstance()->GetCurrentTime(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " Save %d %d", data->Heart, data->timestamp); SetCheckTime(data->timestamp); - HealthService::GetInstance()->UpdateHeartRateData(*data); + HealthService::GetInstance()->UpdateHealthData(*data); // 更新卡片心率值 // SetHeartRatePerSec(heart); } -- 2.17.1