优化星历下载的逻辑
authorCaisking <Casiking@zhihuishixun.com>
Thu, 8 Jan 2026 02:49:41 +0000 (10:49 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Thu, 8 Jan 2026 02:49:41 +0000 (10:49 +0800)
code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadPresenter.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadView.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/include/TraingNomalPresenter.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingNomalPresenter.cpp

index 0e3d28a..9e06dd2 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "common/key_code.h"
 #include "custom_utils.h"
+#include "custom_runtime.h"
 #include "key/include/KeyInputListener.h"
 
 #include "AppViewIDs.h"
@@ -11,6 +12,7 @@
 
 #include "NativeRegisterManager.h"
 #include "wearable_log.h"
+#include "ui_resource_string.h"
 
 #ifdef SUPPORT_BLE_SERVICE
 #include "bleEvent.h"
@@ -46,7 +48,18 @@ bool EphemerisDownloadPresenter::OnClick(UIView &view,
   UNUSED(event);
   //点击下载按键
   if (strcmp(view.GetViewId(), DOWNLOAD_ID) == 0) {
-    //进行下载
+    //检查蓝牙连接状态
+    uint8_t ble_connect_stat = uapi_dev_runtime_get_ble_connect_stat();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ble phone connect stat = %d", ble_connect_stat);
+    
+    if (ble_connect_stat == 0) {
+      //蓝牙未连接,跳转到查找手机Slice显示蓝牙未连接提示
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bluetooth not connected, jump to find phone slice");
+      NativeAbility::GetInstance().EnterSlice(VIEW_FIND_PHONE);
+      return true;
+    }
+    
+    //蓝牙已连接,进行下载
     // EphemerisDownloadModel::GetInstance().DownloadEphemeris();
     #ifdef SUPPORT_BLE_SERVICE
     ble_request_epo_file();
index c21482e..d3f7a6b 100644 (file)
@@ -153,7 +153,7 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
     labelNote_->SetPosition(50, 230, 366, 80);
     labelNote_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20);
     labelNote_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    labelNote_->SetText("注:请打开4G,需要在网络连接状态下才可以下载");
+    labelNote_->SetText("注:需要在网络连接状态下才可以下载");
     labelNote_->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff)); // 灰色
     //修改为靠左对齐
     labelNote_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
@@ -221,7 +221,7 @@ void EphemerisDownloadView::UpdateDownloadButton() {
     switch (status) {
         case EphemerisDownloadStatus::NOT_DOWNLOADED:
         case EphemerisDownloadStatus::FAILED:
-            btnDownload_->SetText("未下载");
+            btnDownload_->SetText("点击下载");
             btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full); // 蓝色
             btnDownload_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::GetColorFromRGBA(0xcc, 0x70, 0x00, 0xff).full, UIButton::PRESSED);
             break;
index db13d75..235b213 100644 (file)
@@ -6,6 +6,7 @@
 #include "Presenter.h"
 #include "TraingNomalView.h"
 #include "ModelListenerSample.h"
+#include "AppViewIDs.h"
 namespace OHOS
 {
     class TraingNomalView;
@@ -30,6 +31,9 @@ namespace OHOS
 
         static TraingNomalPresenter *GetInstance();
 
+        // 清理GPS和心率相关资源
+        void CleanupGPSResources();
+
     private:
         // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;
         bool OnClick(UIView &view, const ClickEvent &event) override;
@@ -37,6 +41,11 @@ namespace OHOS
         bool OnDragEnd(UIView &view, const DragEvent &event) override;
         bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
 
+        // 检查GPS相关条件,返回目标视图ID
+        AppViewId CheckGPSAndNavigate();
+        // 启动运动相关资源
+        void StartSportResources();
+
         bool enter_flag{false};
     };
 } // namespace OHOS
