From da0edd1028fb2ec70c8b1a9f2f3be2c7bda4bd9d Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Tue, 3 Dec 2024 17:48:20 +0800 Subject: [PATCH] =?utf8?q?=E5=BF=83=E7=8E=87=EF=BC=9A=E4=BC=98=E5=8C=96?= =?utf8?q?=E5=BF=83=E7=8E=87=E5=AD=98=E5=82=A8=E8=AF=BB=E5=86=99=E6=9C=8D?= =?utf8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../health_service/health_service.cpp | 409 +++++++----------- .../health_service/health_service.h | 29 +- .../nativeui/heartrate/include/HeartModel.h | 3 +- .../nativeui/heartrate/src/HeartModel.cpp | 78 ++-- .../service/ble_service/blemoder/bletest.cpp | 13 +- .../service/ble_service/bleservice/bleEvent.c | 20 +- .../drivers/peripheral/utils/custom_utils.c | 2 +- 7 files changed, 234 insertions(+), 320 deletions(-) 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 6ca39a1db..bf84199c2 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 @@ -85,6 +85,33 @@ void save_heart_rate_data() { //进行心率列表保存 void save_heart_list() { HealthService::GetInstance()->SaveDailyHeartRate(); } } + +//判断时间戳是否为今日 +bool IsTimestampToday(uint32_t timestamp) { + // 获取当前时间 + struct tm currentTm; + time_t seconds; + time(&seconds); + localtime_r(&seconds, ¤tTm); + // 将给定时间戳转换为 tm 结构 + struct tm *timestampTm = + localtime(reinterpret_cast(×tamp)); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前年月日:%d-%d-%d", + currentTm.tm_year + 1900, currentTm.tm_mon + 1, + currentTm.tm_mday); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "给定时间戳:%d-%d-%d", + timestampTm->tm_year + 1900, timestampTm->tm_mon + 1, + timestampTm->tm_mday); + // 比较年、月和日 + if ((currentTm.tm_year == timestampTm->tm_year && + currentTm.tm_mon == timestampTm->tm_mon && + currentTm.tm_mday == timestampTm->tm_mday)) { + return true; + } else { + return false; + } +} + static HealthService *g_pHealthService = nullptr; /*获取日期*/ std::string GetCurrentDate() { @@ -239,88 +266,14 @@ BloodOxygenData *HealthService::ReadBloodOxygenData() { } // 读取心率数据 -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_LOGD(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData); - - // 关闭文件 - inFile.close(); - - if (jsonDataString.empty()) { - WEARABLE_LOGD(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; +void HealthService::ReadHeartRateData(HeartRateData &data) { + data.timestamp = heart_time; + data.Heart = heart_rate; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heart_time: %d, heart_rate: %d", + data.timestamp, data.Heart); } -// 保存血氧数据 +// 保存血氧数据X bool HealthService::UpdateHealthData(const BloodOxygenData &data) { // 配置血氧存储状态 uapi_dev_runtime_set_bloodoxygen_storage_status(1); @@ -398,76 +351,6 @@ bool HealthService::UpdateHealthData(const BloodOxygenData &data) { 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_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateHealthData Heart JSON is ok"); - - WEARABLE_LOGD(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; - } - - if (!save_bin_heart(data)) { // 存储bin文件[协议使用] - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed"); - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return false; - } - - uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 - return true; -} // 清空健康数据 bool HealthService::CleanHealthData() { //清空心率数组 @@ -500,75 +383,6 @@ void HealthService::ClearHourlyHeartRates() { } } -// 加载心率列表 -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_LOGD(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_LOGD(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate is ok"); - return true; // 成功保存 -} - // 更新心率列表项 void HealthService::UpdateHourlyHeartRate(time_t timestamp, uint16_t heartRate) { @@ -645,27 +459,11 @@ bool HealthService::SaveHeartMaxMin(uint16_t max, uint16_t min) { } // 加载最大最小值 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_LOGD(WEARABLE_LOG_MODULE_APP, "LoadHeartMaxMin is ok max %d, min %d", - max, min); + max = heart_max; + if (heart_min == 255) + min = 0; + else + min = heart_min; } //进行消息发送 @@ -678,9 +476,8 @@ void HealthService::send_blood_save() { CUSTOM_FILEOPERATE_MSG_TYPE_BLOODXYGEN_SAVE, nullptr, 0); } -uint32_t HealthService::GetListTime() { - return lastLoadTime; -} +//获取list文件 +uint32_t HealthService::GetListTime() { return lastLoadTime; } std::string HealthService::formatTime(uint32_t time) { char labelTime[20]; @@ -691,9 +488,42 @@ std::string HealthService::formatTime(uint32_t time) { return labelTime; // 成功获取时间 } +/********************************************************************************************/ +/******************************************************************************************* + */ +//存储心率 +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; + } + + if (data.timestamp < 0 || (!IsTimestampToday(data.timestamp))) { + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp %d", + data.timestamp); + return false; + } + if (!save_bin_heart(data)) { // 存储bin文件[协议使用] + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveDailyHeartRate failed"); + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return false; + } + + uapi_dev_runtime_set_heartrate_storage_status(0); // 恢复状态 + return true; +} +//存储bin文件 bool HealthService::save_bin_heart(const HeartRateData &data) { /* 存储 bin 文件 [协议使用] */ std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "save_bin_heart binFilePath %s", + binFilePath.c_str()); FILE *fp = fopen(binFilePath.c_str(), "ab+"); if (fp == NULL) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, @@ -701,16 +531,9 @@ bool HealthService::save_bin_heart(const HeartRateData &data) { return false; } - // 检查时间戳是否有效 - if (data.timestamp < 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid timestamp: %d", - data.timestamp); - fclose(fp); - return false; // 返回错误 - } - // 写入数据 - if (fwrite(&data, sizeof(HeartRateData), 1, fp) != 1) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sizeof(HeartRateData) %d", sizeof(HeartRateData)); + 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); @@ -723,7 +546,84 @@ bool HealthService::save_bin_heart(const HeartRateData &data) { data.Heart); return true; } - +// 加载心率数据 24小时数据 +bool HealthService::LoadDailyHeartRate() { + ClearHourlyHeartRates(); // 清空数组 赋0操作 + std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadDailyHeartRate"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "binFilePath %s", binFilePath.c_str()); + + // 配置心率存储状态 + uapi_dev_runtime_set_heartrate_storage_status(1); + + std::ifstream ifs(binFilePath, std::ios::binary); + if (!ifs.is_open()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to open binary file for reading"); + uapi_dev_runtime_set_heartrate_storage_status(0); + return false; + } + + HeartRateData data; + + // 选取每个小时的最新数据 + while (true) { + // 先读取时间戳 + if (!ifs.read(reinterpret_cast(&data.timestamp), sizeof(data.timestamp))) { + break; // 如果读取失败,退出循环 + } + + // 再读取心率值 + if (!ifs.read(reinterpret_cast(&data.Heart), sizeof(data.Heart))) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to read heart rate value"); + break; // 如果读取失败,退出循环 + } + + // 检查时间戳是否为当天 + if (IsTimestampToday(data.timestamp)) { + // 计算当前小时 + time_t rawTime = static_cast(data.timestamp); + struct tm *timeInfo = localtime(&rawTime); + int hour = timeInfo->tm_hour; // 获取小时数 + + // 更新每小时最新心率数据 + if (dailyHeartRates[hour].timestamp < data.timestamp) { + dailyHeartRates[hour].Heart = data.Heart; // 更新最新数据 + dailyHeartRates[hour].timestamp = data.timestamp; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "hour %d %d %d", hour, + data.timestamp, data.Heart); + } + + // 更新最高、最低心率 + if (data.Heart > heart_max) { + heart_max = data.Heart; + } + if (data.Heart < heart_min) { + heart_min = data.Heart; + } + // 更新最新心率数据 + heart_time = data.timestamp; + heart_rate = data.Heart; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "Loaded heart data: timestamp = %d, Heart = %d", + data.timestamp, data.Heart); + } else { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "error data: timestamp = %d, Heart = %d", data.timestamp, + data.Heart); + } + } + + // 打印list内容 + // for (int i = 0; i < MAX_HOURS; i++) { + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dailyHeartRates[%d] %d %d", i, + // dailyHeartRates[i].timestamp, dailyHeartRates[i].Heart); + // } + + uapi_dev_runtime_set_heartrate_storage_status(0); + return true; +} std::string HealthService::get_heart_data() { std::string binFilePath = GetBinFilePath(HEALTH_TYPE_HEART); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "binFilePath %s", binFilePath.c_str()); @@ -749,7 +649,8 @@ std::string HealthService::get_heart_data() { } // 将数据格式化为字符串,拼接到结果中 - result << formatTime(data.timestamp) << "," << std::to_string(data.Heart) << "\n"; + result << formatTime(data.timestamp) << "," << std::to_string(data.Heart) + << "\n"; WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get_heart_data %d %d", data.timestamp, data.Heart); } 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 a2fa5d268..6c4fe38b0 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 @@ -23,11 +23,12 @@ namespace OHOS const char *GET_HEALTH_JSON_PATH_C_STR_HEART(); const char *GET_HEALTH_JSON_PATH_C_STR_OXYGEN(); - typedef enum - { - HEALTH_TYPE_HEART, - HEALTH_TYPE_OXYGEN, + typedef enum { + HEALTH_TYPE_HEART, + HEALTH_TYPE_OXYGEN, } HEALTH_TYPE; + +#pragma pack(push, 1) // 设置对齐为1字节 typedef struct { uint8_t SPO2; // 血氧值 @@ -37,8 +38,8 @@ namespace OHOS { uint8_t Heart; // 心率值 uint32_t timestamp; // 最近一次检测时间 - } HeartRateData; - + } HeartRateData; +#pragma pack(pop) // 恢复默认对齐 // 检查类 typedef enum { @@ -71,7 +72,7 @@ namespace OHOS bool CreateHealthFolder(); bool LoadJsonData(uint8_t type); // 加载json BloodOxygenData *ReadBloodOxygenData(); // 读取血氧数据 - HeartRateData *ReadHeartRateData(); // 读取心率数据 + void ReadHeartRateData( HeartRateData &data); // 读取心率数据 bool UpdateHealthData(const HeartRateData &data); // 更新心率数据 bool UpdateHealthData(const BloodOxygenData &data); void ReleaseJsonData(uint8_t type); // 释放json @@ -110,13 +111,21 @@ namespace OHOS bool save_bin_heart(const HeartRateData &heart); bool save_bin_blood(const BloodOxygenData &bloodoxygen); - private: + private: + //曲线显示数据 static const int MAX_HOURS = 24; - HeartRateData dailyHeartRates[MAX_HOURS]; // 存储心率值,检测时间戳?使用结构体? + HeartRateData dailyHeartRates[MAX_HOURS]; + //最大最小心率 + uint8_t heart_max = 0; + uint8_t heart_min = 255; + //最新一次检测的时间与心率值 + uint32_t heart_time = 0; + uint8_t heart_rate = 0; + + //健康状态 HealthState healthState_; time_t lastLoadTime; // 记录最后加载的时间 uint16_t currenthour = 0; - }; } #endif // HEALTH_MODEL_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index 466a2a2fc..00809cf43 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -178,8 +178,7 @@ private: uint16_t displayheart_max = 0; // 显示最大心率 uint16_t displayheart_min = 0; // 显示最小心率 - uint32 - timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) + uint32 timestamp_ms; // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚) bool initstatus = true; bool heartstate = false; 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 ee2c95a5a..26b589f08 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -195,20 +195,19 @@ void HeartModel::ClearHeartData(void) { HeartModel::HeartModel() { /*初始化读取文件*/ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); - HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartModel::HeartModel()"); /*初始化历史文件*/ HealthService::GetInstance()->LoadDailyHeartRate(); - if (data != nullptr) { - currentheart = data->Heart; - timestamp_ms = data->timestamp; - // 更新表盘心率数据 - DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart); - delete data; - } else { - currentheart = 0; - timestamp_ms = 0; - } + /*读取上一次心率数据*/ + HeartRateData data; + HealthService::GetInstance()->ReadHeartRateData(data); + currentheart = data.Heart; + timestamp_ms = data.timestamp; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentheart %d timestamp_ms %d", + currentheart, timestamp_ms); + // 更新表盘心率数据 + DialModelHeartRate::GetInstance()->UpdateHeartRate(currentheart); + //读取最大最小值 HealthService::GetInstance()->LoadHeartMaxMin(displayheart_max, displayheart_min); @@ -502,17 +501,26 @@ void HeartModel::Heart_Save() { uint32_t timestamp = HeartResultPresenter::GetInstance()->GetCurrentTime(); SetCheckTime(timestamp); -#if MSG_SAVE_TEST - HeartRateData data; - data.Heart = currentheart; - data.timestamp = timestamp_ms; - HealthService::GetInstance()->UpdateHealthData(data); -#else + HealthService::GetInstance()->send_heart_save(); + + // 更新最大和最小心率 + displayheart_max = + (displayheart_max < currentheart ? currentheart : displayheart_max); + + // 确保最小心率的第一次赋值大于50 + if (displayheart_min == 0 && currentheart > MIN_DISPLAY_HEART) { + displayheart_min = currentheart; // 初始化最小心率 + } else { + displayheart_min = + (displayheart_min > currentheart && currentheart > MIN_DISPLAY_HEART) + ? currentheart + : displayheart_min; + } + // 将更新曲线写到这里提前更新 HealthService::GetInstance()->UpdateHourlyHeartRate(timestamp_ms, currentheart); -#endif // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "保存的心率数据:%d%ld", // currentheart,data.timestamp); } @@ -596,7 +604,12 @@ void HeartModel::logAndChangeSlice(HeartResult result) { : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据"; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg); uapi_set_screen_on_api(); // 亮屏 - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); + //需要先判断界面 心率卡片界面 + if (MainViewSample::GetInstance()) { + if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); + } else + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); } // 处理低心率情况 void HeartModel::handleLowHeartRate() { @@ -604,7 +617,11 @@ void HeartModel::handleLowHeartRate() { HealthState lowHealthState = {HEART_CHECK, LOW, thresholdValue}; HealthService::GetInstance()->SetHealthCurrent(lowHealthState); uapi_set_screen_on_api(); // 亮屏 - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + if (MainViewSample::GetInstance()) { + if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + } else + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); } // 处理高心率情况 void HeartModel::handleHighHeartRate() { @@ -612,7 +629,11 @@ void HeartModel::handleHighHeartRate() { HealthState highHealthState = {HEART_CHECK, HIGH, thresholdValue}; HealthService::GetInstance()->SetHealthCurrent(highHealthState); uapi_set_screen_on_api(); // 亮屏 - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + if (MainViewSample::GetInstance()) { + if (MainViewSample::GetInstance()->GetHorCurrentCard() == HEART_RATE) + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + } else + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); } // 设置佩戴状态 void HeartModel::SetWearStatus() { @@ -670,19 +691,6 @@ void HeartModel::UpHeartdata(uint16_t heart) { valid_counter_++; // 增加有效计数器 disvalid_counter_ = 0; // 清空无效计数器 - // 更新最大和最小心率 - displayheart_max = - (displayheart_max < displayheart ? displayheart : displayheart_max); - - // 确保最小心率的第一次赋值大于50 - if (displayheart_min == 0 && displayheart > MIN_DISPLAY_HEART) { - displayheart_min = displayheart; // 初始化最小心率 - } else { - displayheart_min = - (displayheart_min > displayheart && displayheart > MIN_DISPLAY_HEART) - ? displayheart - : displayheart_min; - } } else { disvalid_counter_++; // 增加无效计数器 valid_counter_ = 0; // 清零有效计数器 diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp index 87de1e3da..816445a0b 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp @@ -400,15 +400,10 @@ bool get_lcd_state(void) uint8_t ble_get_heart_data() { - OHOS::HeartRateData *data=(OHOS::HeartRateData*)malloc(sizeof(OHOS::HeartRateData)); - data=OHOS::HealthService ::GetInstance()->ReadHeartRateData(); + OHOS::HeartRateData data; + OHOS::HealthService ::GetInstance()->ReadHeartRateData(data); uint8_t heart=0; - if(data==NULL) - heart=0; - else - heart=data->Heart; - - free(data); + heart=data.Heart; return heart; } @@ -2364,7 +2359,7 @@ void get_health_HEART_data_path(char *path, uint8_t day,uint16_t max_size) char timeday[12] = {0}; uapi_get_YYMMDD_Time_extend(timeday,'\0',day); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",timeday); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%s\r\n",timeday); sprintf_s(path,max_size,"%s%s.bin",OHOS::GET_HEALTH_JSON_PATH_C_STR_HEART(),timeday); diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c index 506b47c43..c8177f573 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c @@ -448,15 +448,15 @@ void send_big_data(ble_data_type type,char *data, uint16 datalen) memcpy(buf + 17, data, datalen); // 复制数据到缓冲区 buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC } - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n"); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"data:\r\n"); for(int i=0;i<17 + datalen + 1;i++) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]); } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n"); - #endif + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"end\r\n"); + // 根据标志位选择发送数据的方式 if(type.type==6) { @@ -6108,7 +6108,7 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i FILE *fp= fopen(path,"r+"); if(fp==NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); return false; } fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 @@ -6118,7 +6118,8 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i int num_check=file_size%5; if(num_check!=0) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据有误 %d %d \r\n", file_size, num); + fclose(fp); return false; } @@ -6139,7 +6140,8 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i if(read_size!=0) { ble_data_type type_={0x01,id,file_size,pack,pack_id}; - send_big_data(type_,buf,read_size); + send_big_data(type_, buf, read_size); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%d %d %d %d %s\r\n",read_size,file_size,pack_id,pack); } @@ -6180,7 +6182,7 @@ void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id) int check_num=data_len%single_data; if(check_num!=0) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id); ble_data_type type_={0x01,id,0,1,1}; send_big_data(type_,NULL,0); diff --git a/code/sdk/drivers/peripheral/utils/custom_utils.c b/code/sdk/drivers/peripheral/utils/custom_utils.c index 992bb120f..98f1aac35 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils.c @@ -286,7 +286,7 @@ void shutdown_reboot_prejobs_task(void) saveancsdata(); //接收到信息进行保存 暂时不修改 //保存当天心率数据 // save_heart_data();//测量完成保存 - save_heart_maxmin();//存储最大最小状态值 + // save_heart_maxmin();//存储最大最小状态值 //表盘配置 // dial_file_save(); -- 2.17.1