增加运动数据获取服务
authorCaisking <Casiking@zhihuishixun.com>
Sat, 19 Jul 2025 10:23:29 +0000 (18:23 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Sat, 19 Jul 2025 10:23:29 +0000 (18:23 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp

index 45b562a..db9ddb5 100644 (file)
@@ -363,6 +363,10 @@ public:
   void SetUserSportdata();
   void SetMaxHeart(int maxheart);
 
+  //获取数据定时器
+  void sport_data_timer(uint32_t interval = 1000);
+  void sport_stop_data_timer();
+
 private:
   TraingModel(const TraingModel &) = delete;
   TraingModel &operator=(const TraingModel &) = delete;
index 6d347df..8fc620c 100644 (file)
 #include "bleService.h"
 #endif
 
+#ifdef SUPPORT_PPG_SERVICE
+#include "ppg_hal.h"
+#include "ppg_service.h"
+#endif
+
+#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_service.h"
+#endif
+
+#define SPORT_TIMER_DATA 1
+
 #include "broadcast_feature.h"
 #include "broadcast_service.h"
 #include "custom_runtime.h"
@@ -445,6 +456,7 @@ std::string TraingModel::GetTagStr() {
 }
 /*设置运动状态*/
 void TraingModel::SetSportState(ExerciseState state) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " SetSportState %d", state);
   if (state != ExerciseState::General) {
     /*app发起的运动*/
     if (Openingway == true) {
@@ -679,6 +691,7 @@ uint32_t TraingModel::get_current_time() {
 
 /*设置运动开始与结束*/
 void TraingModel::SetTimestamp() {
+
   uint32_t time;
   if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
@@ -686,6 +699,7 @@ void TraingModel::SetTimestamp() {
   }
 
   ExerciseState currentState = GetSportState(); // 获取当前运动状态
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentState:%d", currentState);
 
   // 增加标志位互斥保障"开始"和"结束"的唯一性操作
   if (currentState == ExerciseState::Start && !Startstate) {
@@ -727,6 +741,8 @@ void TraingModel::SetTimestamp() {
     Endstate = false; // 确保"开始"和"结束"状态互斥
 
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始运动");
+    sport_data_timer(); //开启数据获取定时器
+
 #ifdef SYSTEM_LOG_SERVICE
     //日志记录
     if (Openingway) {
@@ -740,7 +756,10 @@ void TraingModel::SetTimestamp() {
       uapi_save_runtime_log(RUNTIME_LOG_SPORT_NORMAL_START); //普通运动
     }
 #endif
+
   } else if (currentState == ExerciseState::End && !Endstate) {
+    sport_stop_data_timer(); //停止数据获取定时器
+
     // 设置训练 runtime 为 0 训练结束
     uapi_dev_runtime_set_train_status(0);
     if (Openingway) {
@@ -1012,7 +1031,7 @@ void TraingModel::SetIntensity(int heart) {
       (heartRateAsDouble / (double)user_Intensity) * 100;
   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
                 "heart: %d, maxHeartRate: %d, intensityPercentage: %.2f", heart,
-                HeartModel, intensityPercentage);
+                TraingModel, intensityPercentage);
 
   if (intensityPercentage < LOW_INTENSITY_THRESHOLD) {
     // 较低强度
@@ -1681,20 +1700,20 @@ std::string TraingModel::GetPaceTablePath(uint32_t timestamp) {
 }
 /*发送实时数据*/
 void TraingModel::SendLiveData() {
-  // msg_get_train_data_info_t data;
-  // memset(&data, 0, sizeof(msg_get_train_data_info_t));
-  // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->starttime %d \r\n",
-  //               sportdata->starttime);
-  // data.st = sportdata->starttime;
-  // data.hr = sportdata->heart;
-  // data.ca = sportdata->calories * 10; // app端需要乘10
-  // data.di = sportdata->distance;
-  // data.stp = sportdata->steps;
-  // data.ti = sportdata->intensity;
-  // data.pc = sportdata->pc;
-  // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SendLiveData Begin!");
-  // sendtraningdata(&data); // 发送数据函数
-  // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SendLiveData Stop!");
+  msg_get_train_data_info_t data;
+  memset(&data, 0, sizeof(msg_get_train_data_info_t));
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->starttime %d \r\n",
+                sportdata->starttime);
+  data.st = sportdata->starttime;
+  data.hr = sportdata->heart;
+  data.ca = sportdata->calories * 10; // app端需要乘10
+  data.di = sportdata->distance;
+  data.stp = sportdata->steps;
+  data.ti = sportdata->intensity;
+  data.pc = sportdata->pc;
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SendLiveData Begin!");
+  sendtraningdata(&data); // 发送数据函数
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SendLiveData Stop!");
 }
 /* -------------------------------- 运动识别发起处理
  * -------------------------------- */
@@ -1742,25 +1761,11 @@ std::string TraingModel::DisplayMotionDuration() {
 
   motionDuration = oss.str();
 
-  // // 获取当前时间(以微秒为单位)
-  // uint32_t currentTime = static_cast<uint32_t>(
-  //     std::chrono::duration_cast<std::chrono::microseconds>(
-  //         std::chrono::system_clock::now().time_since_epoch())
-  //         .count());
-
-  // // 记录和检查上一次调用的时间
-  // static uint32_t lastCallTime = 0;
-  // if (currentTime - lastCallTime < 1000000) { // 小于1秒
-  //   return motionDuration;
-  // }
-  // lastCallTime = currentTime; // 更新最后调用时间
-
-  // 如果 g_motionTimes 不为零,进行计算和数据存储
   if (g_motionTimes > 0) {
     sportdata->duration = g_motionTimes; // 设置训练时长
 
     // 每分钟进行配速和心率数据存储
-    // StoreDataIfMinutePassed();
+    StoreDataIfMinutePassed();
   }
 
   return motionDuration; // 返回格式化的运动时长
@@ -1794,6 +1799,7 @@ void TraingModel::StoreDataIfMinutePassed() {
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "duration:[%d] g_motionTimes[%d]\r\n",
                 sportdata->duration, g_motionTimes);
 }
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -1814,7 +1820,6 @@ void LogError(const char *msg, osStatus_t ret) {
 /* 定时器回调函数 */
 void TraingTimerCallback(void) {
   // 只在活动状态下进行更新
-
   if (pauseStartTimestamp == 0) {
     //开始时将该值设置为运动开始值
     pauseStartTimestamp = sportdata->starttime;
@@ -2358,6 +2363,85 @@ bool TraingModel::LoadDataFormJson(std::vector<SportData> &sportDataVector) {
   return true;
 }
 
+///////////////////////////////////////datatimer//////////////////////////////////
+#if SPORT_TIMER_DATA
+// 声明定时器变量
+static osTimerId_t g_data_timer = nullptr;
+static void sport_data_callbackProc(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_callbackProc");
+#ifdef CYWEE_ACTIVITY_ENABLE
+  act_result_t cyweeInfo;
+  cywee_get_act_data(&cyweeInfo);
+  TraingModel::GetInstance()->AnalysisData(cyweeInfo);
+  // 更新其他目标完成度
+  TraingModel::GetInstance()->CheckSportTag();
+
+  act_ext_result_t cyweeInfo_ext;
+
+  cywee_get_act_ext_data(&cyweeInfo_ext);
+  TraingModel::GetInstance()->AnalysisExtraData(cyweeInfo_ext);
+#endif
+  //训练心率
+  uint8_t hrs = 0;
+#ifdef SUPPORT_PPG_SERVICE
+  hrs = ppg_get_hrs();
+  printf("heart_data_callbackProc::hrs = %d\n", hrs);
+#endif
+  TraingModel::GetInstance()->AnalysisHeartData(hrs);
+}
+
+static void sport_data_timer_callback(int data) {
+  GraphicService::GetInstance()->PostGraphicEvent(
+      std::bind(sport_data_callbackProc, data));
+}
+
+void TraingModel::sport_data_timer(uint32_t interval) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "TraingModel::sport_start_screen60s_timer");
+  if (g_data_timer != nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+    return;
+  }
+  g_data_timer = osTimerNew((osTimerFunc_t)sport_data_timer_callback,
+                            osTimerPeriodic, nullptr, nullptr);
+  if (g_data_timer == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+    return;
+  }
+  int tick = osMs2Tick(interval);
+  osStatus_t ret = osTimerStart(g_data_timer, tick);
+  if (ret != osOK) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!",
+                  ret);
+    if (g_data_timer != nullptr) {
+      ret = osTimerDelete(g_data_timer);
+    }
+    g_data_timer = nullptr;
+    return;
+  }
+}
+void TraingModel::sport_stop_data_timer(void) {
+  // 检查定时器是否存在
+  if (g_data_timer != nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "TraingModel::sport_stop_screen60s_timer");
+    osTimerStop(g_data_timer);
+    // 删除定时器并置为 nullptr
+    osStatus_t ret = osTimerDelete(g_data_timer);
+    if (ret != osOK) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "osTimerDelete failed, ret = %lx!!", ret);
+    }
+    g_data_timer = nullptr;
+  }
+}
+#endif
+
 #ifdef BLE_INSTRUCT
 
 #include "bleEvent.h"