优化TrainingModel部分函数,实现训练数据存储 66/2
authorCaisking <3449750381@qq.com>
Mon, 22 Apr 2024 10:35:36 +0000 (18:35 +0800)
committerCaisking <3449750381@qq.com>
Mon, 22 Apr 2024 10:35:36 +0000 (18:35 +0800)
code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingEnddataView.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingNomalPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingSetPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardView.cpp

index c413c0c..b531f35 100644 (file)
@@ -36,6 +36,7 @@
 
 #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"
@@ -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> sportdata;*/ // 使用 std::unique_ptr 管理 SportData 对象
     };
index b66925f..097cca4 100644 (file)
@@ -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<float>(currentdata) / enddata->tag) * 100;
-            completeness = round(completeness); // 四舍五入
-            std::string tagStr = std::to_string(static_cast<int>(completeness)) + "%";
+            std::string tagStr = std::to_string(enddata->goaldegree) + "%";
             labeltag->SetText(tagStr.c_str());
         }
         // 运动时长
index 5471fe9..96de04c 100644 (file)
@@ -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<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
     /* 时间显示 */
index 69fdc59..978d9ef 100644 (file)
@@ -84,6 +84,8 @@ namespace OHOS
             ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
             // 开启对应的运动\r
             TraingCardPresenter::GetInstance()->OpenSensor(type);\r
+            // 设置为手表开启运动\r
+            TraingModel::GetInstance()->SetSportOpenWay(false);\r
         }\r
         return true;\r
     }\r
index f579401..1730462 100644 (file)
@@ -17,6 +17,7 @@
 #include "traing/include/TraingModel.h"\r
 // #include "TraingSetView.h"\r
 \r
+#define TAGTEST 0\r
 namespace OHOS\r
 {\r
 \r
@@ -118,13 +119,21 @@ namespace OHOS
         case SET_STEPS:\r
             if (strcmp(view.GetViewId(), GetButtonIdFromCard(CardID)) == 0)\r
             {\r
+                // 获取训练目标值\r
                 int tag = GetTagFromCard(CardID);\r
                 TraingModel::GetInstance()->SetSportTag(GetExerciseTagFromCard(CardID), tag);\r
-                // TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试\r
+#if TAGTEST\r
+                TraingModel::GetInstance()->SetSportTag(ExerciseTag::STEP, 10); // 测试\r
+#endif\r
                 PRINT("GetButtonIdFromCard:%d tag:%d \r\n", CardID, tag);\r
+                // 切换到训练卡片\r
                 NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD);\r
+                // 获取训练项目\r
                 ExerciseClass type = TraingModel::GetInstance()->GetSportId();\r
+                // 开启cywee\r
                 TraingCardPresenter::GetInstance()->OpenSensor(type);\r
+                // 设置为手表开启运动\r
+                TraingModel::GetInstance()->SetSportOpenWay(false);\r
             }\r
             break;\r
         default:\r
index 1c37781..f85f9c1 100644 (file)
@@ -251,9 +251,8 @@ namespace OHOS
         {\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
@@ -289,6 +288,7 @@ namespace OHOS
         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
@@ -321,7 +321,6 @@ namespace OHOS
             ControlSensor(ExerciseState::End);\r
             if (TraingCardView::GetInstance()->RefreshEndView())\r
             {\r
-                // 进行存储操作?\r
                 NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGENDDATA);\r
             }\r
             else\r
@@ -331,7 +330,7 @@ namespace OHOS
             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
@@ -344,6 +343,7 @@ namespace OHOS
                 PauseTimer();\r
                 // 暂停运动库\r
                 ControlSensor(ExerciseState::Pause);\r
+                return true;\r
             }\r
             // 暂停状态\r
             if (TraingModel::GetInstance()->GetSportState() == ExerciseState::Pause)\r
@@ -356,8 +356,17 @@ namespace OHOS
                 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
index cd91f93..743c895 100644 (file)
@@ -337,12 +337,9 @@ namespace OHOS
     bool TraingCardView::RefreshEndView()\r
     {\r
         // 获取训练卡路里判断运动量\r
-        int caldata = TraingModel::GetInstance()->GetCal();\r
-        if (caldata >= 1)\r
-        {\r
-            momentumFlag = true;\r
-        }\r
+        momentumFlag = TraingModel::GetInstance()->GetMomentum();\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "momentumFlag %d", momentumFlag);\r
+        \r
         if (momentumFlag)\r
         {\r
             // 正常结束\r