#include "common/key_code.h"
#include "custom_utils.h"
+#include "custom_runtime.h"
#include "key/include/KeyInputListener.h"
#include "AppViewIDs.h"
#include "NativeRegisterManager.h"
#include "wearable_log.h"
+#include "ui_resource_string.h"
#ifdef SUPPORT_BLE_SERVICE
#include "bleEvent.h"
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();
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);
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;
#include "Presenter.h"
#include "TraingNomalView.h"
#include "ModelListenerSample.h"
+#include "AppViewIDs.h"
namespace OHOS
{
class TraingNomalView;
static TraingNomalPresenter *GetInstance();
+ // 清理GPS和心率相关资源
+ void CleanupGPSResources();
+
private:
// 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;
bool OnClick(UIView &view, const ClickEvent &event) override;
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
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定时器启动流程结束(成功) ===");
}
/*
#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
\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
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
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
{\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
return;\r
}\r
//获取gps定位状态\r
- // TraingNomalView::GetInstance()->updateview();\r
+ TraingNomalView::GetInstance()->updateview();\r
}\r
}\r