index 78a3838..61fa5a6 100644 (file)
  bool TraingModel::GetGPSConnectState() { return gpsconnect; }
  //设置GPS连接状态
  void TraingModel::SetGPSConnectState(bool state) {
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== GPS连接状态设置 ===");
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前GPS连接状态: %d, 新状态: %d",
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "=== GPS连接状态设置 ===");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前GPS连接状态: %d, 新状态: %d",
                  gpsconnect, state);
  
    if (gpsconnect != state) {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS连接状态发生变化: %d -> %d",
+     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS连接状态发生变化: %d -> %d",
                    gpsconnect, state);
      gpsconnect = state;
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS连接状态已更新为: %d",
+     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS连接状态已更新为: %d",
                    gpsconnect);
  
      //状态改变记录
      // SystemLogModel::GetInstance()->save_gps_status_log_type(gpsconnect);
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS状态变化记录完成");
+     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS状态变化记录完成");
    } else {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS连接状态未发生变化,保持: %d",
+     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS连接状态未发生变化,保持: %d",
                    gpsconnect);
    }
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== GPS连接状态设置完成 ===");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "=== GPS连接状态设置完成 ===");
  }
  //运动心率、gps开启准备
  void TraingModel::start_training_heart() {
    ExerciseState sport_state = TraingModel::GetInstance()->GetSportState();
  
    if (train_status == 0 || sport_state == ExerciseState::End) {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
                    "运动已结束或未开始,跳过GPS数据添加");
      return;
    }
      TraingModel::GetInstance()->AddGPSData(time, send_gps_data.location.lat,
                                             send_gps_data.location.lng);
    } else {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS定位失败,跳过数据添加");
+     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS定位失败,跳过数据添加");
    }
  #endif
  }
   *  @param interval 时间间隔,单位ms
   */
  void TraingModel::gnss_start_timer(uint32_t interval) {
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== GPS定时器启动流程开始 ===");
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "定时器间隔: %u ms", interval);
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "当前定时器状态: %p",
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "=== GPS定时器启动流程开始 ===");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "定时器间隔: %u ms", interval);
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前定时器状态: %p",
                  g_location_timer);
  
    /* -------------------------- 1.检查位置服务定时器是否已经存在,如果存在则返回
      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "错误: GPS定时器已存在,跳过创建");
      return;
    }
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS定时器不存在,开始创建...");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS定时器不存在,开始创建...");
  
    /* --------------------------------- 2.创建位置服务定时器
     * -------------------------------- */
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "调用osTimerNew创建GPS定时器...");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "调用osTimerNew创建GPS定时器...");
    g_location_timer = osTimerNew((osTimerFunc_t)gnss_timer_callback,
                                  osTimerPeriodic, nullptr, nullptr);
    // 检查定时器创建是否成功
      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "错误: GPS定时器创建失败!!");
      return;
    }
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS定时器创建成功: %p",
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS定时器创建成功: %p",
                  g_location_timer);
  
    /* ----------------------------- 3.将毫秒转换为系统时钟节拍数
     * ---------------------------- */
    int tick = osMs2Tick(interval);
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间转换: %u ms -> %d ticks",
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "时间转换: %u ms -> %d ticks",
                  interval, tick);
  
    /* --------------------------------- 4.启动位置服务定时器
     * -------------------------------- */
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "启动GPS定时器...");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "启动GPS定时器...");
    osStatus_t ret = osTimerStart(g_location_timer, tick);
    /* -------------------- 5.检查位置服务定时器启动是否成功,如果启动失败,删除定时器并置为
     * nullptr -------------------- */
                    "=== GPS定时器启动流程结束(失败) ===");
      return;
    }
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS定时器启动成功");
-   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== GPS定时器启动流程结束(成功) ===");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GPS定时器启动成功");
+   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "=== GPS定时器启动流程结束(成功) ===");
  }
  
  /*
index ea6204d..d9dcd7e 100644 (file)
 #include "main/include/MainModel.h"\r
 #include "UiConfig.h"\r
 // #include "TraingNomalView.h"\r
+#ifdef SUPPORT_GNSS\r
+#include "ephemeris_download/include/EphemerisDownloadModel.h"\r
+#endif\r
+\r
+\r
+#if 0\r
+    点击开始按钮\r
+    ↓\r
+    检查是否需要GPS\r
+    ↓ (需要GPS)\r
+    检查星历是否有效\r
+    ↓ (无效) → 跳转星历提醒界面\r
+    ↓ (有效)\r
+    检查GPS是否连接\r
+    ↓ (未连接) → 跳转GPS提醒界面\r
+    ↓ (已连接)\r
+    跳转运动卡片\r
+#endif\r
 \r
 #include "NativeRegisterManager.h"\r
 namespace OHOS\r
@@ -30,19 +48,17 @@ namespace OHOS
     \r
     TraingNomalPresenter::TraingNomalPresenter()\r
     {\r
-\r
+        enter_flag = false;\r
         g_pTraingNomalPresenter = this;\r
     }\r
 \r
     TraingNomalPresenter::~TraingNomalPresenter()\r
     {\r
-\r
         g_pTraingNomalPresenter = nullptr;\r
     }\r
 \r
     TraingNomalPresenter *TraingNomalPresenter::GetInstance()\r
     {\r
-\r
         return g_pTraingNomalPresenter;\r
     }\r
 \r
@@ -83,15 +99,13 @@ namespace OHOS
             3.[更多]->[具体训练项]进入\r
             4.[设置训练目标]进入 {不返回}\r
         */\r
-        NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
-        //如果不是进入运动界面\r
+        NativeAbility::GetInstance().Back();\r
+        \r
+        // 如果未进入运动卡片(进入的是提醒界面),清理GPS和心率资源\r
+        // enter_flag = true 表示已进入运动卡片,资源由运动卡片管理\r
+        // enter_flag = false 表示进入的是提醒界面,需要清理资源\r
         if(enter_flag == false){\r
-        // 关闭心率\r
-        TraingModel::GetInstance()->stop_heart_gps();\r
-    #if defined(SUPPORT_GNSS)\r
-        // 关闭gps定时器\r
-        TraingModel::GetInstance()->gnss_stop_timer();\r
-    #endif\r
+            CleanupGPSResources();\r
         }\r
     }\r
     bool TraingNomalPresenter::OnDrag(UIView &view, const DragEvent &event)\r
