return;
}
TraingModel::GetInstance()->AnalysisData(cyweeInfo);
+ // 更新其他目标完成度
+ TraingModel::GetInstance()->CheckSportTag();
delete cyweeInfo; // 释放内存
}
//训练额外信息
static constexpr int16 NUM_TIME_HOUR = 3600;
static constexpr int32 NUM_TIME_DAY = 86400;
#endif
+
SportData *sportdata = new SportData();
+int shock_count{0}; //震动提醒
+
TraingModel ::TraingModel() {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingModel::TraingModel()");
// sportdata->Initialize(); // 初始化结构体
Gettagstuats = false; // 重置训练达标标志位
Openstate = true; // 开启运动开始标志位
+
+ shock_count = 0; //重置震动计数
}
/*设置运动开始与结束*/
sportdata->sportType = sportType_; // 训练类型
sportdata->sportId = sportId_;
+
IsSpecialSport(sportdata->sportId); // 配置运动特殊性状态
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "训练目标:类型: %d 值: %d",
- sportTagType_, sportTag_);
if (sportTag_) // 有值才设置[训练目标]
{
sportdata->sportTagType = sportTagType_;
sportdata->tag = sportTag_;
}
- // (Openingway == true) ? (printf("app发起运动\n"))
- // : (printf("手表发起运动\n"));
+ current_goal = GetCurrentSportTag();
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "训练目标:类型: %d 值: %d 当前目标值:%d", sportTagType_,
+ sportTag_, current_goal);
+
+ (Openingway == true) ? (printf("app发起运动\n"))
+ : (printf("手表发起运动\n"));
// 设置起始日期和时间
SetStartDateTime();
/* 获取当前的目标值 */
int TraingModel::GetSportTagData() {
- if (sportdata->tag == 0) {
+ if (sportdata->tag == 0 || current_goal == 0) {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0");
return 0;
}
// 根据设置的训练目标类型去对应相对的数据
switch (sportdata->sportTagType) {
case ExerciseTag::Duration: {
- // 转换目标时长为秒
- float durationInSeconds = static_cast<float>(sportdata->tag * 60);
// 计算完成度
- goaldegree =
- (static_cast<float>(sportdata->duration) / durationInSeconds) * 100;
+ goaldegree = (static_cast<float>(sportdata->duration) / current_goal) * 100;
break;
}
case ExerciseTag::Calories: {
// 计算目标完成度
- goaldegree =
- (static_cast<float>(sportdata->calories) / sportdata->tag) * 100;
+ goaldegree = (static_cast<float>(sportdata->calories) / current_goal) * 100;
break;
}
case ExerciseTag::Distance: {
- float distanceInMeters = static_cast<float>(sportdata->tag * 1000);
// 计算目标完成度
- goaldegree =
- (static_cast<float>(sportdata->distance) / distanceInMeters) * 100;
+ goaldegree = (static_cast<float>(sportdata->distance) / current_goal) * 100;
break;
}
case ExerciseTag::Steps: {
// 计算目标完成度
- goaldegree = (static_cast<float>(sportdata->steps) / sportdata->tag) * 100;
+ goaldegree = (static_cast<float>(sportdata->steps) / current_goal) * 100;
break;
}
default:
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->sportTagType is error");
+ return 0;
break;
}
return static_cast<int>(round(goaldegree)); // 返回目标完成度
}
+//获取目标值
+uint32_t TraingModel::GetCurrentSportTag() {
+ if (sportdata->tag == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0");
+ return 0;
+ }
+
+ float goaldegree = 0.0f; // 初始化目标完成度
+
+ // 根据设置的训练目标类型去对应相对的数据
+ switch (sportdata->sportTagType) {
+ case ExerciseTag::Duration: {
+ // 转换目标时长为秒
+ return static_cast<float>(sportdata->tag * 60);
+ break;
+ }
+ case ExerciseTag::Calories: {
+ // 计算目标完成度
+ return sportdata->tag;
+ break;
+ }
+ case ExerciseTag::Distance: {
+ return static_cast<float>(sportdata->tag * 1000);
+ break;
+ }
+ case ExerciseTag::Steps: {
+ return sportdata->tag;
+ break;
+ }
+ default:
+ return 0;
+ break;
+ }
+}
+//获取是否达到目标 使用比较
+bool TraingModel::IsGetGoaldegree() {
+ if (sportdata->tag == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0");
+ return false;
+ }
+
+ float goaldegree = 0.0f; // 初始化目标完成度
+
+ // 根据设置的训练目标类型去对应相对的数据
+ switch (sportdata->sportTagType) {
+ case ExerciseTag::Calories: {
+ // 计算目标完成度
+ if (sportdata->calories >= current_goal) {
+ return true;
+ }
+ return false;
+ break;
+ }
+ case ExerciseTag::Distance: {
+ if (sportdata->distance >= current_goal) {
+ return true;
+ }
+ return false;
+ break;
+ }
+ case ExerciseTag::Steps: {
+ if (sportdata->steps >= current_goal) {
+ return true;
+ }
+ return false;
+ break;
+ }
+ default:
+ return false;
+ break;
+ }
+}
+
/* 获取训练目标完成百分比 */
int TraingModel::GetGoaldegree() {
if (sportdata->tag == 0) {
return goaldegree; // 直接返回目标完成度
}
+void TraingModel::updata_goal() {
+ if (sportdata->tag == 0)
+ return;
+
+ sportdata->goaldegree = GetGoaldegree();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d",
+ sportdata->goaldegree);
+}
+
/* 训练目标校验 */
void TraingModel::CheckSportTag() {
// 运动开始才计算
- if (sportdata->tag) {
- sportdata->goaldegree = GetGoaldegree();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sportdata->goaldegree %d",
- sportdata->goaldegree);
- if (sportdata->goaldegree >= 100 && !Gettagstuats) {
+ if (sportdata->tag && sportdata->sportTagType != ExerciseTag::Duration) {
+ if (IsGetGoaldegree() && !Gettagstuats) {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标完成");
uapi_set_screen_on_api(); // 亮屏检测
if (!OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) {
}
}
}
-//运动时长目标
-void TraingModel::CheckTimeTag() {}
+// 校验时间获取目标
+void TraingModel::CheckTimeTag() {
+ if (sportdata->tag == 0 || sportdata->sportTagType != ExerciseTag::Duration) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata->tag is 0");
+ return;
+ }
+ if (sportdata->duration == current_goal && !Gettagstuats) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标完成");
+ uapi_set_screen_on_api(); // 亮屏检测
+ if (!OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) {
+ ui_api_vibrate_once_func(); // 震动提示
+ }
+ if (TraingCardView::GetInstance()) {
+ GraphicService::GetInstance()->PostGraphicEvent(
+ std::bind(&TraingCardView::SetPopupViewStatus,
+ TraingCardView::GetInstance(), GetTagPopup, true));
+ auto animator = TraingCardView::GetInstance()->GetAnimator();
+ if (animator) {
+ animator->Start(); // 启动动画
+ }
+ }
+ Gettagstuats = true; // 更新状态
+ }
+}
//获取运动时长
int TraingModel::GetDuration() { return sportdata->duration; }
void TraingModel::StoreDataIfMinutePassed() {
if (sportdata->duration % 10 == 0) {
uint32_t timestamp;
+ //进行数据的筛选
if (uapi_get_timestampe_ss(×tamp) == ERRCODE_SUCC) {
- AddHeartRateData(timestamp, sportdata->heart);
- AddPaceData(timestamp, sportdata->apc);
+ if (sportdata->heart != 0)
+ AddHeartRateData(timestamp, sportdata->heart);
+ if (sportdata->apc != 0)
+ AddPaceData(timestamp, sportdata->apc);
}
}
void TraingTimerCallback() {
g_motionTimes++;
if (g_motionTimes != 0) {
- sportdata->duration = g_motionTimes;
- }
+ sportdata->duration = g_motionTimes;
+ }
// 检查并发送实时数据
OHOS::TraingModel::GetInstance()->SendLiveDataIfNecessary();
- // 更新目标完成度
- OHOS::TraingModel::GetInstance()->CheckSportTag();
+ // 更新时间目标完成度
+ OHOS::TraingModel::GetInstance()->CheckTimeTag();
+
+ if ((sportdata->goaldegree >= 100) && (shock_count < 4)) {
+ shock_count++;
+ ui_api_vibrate_once_func(); //震动一次 共计3次
+ }
#if 0
TraingCardPresenter *gTraingCardPresenter = TraingCardPresenter::GetInstance();
if (gTraingCardPresenter == nullptr)