增加运动开始界面的心率检测;以及优化gps与运动心率开启关闭的管理
authorCaisking <Casiking@zhihuishixun.com>
Fri, 29 Aug 2025 03:43:47 +0000 (11:43 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Fri, 29 Aug 2025 03:43:47 +0000 (11:43 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingNomalView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/training_card/src/TrainingDataView.cpp

index f5d8e0c..64f344b 100644 (file)
@@ -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<Point> canvasData; // 轨迹点集
   std::vector<GPSData> gpsData;  // GPS数据集
   bool gpsconnect{false};
+  bool gpsopen{false};// GPS是否开启
 };
 } // namespace OHOS
 
index cc5d5f3..a04225d 100644 (file)
@@ -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(): 获取心率数据,返回心率值
+ * - 数据分析和处理逻辑在定时器回调中协调完成
+ *
  * 两个定时器独立运行,互不干扰,根据各自功能特点选择合适的执行频率
  */
 
index 91fc99a..52d28d6 100644 (file)
@@ -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)
index 8cce5fd..aaccfec 100644 (file)
@@ -68,7 +68,7 @@ bool TrainingDataView ::InitPage() {
   circleProgress->SetStartAngle(215);
   circleProgress->SetEndAngle(505);
   circleProgress->SetCapType(CAP_ROUND);
-  circleProgress->SetValue(100);
+  circleProgress->SetValue(0);
 
 
   // 初始化Lable