// 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(); }
/////////////////////////////////////位置服务定时器/////////////////////////////////////
/*
/* --------------------------------- 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!!");
/* -------------------- 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);
}
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();
}
}
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;
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);
}
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);
/*
* 定时器分工总结:
- *
+ *
* 1. 位置服务定时器 (g_location_timer)
* - 频率:1秒间隔
* - 功能:GPS定位、连接状态更新、轨迹数据采集
* - 特点:中等频率,保证位置数据实时性
- *
+ *
* 2. 运动数据采集定时器 (g_sport_start_data_timer)
* - 频率:300毫秒间隔
* - 功能:运动数据采集、心率监测、目标完成度检查、UI更新
* - 特点:高频率,保证运动数据实时性和准确性
- *
+ *
+ * 数据获取函数封装(职责单一,无耦合):
+ * - GetSportActivityData(): 获取运动基础数据,返回是否成功
+ * - GetSportExtraData(): 获取运动额外数据,返回是否成功
+ * - GetHeartRateData(): 获取心率数据,返回心率值
+ * - 数据分析和处理逻辑在定时器回调中协调完成
+ *
* 两个定时器独立运行,互不干扰,根据各自功能特点选择合适的执行频率
*/