From: Caisking <3449750381@qq.com> Date: Mon, 22 Apr 2024 10:35:36 +0000 (+0800) Subject: 优化TrainingModel部分函数,实现训练数据存储 X-Git-Tag: release_V1.2.70_20241020_135402~1151 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=d3582741860ecbd3b5c19ae950a262c6c2706266;p=mirrors%2FFD230.git 优化TrainingModel部分函数,实现训练数据存储 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h index c413c0cca..b531f35a9 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h @@ -36,6 +36,7 @@ #include #include +#include #define GILROY_REGULAR_FONT "./font_library/gilroy-regular-3.ttf" #define GILROY_BOLD_FONT "./font_library/gilroy-bold-4.ttf" @@ -179,7 +180,7 @@ namespace OHOS 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() { @@ -199,7 +200,7 @@ namespace OHOS end_time = nullptr; sportType = Exercisetype::FITNESS; sportId = UIResourceTextId::STR_EXTREME_SPORTS; - sportTag = ExerciseTag::UNKNOW; + sportTagType = ExerciseTag::UNKNOW; } void Reset() @@ -265,7 +266,15 @@ namespace OHOS /*获取训练强度STR*/ UIResourceTextId GetIntensity(); /*获取对应的训练目标的值*/ - int GetSportTypeData(); + int GetSportTagData(); + /*获取训练目标完成百分比*/ + int GetGoaldegree(); + /*保存数据*/ + bool SaveSportData(); + /*设置运动开始方式*/ + void SetSportOpenWay(bool way); + /*获取训练量是否达标*/ + bool GetMomentum(); std::string GetStartTiemStr(); std::string GetEndTiemStr(); @@ -286,9 +295,11 @@ namespace OHOS 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;*/ // 使用 std::unique_ptr 管理 SportData 对象 }; diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingEnddataView.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingEnddataView.cpp index b66925f7c..097cca41f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingEnddataView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingEnddataView.cpp @@ -277,6 +277,12 @@ namespace OHOS void TraingEnddataView::InitData() { SportData *enddata = TraingModel::GetInstance()->GetSportdata(); + if (enddata == nullptr) + { + + return; + } + // 训练图标Icon std::string imageStr = TraingModel::GetInstance()->GetSportType(); imageIcon->SetSrc(imageStr.c_str()); @@ -293,11 +299,7 @@ namespace OHOS // 运动目标 if (enddata && enddata->tag) { - // labeltag->SetText("100%"); // 暂时设置为默认 - int currentdata = TraingModel::GetInstance()->GetSportTypeData(); - float completeness = (static_cast(currentdata) / enddata->tag) * 100; - completeness = round(completeness); // 四舍五入 - std::string tagStr = std::to_string(static_cast(completeness)) + "%"; + std::string tagStr = std::to_string(enddata->goaldegree) + "%"; labeltag->SetText(tagStr.c_str()); } // 运动时长 diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp index 5471fe934..96de04cae 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -31,7 +31,7 @@ #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 @@ -520,11 +520,11 @@ namespace OHOS 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); @@ -532,7 +532,7 @@ namespace OHOS custom_VibratorFunc(VibratorType::VIBRATOR_TYPE_TWO); TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true); TraingCardView::GetInstance()->GetAnimator()->Start(); - gettagstuats = true; + Gettagstuats = true; } } } @@ -554,7 +554,7 @@ namespace OHOS /*获取训练项目类型*/ ExerciseTag TraingModel::GetSportTagtype() { - return sportdata->sportTag; + return sportdata->sportTagType; } /*设置时间*/ void TraingModel::SetTimestamp() @@ -574,11 +574,10 @@ namespace OHOS /*将Model的成员变量赋值到结构体里面*/ sportdata->starttime = time; sportdata->sportType = sportType_; // 训练类型 - gettagstuats = false; // 重置训练达标标志位 + Gettagstuats = false; // 重置训练达标标志位 if (sportTag_) // 有值才设置[训练目标] { - - sportdata->sportTag = sportTagType_; + sportdata->sportTagType = sportTagType_; sportdata->tag = sportTag_; } @@ -623,6 +622,16 @@ namespace OHOS 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; } @@ -660,6 +669,7 @@ namespace OHOS int averageHeartRate = totalHeartRate / countHeartRate; // 计算平均心率 return averageHeartRate; } + /*设置训练目标类型以及训练目标*/ void TraingModel::SetSportTag(ExerciseTag tagtpye, int tag) { @@ -727,12 +737,12 @@ namespace OHOS } } /*获取对应的训练目标的值*/ - int TraingModel::GetSportTypeData() + int TraingModel::GetSportTagData() { if (sportTag_) { // 根据设置的训练目标类型去对应相对的数据 - switch (sportdata->sportTag) + switch (sportdata->sportTagType) { case ExerciseTag::Duration: return sportdata->duration; @@ -752,6 +762,88 @@ namespace OHOS } 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(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(sportdata->sportType); + data.ty = static_cast(sportdata->sportId); + data.st = static_cast((sportdata->starttime) * 1000); + data.sp = static_cast((sportdata->endtime) * 1000); + data.tgt = static_cast(sportdata->sportTagType); + data.tg = static_cast(sportdata->tag); + data.pg = static_cast(sportdata->goaldegree); + data.du = static_cast(sportdata->duration); + data.ca = static_cast(sportdata->calories); + data.di = static_cast(sportdata->distance); + data.hr = static_cast(sportdata->avgheart); + data.stp = static_cast(sportdata->steps); + data.ti = static_cast(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 /* 时间显示 */ diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingNomalPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingNomalPresenter.cpp index 69fdc59e8..978d9ef7b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingNomalPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingNomalPresenter.cpp @@ -84,6 +84,8 @@ namespace OHOS ExerciseClass type = TraingModel::GetInstance()->GetSportId(); // 开启对应的运动 TraingCardPresenter::GetInstance()->OpenSensor(type); + // 设置为手表开启运动 + TraingModel::GetInstance()->SetSportOpenWay(false); } return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp index f57940196..1730462a6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp @@ -17,6 +17,7 @@ #include "traing/include/TraingModel.h" // #include "TraingSetView.h" +#define TAGTEST 0 namespace OHOS { @@ -118,13 +119,21 @@ namespace OHOS case SET_STEPS: if (strcmp(view.GetViewId(), GetButtonIdFromCard(CardID)) == 0) { + // 获取训练目标值 int tag = GetTagFromCard(CardID); TraingModel::GetInstance()->SetSportTag(GetExerciseTagFromCard(CardID), tag); - // TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试 +#if TAGTEST + TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试 +#endif PRINT("GetButtonIdFromCard:%d tag:%d \r\n", CardID, tag); + // 切换到训练卡片 NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD); + // 获取训练项目 ExerciseClass type = TraingModel::GetInstance()->GetSportId(); + // 开启cywee TraingCardPresenter::GetInstance()->OpenSensor(type); + // 设置为手表开启运动 + TraingModel::GetInstance()->SetSportOpenWay(false); } break; default: diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp index 1c37781cd..f85f9c19d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp @@ -251,9 +251,8 @@ namespace OHOS { TraingModel::GetInstance()->SetSportState(ExerciseState::End); ControlSensor(ExerciseState::End); - if (TraingCardView::GetInstance()->RefreshEndView()) + if (TraingModel::GetInstance()->GetMomentum()) { - // 进行存储操作? NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA); } else @@ -289,6 +288,7 @@ namespace OHOS NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD); // 切换Slice // 增加打印 PRINT("cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],cmd->sportType[%d]\r\n", cmd->sportType, cmd->controlmd, cmd->sportTagType, cmd->sportType); + switch (cmd->sportType) { // 室外走路 @@ -321,7 +321,6 @@ namespace OHOS ControlSensor(ExerciseState::End); if (TraingCardView::GetInstance()->RefreshEndView()) { - // 进行存储操作? NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA); } else @@ -331,7 +330,7 @@ namespace OHOS return true; } // 暂停和恢复 - if (cmdState == ExerciseState::Continue || cmdState == ExerciseState::Pause) + else if (cmdState == ExerciseState::Continue || cmdState == ExerciseState::Pause) { // 开始状态 if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Start || TraingModel::GetInstance()->GetSportState() == ExerciseState::Continue) @@ -344,6 +343,7 @@ namespace OHOS PauseTimer(); // 暂停运动库 ControlSensor(ExerciseState::Pause); + return true; } // 暂停状态 if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Pause) @@ -356,8 +356,17 @@ namespace OHOS ResumeTimer(); // 恢复运动库 ControlSensor(ExerciseState::Continue); + return true; } } + else if (cmdState == ExerciseState::Start) + { + // 开启运动 + ControlSensor(cmdState); + // 设置APP开启运动 + TraingModel::GetInstance()->SetSportOpenWay(true); + } + return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp index cd91f93ca..743c895e9 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp @@ -337,12 +337,9 @@ namespace OHOS bool TraingCardView::RefreshEndView() { // 获取训练卡路里判断运动量 - int caldata = TraingModel::GetInstance()->GetCal(); - if (caldata >= 1) - { - momentumFlag = true; - } + momentumFlag = TraingModel::GetInstance()->GetMomentum(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "momentumFlag %d", momentumFlag); + if (momentumFlag) { // 正常结束