From 2cea5398cb5ca40fea3faa12da0ee2fd54f69a9e Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Wed, 13 Nov 2024 19:57:20 +0800 Subject: [PATCH] =?utf8?q?=E8=AE=AD=E7=BB=83=EF=BC=9A=E4=BC=98=E5=8C=96?= =?utf8?q?=E8=AE=AD=E7=BB=83=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/traing/include/TraingModel.h | 5 + .../nativeui/traing/src/TraingModel.cpp | 173 +++++++++++++++--- .../training_card/src/TraingCardPresenter.cpp | 5 +- .../service/ble_service/blemoder/bletest.cpp | 8 +- 4 files changed, 157 insertions(+), 34 deletions(-) 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 1c1db830d..283dc8ee0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h @@ -325,6 +325,9 @@ public: std::string GetTagStr(); /*获取训练目标Str*/ void CheckSportTag(); void CheckTimeTag(); + uint32_t GetCurrentSportTag(); + void updata_goal(); + bool IsGetGoaldegree(); /*配速表以及心率表配置*/ bool AddHeartRateData(uint32_t timestamp, uint8_t heartRate); @@ -391,6 +394,8 @@ private: int user_autoget{1}; // 自动获取设置 int user_freq{10}; // 训练频率 int user_Intensity{160}; + + uint32_t current_goal{0}; // 当前目标 }; } // 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 ac4997f04..4351648bf 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -145,6 +145,8 @@ static void Training_Notify(void *args, const Topic topic, Request *request) { return; } TraingModel::GetInstance()->AnalysisData(cyweeInfo); + // 更新其他目标完成度 + TraingModel::GetInstance()->CheckSportTag(); delete cyweeInfo; // 释放内存 } //训练额外信息 @@ -193,7 +195,10 @@ static constexpr int16 NUM_TIME_MIN = 60; static constexpr int16 NUM_TIME_HOUR = 3600; static constexpr int32 NUM_TIME_DAY = 86400; #endif + SportData *sportdata = new SportData(); +int shock_count{0}; //震动提醒 + TraingModel ::TraingModel() { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingModel::TraingModel()"); // sportdata->Initialize(); // 初始化结构体 @@ -568,6 +573,8 @@ void TraingModel::ResetSharedTrainingData() { Gettagstuats = false; // 重置训练达标标志位 Openstate = true; // 开启运动开始标志位 + + shock_count = 0; //重置震动计数 } /*设置运动开始与结束*/ @@ -595,18 +602,23 @@ void TraingModel::SetTimestamp() { sportdata->sportType = sportType_; // 训练类型 sportdata->sportId = sportId_; + IsSpecialSport(sportdata->sportId); // 配置运动特殊性状态 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "训练目标:类型: %d 值: %d", - sportTagType_, sportTag_); if (sportTag_) // 有值才设置[训练目标] { sportdata->sportTagType = sportTagType_; sportdata->tag = sportTag_; } - // (Openingway == true) ? (printf("app发起运动\n")) - // : (printf("手表发起运动\n")); + current_goal = GetCurrentSportTag(); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "训练目标:类型: %d 值: %d 当前目标值:%d", sportTagType_, + sportTag_, current_goal); + + (Openingway == true) ? (printf("app发起运动\n")) + : (printf("手表发起运动\n")); // 设置起始日期和时间 SetStartDateTime(); @@ -928,7 +940,7 @@ UIResourceTextId TraingModel::GetIntensity() { /* 获取当前的目标值 */ int TraingModel::GetSportTagData() { - if (sportdata->tag == 0) { + if (sportdata->tag == 0 || current_goal == 0) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0"); return 0; } @@ -938,32 +950,28 @@ int TraingModel::GetSportTagData() { // 根据设置的训练目标类型去对应相对的数据 switch (sportdata->sportTagType) { case ExerciseTag::Duration: { - // 转换目标时长为秒 - float durationInSeconds = static_cast(sportdata->tag * 60); // 计算完成度 - goaldegree = - (static_cast(sportdata->duration) / durationInSeconds) * 100; + goaldegree = (static_cast(sportdata->duration) / current_goal) * 100; break; } case ExerciseTag::Calories: { // 计算目标完成度 - goaldegree = - (static_cast(sportdata->calories) / sportdata->tag) * 100; + goaldegree = (static_cast(sportdata->calories) / current_goal) * 100; break; } case ExerciseTag::Distance: { - float distanceInMeters = static_cast(sportdata->tag * 1000); // 计算目标完成度 - goaldegree = - (static_cast(sportdata->distance) / distanceInMeters) * 100; + goaldegree = (static_cast(sportdata->distance) / current_goal) * 100; break; } case ExerciseTag::Steps: { // 计算目标完成度 - goaldegree = (static_cast(sportdata->steps) / sportdata->tag) * 100; + goaldegree = (static_cast(sportdata->steps) / current_goal) * 100; break; } default: + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->sportTagType is error"); + return 0; break; } @@ -977,6 +985,79 @@ int TraingModel::GetSportTagData() { return static_cast(round(goaldegree)); // 返回目标完成度 } +//获取目标值 +uint32_t TraingModel::GetCurrentSportTag() { + if (sportdata->tag == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0"); + return 0; + } + + float goaldegree = 0.0f; // 初始化目标完成度 + + // 根据设置的训练目标类型去对应相对的数据 + switch (sportdata->sportTagType) { + case ExerciseTag::Duration: { + // 转换目标时长为秒 + return static_cast(sportdata->tag * 60); + break; + } + case ExerciseTag::Calories: { + // 计算目标完成度 + return sportdata->tag; + break; + } + case ExerciseTag::Distance: { + return static_cast(sportdata->tag * 1000); + break; + } + case ExerciseTag::Steps: { + return sportdata->tag; + break; + } + default: + return 0; + break; + } +} +//获取是否达到目标 使用比较 +bool TraingModel::IsGetGoaldegree() { + if (sportdata->tag == 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0"); + return false; + } + + float goaldegree = 0.0f; // 初始化目标完成度 + + // 根据设置的训练目标类型去对应相对的数据 + switch (sportdata->sportTagType) { + case ExerciseTag::Calories: { + // 计算目标完成度 + if (sportdata->calories >= current_goal) { + return true; + } + return false; + break; + } + case ExerciseTag::Distance: { + if (sportdata->distance >= current_goal) { + return true; + } + return false; + break; + } + case ExerciseTag::Steps: { + if (sportdata->steps >= current_goal) { + return true; + } + return false; + break; + } + default: + return false; + break; + } +} + /* 获取训练目标完成百分比 */ int TraingModel::GetGoaldegree() { if (sportdata->tag == 0) { @@ -989,14 +1070,20 @@ int TraingModel::GetGoaldegree() { return goaldegree; // 直接返回目标完成度 } +void TraingModel::updata_goal() { + if (sportdata->tag == 0) + return; + + sportdata->goaldegree = GetGoaldegree(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d", + sportdata->goaldegree); +} + /* 训练目标校验 */ void TraingModel::CheckSportTag() { // 运动开始才计算 - if (sportdata->tag) { - sportdata->goaldegree = GetGoaldegree(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d", - sportdata->goaldegree); - if (sportdata->goaldegree >= 100 && !Gettagstuats) { + if (sportdata->tag && sportdata->sportTagType != ExerciseTag::Duration) { + if (IsGetGoaldegree() && !Gettagstuats) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标完成"); uapi_set_screen_on_api(); // 亮屏检测 if (!OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) { @@ -1015,8 +1102,30 @@ void TraingModel::CheckSportTag() { } } } -//运动时长目标 -void TraingModel::CheckTimeTag() {} +// 校验时间获取目标 +void TraingModel::CheckTimeTag() { + if (sportdata->tag == 0 || sportdata->sportTagType != ExerciseTag::Duration) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0"); + return; + } + if (sportdata->duration == current_goal && !Gettagstuats) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标完成"); + uapi_set_screen_on_api(); // 亮屏检测 + if (!OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) { + ui_api_vibrate_once_func(); // 震动提示 + } + if (TraingCardView::GetInstance()) { + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&TraingCardView::SetPopupViewStatus, + TraingCardView::GetInstance(), GetTagPopup, true)); + auto animator = TraingCardView::GetInstance()->GetAnimator(); + if (animator) { + animator->Start(); // 启动动画 + } + } + Gettagstuats = true; // 更新状态 + } +} //获取运动时长 int TraingModel::GetDuration() { return sportdata->duration; } @@ -1545,9 +1654,12 @@ void TraingModel::SendLiveDataIfNecessary() { void TraingModel::StoreDataIfMinutePassed() { if (sportdata->duration % 10 == 0) { uint32_t timestamp; + //进行数据的筛选 if (uapi_get_timestampe_ss(×tamp) == ERRCODE_SUCC) { - AddHeartRateData(timestamp, sportdata->heart); - AddPaceData(timestamp, sportdata->apc); + if (sportdata->heart != 0) + AddHeartRateData(timestamp, sportdata->heart); + if (sportdata->apc != 0) + AddPaceData(timestamp, sportdata->apc); } } @@ -1561,12 +1673,17 @@ extern "C" { void TraingTimerCallback() { g_motionTimes++; if (g_motionTimes != 0) { - sportdata->duration = g_motionTimes; - } + sportdata->duration = g_motionTimes; + } // 检查并发送实时数据 OHOS::TraingModel::GetInstance()->SendLiveDataIfNecessary(); - // 更新目标完成度 - OHOS::TraingModel::GetInstance()->CheckSportTag(); + // 更新时间目标完成度 + OHOS::TraingModel::GetInstance()->CheckTimeTag(); + + if ((sportdata->goaldegree >= 100) && (shock_count < 4)) { + shock_count++; + ui_api_vibrate_once_func(); //震动一次 共计3次 + } #if 0 TraingCardPresenter *gTraingCardPresenter = TraingCardPresenter::GetInstance(); if (gTraingCardPresenter == nullptr) diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp index b1f3d23ec..de4edf22e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp @@ -293,9 +293,8 @@ void TraingCardPresenter::UpdateDataView() { GraphicService::GetInstance()->PostGraphicEvent(std::bind( &TrainingDataView::UpdataTime, TrainingDataView::GetInstance())); - // // 更新目标完成度 - // TraingModel::GetInstance()->CheckSportTag(); - + TraingModel::GetInstance()->updata_goal(); + // 刷新训练数据:心率、卡路里、距离、步数、训练强度、目标完成度 SportData *sportdata = TraingModel::GetInstance()->GetSportdata(); RefreshData(sportdata); 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 3485ff066..0513d5a0d 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp @@ -153,7 +153,8 @@ void test_paly(uint8_t falg) } bool get_training_spead_path(char *path ,uint32_t time,uint32_t max_len) { - std::string str= OHOS::TraingModel::GetInstance()->GetPaceTablePath(time); + std::string str = OHOS::TraingModel::GetInstance()->GetPaceTablePath(time); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"get_training_spead:%s\r\n",str.c_str()); if(str.length()<=3) { return false; @@ -166,7 +167,8 @@ bool get_training_spead_path(char *path ,uint32_t time,uint32_t max_len) bool get_training_heart_path(char *path ,uint32_t time,uint32_t max_len) { - std::string str= OHOS::TraingModel::GetInstance()->GetHeartTablePath(time); + std::string str = OHOS::TraingModel::GetInstance()->GetHeartTablePath(time); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"get_training_heart:%s\r\n",str.c_str()); if(str.length()<=3) { return false; @@ -1705,7 +1707,7 @@ char * struct_to_json_buf_malloc_(uint8_t day) char *json_format = cJSON_PrintUnformatted(dataJSON); int pSize = cJSON_GetArraySize(dataJSON); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"训练历史数据:%s\r\n",json_format); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"训练历史数据:%s\r\n",json_format); cJSON_Delete(dataJSON); return json_format; #else -- 2.17.1