优化运动心率震动 3228/1 3228/head 3229/target/1
authorCaisking <Casiking@zhihuishixun.com>
Sat, 28 Feb 2026 06:32:22 +0000 (14:32 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Sat, 28 Feb 2026 06:32:22 +0000 (14:32 +0800)
code/sdk/application/wearable/fd272/nativeapp/nativeui/motionrecognition/src/MotionRecognitionView.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/training_card/include/TraingCardView.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/training_card/src/TraingCardView.cpp

index 11d2469..0fcb524 100644 (file)
@@ -156,7 +156,7 @@ namespace OHOS
             note->SetStyle(STYLE_TEXT_FONT, 20);
             note->SetStyle(STYLE_LINE_HEIGHT, 40);
             note->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));
-            // note->SetTextId(STR_MOTION_RECOGNITION_NOTE);//开启后,手表会在检测到你处于运动状态时发出提醒。支持的运动包括:走路、跑步、划船机、椭圆机。
+            // note->SetTextId(STR_MOTION_RECOGNITION_NOTE);//开启后,手表会在检测到你处于运动状态时发出提醒。支持的运动包括:走路、跑步  、划船机、椭圆机。
             if(ConfigModel::GetInstance()->GetLanguage() == 0)
             {
                 note->SetText("开启后,手表会在检测到你处于运动状态时发出提醒。支持的运动包括:走路、跑步、划船机、椭圆机。");
index 8cc0af5..30349ee 100644 (file)
@@ -464,6 +464,8 @@ private:
   std::vector<GPSData> gpsData;  // GPS数据集
   bool gpsconnect{false};
   bool gpsopen{false};// GPS是否开启
+  int shock_count{0}; //震动次数
+  int restshock_count{0}; //震动休息次数
 };
 } // namespace OHOS
 
index 296f7eb..4211122 100644 (file)
  
    return sum / sortedHeartRates.size(); // 返回平均值
  }
+
  #ifdef SUPPORT_CYWEE_SERVICE
  /*分析数据*/
  void TraingModel::AnalysisData(act_result_t *cyweeInfo) {
    // 心率提醒 目前取值有问题,暂时关闭
    if (sportdata->heart >= user_maxHeart && user_maxHeart != 0) {
      uapi_set_screen_on_api(); // 亮屏检测
-     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() &&
-         (!uapi_sleep_mode_flag_get())) {
-       custom_VibratorFunc_int(0);
-       custom_VibratorFunc_int(0);
-       custom_VibratorFunc_int(0);
+     if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get())) {
+          if (shock_count < 10 && restshock_count < 5) {
+            custom_VibratorFunc_int(0);
+            shock_count++;
+            restshock_count = 0;
+          } else {
+            restshock_count++;
+            shock_count = 0;
+            if (restshock_count >= 5) {
+              restshock_count = 0; /* 休息满 5 次,下一轮可再震 */
+            }
+          }
      }
      if (TraingCardView::GetInstance()) {
        GraphicService::GetInstance()->PostGraphicEvent(
    if (isspecialsport_ == false) {
      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);
  /*分析运动心率数据*/
  void TraingModel::AnalysisHeartData(uint8_t hrs) {
     sportdata->heart = hrs;
-    // 计算平均心率
+    // 计算平均心率 
     if (sportdata->heart > 50) {
       sportdata->avgheart = Averageheartrate(sportdata->heart);
       SetIntensity(sportdata->avgheart); // 设置训练强度
@@ -730,6 +738,9 @@ void TraingModel::SetSportdata(SportData *data) {
  
    gpsData.clear();    // 清空gps数据
    canvasData.clear(); // 清空画布数据
+
+   restshock_count = 0; //重置震动休息计数
+   shock_count = 0; //重置震动计数
  }
  
  uint32_t TraingModel::get_current_time() {
index e77aa40..a1284f7 100644 (file)
@@ -51,6 +51,7 @@ namespace OHOS {
 \r
 enum Control_Card { CONTROL = 0, DATA, MUSIC };\r
 enum PopupType {\r
+  None,        // 无弹窗\r
   EndPopup,    // 结束训练弹窗\r
   GetTagPopup, // 达到训练目标弹窗\r
   HeartPopup,  // 达到最高心率弹窗\r
@@ -134,6 +135,9 @@ private:
   std::string winbasePath = "/user/res/Training/training_GIF/win/";\r
   const ImageInfo **winimageInfos;\r
   ImageAnimatorInfo *winimageAnimatorInfo{nullptr};\r
+\r
+  PopupType currentPopupType = PopupType::None;\r
+  bool currentPopupStatus = false;\r
 };\r
 } // namespace OHOS\r
 #endif // TraingCard_PRESENTER_H\r
index f2b7833..7529389 100644 (file)
@@ -785,16 +785,27 @@ void TraingCardView::OnStart() {
   //////////////////////////////////////////////\r
 #endif\r
 }\r
-/*设置弹窗状态*/\r
+/*\r
+设置弹窗状态\r
+增加 如果当前已经是这个弹窗状态 不需要设置\r
+\r
+*/\r
 void TraingCardView::SetPopupViewStatus(PopupType type, bool status) {\r
   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d", type);\r
 \r
+  if (currentPopupType == type && currentPopupStatus == status) {\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d already set status %d", type, status);\r
+    return;\r
+  }\r
+  currentPopupType = type;\r
+  currentPopupStatus = status;\r
+\r
   UIView *popupView = nullptr;\r
-  if (type == EndPopup) {\r
+  if (currentPopupType == EndPopup) {\r
     popupView = endView;\r
-  } else if (type == GetTagPopup) {\r
+  } else if (currentPopupType == GetTagPopup) {\r
     popupView = getView;\r
-  } else if (type == HeartPopup) {\r
+  } else if (currentPopupType == HeartPopup) {\r
     popupView = heartView;\r
   }\r
   if (popupView == nullptr) {\r
@@ -803,9 +814,9 @@ void TraingCardView::SetPopupViewStatus(PopupType type, bool status) {
   }\r
   UIView *cardview = TraingCardView::GetInstance()->GetTraingCrad();\r
   if (cardview != nullptr) {\r
-    cardview->SetVisible(!status);\r
+    cardview->SetVisible(!currentPopupStatus);\r
   }\r
-  popupView->SetVisible(status);\r
+  popupView->SetVisible(currentPopupStatus);\r
   //刷新\r
   RootView::GetInstance()->Invalidate();\r
 }\r