优化运动配速检测
authorCaisking <Casiking@zhihuishixun.com>
Tue, 27 Jan 2026 12:07:16 +0000 (20:07 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Tue, 27 Jan 2026 12:07:16 +0000 (20:07 +0800)
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp

index 2992e16..aafcf1c 100644 (file)
    // sportdata->cdc = cyweeInfo->step_frequency;
    // sportdata->std = cyweeInfo->step_length;
  
-   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " pace %d", sportdata->pc);
- 
-   sportdata->pc = cyweeInfo->pace;
- 
-   // 更新最慢配速
-   if (sportdata->spc < sportdata->pc && sportdata->pc != 0) {
-     sportdata->spc = sportdata->pc;
-   }
- 
-   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "spc %d", sportdata->spc);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " pace %d", sportdata->pc);
+
+  // 通过距离和时间自己计算配速,而不是使用CYWEE提供的配速
+  // 配速单位:秒/公里
+  // 计算公式:配速 = 时间(秒) * 1000 / 距离(米)
+  int calculatedPace = 0;
+  if (sportdata->distance > 0 && sportdata->duration > 0) {
+    // 距离单位是米,需要转换为公里:距离(公里) = 距离(米) / 1000
+    // 配速(秒/公里) = 时间(秒) / 距离(公里) = 时间(秒) * 1000 / 距离(米)
+    calculatedPace = (sportdata->duration * 1000) / sportdata->distance;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, 
+                  "CalculatePace: distance=%d米, duration=%d秒, calculatedPace=%d秒/公里",
+                  sportdata->distance, sportdata->duration, calculatedPace);
+  } else {
+    // 如果距离或时间为0,使用CYWEE提供的配速作为后备
+    calculatedPace = cyweeInfo->pace;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, 
+                  "CalculatePace: 距离或时间为0,使用CYWEE配速=%d", calculatedPace);
+  }
+  
+  sportdata->pc = calculatedPace;
+
+  // 更新最慢配速
+  if (sportdata->spc < sportdata->pc && sportdata->pc != 0) {
+    sportdata->spc = sportdata->pc;
+  }
+
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "spc %d", sportdata->spc);
  
  
 #if 0
      return;
    }
  
-   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[apc:%d fpc:%d cdc:%d std:%d]",
-                 cyweeInfo->avg_pace, cyweeInfo->max_pace,
-                 cyweeInfo->avg_step_freq, cyweeInfo->avg_step_len);
-   //平均配速
-   if (cyweeInfo->avg_pace != 0) {
-     sportdata->apc = cyweeInfo->avg_pace;
-   }
-   //最快配速
-   if (cyweeInfo->max_pace != 0) {
-     sportdata->fpc = cyweeInfo->max_pace;
-   }
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[apc:%d fpc:%d cdc:%d std:%d]",
+                cyweeInfo->avg_pace, cyweeInfo->max_pace,
+                cyweeInfo->avg_step_freq, cyweeInfo->avg_step_len);
+  
+  // 通过距离和时间自己计算平均配速和最快配速
+  // 平均配速 = 总时间(秒) * 1000 / 总距离(米)
+  if (sportdata->distance > 0 && sportdata->duration > 0) {
+    int calculatedAvgPace = (sportdata->duration * 1000) / sportdata->distance;
+    sportdata->apc = calculatedAvgPace;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, 
+                  "CalculateAvgPace: distance=%d米, duration=%d秒, avgPace=%d秒/公里",
+                  sportdata->distance, sportdata->duration, calculatedAvgPace);
+  } else if (cyweeInfo->avg_pace != 0) {
+    // 如果距离或时间为0,使用CYWEE提供的平均配速作为后备
+    sportdata->apc = cyweeInfo->avg_pace;
+  }
+  
+  // 最快配速:配速越小表示速度越快,所以最快配速应该是最小的配速值
+  // 如果当前配速不为0且小于之前的最快配速(或最快配速为0),则更新最快配速
+  if (sportdata->pc > 0) {
+    if (sportdata->fpc == 0 || sportdata->pc < sportdata->fpc) {
+      sportdata->fpc = sportdata->pc;
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, 
+                    "UpdateFastestPace: fpc=%d秒/公里", sportdata->fpc);
+    }
+  } else if (cyweeInfo->max_pace != 0) {
+    // 如果当前配速为0,使用CYWEE提供的最快配速作为后备
+    sportdata->fpc = cyweeInfo->max_pace;
+  }
    //平均步频
    if (cyweeInfo->avg_step_freq != 0) {
      sportdata->cdc = cyweeInfo->avg_step_freq;