#1049手表,运动室外跑步,500步目标测试,实际600步,目标完成度100%,目标完成度需要进行相应增加120%;
authorCaisking <3449750381@qq.com>
Fri, 18 Oct 2024 08:49:26 +0000 (16:49 +0800)
committerCaisking <3449750381@qq.com>
Fri, 18 Oct 2024 08:49:26 +0000 (16:49 +0800)
#1048手表,运动室外跑步,1KM目标测试,实际1259米,目标完成度100%,目标完成度需要进行相应增加125%;

#1052配速,步频,目标完成度,目标完成提示,都有问题;

#1047手表,运动室外跑步,1KM目标测试,目标进度条在运动过程中不会变更,在运动达标时直接显示满

code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp

index c9548ad..701d7b6 100644 (file)
@@ -323,6 +323,7 @@ public:
   int GetSportTagData();         /*获取对应的训练目标的值*/
   int GetGoaldegree();           /*获取训练目标完成百分比*/
   std::string GetTagStr();       /*获取训练目标Str*/
+  void CheckSportTag();
 
   /*配速表以及心率表配置*/
   bool AddHeartRateData(uint32_t timestamp, uint8_t heartRate);
index cdbc359..7bdc5e8 100644 (file)
@@ -32,6 +32,7 @@
 #include "traingrecord/include/TraingRecordModel.h"
 #include "vibrator_service.h"
 #include <algorithm>
+#include <cmath>
 #include <filesystem>
 #include <fstream>
 #include <limits.h>
@@ -450,29 +451,9 @@ void TraingModel::AnalysisData(cywee_activity_result_t *cyweeInfo) {
       ui_api_vibrate_once_func();
     }
     if (TraingCardView::GetInstance()) {
-      TraingCardView::GetInstance()->SetPopupViewStatus(HeartPopup, true);
-    }
-  }
-
-  // 训练目标检查
-  if (sportdata->tag && !Gettagstuats) {
-    sportdata->goaldegree = GetGoaldegree();
-
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d",
-                  sportdata->goaldegree);
-    if (sportdata->goaldegree >= 100) { //测试
-      // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentdata%d", currentdata);
-      uapi_set_screen_on_api(); // 亮屏检测
-      if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) {
-        ui_api_vibrate_once_func();
-      }
-      if (TraingCardView::GetInstance()) {
-        TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
-        if (TraingCardView::GetInstance()->GetAnimator()) {
-          TraingCardView::GetInstance()->GetAnimator()->Start();
-        }
-      }
-      Gettagstuats = true;
+      GraphicService::GetInstance()->PostGraphicEvent(
+          std::bind(&TraingCardView::SetPopupViewStatus,
+                    TraingCardView::GetInstance(), HeartPopup, true));
     }
   }
 }
@@ -920,29 +901,90 @@ UIResourceTextId TraingModel::GetIntensity() {
     break;
   }
 }
-/*获取当前的目标值*/
+
+/*
+时长:10~600分钟 实际出值 秒
+距离:1~20km  实际出值 m
+步数:500~50000步 实际出值 步
+卡路里:100~1000kcal 实际出值 kcal
+*/
+
+/* 获取当前的目标值 */
 int TraingModel::GetSportTagData() {
+  if (sportdata->tag == 0)
+    return 0;
+
+  float goaldegree = 0.0f; // 初始化目标完成度
+
+  // 根据设置的训练目标类型去对应相对的数据
+  switch (sportdata->sportTagType) {
+  case ExerciseTag::Duration: {
+    // 转换目标时长为秒
+    float durationInSeconds = static_cast<float>(sportdata->tag * 60);
+    // 计算完成度
+    goaldegree =
+        (static_cast<float>(sportdata->duration) / durationInSeconds) * 100;
+    break;
+  }
+  case ExerciseTag::Calories: {
+    // 计算目标完成度
+    goaldegree =
+        (static_cast<float>(sportdata->calories) / sportdata->tag) * 100;
+    break;
+  }
+  case ExerciseTag::Distance: {
+    float distanceInMeters = static_cast<float>(sportdata->tag * 1000);
+    // 计算目标完成度
+    goaldegree =
+        (static_cast<float>(sportdata->distance) / distanceInMeters) * 100;
+    break;
+  }
+  case ExerciseTag::Steps: {
+    // 计算目标完成度
+    goaldegree = (static_cast<float>(sportdata->steps) / sportdata->tag) * 100;
+    break;
+  }
+  default:
+    break;
+  }
+
+  return static_cast<int>(round(goaldegree)); // 返回目标完成度
+}
+
+/* 获取训练目标完成百分比 */
+int TraingModel::GetGoaldegree() {
+  if (sportdata->tag == 0) {
+    return 0; // 如果目标值为 0,返回 0%
+  }
+
+  int goaldegree = GetSportTagData();
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "goaldegree %d", goaldegree);
+  return goaldegree; // 直接返回目标完成度
+}
+
+/* 训练目标校验 */
+void TraingModel::CheckSportTag() {
   if (sportdata->tag) {
-    // 根据设置的训练目标类型去对应相对的数据
-    switch (sportdata->sportTagType) {
-    case ExerciseTag::Duration:
-      return int(sportdata->duration / 60); // 时间是秒需要转换为目标的分钟
-      break;
-    case ExerciseTag::Calories:
-      return sportdata->calories; //卡路里是kcal
-      break;
-    case ExerciseTag::Distance:
-      return int(sportdata->distance / 1000); //距离是米需要转换为km
-      break;
-    case ExerciseTag::Steps:
-      return sportdata->steps; //步数是步
-      break;
-    default:
-      break;
+    sportdata->goaldegree = GetGoaldegree();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d",
+                  sportdata->goaldegree);
+    if (sportdata->goaldegree >= 100 && !Gettagstuats) {
+      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; // 更新状态
     }
   }
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Not set Sport_Tag!");
-  return 0; // 添加默认返回值
 }
 //获取运动时长
 int TraingModel::GetDuration() { return sportdata->duration; }
