修改运动GPS,只有特定运动有GPS
authorCaisking <Casiking@zhihuishixun.com>
Sat, 13 Sep 2025 09:14:31 +0000 (17:14 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Sat, 13 Sep 2025 09:14:31 +0000 (17:14 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingEnddataView.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingEnddataView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalPresenter.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalView.cpp

index e987071..8741f1a 100644 (file)
@@ -117,6 +117,8 @@ private:
   UILabelExt *labelstride = nullptr;   // 训练步幅
   UILabelExt *labelcalories = nullptr; // 训练卡路里
 
+  UILabelExt *gpsNoTrackLabel = nullptr; // GPS轨迹失败提示标签
+
   UILabelExt *exitLabel = nullptr;        // APP提醒
   UILabelButtonExt *exitButton = nullptr; // 返回按键
 
index 64f344b..5a04ff9 100644 (file)
@@ -403,6 +403,9 @@ public:
   bool GetSportExtraData(void);       // 获取运动额外数据
   uint8_t GetHeartRateData(void);     // 获取心率数据
 
+  //判断是不是需要GPS的运动
+  bool IsNeedGPS(UIResourceTextId sportId_);
+
 private:
   TraingModel(const TraingModel &) = delete;
   TraingModel &operator=(const TraingModel &) = delete;
index 3181ab8..968d2f8 100644 (file)
@@ -172,6 +172,13 @@ void TraingEnddataView ::InitializeLabels() {
   scrollView_->Add(labelheart);
   scrollView_->Add(labelstrong);
   scrollView_->Add(labelcalories);
+
+  // 初始化GPS轨迹失败提示标签(默认隐藏)
+  InitLabel(gpsNoTrackLabel, 33, 100 + CANVAS_SIZE/2 - 20, CANVAS_SIZE, 40,
+            "gpsNoTrackLabel", "未定位成功,没有GPS轨迹", DEFAULT_VECTOR_FONT_FILENAME, 24);
+  gpsNoTrackLabel->SetTextColor(Color::Red());
+  gpsNoTrackLabel->SetVisible(false); // 默认隐藏
+  scrollView_->Add(gpsNoTrackLabel);
 }
 // 增加额外配置
 void TraingEnddataView::BonusdataView() {
@@ -420,6 +427,10 @@ void TraingEnddataView::DeInit() {
     delete labelcalories;
     labelcalories = nullptr;
   }
+  if (gpsNoTrackLabel) {
+    delete gpsNoTrackLabel;
+    gpsNoTrackLabel = nullptr;
+  }
 
   /* 删除图片 label */
   if (imageIcon) {
@@ -656,6 +667,12 @@ void TraingEnddataView::InitData() {
       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stride length set: %s\r\n",
                     strideStr.c_str()); // 打印步幅
     }
+    // 判断是否需要GPS
+    if(TraingModel::GetInstance()->IsNeedGPS(enddata->sportId) == false)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "该运动项不需要GPS");
+        return;
+    }
 #if defined(BOARD_W9) || defined(BOARD_N9)
     //读取一下gps文件
     std::string gpsFilePath =
@@ -689,6 +706,13 @@ void TraingEnddataView::OnStart() {
   GetRootContainer()->SetOnDragListener(presenter_);
 
   SetKeyActListener();
+
+  // 判断是否需要GPS
+  if(TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()) == false)
+  {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "该运动项不需要GPS");
+    return;
+  }
 #if defined(BOARD_W9) || defined(BOARD_N9)
   ///////////////////////////gps轨迹测试//////////////////////
   canvas = new UICanvas();
@@ -697,8 +721,17 @@ void TraingEnddataView::OnStart() {
   canvas->SetPosition(33, 100);
   scrollView_->Add(canvas);
   GenerateTrackPoints();
-  DrawTrackSegment(canvas);
-  DrawMarkers(canvas);
+  
+  // 检查是否有足够的GPS数据来绘制轨迹
+  std::vector<Point> canvasData = TraingModel::GetInstance()->GetCanvasData();
+  if (canvasData.size() >= 3) {
+    // 有足够数据,绘制轨迹
+    DrawTrackSegment(canvas);
+    DrawMarkers(canvas);
+  } else {
+    // 数据不足,只显示提示标签(已在GenerateTrackPoints中处理)
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS轨迹数据不足,不绘制轨迹");
+  }
 #endif
 }
 
