From 927f0433e571cef3b8cf2233c6fcfa02b77a9ddd Mon Sep 17 00:00:00 2001 From: Caisking Date: Thu, 8 Jan 2026 10:49:41 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E6=98=9F=E5=8E=86=E4=B8=8B?= =?utf8?q?=E8=BD=BD=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../src/EphemerisDownloadPresenter.cpp | 15 +- .../src/EphemerisDownloadView.cpp | 4 +- .../traing/include/TraingNomalPresenter.h | 9 ++ .../nativeui/traing/src/TraingModel.cpp | 38 ++--- .../traing/src/TraingNomalPresenter.cpp | 142 +++++++++++++----- 5 files changed, 151 insertions(+), 57 deletions(-) diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadPresenter.cpp b/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadPresenter.cpp index 0e3d28aed..9e06dd2e1 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadPresenter.cpp +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadPresenter.cpp @@ -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(); diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadView.cpp b/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadView.cpp index c21482e02..d3f7a6b8c 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadView.cpp +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadView.cpp @@ -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; diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/include/TraingNomalPresenter.h b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/include/TraingNomalPresenter.h index db13d7579..235b21301 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/include/TraingNomalPresenter.h +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/include/TraingNomalPresenter.h @@ -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 diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp index 78a383843..61fa5a6d9 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingModel.cpp @@ -3070,25 +3070,25 @@ 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() { @@ -3184,7 +3184,7 @@ 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; } @@ -3195,7 +3195,7 @@ 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 } @@ -3214,9 +3214,9 @@ * @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.检查位置服务定时器是否已经存在,如果存在则返回 @@ -3225,11 +3225,11 @@ 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); // 检查定时器创建是否成功 @@ -3237,18 +3237,18 @@ 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 -------------------- */ @@ -3265,8 +3265,8 @@ "=== 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定时器启动流程结束(成功) ==="); } /* diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingNomalPresenter.cpp b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingNomalPresenter.cpp index ea6204dc7..d9dcd7e2a 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingNomalPresenter.cpp +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingNomalPresenter.cpp @@ -17,6 +17,24 @@ #include "main/include/MainModel.h" #include "UiConfig.h" // #include "TraingNomalView.h" +#ifdef SUPPORT_GNSS +#include "ephemeris_download/include/EphemerisDownloadModel.h" +#endif + + +#if 0 + 点击开始按钮 + ↓ + 检查是否需要GPS + ↓ (需要GPS) + 检查星历是否有效 + ↓ (无效) → 跳转星历提醒界面 + ↓ (有效) + 检查GPS是否连接 + ↓ (未连接) → 跳转GPS提醒界面 + ↓ (已连接) + 跳转运动卡片 +#endif #include "NativeRegisterManager.h" namespace OHOS @@ -30,19 +48,17 @@ namespace OHOS TraingNomalPresenter::TraingNomalPresenter() { - + enter_flag = false; g_pTraingNomalPresenter = this; } TraingNomalPresenter::~TraingNomalPresenter() { - g_pTraingNomalPresenter = nullptr; } TraingNomalPresenter *TraingNomalPresenter::GetInstance() { - return g_pTraingNomalPresenter; } @@ -83,15 +99,13 @@ namespace OHOS 3.[更多]->[具体训练项]进入 4.[设置训练目标]进入 {不返回} */ - NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); - //如果不是进入运动界面 + NativeAbility::GetInstance().Back(); + + // 如果未进入运动卡片(进入的是提醒界面),清理GPS和心率资源 + // enter_flag = true 表示已进入运动卡片,资源由运动卡片管理 + // enter_flag = false 表示进入的是提醒界面,需要清理资源 if(enter_flag == false){ - // 关闭心率 - TraingModel::GetInstance()->stop_heart_gps(); - #if defined(SUPPORT_GNSS) - // 关闭gps定时器 - TraingModel::GetInstance()->gnss_stop_timer(); - #endif + CleanupGPSResources(); } } bool TraingNomalPresenter::OnDrag(UIView &view, const DragEvent &event) @@ -112,6 +126,66 @@ namespace OHOS return true; } + // 检查GPS相关条件,返回目标视图ID + AppViewId TraingNomalPresenter::CheckGPSAndNavigate() + { + AppViewId targetViewId = VIEW_TRAININGCRAD; + + // 判断是否需要GPS + if (!TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent())) + { + // 不需要GPS,直接进入运动卡片 + return targetViewId; + } + + #if defined(SUPPORT_GNSS) + // 需要GPS,先检查星历是否有效 + bool ephemeris_valid = EphemerisDownloadModel::GetInstance().GetValidityPeriod(); + if (!ephemeris_valid) + { + // 星历无效,进入星历提醒界面 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "星历无效,跳转到星历提醒界面"); + return VIEW_TRAINING_EPHEMERIS_NOTE; + } + + // 星历有效,再检查GPS连接状态 + bool gps_status = TraingModel::GetInstance()->GetGPSConnectState(); + if (!gps_status) + { + // GPS未连接,进入GPS提醒界面 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS未连接,跳转到GPS提醒界面"); + return VIEW_TRAINING_GPSNOTE; + } + + // 星历有效且GPS已连接,可以进入运动卡片 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS条件满足,进入运动卡片"); + #endif + + return targetViewId; + } + + // 清理GPS和心率相关资源 + void TraingNomalPresenter::CleanupGPSResources() + { + // 关闭心率 + TraingModel::GetInstance()->stop_heart_gps(); + #if defined(SUPPORT_GNSS) + // 关闭gps定时器 + TraingModel::GetInstance()->gnss_stop_timer(); + #endif + } + + // 启动运动相关资源 + void TraingNomalPresenter::StartSportResources() + { + // 获取运动项目 + ExerciseClass type = TraingModel::GetInstance()->GetSportId(); + // 开启对应的运动 + TraingCardPresenter::GetInstance()->OpenSensor(type); + // 设置为手表开启运动 + TraingModel::GetInstance()->SetSportOpenWay(false); + } + bool TraingNomalPresenter::OnClick(UIView &view, const ClickEvent &event) { // 根据控件id查找是哪个控件触发了点击回调 @@ -119,37 +193,35 @@ namespace OHOS { // 训练准备 -> 训练设置 NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGSET); + return true; } + if (strcmp(view.GetViewId(), BUTTONGO) == 0) { - //默认前往运动卡片 - AppViewId viewid = VIEW_TRAININGCRAD; - /*判断是否需要GPS*/ - if(TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()) == true) + // 检查GPS条件并确定目标视图 + AppViewId targetViewId = CheckGPSAndNavigate(); + + // 根据目标视图决定后续操作 + if (targetViewId == VIEW_TRAININGCRAD) { - #if defined(SUPPORT_GNSS) - bool gps_status = TraingModel::GetInstance()->GetGPSConnectState(); - if (!gps_status) - { - //未连接进入GPS提示界面 - viewid = VIEW_TRAINING_GPSNOTE; - } - #endif + // 进入运动卡片:设置标志位并启动运动资源 + enter_flag = true; + StartSportResources(); } - NativeAbility::GetInstance().ChangeSlice(viewid); - // 获取运动项目 - ExerciseClass type = TraingModel::GetInstance()->GetSportId(); - // 开启对应的运动 - TraingCardPresenter::GetInstance()->OpenSensor(type); - // 设置为手表开启运动 - TraingModel::GetInstance()->SetSportOpenWay(false); - // 如果是进入运动卡片,设置进入标志位 - if(viewid == VIEW_TRAININGCRAD) + else { - // 设置进入标志位 - enter_flag = true; + // 进入提醒界面:设置标志位为false + enter_flag = false; + } + + // 执行跳转 + NativeAbility::GetInstance().ChangeSlice(targetViewId); + + + return true; } + return true; } bool TraingNomalPresenter::OnKeyAct(UIView &view, const KeyEvent &event) @@ -178,6 +250,6 @@ namespace OHOS return; } //获取gps定位状态 - // TraingNomalView::GetInstance()->updateview(); + TraingNomalView::GetInstance()->updateview(); } } -- 2.17.1