@@ -1001,16 +1043,7 @@ void TraingModel::printTrainingData(const Trainingdata &data) {
   printf("cir: %u\n", data.cir);
   printf("alt: %u\n", data.alt);
 }
-/*获取训练目标完成百分比*/
-int TraingModel::GetGoaldegree() {
-  if (sportTag_ == 0) {
-    return 0;
-  }
-  int currentdata = GetSportTagData();
-  float completeness = (static_cast<float>(currentdata) / sportdata->tag) * 100;
 
-  return round(completeness); // 四舍五入
-}
 /*
     uint32_t src; // 训练来源:0 - 手表开启的训练,1 - APP开启的训练
     uint32_t bt;  // 运动类型:0 - 健身类,1 - 舞蹈类,2 - 休闲运动,3 - 球类,4
@@ -2025,4 +2058,4 @@ bool TraingModel::LoadDataFormJson(std::vector<SportData> &sportDataVector) {
   return true;
 }
 
-} // namespace OHOS
\ No newline at end of file
+} // namespace OHOS
index a967534..10982c3 100644 (file)
@@ -293,6 +293,9 @@ void TraingCardPresenter::UpdateDataView() {
   GraphicService::GetInstance()->PostGraphicEvent(std::bind(\r
       &TrainingDataView::UpdataTime, TrainingDataView::GetInstance()));\r
 \r
+  // 更新目标完成度\r
+  TraingModel::GetInstance()->CheckSportTag();\r
+\r
   // 刷新训练数据:心率、卡路里、距离、步数、训练强度、目标完成度\r
   SportData *sportdata = TraingModel::GetInstance()->GetSportdata();\r
   RefreshData(sportdata);\r
@@ -377,7 +380,8 @@ bool TraingCardPresenter::send_sport_cmd(training_ble *cmd) {
   // 获取当前的运动状态\r
   ExerciseState currentState = TraingModel::GetInstance()->GetSportState();\r
   ExerciseState cmdstate = static_cast<ExerciseState>(cmd->controlmd);\r
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cmdstate:%d currentState:%d", cmdstate,currentState);\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cmdstate:%d currentState:%d",\r
+                cmdstate, currentState);\r
 \r
   switch (cmd->controlmd) {\r
   case SETGOAL:\r
index 32fc924..d032fb7 100644 (file)
@@ -19,6 +19,7 @@
 #include "traing/include/TraingModel.h"\r
 #include "uicomponents/UIComponents.h"\r
 \r
+\r
 extern "C" {\r
 void InitTimer();\r
 void DisableTimer();\r
@@ -414,6 +415,8 @@ void TraingCardView::SetPopupViewStatus(PopupType type, bool status) {
     cardview->SetVisible(!status);\r
   }\r
   popupView->SetVisible(status);\r
+  //刷新\r
+  RootView::GetInstance()->Invalidate();\r
 }\r
 /*结束弹窗界面*/\r
 void TraingCardView::ShowEndView() {\r