@@ -112,6 +126,66 @@ namespace OHOS
         return true;\r
     }\r
 \r
+    // 检查GPS相关条件,返回目标视图ID\r
+    AppViewId TraingNomalPresenter::CheckGPSAndNavigate()\r
+    {\r
+        AppViewId targetViewId = VIEW_TRAININGCRAD;\r
+        \r
+        // 判断是否需要GPS\r
+        if (!TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()))\r
+        {\r
+            // 不需要GPS,直接进入运动卡片\r
+            return targetViewId;\r
+        }\r
+\r
+        #if defined(SUPPORT_GNSS)\r
+        // 需要GPS,先检查星历是否有效\r
+        bool ephemeris_valid = EphemerisDownloadModel::GetInstance().GetValidityPeriod();\r
+        if (!ephemeris_valid)\r
+        {\r
+            // 星历无效,进入星历提醒界面\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "星历无效,跳转到星历提醒界面");\r
+            return VIEW_TRAINING_EPHEMERIS_NOTE;\r
+        }\r
+\r
+        // 星历有效,再检查GPS连接状态\r
+        bool gps_status = TraingModel::GetInstance()->GetGPSConnectState();\r
+        if (!gps_status)\r
+        {\r
+            // GPS未连接,进入GPS提醒界面\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS未连接,跳转到GPS提醒界面");\r
+            return VIEW_TRAINING_GPSNOTE;\r
+        }\r
+\r
+        // 星历有效且GPS已连接,可以进入运动卡片\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS条件满足,进入运动卡片");\r
+        #endif\r
+        \r
+        return targetViewId;\r
+    }\r
+\r
+    // 清理GPS和心率相关资源\r
+    void TraingNomalPresenter::CleanupGPSResources()\r
+    {\r
+        // 关闭心率\r
+        TraingModel::GetInstance()->stop_heart_gps();\r
+        #if defined(SUPPORT_GNSS)\r
+        // 关闭gps定时器\r
+        TraingModel::GetInstance()->gnss_stop_timer();\r
+        #endif\r
+    }\r
+\r
+    // 启动运动相关资源\r
+    void TraingNomalPresenter::StartSportResources()\r
+    {\r
+        // 获取运动项目\r
+        ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
+        // 开启对应的运动\r
+        TraingCardPresenter::GetInstance()->OpenSensor(type);\r
+        // 设置为手表开启运动\r
+        TraingModel::GetInstance()->SetSportOpenWay(false);\r
+    }\r
+\r
     bool TraingNomalPresenter::OnClick(UIView &view, const ClickEvent &event)\r
     {\r
         // 根据控件id查找是哪个控件触发了点击回调\r
@@ -119,37 +193,35 @@ namespace OHOS
         {\r
             // 训练准备 -> 训练设置\r
             NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGSET);\r
+            return true;\r
         }\r
+        \r
         if (strcmp(view.GetViewId(), BUTTONGO) == 0)\r
         {\r
-            //默认前往运动卡片\r
-            AppViewId viewid = VIEW_TRAININGCRAD;\r
-            /*判断是否需要GPS*/\r
-            if(TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()) == true)\r
+            // 检查GPS条件并确定目标视图\r
+            AppViewId targetViewId = CheckGPSAndNavigate();\r
+            \r
+            // 根据目标视图决定后续操作\r
+            if (targetViewId == VIEW_TRAININGCRAD)\r
             {\r
-            #if defined(SUPPORT_GNSS)\r
-                bool gps_status = TraingModel::GetInstance()->GetGPSConnectState();\r
-                if (!gps_status)\r
-                {\r
-                //未连接进入GPS提示界面\r
-                viewid = VIEW_TRAINING_GPSNOTE;\r
-                }\r
-            #endif\r
+                // 进入运动卡片:设置标志位并启动运动资源\r
+                enter_flag = true;\r
+                StartSportResources();\r
             }\r
-            NativeAbility::GetInstance().ChangeSlice(viewid);\r
-            // 获取运动项目\r
-            ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
-            // 开启对应的运动\r
-            TraingCardPresenter::GetInstance()->OpenSensor(type);\r
-            // 设置为手表开启运动\r
-            TraingModel::GetInstance()->SetSportOpenWay(false);\r
-            // 如果是进入运动卡片,设置进入标志位\r
-            if(viewid == VIEW_TRAININGCRAD)\r
+            else\r
             {\r
-                // 设置进入标志位\r
-                enter_flag = true;\r
+                // 进入提醒界面:设置标志位为false\r
+                enter_flag = false;\r
+\r
             }\r
+\r
+            // 执行跳转\r
+            NativeAbility::GetInstance().ChangeSlice(targetViewId);\r
+            \r
+            \r
+            return true;\r
         }\r
+        \r
         return true;\r
     }\r
     bool TraingNomalPresenter::OnKeyAct(UIView &view, const KeyEvent &event)\r
@@ -178,6 +250,6 @@ namespace OHOS
             return;\r
         }\r
         //获取gps定位状态\r
-        // TraingNomalView::GetInstance()->updateview();\r
+        TraingNomalView::GetInstance()->updateview();\r
     }\r
 }\r