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())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
- return nullptr;
- }
-
- // 读取文件
- std::ifstream inFile(BLOOD_JSON_PATH);
- if (!inFile.is_open())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
- return nullptr;
- }
-
- // 读取文件内容到字符串
- 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);
-
- // 关闭文件
- inFile.close();
-
- if (jsonDataString.empty())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
- return nullptr;
- }
-
- cJSON *oxygen_root = cJSON_Parse(jsonData);
- if (oxygen_root == NULL)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "oxygen_root is empty");
- return nullptr;
- }
-
- 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)
- {
- data->SPO2 = value_item->valueint;
- data->timestamp = timestamp_item->valuedouble;
- }
- else
- {
- // 读取的数据异常
- cJSON_Delete(oxygen_root);
- delete data;
- return nullptr;
- }
- cJSON_Delete(oxygen_root);
- return data;
+ // 读取血氧数据
+ BloodOxygenData *HealthService::ReadBloodOxygenData()
+ {
+ // 判断文件夹是否存在
+ if (!CreateHealthFolder())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");
+ return nullptr;
+ }
+
+ // 读取文件
+ std::ifstream inFile(BLOOD_JSON_PATH);
+ if (!inFile.is_open())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
+ return nullptr;
+ }
+
+ // 读取文件内容到字符串
+ 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);
+
+ // 关闭文件
+ inFile.close();
+
+ if (jsonDataString.empty())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
+ return nullptr;
+ }
+
+ cJSON *oxygen_root = cJSON_Parse(jsonData);
+ if (oxygen_root == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");
+ return nullptr;
+ }
+
+ BloodOxygenData *data = new BloodOxygenData();
+
+ cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value");
+ cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp");
+
+ // 检查是否存在必要字段,并验证数据类型
+ if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item))
+ {
+ data->SPO2 = value_item->valueint;
+ data->timestamp = timestamp_item->valuedouble;
+
+ // 进一步验证数据的合理性
+ if (data->SPO2 < 0 || data->SPO2 > 100) // 血氧饱和度范围是0-100
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid SPO2 value: %d", data->SPO2);
+ cJSON_Delete(oxygen_root);
+ delete data;
+ return nullptr;
+ }
+ }
+ else
+ {
+ // 读取的数据异常
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");
+ cJSON_Delete(oxygen_root);
+ delete data;
+ return nullptr;
+ }
+
+ cJSON_Delete(oxygen_root);
+ return data;
}
- // 读取心率数据
- HeartRateData *HealthService::ReadHeartRateData()
- {
- // 判断文件夹是否存在
- if (!CreateHealthFolder())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
- return nullptr;
- }
-
- // 读取文件
- std::ifstream inFile(HEART_JSON_PATH);
- if (!inFile.is_open())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
- // 创建一个默认值为 0的数据 存储到json里面 ?
- return nullptr;
- }
-
- // 读取文件内容到字符串
- 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);
-
- // 关闭文件
- inFile.close();
-
- if (jsonDataString.empty())
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
- return nullptr;
- }
-
- 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();
-
- cJSON *value_item = cJSON_GetObjectItem(heart_root, "value");
- cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp");
-
- if (value_item && timestamp_item)
- {
- data->Heart = value_item->valueint;
- data->timestamp = timestamp_item->valuedouble;
- }
- else
- {
- // 读取的数据异常
- cJSON_Delete(heart_root);
- delete data;
- return nullptr;
- }
- cJSON_Delete(heart_root);
- return data;
+ // 读取心率数据
+ HeartRateData *HealthService::ReadHeartRateData()
+ {
+ // 判断文件夹是否存在
+ if (!CreateHealthFolder())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");
+ return nullptr;
+ }
+
+ // 读取文件
+ std::ifstream inFile(HEART_JSON_PATH);
+ if (!inFile.is_open())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file, creating default data");
+
+ // 创建默认值为 0 的数据并存储到 JSON 文件
+ HeartRateData defaultData;
+ defaultData.Heart = 0; // 默认心率值
+ defaultData.timestamp = static_cast<double>(time(nullptr)); // 当前时间戳
+
+ // 创建 JSON 对象并写入文件
+ cJSON *defaultRoot = cJSON_CreateObject();
+ cJSON_AddNumberToObject(defaultRoot, "value", defaultData.Heart);
+ cJSON_AddNumberToObject(defaultRoot, "timestamp", defaultData.timestamp);
+
+ // 写入 JSON 文件
+ FILE *file = fopen(HEART_JSON_PATH, "w");
+ if (file)
+ {
+ char *jsonString = cJSON_Print(defaultRoot);
+ fprintf(file, "%s", jsonString);
+ fclose(file);
+ free(jsonString);
+ }
+ cJSON_Delete(defaultRoot);
+
+ // 返回默认数据
+ HeartRateData *data = new HeartRateData(defaultData);
+ return data;
+ }
+
+ // 读取文件内容到字符串
+ 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);
+
+ // 关闭文件
+ inFile.close();
+
+ if (jsonDataString.empty())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
+ return nullptr;
+ }
+
+ cJSON *heart_root = cJSON_Parse(jsonData);
+ if (heart_root == NULL)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");
+ return nullptr;
+ }
+
+ HeartRateData *data = new HeartRateData();
+
+ cJSON *value_item = cJSON_GetObjectItem(heart_root, "value");
+ cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp");
+
+ // 检查是否存在必要字段,并验证数据类型
+ if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item))
+ {
+ data->Heart = value_item->valueint;
+ data->timestamp = timestamp_item->valuedouble;
+ }
+ else
+ {
+ // 读取的数据异常
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");
+ cJSON_Delete(heart_root);
+ delete data;
+ return nullptr;
+ }
+
+ cJSON_Delete(heart_root);
+ return data;
}
// 保存血氧数据
bool HealthService::UpdateHealthData(const BloodOxygenData &data)