#include <string>
#include <memory>
+#include <cmath>
#define GILROY_REGULAR_FONT "./font_library/gilroy-regular-3.ttf"
#define GILROY_BOLD_FONT "./font_library/gilroy-bold-4.ttf"
std::string end_time; // 训练结束时间
Exercisetype sportType; // 训练类型(0:健身类 1:跳舞类 2:休闲运动 3:球类 4:水上运动:5:冰上运动:6:极限运动:7:其他)
UIResourceTextId sportId; // 训练Id
- ExerciseTag sportTag; // 训练目标类型(0: 距离 1:时长 2:卡路里 3:步数)
+ ExerciseTag sportTagType; // 训练目标类型(0: 距离 1:时长 2:卡路里 3:步数)
void Initialize()
{
end_time = nullptr;
sportType = Exercisetype::FITNESS;
sportId = UIResourceTextId::STR_EXTREME_SPORTS;
- sportTag = ExerciseTag::UNKNOW;
+ sportTagType = ExerciseTag::UNKNOW;
}
void Reset()
/*获取训练强度STR*/
UIResourceTextId GetIntensity();
/*获取对应的训练目标的值*/
- int GetSportTypeData();
+ int GetSportTagData();
+ /*获取训练目标完成百分比*/
+ int GetGoaldegree();
+ /*保存数据*/
+ bool SaveSportData();
+ /*设置运动开始方式*/
+ void SetSportOpenWay(bool way);
+ /*获取训练量是否达标*/
+ bool GetMomentum();
std::string GetStartTiemStr();
std::string GetEndTiemStr();
int sportTag_ = 0; // 训练目标
int totalHeartRate = 0;
int countHeartRate = 0;
- bool gettagstuats{false}; // 训练达标标志位
+ bool Gettagstuats{false}; // 训练达标标志位
bool Startstate{false}; // 开始训练标志位
bool Endstate{false}; // 结束训练标志位
+ bool Openingway{false}; // 运动开启方式
+ bool MomentumFlag{false}; // 训练量达标标志位
/*std::unique_ptr<SportData> sportdata;*/ // 使用 std::unique_ptr 管理 SportData 对象
};
#define TIMER 1
#define BLETEST 0
#define HARD_OFF 1
-#define TRAINING_PATH "user/userdata/sportdata/"
+#define TRAINING_PATH "user/userdata/sport/TrainingData/"
#define MAX_HEART_RATE 220
#define AGE_THRESHOLD 59
break;
}
/* -------------------------------------------------------------------------- */
- // 首先需要判断有没有设置训练目标
- if (sportdata->tag && (!gettagstuats))
+ // 首先需要判断有没有设置训练目标,并且保障弹窗只出现一次
+ if (sportdata->tag && (!Gettagstuats))
{
// 根据设置的训练目标类型去对应相对的数据
- int currentdata = GetSportTypeData();
+ int currentdata = GetSportTagData();
if (currentdata >= sportdata->tag)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentdata%d", currentdata);
custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO);
TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
TraingCardView::GetInstance()->GetAnimator()->Start();
- gettagstuats = true;
+ Gettagstuats = true;
}
}
}
/*获取训练项目类型*/
ExerciseTag TraingModel::GetSportTagtype()
{
- return sportdata->sportTag;
+ return sportdata->sportTagType;
}
/*设置时间*/
void TraingModel::SetTimestamp()
/*将Model的成员变量赋值到结构体里面*/
sportdata->starttime = time;
sportdata->sportType = sportType_; // 训练类型
- gettagstuats = false; // 重置训练达标标志位
+ Gettagstuats = false; // 重置训练达标标志位
if (sportTag_) // 有值才设置[训练目标]
{
-
- sportdata->sportTag = sportTagType_;
+ sportdata->sportTagType = sportTagType_;
sportdata->tag = sportTag_;
}
free(end_time); // 释放内存
PRINT("sportdata->end_time [%s]\r\n", (sportdata->end_time).c_str());
+ /*存储正常数据[运动量达标]*/
+ if (MomentumFlag)
+ {
+ GetGoaldegree(); // 设置目标完成度
+ if (SaveSportData() == false)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveSportData error!");
+ }
+ }
+
Startstate = false;
Endstate = true;
}
int averageHeartRate = totalHeartRate / countHeartRate; // 计算平均心率
return averageHeartRate;
}
+
/*设置训练目标类型以及训练目标*/
void TraingModel::SetSportTag(ExerciseTag tagtpye, int tag)
{
}
}
/*获取对应的训练目标的值*/
- int TraingModel::GetSportTypeData()
+ int TraingModel::GetSportTagData()
{
if (sportTag_)
{
// 根据设置的训练目标类型去对应相对的数据
- switch (sportdata->sportTag)
+ switch (sportdata->sportTagType)
{
case ExerciseTag::Duration:
return sportdata->duration;
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Not set Sport_Tag!");
}
+ /*获取训练目标完成百分比*/
+ int TraingModel::GetGoaldegree()
+ {
+ if (sportTag_ == 0)
+ {
+ return 0;
+ }
+ int currentdata = GetSportTagData();
+ float completeness = (static_cast<float>(currentdata) / sportdata->tag) * 100;
+ sportdata->goaldegree = round(completeness); // 四舍五入
+
+ return sportdata->goaldegree;
+ }
+ /*
+ uint32_t src; // 训练来源:0 - 手表开启的训练,1 - APP开启的训练
+ uint32_t bt; // 运动类型:0 - 健身类,1 - 舞蹈类,2 - 休闲运动,3 - 球类,4 - 水上项目,5 - 冰上项目,6 - 极限运动,7 - 其他
+ uint32_t ty; // 训练类型:自由训练
+ uint32_t st; // 开始时间戳(单位:秒)
+ uint32_t sp; // 结束时间戳(单位:秒)
+ uint32_t tgt; // 训练目标类型:0 - 距离,1 - 卡路里,2 - 时间,3 - 步数
+ uint32_t tg; // 训练目标值:路程(单位:米),卡路里(单位:kcal),时间(单位:分钟),步数(单位:步)
+ uint32_t pg; // 目标完成度(单位:%)
+ uint32_t du; // 训练总时长(单位:秒)
+ uint32_t ca; // 消耗卡路里(单位:kcal)
+ uint32_t di; // 完成的距离(单位:米)
+ uint32_t hr; // 平均心率
+ uint32_t stp; // 步数
+ uint32_t ti; // 训练强度:0 - 较低强度,1 - 中等强度,2 - 高等强度,3 - 超高强度
+ uint32_t cir; // 圈数
+ uint32_t alt; // 最高海拔高度
+ */
+ /*保存数据*/
+ bool TraingModel::SaveSportData()
+ {
+ Trainingdata data;
+ data.src = Openingway;
+ data.bt = static_cast<uint32_t>(sportdata->sportType);
+ data.ty = static_cast<uint32_t>(sportdata->sportId);
+ data.st = static_cast<uint32_t>((sportdata->starttime) * 1000);
+ data.sp = static_cast<uint32_t>((sportdata->endtime) * 1000);
+ data.tgt = static_cast<uint32_t>(sportdata->sportTagType);
+ data.tg = static_cast<uint32_t>(sportdata->tag);
+ data.pg = static_cast<uint32_t>(sportdata->goaldegree);
+ data.du = static_cast<uint32_t>(sportdata->duration);
+ data.ca = static_cast<uint32_t>(sportdata->calories);
+ data.di = static_cast<uint32_t>(sportdata->distance);
+ data.hr = static_cast<uint32_t>(sportdata->avgheart);
+ data.stp = static_cast<uint32_t>(sportdata->steps);
+ data.ti = static_cast<uint32_t>(sportdata->intensity);
+ /*230目前不支持【圈数】【最高海拔高度】*/
+ data.cir = 0;
+ data.alt = 0;
+
+ if (write_Trainingdata_data(data) != true)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "write_Trainingdata_data is error!");
+ return false;
+ }
+
+ return true;
+ // delete data;
+ }
+ /*设置开启方式*/
+ void TraingModel::SetSportOpenWay(bool way)
+ {
+ Openingway = way;
+ }
+ /*获取训练量是否达标*/
+ bool TraingModel::GetMomentum()
+ {
+ int caldata = TraingModel::GetInstance()->GetCal();
+ /*判断是否产生至少1Kcald的运动量*/
+ if (caldata >= 1)
+ {
+ MomentumFlag = true;
+ }
+ else
+ {
+ MomentumFlag = false;
+ }
+ return MomentumFlag;
+ }
/* -------------------------------------------------------------------------- */
#if TIMER
/* 时间显示 */
{\r
TraingModel::GetInstance()->SetSportState(ExerciseState::End);\r
ControlSensor(ExerciseState::End);\r
- if (TraingCardView::GetInstance()->RefreshEndView())\r
+ if (TraingModel::GetInstance()->GetMomentum())\r
{\r
- // 进行存储操作?\r
NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
}\r
else\r
NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD); // 切换Slice\r
// 增加打印\r
PRINT("cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],cmd->sportType[%d]\r\n", cmd->sportType, cmd->controlmd, cmd->sportTagType, cmd->sportType);\r
+\r
switch (cmd->sportType)\r
{\r
// 室外走路\r
ControlSensor(ExerciseState::End);\r
if (TraingCardView::GetInstance()->RefreshEndView())\r
{\r
- // 进行存储操作?\r
NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
}\r
else\r
return true;\r
}\r
// 暂停和恢复\r
- if (cmdState == ExerciseState::Continue || cmdState == ExerciseState::Pause)\r
+ else if (cmdState == ExerciseState::Continue || cmdState == ExerciseState::Pause)\r
{\r
// 开始状态\r
if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Start || TraingModel::GetInstance()->GetSportState() == ExerciseState::Continue)\r
PauseTimer();\r
// 暂停运动库\r
ControlSensor(ExerciseState::Pause);\r
+ return true;\r
}\r
// 暂停状态\r
if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Pause)\r
ResumeTimer();\r
// 恢复运动库\r
ControlSensor(ExerciseState::Continue);\r
+ return true;\r
}\r
}\r
+ else if (cmdState == ExerciseState::Start)\r
+ {\r
+ // 开启运动\r
+ ControlSensor(cmdState);\r
+ // 设置APP开启运动\r
+ TraingModel::GetInstance()->SetSportOpenWay(true);\r
+ }\r
+\r
return true;\r
}\r
\r