训练:优化训练数据更新
authorCaisking <3449750381@qq.com>
Wed, 13 Nov 2024 11:57:20 +0000 (19:57 +0800)
committerCaisking <3449750381@qq.com>
Wed, 13 Nov 2024 11:57:20 +0000 (19:57 +0800)
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/service/ble_service/blemoder/bletest.cpp

index 1c1db83..283dc8e 100644 (file)
@@ -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
 
index ac4997f..4351648 100644 (file)
@@ -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<float>(sportdata->tag * 60);
     // 计算完成度
-    goaldegree =
-        (static_cast<float>(sportdata->duration) / durationInSeconds) * 100;
+    goaldegree = (static_cast<float>(sportdata->duration) / current_goal) * 100;
     break;
   }
   case ExerciseTag::Calories: {
     // 计算目标完成度
-    goaldegree =
-        (static_cast<float>(sportdata->calories) / sportdata->tag) * 100;
+    goaldegree = (static_cast<float>(sportdata->calories) / current_goal) * 100;
     break;
   }
   case ExerciseTag::Distance: {
-    float distanceInMeters = static_cast<float>(sportdata->tag * 1000);
     // 计算目标完成度
-    goaldegree =
-        (static_cast<float>(sportdata->distance) / distanceInMeters) * 100;
+    goaldegree = (static_cast<float>(sportdata->distance) / current_goal) * 100;
     break;
   }
   case ExerciseTag::Steps: {
     // 计算目标完成度
-    goaldegree = (static_cast<float>(sportdata->steps) / sportdata->tag) * 100;
+    goaldegree = (static_cast<float>(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<int>(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<float>(sportdata->tag * 60);
+    break;
+  }
+  case ExerciseTag::Calories: {
+    // 计算目标完成度
+    return sportdata->tag;
+    break;
+  }
+  case ExerciseTag::Distance: {
+    return static_cast<float>(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(&timestamp) == 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)
index b1f3d23..de4edf2 100644 (file)
@@ -293,9 +293,8 @@ void TraingCardPresenter::UpdateDataView() {
   GraphicService::GetInstance()->PostGraphicEvent(std::bind(\r
       &TrainingDataView::UpdataTime, TrainingDataView::GetInstance()));\r
 \r
-  // // 更新目标完成度\r
-  // TraingModel::GetInstance()->CheckSportTag();\r
-\r
+  TraingModel::GetInstance()->updata_goal();\r
+  \r
   // 刷新训练数据:心率、卡路里、距离、步数、训练强度、目标完成度\r
   SportData *sportdata = TraingModel::GetInstance()->GetSportdata();\r
   RefreshData(sportdata);\r
index 3485ff0..0513d5a 100644 (file)
@@ -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