@@ -717,8 +750,19 @@ void TraingEnddataView::GenerateTrackPoints() {
   std::vector<Point> canvasData = TraingModel::GetInstance()->GetCanvasData();
   //最小轨迹点数限制,防止绘制失败
   if (canvasData.size() < 3) {
+    // GPS数据不足,显示提示标签
+    if (gpsNoTrackLabel) {
+      gpsNoTrackLabel->SetVisible(true);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS轨迹数据不足,显示提示标签");
+    }
     return;
   }
+  
+  // GPS数据充足,隐藏提示标签
+  if (gpsNoTrackLabel) {
+    gpsNoTrackLabel->SetVisible(false);
+  }
+  
   //将点位赋值
   for (size_t i = 0; i < canvasData.size(); ++i) {
     seg1.points.push_back(canvasData[i]);
index b6d67d6..388b4a2 100644 (file)
@@ -399,6 +399,21 @@ ExerciseClass TraingModel::GetSportId() {
     return ExerciseClass::FREE_TRAINING;
   }
 }
+/*判断是否为需要Gps的运动*/
+bool TraingModel::IsNeedGPS(UIResourceTextId sportId_) {
+  //跑步 走路 骑行需要GPS
+  switch (sportId_) {
+  case UIResourceTextId::STR_EXERCISE_OUTDOORRUNNING:
+  case UIResourceTextId::STR_EXERCISE_OUTDOORWALKING:
+  case UIResourceTextId::STR_EXERCISE_INDOORRUNNING:
+  case UIResourceTextId::STR_EXERCISE_INDOORWALKING:
+  case UIResourceTextId::STR_EXERCISE_TREADMILL:
+  case UIResourceTextId::STR_EXERCISE_STROLLMACHINE:
+    return true;
+  default:
+    return false;
+  }
+}
 /*判断是否为特殊运动*/
 void TraingModel::IsSpecialSport(UIResourceTextId sportId_) {
   switch (sportId_) {
index 1e2a2a7..4511839 100644 (file)
@@ -107,14 +107,18 @@ namespace OHOS
         {\r
             //默认前往运动卡片\r
             AppViewId viewid = VIEW_TRAININGCRAD;\r
-        #if defined(BOARD_W9) || defined(BOARD_N9)\r
-            bool gps_status = TraingModel::GetInstance()->GetGPSConnectState();\r
-            if (!gps_status)\r
+            /*判断是否需要GPS*/\r
+            if(TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()) == true)\r
             {\r
-               //未连接进入GPS提示界面\r
-               viewid = VIEW_TRAINING_GPSNOTE;\r
+            #if defined(BOARD_W9) || defined(BOARD_N9)\r
+                bool gps_status = TraingModel::GetInstance()->GetGPSConnectState();\r
+                if (!gps_status)\r
+                {\r
+                //未连接进入GPS提示界面\r
+                viewid = VIEW_TRAINING_GPSNOTE;\r
+                }\r
+            #endif\r
             }\r
-        #endif\r
             NativeAbility::GetInstance().ChangeSlice(viewid);\r
             // 获取运动项目\r
             ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
@@ -122,7 +126,12 @@ namespace OHOS
             TraingCardPresenter::GetInstance()->OpenSensor(type);\r
             // 设置为手表开启运动\r
             TraingModel::GetInstance()->SetSportOpenWay(false);\r
-            enter_flag = true;\r
+            // 如果是进入运动卡片,设置进入标志位\r
+            if(viewid == VIEW_TRAININGCRAD)\r
+            {\r
+                // 设置进入标志位\r
+                enter_flag = true;\r
+            }\r
         }\r
         return true;\r
     }\r
@@ -140,6 +149,12 @@ namespace OHOS
 \r
     void TraingNomalPresenter::Notify()\r
     {\r
+        /*判断是否需要GPS*/\r
+        if(TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()) == false)\r
+        {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "该运动项不需要GPS");\r
+            return;\r
+        }\r
         //获取gps定位状态\r
         TraingNomalView::GetInstance()->updateview();\r
     }\r
index 52d28d6..82b4121 100644 (file)
@@ -19,7 +19,11 @@ namespace OHOS
 
     TraingNomalView::TraingNomalView()
     {
-        TraingModel::GetInstance()->start_heart_gps();
+        /*判断是否需要GPS*/
+        if(TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()) == true)
+        {
+            TraingModel::GetInstance()->start_heart_gps();
+        }
         g_pTraingNomalView = this;
     }
 
@@ -61,8 +65,14 @@ namespace OHOS
 
         buttonGo_->SetOnClickListener(static_cast<UIView::OnClickListener *>(TraingNomalPresenter::GetInstance()));
         buttonSet_->SetOnClickListener(static_cast<UIView::OnClickListener *>(TraingNomalPresenter::GetInstance()));
-   AddViewToRootContainer(buttonGo_);
+        AddViewToRootContainer(buttonGo_);
         AddViewToRootContainer(buttonSet_);
+        /*判断是否需要GPS*/
+        if(TraingModel::GetInstance()->IsNeedGPS(sport_id) == false)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该运动项不需要GPS");
+            return;
+        }
 #if defined(BOARD_W9) || defined(BOARD_N9)
         InitUILabel(heartrate_label_, -32, 230, 200, 60, "heartrate_label_", "--", DEFAULT_VECTOR_FONT_FILENAME, 30);
         AddViewToRootContainer(heartrate_label_);