From ee892abf794d8a52225974ebd356d1d51514fb62 Mon Sep 17 00:00:00 2001 From: Caisking Date: Fri, 29 Aug 2025 11:43:47 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E8=BF=90=E5=8A=A8=E5=BC=80?= =?utf8?q?=E5=A7=8B=E7=95=8C=E9=9D=A2=E7=9A=84=E5=BF=83=E7=8E=87=E6=A3=80?= =?utf8?q?=E6=B5=8B=EF=BC=9B=E4=BB=A5=E5=8F=8A=E4=BC=98=E5=8C=96gps?= =?utf8?q?=E4=B8=8E=E8=BF=90=E5=8A=A8=E5=BF=83=E7=8E=87=E5=BC=80=E5=90=AF?= =?utf8?q?=E5=85=B3=E9=97=AD=E7=9A=84=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/traing/include/TraingModel.h | 6 + .../nativeui/traing/src/TraingModel.cpp | 129 +++++++++++++----- .../nativeui/traing/src/TraingNomalView.cpp | 5 +- .../training_card/src/TrainingDataView.cpp | 2 +- 4 files changed, 103 insertions(+), 39 deletions(-) diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h index f5d8e0c63..64f344b3e 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h @@ -397,6 +397,11 @@ public: void gnss_stop_timer(void); void sport_start_data_timer(uint32_t interval = 1 * 1000); void sport_stop_data_timer(); + + // 数据获取相关函数 + bool GetSportActivityData(void); // 获取运动基础数据 + bool GetSportExtraData(void); // 获取运动额外数据 + uint8_t GetHeartRateData(void); // 获取心率数据 private: TraingModel(const TraingModel &) = delete; @@ -449,6 +454,7 @@ private: std::vector canvasData; // 轨迹点集 std::vector gpsData; // GPS数据集 bool gpsconnect{false}; + bool gpsopen{false};// GPS是否开启 }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp index cc5d5f3cc..a04225d76 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp @@ -3025,24 +3025,36 @@ void TraingModel::SetGPSConnectState(bool state) { // SystemLogModel::GetInstance()->save_gps_status_log_type(gpsconnect); } } -//开启gps -void TraingModel::OpenGPS() { -// 开启GPS的代码逻辑 +//运动心率、gps开启准备 +void TraingModel::start_heart_gps() { + if (gpsopen == false) { + // 开启gps #if defined(SUPPORT_GNSS) - gnss_start(); + gnss_start(); +#endif + //开启心率检测 +#ifdef SUPPORT_PPG_SERVICE + ppg_hr_start(); #endif + gpsopen = true; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开启gps定位"); + } } -//关闭gps -void TraingModel::CloseGPS() { -// 关闭GPS的代码逻辑 +//运动心率、gps关闭 +void TraingModel::stop_heart_gps() { + if (gpsopen == true) { + // 关闭gps #if defined(SUPPORT_GNSS) - gnss_stop(); + gnss_stop(); +#endif + //关闭心率检测 +#ifdef SUPPORT_PPG_SERVICE + ppg_hr_stop(); #endif + gpsopen = false; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "关闭gps定位"); + } } -//运动心率、gps开启准备 -void TraingModel::start_heart_gps() { OpenGPS(); } -//运动心率、gps关闭 -void TraingModel::stop_heart_gps() { CloseGPS(); } /////////////////////////////////////位置服务定时器///////////////////////////////////// /* @@ -3118,8 +3130,8 @@ void TraingModel::gnss_start_timer(uint32_t interval) { /* --------------------------------- 2.创建位置服务定时器 * -------------------------------- */ - g_location_timer = osTimerNew((osTimerFunc_t)gnss_timer_callback, osTimerPeriodic, - nullptr, nullptr); + g_location_timer = osTimerNew((osTimerFunc_t)gnss_timer_callback, + osTimerPeriodic, nullptr, nullptr); // 检查定时器创建是否成功 if (g_location_timer == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Location Timer create failed!!"); @@ -3136,8 +3148,8 @@ void TraingModel::gnss_start_timer(uint32_t interval) { /* -------------------- 5.检查位置服务定时器启动是否成功,如果启动失败,删除定时器并置为 * nullptr -------------------- */ if (ret != osOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Location Timer start failed, ret = %lx!!", - ret); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Location Timer start failed, ret = %lx!!", ret); if (g_location_timer != nullptr) { ret = osTimerDelete(g_location_timer); } @@ -3177,34 +3189,69 @@ void TraingModel::gnss_stop_timer(void) { static osTimerId_t g_sport_start_data_timer = nullptr; static int sport_start_data_timer_interval = 300; // 运动数据获取间隔,单位毫秒 -static void sport_data_time_proc(int data) { - //增加训练runtime控制 - if (uapi_dev_runtime_get_train_status() == 0 || - TraingModel::GetInstance()->GetSportState() == ExerciseState::End) { - return; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sport_data_time_proc"); - +/* + * @brief 获取运动基础数据 + * @return 是否成功获取数据 + */ +bool TraingModel::GetSportActivityData(void) { #ifdef SUPPORT_CYWEE_SERVICE act_result_t cyweeInfo; cywee_get_act_data(&cyweeInfo); + // 更新运动基础数据 TraingModel::GetInstance()->AnalysisData(&cyweeInfo); // 更新其他目标完成度 TraingModel::GetInstance()->CheckSportTag(); +#endif + return true; +} +/* + * @brief 获取运动额外数据 + * @return 是否成功获取数据 + */ +bool TraingModel::GetSportExtraData(void) { +#ifdef SUPPORT_CYWEE_SERVICE act_ext_result_t cyweeInfo_ext; cywee_get_act_ext_data(&cyweeInfo_ext); TraingModel::GetInstance()->AnalysisExtraData(&cyweeInfo_ext); #endif + return true; +} - //训练心率 +/* + * @brief 获取心率数据 + * @return 获取到的心率值,如果服务不支持则返回0 + */ +uint8_t TraingModel::GetHeartRateData(void) { uint8_t hrs = 0; #ifdef SUPPORT_PPG_SERVICE hrs = ppg_get_hrs(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Training data timer: heart rate = %d", hrs); #endif - TraingModel::GetInstance()->AnalysisHeartData(hrs); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Heart rate data: %d", hrs); + return hrs; +} +static void sport_data_time_proc(int data) { + //增加训练runtime控制 + if (uapi_dev_runtime_get_train_status() == 0 || + TraingModel::GetInstance()->GetSportState() == ExerciseState::End) { + return; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sport_data_time_proc"); + + // 获取并处理运动基础数据 + TraingModel::GetInstance()->GetSportActivityData(); + + // 获取并处理运动额外数据 前提是特殊运动 + if (TraingModel::GetInstance()->GetIsSpecial()){ + TraingModel::GetInstance()->GetSportExtraData(); + } + + // 获取并处理心率数据 + uint8_t heartRate = TraingModel::GetInstance()->GetHeartRateData(); + TraingModel::GetInstance()->AnalysisHeartData(heartRate); + + // 更新UI if (TraingCardPresenter::GetInstance()) { TraingCardPresenter::GetInstance()->updataview(); } @@ -3216,14 +3263,15 @@ static void sport_data_time_callback(int data) { } void TraingModel::sport_start_data_timer(uint32_t interval) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "TraingModel::sport_start_data_timer - Starting sport data timer"); + WEARABLE_LOGE( + WEARABLE_LOG_MODULE_APP, + "TraingModel::sport_start_data_timer - Starting sport data timer"); if (g_sport_start_data_timer != nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sport Data Timer already exists!!"); return; } g_sport_start_data_timer = osTimerNew((osTimerFunc_t)sport_data_time_callback, - osTimerPeriodic, nullptr, nullptr); + osTimerPeriodic, nullptr, nullptr); if (g_sport_start_data_timer == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sport Data Timer create failed!!"); return; @@ -3231,8 +3279,8 @@ void TraingModel::sport_start_data_timer(uint32_t interval) { int tick = osMs2Tick(interval); osStatus_t ret = osTimerStart(g_sport_start_data_timer, tick); if (ret != osOK) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sport Data Timer start failed, ret = %lx!!", - ret); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Sport Data Timer start failed, ret = %lx!!", ret); if (g_sport_start_data_timer != nullptr) { ret = osTimerDelete(g_sport_start_data_timer); } @@ -3244,8 +3292,9 @@ void TraingModel::sport_start_data_timer(uint32_t interval) { void TraingModel::sport_stop_data_timer(void) { // 检查运动数据采集定时器是否存在 if (g_sport_start_data_timer != nullptr) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "TraingModel::sport_stop_data_timer - Stopping sport data timer"); + WEARABLE_LOGE( + WEARABLE_LOG_MODULE_APP, + "TraingModel::sport_stop_data_timer - Stopping sport data timer"); osTimerStop(g_sport_start_data_timer); // 删除定时器并置为 nullptr osStatus_t ret = osTimerDelete(g_sport_start_data_timer); @@ -3364,17 +3413,23 @@ void ble_training_init(void) { /* * 定时器分工总结: - * + * * 1. 位置服务定时器 (g_location_timer) * - 频率:1秒间隔 * - 功能:GPS定位、连接状态更新、轨迹数据采集 * - 特点:中等频率,保证位置数据实时性 - * + * * 2. 运动数据采集定时器 (g_sport_start_data_timer) * - 频率:300毫秒间隔 * - 功能:运动数据采集、心率监测、目标完成度检查、UI更新 * - 特点:高频率,保证运动数据实时性和准确性 - * + * + * 数据获取函数封装(职责单一,无耦合): + * - GetSportActivityData(): 获取运动基础数据,返回是否成功 + * - GetSportExtraData(): 获取运动额外数据,返回是否成功 + * - GetHeartRateData(): 获取心率数据,返回心率值 + * - 数据分析和处理逻辑在定时器回调中协调完成 + * * 两个定时器独立运行,互不干扰,根据各自功能特点选择合适的执行频率 */ diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalView.cpp index 91fc99aa0..52d28d696 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalView.cpp @@ -178,10 +178,13 @@ namespace OHOS //更新gps状态 bool TraingNomalView::updateview() { - if(gps_image_ == nullptr || buttonGo_ == nullptr) + if(gps_image_ == nullptr || buttonGo_ == nullptr ||heartrate_label_ == nullptr) { return false; } + // 更新心率状态显示 + uint8_t heartRate = TraingModel::GetInstance()->GetHeartRateData(); + heartrate_label_->SetText(std::to_string(heartRate).c_str()); // 更新GPS状态显示 bool gps_status = TraingModel::GetInstance()->GetGPSConnectState(); if(gps_status == updat_view_status) diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TrainingDataView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TrainingDataView.cpp index 8cce5fd67..aaccfec16 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TrainingDataView.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TrainingDataView.cpp @@ -68,7 +68,7 @@ bool TrainingDataView ::InitPage() { circleProgress->SetStartAngle(215); circleProgress->SetEndAngle(505); circleProgress->SetCapType(CAP_ROUND); - circleProgress->SetValue(100); + circleProgress->SetValue(0); // 初始化Lable -- 2.17.1