#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");
{
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()
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)
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)
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)
{
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;
}
// 读取文件内容到字符串
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)
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)
return false;
}
- fwrite(&data.timestamp, 1, 4, fp);
+ fwrite(&data.timestamp, 4, 1, fp);
fwrite(&data.Heart, 1, 1, fp);
+
fclose(fp);
return true;