From 0cfd56569f0715f8103257b765146239c1ac3289 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Thu, 24 Oct 2024 00:17:55 +0000 Subject: [PATCH] Merge #1243 into sdk602patch0911 from refs/changes/1243/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/1243/head: (8 commits squashed) - 系统:增加亮屏函数打印 - Merge branch 'sdk602patch0911' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0911 - #994 心率界面检测显示有全天心率数据(最大值 ,最小值 )手表重启后,最大值 ,最小值消失显示为-- - 心率:增加读取控制 - 血氧:增加读写控制 - 系统:修改死机文件的生成路径 - 健康数据:增加存储宏控制 - 心率:关闭MSG_SAVE_TEST宏 Signed-off-by: Caisking <3449750381@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1243 --- .../bloodoxygen/src/BloodOxygenModel.cpp | 12 +- .../health_service/health_service.cpp | 1086 +++++++++-------- .../health_service/health_service.h | 6 + .../nativeui/heartrate/src/HeartModel.cpp | 28 +- .../include/SafeModeManagerModelC.h | 4 + .../nativeui/traing/include/TraingModel.h | 9 +- .../nativeui/traing/src/TraingModel.cpp | 9 +- .../debug_output_notification.cpp | 2 +- .../utils/custom_fileoperate_service.c | 2 + .../drivers/peripheral/utils/custom_utils.c | 18 +- 10 files changed, 653 insertions(+), 523 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 3689e3645..586273d67 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp @@ -5,6 +5,7 @@ #include "wearable_log.h" #include "heart_blood/health_service/health_service.h" #include "custom_utils.h" + extern "C" errcode_t uapi_get_timestamp_ms(uint32_t *tm); #include "custom_utils.h" @@ -141,13 +142,16 @@ namespace OHOS // 保存检测数据 void BloodOxygenModel::Blood_Save() { + uint32_t timestamp = BloodResultPresenter::GetInstance()->GetCurrentTime(); + SetCheckTime(timestamp); +#if MSG_SAVE_TEST BloodOxygenData data; data.SPO2 = currentspo2; - data.timestamp = BloodResultPresenter::GetInstance()->GetCurrentTime(); - SetCheckTime(data.timestamp); + data.timestamp = timestamp_ms; HealthService::GetInstance()->UpdateHealthData(data); - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %ld", currentspo2, data.timestamp); +#else + HealthService::GetInstance()->send_blood_save(); + #endif } // 显示检测结果// 显示检测结果 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 595885fac..a19afb13c 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 @@ -1,34 +1,87 @@ #include "health_service.h" -#include -#include "wearable_log.h" +#include "bloodoxygen/include/BloodOxygenModel.h" #include "cJSON.h" -#include -#include +#include "heartrate/include/HeartModel.h" #include "kv_store.h" -#include "custom_utils.h" -#include "custom_runtime.h" +#include "wearable_log.h" +#include +#include #include +#include #include #include -#include -#include "heartrate/include/HeartModel.h" -#include "bloodoxygen/include/BloodOxygenModel.h" +#include -namespace OHOS -{ - extern "C" - { - void uapi_dev_runtime_set_bloodoxygen_storage_status(uint8_t status); - void uapi_dev_runtime_set_heartrate_storage_status(uint8_t status); - - void save_heart_data() - { - printf("save_heart_data\r\n"); - OHOS::HealthService::GetInstance()->SaveDailyHeartRate(); - return; - } +#include "custom_runtime.h" +#include "custom_utils.h" + +#include "safemodemanager/include/SafeModeManagerModelC.h" +namespace OHOS { +extern "C" { +void uapi_dev_runtime_set_bloodoxygen_storage_status(uint8_t status); +void uapi_dev_runtime_set_heartrate_storage_status(uint8_t status); + +void save_heart_data() { + printf("save_heart_data\r\n"); + OHOS::HealthService::GetInstance()->SaveDailyHeartRate(); + return; +} + +void save_heart_maxmin() { + printf("save_heart_maxmin\r\n"); + uint16_t max_heart_data = + OHOS::HeartModel::GetInstance()->GetShowMaxHeartdata(); + uint16_t min_heart_data = + OHOS::HeartModel::GetInstance()->GetShowMinHeartdata(); + + OHOS::HealthService::GetInstance()->SaveHeartMaxMin(max_heart_data, + min_heart_data); + return; +} +void save_blood_oxygen_data() { + OHOS::BloodOxygenData data; + data.SPO2 = OHOS::BloodOxygenModel::GetInstance()->GetSPO2data(); + data.timestamp = OHOS::BloodOxygenModel::GetInstance()->GetCheckTime(); + // 进行血氧存储 如果处于读取 + if (uapi_dev_runtime_get_bloodoxygen_storage_status()) { + printf("save_blood_oxygen_data is reading\n"); + //进行延迟 + LOS_Msleep(100); + if (uapi_dev_runtime_get_bloodoxygen_storage_status()) { + printf("save_blood_oxygen_data is reading again\n"); + //重新发送该消息 + do_custom_fileoperate_service_check_msg( + CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0); + return; } + } + HealthService::GetInstance()->UpdateHealthData(data); + printf("save_blood_oxygen_data success\n"); + return; +} +void save_heart_rate_data() { + OHOS::HeartRateData data; + data.Heart = OHOS::HeartModel::GetInstance()->GetHeartdata(); + data.timestamp = OHOS::HeartModel::GetInstance()->GetCheckTime(); + // 进行心率存储 如果处于读取 + if (uapi_dev_runtime_get_heartrate_storage_status()) { + printf("save_heart_rate_data is reading\n"); + //进行延迟 + LOS_Msleep(100); + if (uapi_dev_runtime_get_heartrate_storage_status()) { + printf("save_heart_rate_data is reading again\n"); + //重新发送该消息 + do_custom_fileoperate_service_check_msg( + CUSTOM_FILEOPERATE_MSG_TYPE_HEARTRATE_SAVE, nullptr, 0); + return; + } + } + HealthService::GetInstance()->UpdateHealthData(data); + printf("save_heart_rate_data success\n"); + return; +} +} static HealthService *g_pHealthService = nullptr; /*获取日期*/ std::string GetCurrentDate() { @@ -91,490 +144,539 @@ bool HealthService::CreateHealthFolder() { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mkdir HEALTH_JSON_PATH_OXYGEN is error"); return false; - } - } - - return true; } + } - /*生成bin*/ - std::string GetBinFilePath(uint8_t type) - { - std::string currentDate = GetCurrentDate(); - const char *healthTypePath = (type == HEALTH_TYPE_HEART) ? HEALTH_JSON_PATH_HEART : HEALTH_JSON_PATH_OXYGEN; + return true; +} - return healthTypePath + currentDate + ".bin"; - } +/*生成bin*/ +std::string GetBinFilePath(uint8_t type) { + std::string currentDate = GetCurrentDate(); + const char *healthTypePath = (type == HEALTH_TYPE_HEART) + ? HEALTH_JSON_PATH_HEART + : HEALTH_JSON_PATH_OXYGEN; - /* --------------------------------- 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()) - { - 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; - } + return healthTypePath + currentDate + ".bin"; +} - // 读取心率数据 - 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(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; - } +/* --------------------------------- 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()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder"); + return nullptr; + } - // 保存血氧数据 - bool HealthService::UpdateHealthData(const BloodOxygenData &data) - { - // 配置血氧存储状态 - uapi_dev_runtime_set_bloodoxygen_storage_status(1); - - // 判断文件夹是否存在 - if (!CreateHealthFolder()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file"); - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return false; - } - - // 判断文件是否存在,不存在即创建并打开以输出模式 - std::ofstream outFile(BLOOD_JSON_PATH, std::ios::trunc); - if (!outFile.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create or open JSON file for writing"); - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return false; - } - - // 创建一个 JSON 对象 - cJSON *oxygen_root = cJSON_CreateObject(); - if (oxygen_root == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create JSON object"); - outFile.close(); - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return false; - } - - 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 generate JSON data"); - cJSON_Delete(oxygen_root); // 释放内存 - outFile.close(); - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return false; - } - - // 写入 JSON 数据到文件 - outFile << jsonData; - - // 释放资源 - cJSON_Delete(oxygen_root); - free(jsonData); - outFile.close(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData SPO2 JSON is ok"); - - /* 存储bin文件[协议使用] */ - std::string binFilePath = GetBinFilePath(HEALTH_TYPE_OXYGEN); - FILE *fp = fopen(binFilePath.c_str(), "ab+"); - if (fp == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open binary file for writing"); - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return false; - } - - // 写入数据 - if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 || - fwrite(&data.SPO2, sizeof(data.SPO2), 1, fp) != 1) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write data to binary file"); - fclose(fp); - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return false; - } - - fclose(fp); - - - uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 - return true; - } + // 读取文件 + std::ifstream inFile(BLOOD_JSON_PATH); + if (!inFile.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file"); + return nullptr; + } - //存储心率 - bool HealthService::UpdateHealthData(const HeartRateData &data) - { - // 配置心率存储状态 - uapi_dev_runtime_set_heartrate_storage_status(1); - - // 判断文件夹是否存在 - if (!CreateHealthFolder()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file"); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - // 判断文件是否存在,不存在即创建并打开以输出模式 - std::ofstream outFile(HEART_JSON_PATH, std::ios::trunc); - if (!outFile.is_open()) - { - // 文件创建失败 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create or open JSON file for writing"); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - // 创建一个 JSON 对象 - cJSON *heart_root = cJSON_CreateObject(); - if (heart_root == NULL) - { - outFile.close(); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - 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 generate JSON data"); - cJSON_Delete(heart_root); // 使用 cJSON_Delete 释放内存 - outFile.close(); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - // 写入 JSON 数据到文件 - outFile << jsonData; - - // 释放资源 - cJSON_Delete(heart_root); - free(jsonData); - outFile.close(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok"); - - // 写入文件到当天历史数据 - UpdateHourlyHeartRate(data.timestamp, data.Heart); - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok"); - - if (!SaveDailyHeartRate()) // 进行心率历史数据文件存储 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed"); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - /* 存储 bin 文件 [协议使用] */ - std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART); - FILE *fp = fopen(binFilePath.c_str(), "ab+"); - if (fp == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open binary file for writing"); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - // 写入数据 - if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 || - fwrite(&data.Heart, sizeof(data.Heart), 1, fp) != 1) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write data to binary file"); - fclose(fp); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - fclose(fp); - - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return true; - } - // 清空健康数据 - bool HealthService::CleanHealthData() { - //清空心率数组 - ClearHourlyHeartRates(); - //进行数据存储 - SaveDailyHeartRate(); - - HeartModel::GetInstance()->ClearDisplayData(); - // BloodOxygenModel::GetInstance()->ClearDisplayData(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData is ok"); - return true; - } + // 读取文件内容到字符串 + 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); - HealthState HealthService::GetHealthCurrent() - { - return healthState_; - } - void HealthService::SetHealthCurrent(HealthState healthState) + // 关闭文件 + 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 { - healthState_ = healthState; - } - /* ------------------------------- 心率当天历史数据处理 ------------------------------ */ - static constexpr const char *HEART_DATA_PATH = "/user/userdata/health/heart_history.bin"; - - //清空数组 - void HealthService::ClearHourlyHeartRates() { - for (int i = 0; i < MAX_HOURS; ++i) { - dailyHeartRates[i].Heart = 0; - dailyHeartRates[i].timestamp = 0; - } - } - - // 加载心率列表 - bool HealthService::LoadDailyHeartRate() { - ClearHourlyHeartRates(); // 清空数组 - - // 使用 RAII 管理文件流 - std::ifstream file(HEART_DATA_PATH, std::ios::binary); - if (!file.is_open()) { - std::cerr << "Error: Unable to open heart rate data file for reading" << std::endl; - return false; - } - - // 读取时间戳 - file.read(reinterpret_cast(&lastLoadTime), sizeof(lastLoadTime)); - if (lastLoadTime == 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate is not today"); - return false; // 无有效数据 - } - - // 判断时间戳是否为今天 - tm *lastTm = localtime(&lastLoadTime); - time_t now = time(nullptr); - tm *currentTm = localtime(&now); - if (currentTm->tm_year == lastTm->tm_year && currentTm->tm_yday == lastTm->tm_yday) { - // 今天:进行数据读取 - for (int i = 0; i < MAX_HOURS; ++i) { - HeartRateData rate; // 假设您有一个 HeartRateData 结构体 - if (!file.read(reinterpret_cast(&rate), sizeof(rate))) { - std::cerr << "Error: Failed to read heart rate data." << std::endl; - return false; // 读取失败 - } - dailyHeartRates[i] = rate; // 保存心率和时间戳 - std::cout << "Hour " << i << ": Heart Rate " << rate.Heart << std::endl; - } - return true; // 成功读取 - } - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate is not today"); - return false; // 不是今日 - } - - // 保存今日心率列表 - bool HealthService::SaveDailyHeartRate() { - std::ofstream outFile(HEART_DATA_PATH, std::ios::binary | std::ios::trunc); - if (!outFile.is_open()) { - std::cerr << "Error: Unable to open heart rate data file for writing" << std::endl; - return false; // 文件打开失败 - } - - // 存储时间戳 - time_t currentTime = time(nullptr); - outFile.write(reinterpret_cast(¤tTime), sizeof(currentTime)); - - // 存储心率数据 - for (const auto& rate : dailyHeartRates) { - if (!outFile.write(reinterpret_cast(&rate), sizeof(rate))) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write heart rate data to file"); - return false; // 写入失败 - } - } - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate is ok"); - return true; // 成功保存 + 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; + } - // 更新心率列表项 - void HealthService::UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate) { - struct tm *timeInfo = localtime(×tamp); - uint16_t hour = static_cast(timeInfo->tm_hour); - - if (hour < MAX_HOURS && heartRate > 0) { - dailyHeartRates[hour] = {heartRate, timestamp}; // 更新心率和时间戳 - currenthour = hour; // 记录当前小时 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok"); - } - else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid hour or heart rate value %d",hour); - } + cJSON_Delete(oxygen_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(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(); - // 获取指定小时的心率 - uint16_t HealthService::GetHourlyHeartRate(uint16_t hour) { - if (hour < MAX_HOURS) { - return dailyHeartRates[hour].Heart; // 默认为 0 如果未更新 - } - return 0; // 或者返回一个异常值 + 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) { + // 配置血氧存储状态 + uapi_dev_runtime_set_bloodoxygen_storage_status(1); + + // 判断文件夹是否存在 + if (!CreateHealthFolder()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file"); + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return false; + } + + // 判断文件是否存在,不存在即创建并打开以输出模式 + std::ofstream outFile(BLOOD_JSON_PATH, std::ios::trunc); + if (!outFile.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to create or open JSON file for writing"); + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return false; + } + + // 创建一个 JSON 对象 + cJSON *oxygen_root = cJSON_CreateObject(); + if (oxygen_root == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create JSON object"); + outFile.close(); + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return false; + } + + 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 generate JSON data"); + cJSON_Delete(oxygen_root); // 释放内存 + outFile.close(); + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return false; + } + + // 写入 JSON 数据到文件 + outFile << jsonData; + + // 释放资源 + cJSON_Delete(oxygen_root); + free(jsonData); + outFile.close(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData SPO2 JSON is ok"); + + /* 存储bin文件[协议使用] */ + std::string binFilePath = GetBinFilePath(HEALTH_TYPE_OXYGEN); + FILE *fp = fopen(binFilePath.c_str(), "ab+"); + if (fp == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to open binary file for writing"); + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return false; + } + + // 写入数据 + if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 || + fwrite(&data.SPO2, sizeof(data.SPO2), 1, fp) != 1) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to write data to binary file"); + fclose(fp); + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return false; + } + + fclose(fp); + + uapi_dev_runtime_set_bloodoxygen_storage_status(0); // 恢复状态 + return true; +} + +//存储心率 +bool HealthService::UpdateHealthData(const HeartRateData &data) { + // 配置心率存储状态 + uapi_dev_runtime_set_heartrate_storage_status(1); + + // 判断文件夹是否存在 + if (!CreateHealthFolder()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file"); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + // 判断文件是否存在,不存在即创建并打开以输出模式 + std::ofstream outFile(HEART_JSON_PATH, std::ios::trunc); + if (!outFile.is_open()) { + // 文件创建失败 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to create or open JSON file for writing"); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + // 创建一个 JSON 对象 + cJSON *heart_root = cJSON_CreateObject(); + if (heart_root == NULL) { + outFile.close(); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + 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 generate JSON data"); + cJSON_Delete(heart_root); // 使用 cJSON_Delete 释放内存 + outFile.close(); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + // 写入 JSON 数据到文件 + outFile << jsonData; + + // 释放资源 + cJSON_Delete(heart_root); + free(jsonData); + outFile.close(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok"); + + // 写入文件到当天历史数据 + UpdateHourlyHeartRate(data.timestamp, data.Heart); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok"); + + if (!SaveDailyHeartRate()) // 进行心率历史数据文件存储 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed"); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + /* 存储 bin 文件 [协议使用] */ + std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART); + FILE *fp = fopen(binFilePath.c_str(), "ab+"); + if (fp == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to open binary file for writing"); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + // 写入数据 + if (fwrite(&data.timestamp, sizeof(data.timestamp), 1, fp) != 1 || + fwrite(&data.Heart, sizeof(data.Heart), 1, fp) != 1) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to write data to binary file"); + fclose(fp); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + fclose(fp); + + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return true; +} +// 清空健康数据 +bool HealthService::CleanHealthData() { + //清空心率数组 + ClearHourlyHeartRates(); + //进行数据存储 + SaveDailyHeartRate(); + + HeartModel::GetInstance()->ClearDisplayData(); + // BloodOxygenModel::GetInstance()->ClearDisplayData(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CleanHealthData is ok"); + return true; +} + +HealthState HealthService::GetHealthCurrent() { return healthState_; } +void HealthService::SetHealthCurrent(HealthState healthState) { + healthState_ = healthState; +} +/* ------------------------------- 心率当天历史数据处理 + * ------------------------------ */ +static constexpr const char *HEART_DATA_PATH = + "/user/userdata/health/heart_history.bin"; + +//清空数组 +void HealthService::ClearHourlyHeartRates() { + for (int i = 0; i < MAX_HOURS; ++i) { + dailyHeartRates[i].Heart = 0; + dailyHeartRates[i].timestamp = 0; + } +} + +// 加载心率列表 +bool HealthService::LoadDailyHeartRate() { + ClearHourlyHeartRates(); // 清空数组 + + // 使用 RAII 管理文件流 + std::ifstream file(HEART_DATA_PATH, std::ios::binary); + if (!file.is_open()) { + std::cerr << "Error: Unable to open heart rate data file for reading" + << std::endl; + return false; + } + + // 读取时间戳 + file.read(reinterpret_cast(&lastLoadTime), sizeof(lastLoadTime)); + if (lastLoadTime == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate is not today"); + return false; // 无有效数据 + } + + // 判断时间戳是否为今天 + tm *lastTm = localtime(&lastLoadTime); + time_t now = time(nullptr); + tm *currentTm = localtime(&now); + if (currentTm->tm_year == lastTm->tm_year && + currentTm->tm_yday == lastTm->tm_yday) { + // 今天:进行数据读取 + for (int i = 0; i < MAX_HOURS; ++i) { + HeartRateData rate; // 假设您有一个 HeartRateData 结构体 + if (!file.read(reinterpret_cast(&rate), sizeof(rate))) { + std::cerr << "Error: Failed to read heart rate data." << std::endl; + return false; // 读取失败 + } + dailyHeartRates[i] = rate; // 保存心率和时间戳 + std::cout << "Hour " << i << ": Heart Rate " << rate.Heart << std::endl; } - //获取指定小时的时间戳 - time_t HealthService::GetHourlyTimestamp(uint16_t hour) { - if (hour < MAX_HOURS) { - return dailyHeartRates[hour].timestamp; // 默认为 0 如果未更新 - } - return 0; // 或者返回一个异常值 + return true; // 成功读取 + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate is not today"); + return false; // 不是今日 +} + +// 保存今日心率列表 +bool HealthService::SaveDailyHeartRate() { + std::ofstream outFile(HEART_DATA_PATH, std::ios::binary | std::ios::trunc); + if (!outFile.is_open()) { + std::cerr << "Error: Unable to open heart rate data file for writing" + << std::endl; + return false; // 文件打开失败 + } + + // 存储时间戳 + time_t currentTime = time(nullptr); + outFile.write(reinterpret_cast(¤tTime), + sizeof(currentTime)); + + // 存储心率数据 + for (const auto &rate : dailyHeartRates) { + if (!outFile.write(reinterpret_cast(&rate), sizeof(rate))) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to write heart rate data to file"); + return false; // 写入失败 } + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate is ok"); + return true; // 成功保存 +} + +// 更新心率列表项 +void HealthService::UpdateHourlyHeartRate(time_t timestamp, + uint16_t heartRate) { + struct tm *timeInfo = localtime(×tamp); + uint16_t hour = static_cast(timeInfo->tm_hour); + + if (hour < MAX_HOURS && heartRate > 0) { + dailyHeartRates[hour] = {heartRate, timestamp}; // 更新心率和时间戳 + currenthour = hour; // 记录当前小时 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateHourlyHeartRate is ok"); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Invalid hour or heart rate value %d", hour); + } +} - // 获取当前小时 - uint16_t HealthService::GetCurrentHour() { - return currenthour; - } +// 获取指定小时的心率 +uint16_t HealthService::GetHourlyHeartRate(uint16_t hour) { + if (hour < MAX_HOURS) { + return dailyHeartRates[hour].Heart; // 默认为 0 如果未更新 + } + return 0; // 或者返回一个异常值 +} +//获取指定小时的时间戳 +time_t HealthService::GetHourlyTimestamp(uint16_t hour) { + if (hour < MAX_HOURS) { + return dailyHeartRates[hour].timestamp; // 默认为 0 如果未更新 + } + return 0; // 或者返回一个异常值 +} + +// 获取当前小时 +uint16_t HealthService::GetCurrentHour() { return currenthour; } +/* +心率最大最小值存储 +关机存储 +*/ +#define HEART_MAX_MIN_PATH "/user/userdata/health/heart_max_min.bin" +// 保存最大最小值 +bool HealthService::SaveHeartMaxMin(uint16_t max, uint16_t min) { + std::ofstream outFile(HEART_MAX_MIN_PATH, std::ios::binary | std::ios::trunc); + if (!outFile.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file"); + return false; + } + + outFile.write(reinterpret_cast(&max), sizeof(max)); + if (!outFile) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write max value"); + return false; + } + + outFile.write(reinterpret_cast(&min), sizeof(min)); + if (!outFile) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to write min value"); + return false; + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveHeartMaxMin is ok max %d, min %d", + max, min); + return true; +} +// 加载最大最小值 +void HealthService::LoadHeartMaxMin(uint16_t &max, uint16_t &min) { + std::ifstream inFile(HEART_MAX_MIN_PATH, std::ios::binary); + if (!inFile.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file %s", + HEART_MAX_MIN_PATH); + return; + } + + inFile.read(reinterpret_cast(&max), sizeof(max)); + if (!inFile) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to read max value"); + return; + } + + inFile.read(reinterpret_cast(&min), sizeof(min)); + if (!inFile) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to read min value"); + return; + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadHeartMaxMin is ok max %d, min %d", + max, min); +} + +//进行消息发送 +void HealthService::send_heart_save() { + do_custom_fileoperate_service_check_msg( + CUSTOM_FILEOPERATE_MSG_TYPE_HEARTRATE_SAVE, nullptr, 0); +} +void HealthService::send_blood_save() { + do_custom_fileoperate_service_check_msg( + CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0); +} } // namespace OHOS 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 7aa6a0792..4ab119d10 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 @@ -15,6 +15,7 @@ #include #define HEART_MAX_POINTS 360 +#define MSG_SAVE_TEST 0 namespace OHOS { const char *GET_HEALTH_JSON_PATH_C_STR_HEART(); @@ -93,6 +94,11 @@ namespace OHOS void ClearHourlyHeartRates(); uint16_t GetCurrentHour(); + bool SaveHeartMaxMin(uint16_t max, uint16_t min); + void LoadHeartMaxMin(uint16_t &max, uint16_t &min); + + void send_heart_save(); + void send_blood_save(); private: static const int MAX_HOURS = 24; 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 bbdfd0ead..77271cae5 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -70,6 +70,7 @@ Subscriber heartSubscirber = { }; static void ProcessHeartRateUpdate(Request *request); static void RefreshHeartData(); +void save_heart_maxmin(); void HeartDataSubscribeTopic(Topic topic) { BroadcastApi *broadcastApi = nullptr; IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, @@ -219,6 +220,9 @@ HeartModel::HeartModel() { currentheart = 0; timestamp_ms = 0; } + //读取最大最小值 + HealthService::GetInstance()->LoadHeartMaxMin(displayheart_max, + displayheart_min); // 配置动态数组 SetArrayData(); } @@ -498,15 +502,19 @@ void HeartModel::Heart_Stop() { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束"); } // 保存检测数据 -void HeartModel::Heart_Save() { +void HeartModel::Heart_Save(){ + +uint32_t timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime(); +SetCheckTime(timestamp); +#if MSG_SAVE_TEST HeartRateData data; data.Heart = currentheart; - data.timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime(); - SetCheckTime(data.timestamp); + data.timestamp = timestamp_ms; HealthService::GetInstance()->UpdateHealthData(data); - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld", currentheart, - data.timestamp); +#else + HealthService::GetInstance()->send_heart_save(); +#endif + //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld", currentheart,data.timestamp); } void HeartModel::Heart_Result() { @@ -668,11 +676,11 @@ void HeartModel::UpHeartdata(uint16_t heart) { } // 检查无效计数器是否达标 - if(uapi_dev_runtime_get_sleep_monitoring_status()) //睡眠监测模式下,增加未佩戴个数最大值,避免误判 - max_valid_count = MAX_DISVALID_HRS_COUNT * 2; + if (uapi_dev_runtime_get_sleep_monitoring_status()) //睡眠监测模式下,增加未佩戴个数最大值,避免误判 + max_valid_count = MAX_DISVALID_HRS_COUNT * 2; else - max_valid_count = MAX_DISVALID_HRS_COUNT; - + max_valid_count = MAX_DISVALID_HRS_COUNT; + if (disvalid_counter_ >= max_valid_count) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:无效数达标 disvalid_counter:%d", disvalid_counter_); diff --git a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h index d38e53512..3e539e444 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h +++ b/code/sdk/application/wearable/fd230app/nativeui/safemodemanager/include/SafeModeManagerModelC.h @@ -10,6 +10,10 @@ extern "C" { void repair_file_start(void); //进行运动存储 void store_sport_data(void); +//进行心率存储 +void save_heart_rate_data(void); +//进行血氧存储 +void save_blood_oxygen_data(void); #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h index 701d7b6fb..20d502958 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h @@ -382,13 +382,12 @@ private: std::vector heartRateTable; // 心率表 std::vector paceTable; // 配速表 - const size_t MAX_ENTRIES = 100000; // 规定最大进场条目数 - + const size_t MAX_ENTRIES = 100000; // 规定最大进场条目数 int user_maxHeart{190}; // 用户最高心率 - int user_Age{20}; // 用户年龄 - int user_autoget{1}; // 自动获取设置 - int user_freq{10}; // 训练频率 + int user_Age{20}; // 用户年龄 + int user_autoget{1}; // 自动获取设置 + int user_freq{10}; // 训练频率 int user_Intensity{160}; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp index 7bdc5e8d9..f95a61c8d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -625,9 +625,9 @@ void TraingModel::SetTimestamp() { Endstate = true; #if 0 - // 重置训练目标 [发生在训练前] - sportTag_ = 0; - sportTagType_ = ExerciseTag::UNKNOW; + // 重置训练目标 [发生在训练前] + sportTag_ = 0; + sportTagType_ = ExerciseTag::UNKNOW; #endif /*运动结束并且是手表发起的运动*/ if (Openingway == false) { @@ -964,7 +964,8 @@ int TraingModel::GetGoaldegree() { /* 训练目标校验 */ void TraingModel::CheckSportTag() { - if (sportdata->tag) { + // 运动开始才计算 + if (sportdata->tag && sportState_!= ExerciseState::General) { sportdata->goaldegree = GetGoaldegree(); WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d", sportdata->goaldegree); diff --git a/code/sdk/application/wearable/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp b/code/sdk/application/wearable/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp index fae1fe150..87d4b2c8a 100644 --- a/code/sdk/application/wearable/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp +++ b/code/sdk/application/wearable/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp @@ -360,7 +360,7 @@ namespace OHOS } // 获取死机列表 - static const char *SHUTDOWN_PATH = "/user/tar"; + static const char *SHUTDOWN_PATH = "/user/system/tar"; std::string DebugOutputViewEventListener::get_shutdown_info() { std::ostringstream oss; diff --git a/code/sdk/drivers/peripheral/utils/custom_fileoperate_service.c b/code/sdk/drivers/peripheral/utils/custom_fileoperate_service.c index 7842fe860..8ba44f019 100644 --- a/code/sdk/drivers/peripheral/utils/custom_fileoperate_service.c +++ b/code/sdk/drivers/peripheral/utils/custom_fileoperate_service.c @@ -118,8 +118,10 @@ static void custom_fileoperate_service_check_task(void const *arg) store_sport_data(); break; case CUSTOM_FILEOPERATE_MSG_TYPE_HEARTRATE_SAVE: + save_heart_rate_data(); break; case CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE: + save_blood_oxygen_data(); break; case CUSTOM_FILEOPERATE_MSG_TYPE_MESSAGEDATA_SAVE: break; diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index 26cb5ea9f..5cdabe710 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -217,6 +217,7 @@ void shutdown_reboot_prejobs_task(void) saveancsdata(); //接收到信息进行保存 暂时不修改 //保存当天心率数据 // save_heart_data();//测量完成保存 + save_heart_maxmin();//存储最大最小状态值 //表盘配置 // dial_file_save(); @@ -1199,14 +1200,17 @@ int32_t uapi_get_screen_state(void) /** * @brief 亮屏函数 */ -void uapi_set_screen_on_api(void) -{ +void uapi_set_screen_on_api(void) { + PRINT("执行亮屏函数!\n"); const power_display_svr_api_t *display_api = power_display_svr_get_api(); - display_api->set_screen_set_keepon_timeout(0); - if (display_api->get_screen_state() != SCREEN_ON) - { + // display_api->set_screen_set_keepon_timeout(0); + PRINT("目前屏幕状态:%d\n",display_api->get_screen_state()); + if (display_api->get_screen_state() != SCREEN_ON) { + PRINT("执行亮屏操作!\n"); display_api->turn_on_screen(); + return; } + PRINT("亮屏函数执行失败!\n"); // 设置屏幕亮5000 // display_api->set_screen_set_keepon_timeout(5000); } @@ -2047,7 +2051,7 @@ int uapi_tar_file(const char *src_path,const char *tar_path,char *tarfilename) } else { - uapi_check_tar_file_count("/user/tar"); //有新的tar文件生成则检查tar文件数量 + uapi_check_tar_file_count("/user/system/tar"); //有新的tar文件生成则检查tar文件数量 } free(buffer); return ret; @@ -2062,7 +2066,7 @@ int uapi_save_exc(void) char buildversion[64]={0}; uapi_get_buildversion((uint8_t*)&buildversion[0],sizeof(buildversion)); sprintf(str, tarfilePath,buildversion,timestamp); - return uapi_tar_file("/user/exc","/user/tar",str); + return uapi_tar_file("/user/exc","/user/system/tar",str); } void uapi_restore_factory_setting(void) -- 2.17.1