{
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()
return healthTypePath + currentDate + ".bin";
}
+
// 加载 JSON 数据
bool HealthService::LoadJsonData(uint8_t type)
{
}
// 释放 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()
{
}
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;
}