#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"
}
/*设置运动状态*/
void TraingModel::SetSportState(ExerciseState state) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " SetSportState %d", state);
if (state != ExerciseState::General) {
/*app发起的运动*/
if (Openingway == true) {
/*设置运动开始与结束*/
void TraingModel::SetTimestamp() {
+
uint32_t time;
if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
}
ExerciseState currentState = GetSportState(); // 获取当前运动状态
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentState:%d", currentState);
// 增加标志位互斥保障"开始"和"结束"的唯一性操作
if (currentState == ExerciseState::Start && !Startstate) {
Endstate = false; // 确保"开始"和"结束"状态互斥
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始运动");
+ sport_data_timer(); //开启数据获取定时器
+
#ifdef SYSTEM_LOG_SERVICE
//日志记录
if (Openingway) {
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) {
(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) {
// 较低强度
}
/*发送实时数据*/
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!");
}
/* -------------------------------- 运动识别发起处理
* -------------------------------- */
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; // 返回格式化的运动时长
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "duration:[%d] g_motionTimes[%d]\r\n",
sportdata->duration, g_motionTimes);
}
+
#ifdef __cplusplus
extern "C" {
#endif
/* 定时器回调函数 */
void TraingTimerCallback(void) {
// 只在活动状态下进行更新
-
if (pauseStartTimestamp == 0) {
//开始时将该值设置为运动开始值
pauseStartTimestamp = sportdata->starttime;
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"