std::string start_date; // 训练开始日期
std::string start_time; // 训练开始时间
std::string end_time; // 训练结束时间
- Exercisetype sportType; // 训练类型
+ Exercisetype sportType; // 训练类型(0:健身类 1:跳舞类 2:休闲运动 3:球类 4:水上运动:5:冰上运动:6:极限运动:7:其他)
UIResourceTextId sportId; // 训练Id
- ExerciseTag sportTag; // 训练目标类型
+ ExerciseTag sportTag; // 训练目标类型(0: 距离 1:时长 2:卡路里 3:步数)
void Initialize()
{
/*设置运动类型*/
void SetSportType(Exercisetype type);
/*获取运动类型*/
- Exercisetype GetSporType();
+ Exercisetype GetSportType();
/*设置运动项目*/
void SetSportEvent(UIResourceTextId id);
/*获取运动项目*/
UIResourceTextId GetSportEvent();
+ /*获取运动项目Id*/
+ ExerciseClass GetSportId();
/*设置运动状态*/
void SetSportState(ExerciseState state);
/*获取运动状态*/
ExerciseState GetSportState();
- /*获取运动类型*/
- ExerciseClass GetSportType();
/*解析传输过来的数据*/
void AnalysisData(cywee_activity_result_t *cyweeInfo);
/*获取训练数据*/
ExerciseTag GetSportTagtype();
/*设置训练强度*/
void SetIntensity(int heart);
+ /*获取训练强度STR*/
+ UIResourceTextId GetIntensity();
+ /*获取对应的训练目标的值*/
+ int GetSportTypeData();
std::string GetStartTiemStr();
std::string GetEndTiemStr();
UIResourceTextId sportId_ = STR_EXTREME_SPORTS; // 训练项目
Exercisetype sportType_ = Exercisetype::FITNESS; // 训练类型
ExerciseState sportState_ = ExerciseState::General; // 训练状态
- ExerciseTag sportTag_ = ExerciseTag::Distance; // 训练目标类型
+ ExerciseTag sportTagType_ = ExerciseTag::Distance; // 训练目标类型
- int tag_ = 0; // 训练目标
+ int sportTag_ = 0; // 训练目标
int totalHeartRate = 0;
int countHeartRate = 0;
- bool gettagstuats{false};
+ bool gettagstuats{false}; // 训练达标标志位
+ bool Startstate{false}; // 开始训练标志位
+ bool Endstate{false}; // 结束训练标志位
+
/*std::unique_ptr<SportData> sportdata;*/ // 使用 std::unique_ptr 管理 SportData 对象
};
}
#include "components/ui_button.h"
#include "traing/include/TraingModel.h"
#include "traing/Training_UiConfig.h"
-
+#include <cmath> // 包含数学函数库,用于四舍五入
+#include <string> // 包含字符串处理库,用于使用 std::to_string
namespace OHOS
{
labelustrong->SetTextColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0x7f));
labelnote->SetTextColor(Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0x7f));
- TraingModel::GetInstance()->InitLabel(labeltag, 146, 292, 240, 60, "label18", "230%", DEFAULT_VECTOR_FONT_FILENAME, 40);
+ TraingModel::GetInstance()->InitLabel(labeltag, 146, 292, 240, 60, "label18", "--", DEFAULT_VECTOR_FONT_FILENAME, 40);
labeltag->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff));
TraingModel::GetInstance()->InitLabel(labeltime, 146, 418, 240, 60, "label14", "05:45:46", DEFAULT_VECTOR_FONT_FILENAME, 40);
labeltime->SetTextColor(Color::GetColorFromRGBA(0xff, 0x8a, 0x36, 0xff));
labelduration->SetText(durationStr.c_str());
// 运动目标
- labeltag->SetText("100%"); // 暂时设置为默认
-
+ if (enddata && enddata->tag)
+ {
+ // labeltag->SetText("100%"); // 暂时设置为默认
+ int currentdata = TraingModel::GetInstance()->GetSportTypeData();
+ float completeness = (currentdata / enddata->tag) * 100;
+ completeness = round(completeness); // 四舍五入?
+ std::string tagStr = std::to_string(completeness) + "%";
+ labeltag->SetText(tagStr.c_str());
+ }
// 运动时长
uint64_t time = TraingModel::GetInstance()->GetTrainingTime();
std::string timeStr = TraingModel::GetInstance()->AnalysisTimestamp(time);
labelmile->SetText(mileStr.c_str());
// 平均心率
- int heart = TraingModel::GetInstance()->CalculateAverageHeartRate(155); // 设置一个测试值
- std::string heartStr = std::to_string(heart);
+ // int heart = TraingModel::GetInstance()->CalculateAverageHeartRate(155); // 设置一个测试值
+ std::string heartStr = std::to_string(enddata->avgheart);
labelheart->SetText(heartStr.c_str());
// 训练强度
- labelstrong->SetText("中等强度");
+ UIResourceTextId intensityid = TraingModel::GetInstance()->GetIntensity();
+ labelstrong->SetTextId(intensityid);
}
void TraingEnddataView::OnStart()
#define BLETEST 0
#define HARD_OFF 1
#define TRAINING_PATH "user/userdata/sportdata/"
+
+#define MAX_HEART_RATE 220
+#define AGE_THRESHOLD 59
+#define LOW_INTENSITY_THRESHOLD 59
+#define MEDIUM_INTENSITY_LOWER_THRESHOLD 60
+#define MEDIUM_INTENSITY_UPPER_THRESHOLD 69
+#define HIGH_INTENSITY_LOWER_THRESHOLD 70
+#define HIGH_INTENSITY_UPPER_THRESHOLD 79
+
extern "C" errcode_t uapi_get_timestampe_ms(uint64_t *tm);
extern "C" void custom_VibratorFunc(OHOS::VibratorType vibratorType);
sportType_ = type;
}
/*获取运动类型*/
- Exercisetype TraingModel::GetSporType()
+ Exercisetype TraingModel::GetSportType()
{
return sportType_;
}
{
return sportId_;
}
- /*获取运动类型*/
- ExerciseClass TraingModel::GetSportType()
+ /*获取运动项目*/
+ ExerciseClass TraingModel::GetSportId()
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " GetSportType %d", sportId_);
// 设置结构体里面的运动类型
void TraingModel::AnalysisData(cywee_activity_result_t *cyweeInfo)
{
// 不同的运动类型解析不同的数据
- ExerciseClass type = GetSportType();
+ ExerciseClass type = GetSportId();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " AnalysisData %d", type);
// 通用数据
sportdata->calories = cyweeInfo->calories;
if (sportdata->tag && (!gettagstuats))
{
// 根据设置的训练目标类型去对应相对的数据
- switch (sportdata->sportTag)
+ int currentdata = GetSportTypeData();
+ if (currentdata >= sportdata->tag)
{
- case ExerciseTag::Duration:
- break;
- case ExerciseTag::Calories:
- if (sportdata->calories >= sportdata->tag)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Calories");
- uapi_set_screen_on_api(); // 亮屏检测
- custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);
- TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
- TraingCardView::GetInstance()->GetAnimator()->Start();
- gettagstuats = true;
- }
- break;
- case ExerciseTag::Distance:
- if (sportdata->distance >= sportdata->tag)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Distance");
- uapi_set_screen_on_api(); // 亮屏检测
- custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);
- TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
- TraingCardView::GetInstance()->GetAnimator()->Start();
- gettagstuats = true;
- }
- break;
- case ExerciseTag::STEP:
- if (sportdata->steps >= sportdata->tag)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "STEP");
- uapi_set_screen_on_api(); // 亮屏检测
- custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);
- TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
- TraingCardView::GetInstance()->GetAnimator()->Start();
- gettagstuats = true;
- }
- break;
- default:
- break;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentdata%d", currentdata);
+ uapi_set_screen_on_api(); // 亮屏检测
+ custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);
+ TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
+ TraingCardView::GetInstance()->GetAnimator()->Start();
+ gettagstuats = true;
}
}
}
return;
}
ExerciseState currentState = GetSportState(); // 获取当前运动状态
- if (currentState == ExerciseState::Start)
+ /*增加标志位互斥保障"开始""结束"的唯一性操作*/
+ if (currentState == ExerciseState::Start && (!Startstate))
{
sportdata->Reset(); // 重置结构体
+
+ /*将Model的成员变量赋值到结构体里面*/
sportdata->starttime = time;
- if (tag_)
+ sportdata->sportType = sportType_; // 训练类型
+ gettagstuats = false; // 重置训练达标标志位
+ if (sportTag_) // 有值才设置[训练目标]
{
- // 有值才设置
- sportdata->sportTag = sportTag_;
- sportdata->tag = tag_;
+
+ sportdata->sportTag = sportTagType_;
+ sportdata->tag = sportTag_;
}
+
char *start_date = (char *)malloc(9 * sizeof(char)); // 分配内存给start_date
if (uapi_get_YYMMDD_Time(start_date, '/') != ERRCODE_SUCC)
{
free(start_time); // 释放内存
return;
}
- // PRINT("start_time [%s]\r\n", start_time);
sportdata->start_time = std::string(start_time);
free(start_time); // 释放内存
-
PRINT("sportdata->start_time [%s]\r\n", (sportdata->start_time).c_str());
+
+ Startstate = true;
+ Endstate = false; // 确保"开始"和"结束"状态互斥
}
- else if (currentState == ExerciseState::End)
+ else if (currentState == ExerciseState::End && (!Endstate))
{
sportdata->endtime = time;
// PRINT("end_time [%s]\r\n", end_time);
sportdata->end_time = std::string(end_time);
free(end_time); // 释放内存
-
PRINT("sportdata->end_time [%s]\r\n", (sportdata->end_time).c_str());
+
+ Startstate = false;
+ Endstate = true;
}
}
-#if 0
- std::string TraingModel::GetStartTiemStr()
- {
- return starttime_;
- }
- std::string TraingModel::GetEndTiemStr()
- {
- return endtime_;
- }
-#endif
// 获取训练时长时间戳
uint32_t TraingModel::GetTrainingTime()
{
void TraingModel::SetSportTag(ExerciseTag tagtpye, int tag)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tagtpye[%d] tag[%d]", tagtpye, tag);
- sportTag_ = tagtpye;
- tag_ = tag;
+ sportTagType_ = tagtpye;
+ sportTag_ = tag;
}
/* 设置训练强度 */
超高强度=最高心率*80%以上
*/
int age = ConfigModel::GetInstance()->GetUserAge();
- int maxHeartRate = 220 - age;
-
+ int maxHeartRate = MAX_HEART_RATE - age;
double intensityPercentage = (heart / (double)maxHeartRate) * 100;
-
- if (intensityPercentage < 59)
+ if (intensityPercentage < LOW_INTENSITY_THRESHOLD)
{
// 较低强度
sportdata->intensity = LOW_INTENSITY;
}
- else if (intensityPercentage >= 60 && intensityPercentage <= 69)
+ else if (intensityPercentage >= MEDIUM_INTENSITY_LOWER_THRESHOLD && intensityPercentage <= MEDIUM_INTENSITY_UPPER_THRESHOLD)
{
// 中等强度
sportdata->intensity = MEDIUM_INTENSITY;
}
- else if (intensityPercentage >= 70 && intensityPercentage <= 79)
+ else if (intensityPercentage >= HIGH_INTENSITY_LOWER_THRESHOLD && intensityPercentage <= HIGH_INTENSITY_UPPER_THRESHOLD)
{
// 高等强度
sportdata->intensity = HIGH_INTENSITY;
sportdata->intensity = VERY_HIGH_INTENSITY;
}
}
+ /*获取训练强度STR*/
+ UIResourceTextId TraingModel::GetIntensity()
+ {
+ switch (sportdata->intensity)
+ {
+ case LOW_INTENSITY:
+ return UIResourceTextId::STR_LOWER_STRENGTH;
+ break;
+ case MEDIUM_INTENSITY:
+ return UIResourceTextId::STR_MEDIUM_STRENGTH;
+ break;
+ case HIGH_INTENSITY:
+ return UIResourceTextId::STR_HIGH_STRENGTH;
+ break;
+ case VERY_HIGH_INTENSITY:
+ return UIResourceTextId::STR_ULTRA_HIGH_STRENGTH;
+ break;
+ default:
+ break;
+ }
+ }
+ /*获取对应的训练目标的值*/
+ int TraingModel::GetSportTypeData()
+ {
+ if (sportTag_)
+ {
+ // 根据设置的训练目标类型去对应相对的数据
+ switch (sportdata->sportTag)
+ {
+ case ExerciseTag::Duration:
+ return sportdata->duration;
+ break;
+ case ExerciseTag::Calories:
+ return sportdata->calories;
+ break;
+ case ExerciseTag::Distance:
+ return sportdata->distance;
+ break;
+ case ExerciseTag::STEP:
+ return sportdata->steps;
+ break;
+ default:
+ break;
+ }
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Not set Sport_Tag!");
+ }
/* -------------------------------------------------------------------------- */
#if TIMER
/* 时间显示 */
}
}
#endif
-
fseek(fp, 0, SEEK_SET);
fclose(fp);
return 1;
if (strcmp(view.GetViewId(), BUTTONGO) == 0)\r
{\r
NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD);\r
- // 获取运动类型\r
- ExerciseClass type = TraingModel::GetInstance()->GetSportType();\r
+ // 获取运动项目\r
+ ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
// 开启对应的运动\r
TraingCardPresenter::GetInstance()->OpenSensor(type);\r
}\r
{
NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGMORE);
}
-
+ // 快捷训练都属于健身类
+ TraingModel::GetInstance()->SetSportType(Exercisetype::FITNESS);
return true;
}
}
// TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试\r
PRINT("GetButtonIdFromCard:%d tag:%d \r\n", CardID, tag);\r
NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD);\r
- ExerciseClass type = TraingModel::GetInstance()->GetSportType();\r
+ ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
TraingCardPresenter::GetInstance()->OpenSensor(type);\r
}\r
break;\r
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-04-22 09:43:01
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/include/TrainingDetailView.h
+ */
#ifndef _TrainingDetail_VIEW_H
#define _TrainingDetail_VIEW_H
void PreLoad(void) override;
void UnLoad(void) override;
-
UILabelExt *GetMileLabel();
UILabelExt *GetStepLabel();
UILabelExt *GetCalorieLabel();
+ UILabelButtonExt *Get_Intensity_Button();
private:
UIView::OnDragListener *draglistener{nullptr};
extern "C" void custom_VibratorFunc(OHOS::VibratorType vibratorType);\r
#define MAXSPORTID 176\r
\r
+#define DEFAULT_DASH "--"\r
+\r
extern "C"\r
{\r
void InitTimer();\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sportdata is null");\r
return;\r
}\r
- PRINT("sportdata->tag[%d] sportdata->sportTag[%d]\r\n", sportdata->tag, sportdata->sportTag);\r
- \r
std::string distanceStr;\r
if (sportdata->distance != 0)\r
{\r
}\r
else\r
{\r
- distanceStr = "--";\r
+ distanceStr = DEFAULT_DASH;\r
}\r
-\r
std::string durationStr = std::to_string(sportdata->duration);\r
- std::string heartStr = (sportdata->heart != 0) ? std::to_string(sportdata->heart) : "--";\r
- std::string stepsStr = (sportdata->steps != 0) ? std::to_string(sportdata->steps) : "--";\r
- std::string calorieStr = (sportdata->calories != 0) ? std::to_string(sportdata->calories) : "--";\r
-\r
- TrainingDataView::GetInstance()->GetHeartLabel()->SetText(heartStr.c_str());\r
-\r
- TrainingDetailView::GetInstance()->GetCalorieLabel()->SetText(calorieStr.c_str());\r
- TrainingDetailView::GetInstance()->GetMileLabel()->SetText(distanceStr.c_str());\r
- TrainingDetailView::GetInstance()->GetStepLabel()->SetText(stepsStr.c_str());\r
+ std::string heartStr = (sportdata->heart != 0) ? std::to_string(sportdata->heart) : DEFAULT_DASH;\r
+ std::string stepsStr = (sportdata->steps != 0) ? std::to_string(sportdata->steps) : DEFAULT_DASH;\r
+ std::string calorieStr = (sportdata->calories != 0) ? std::to_string(sportdata->calories) : DEFAULT_DASH;\r
+ // 训练强度刷新\r
+ UIResourceTextId intensityid = TraingModel::GetInstance()->GetIntensity();\r
+ TrainingDetailView::GetInstance()->Get_Intensity_Button()->SetFontId(intensityid);\r
\r
+ TrainingDataView::GetInstance()->GetHeartLabel()->SetText(heartStr.c_str()); // 心率\r
+ TrainingDetailView::GetInstance()->GetCalorieLabel()->SetText(calorieStr.c_str()); // 卡路里\r
+ TrainingDetailView::GetInstance()->GetMileLabel()->SetText(distanceStr.c_str()); // 距离\r
+ TrainingDetailView::GetInstance()->GetStepLabel()->SetText(stepsStr.c_str()); // 步数\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[Calories: %s, Distance: %s, Steps: %s]", calorieStr.c_str(), distanceStr.c_str(), stepsStr.c_str());\r
-\r
// 释放sportdata内存\r
}\r
/*刷新time和data*/\r
default:\r
break;\r
}\r
-\r
- ControlSensor(static_cast<ExerciseState>(cmd->controlmd));\r
+ \r
+ ExerciseState cmdState = static_cast<ExerciseState>(cmd->controlmd);\r
+ if (cmdState == ExerciseState::End)\r
+ {\r
+ if (TraingCardView::GetInstance()->RefreshEndView())\r
+ {\r
+ // 进行存储操作?\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
+ }\r
+ else\r
+ {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGMORE);\r
+ }\r
+ }\r
+ ControlSensor(static_cast<ExerciseState>(cmdState));\r
return true;\r
}\r
\r
{
return calorielabel;
}
-
+ UILabelButtonExt *TrainingDetailView::Get_Intensity_Button()
+ {
+ return intensity_button;
+ }
}
NativeAbility::GetInstance().EnterSlice(VIEW_TRAININGMORE);
// NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGMORE);
}
- // 标记进入界面是主界面
- // TraingModel::GetInstance()->SetInterface(VIEW_MAIN);
-
+ // 快捷训练都属于健身类
+ TraingModel::GetInstance()->SetSportType(Exercisetype::FITNESS);
return true;
}
} // namespace OHOS
\ No newline at end of file
#include "traing/training_list_more/include/TraingMoreItemView.h"\r
#include "traing/training_list_more/include/TraingMorePresenter.h"\r
#include "traing/training_list_more/include/TraingMoreView.h"\r
+#include "traing/include/TraingModel.h"\r
// #include "TraingMoreView.h"\r
\r
namespace OHOS\r
TraingMoreItemView *itemView = static_cast<TraingMoreItemView *>(&view);\r
AppViewId viewId = itemView->GetTraingMoreIndex();\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplistPresenter::OnClick viewid = %d\n", viewId);\r
+ /*\r
+ VIEW_TRAININGLIMIT, // 极限运动列表\r
+ VIEW_TRAININGICE, // 冰上运动列表\r
+ VIEW_TRAININGFITNESS, // 健身运动列表\r
+ VIEW_TRAININGDANCE, // 舞蹈运动列表\r
+ VIEW_TRAININGREST, // 休闲运动列表\r
+ VIEW_TRAININGBALL, // 球类运动列表\r
+ VIEW_TRAININGAQUATIC, // 水上运动列表\r
+ VIEW_TRAININGOTHER, // 其他列表\r
+ */\r
+ // 设置训练类型\r
+ switch (viewId)\r
+ {\r
+ case VIEW_TRAININGLIMIT:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::EXTREME);\r
+ break;\r
+ case VIEW_TRAININGICE:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::ICE);\r
+ break;\r
+ case VIEW_TRAININGFITNESS:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::FITNESS);\r
+ break;\r
+ case VIEW_TRAININGDANCE:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::DANCE);\r
+ break;\r
+ case VIEW_TRAININGREST:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::LEISURE);\r
+ break;\r
+ case VIEW_TRAININGBALL:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::BALL);\r
+ break;\r
+ case VIEW_TRAININGAQUATIC:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::WATER);\r
+ break;\r
+ case VIEW_TRAININGOTHER:\r
+ TraingModel::GetInstance()->SetSportType(Exercisetype::OTHER);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
if (viewId < VIEW_MAX_INTER_APP)\r
{\r
NativeAbility::GetInstance().ChangeSlice(viewId);\r