训练:修复开机的对于Topic的消息概率以及错误预防
authorCaisking <3449750381@qq.com>
Sat, 12 Oct 2024 03:24:15 +0000 (11:24 +0800)
committerCaisking <3449750381@qq.com>
Sat, 12 Oct 2024 03:24:15 +0000 (11:24 +0800)
code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp

index f448722..f1a9f6f 100644 (file)
@@ -383,11 +383,11 @@ private:
   /*std::unique_ptr<SportData> sportdata;*/   // 使用 std::unique_ptr 管理
                                               // SportData 对象
 
-  int user_maxHeart; // 用户最高心率
-  int user_Age;      // 用户年龄
-  int user_autoget;  // 自动获取设置
-  int user_freq;     // 训练频率
-  int user_Intensity;
+  int user_maxHeart{190}; // 用户最高心率
+  int user_Age{20};      // 用户年龄
+  int user_autoget{1};  // 自动获取设置
+  int user_freq{10};     // 训练频率
+  int user_Intensity{160};
 };
 } // namespace OHOS
 
index f1a1023..9f590a5 100644 (file)
@@ -52,14 +52,14 @@ extern "C" errcode_t uapi_get_timestampe_ms(uint32_t *tm);
 #ifdef __cplusplus
 extern "C" {
 #endif
-static void Notify(void *args, const Topic topic, Request *request);
+static void Training_Notify(void *args, const Topic topic, Request *request);
 
 using namespace OHOS;
 
 Subscriber TraingSubscirber = {
     .identity = NULL,
     .args = NULL,
-    .Notify = Notify,
+    .Notify = Training_Notify,
 };
 
 void TraingSubscribeTopic(Topic topic) {
@@ -107,24 +107,35 @@ void TraingUnsubscribeTopic(Topic topic) {
   broadcastApi->Release((IUnknown *)broadcastApi);
 }
 int flag = 0;
-static void Notify(void *args, const Topic topic, Request *request) {
+static void Training_Notify(void *args, const Topic topic, Request *request) {
   UNUSED(args);
   UNUSED(topic);
   if (request == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "request is NULL");
     return;
   }
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "request %d\r\n", request->msgId);
-  if (request->msgId == TOPIC_EVENT_ACTIVITY_UPDATE) {
-#if BLETEST
-    if (!flag) {
-      training_ble *traingbleInfo = new training_ble();
-      traingbleInfo->sportType = 1;
-      traingbleInfo->controlmd = 0;
-      TraingCardPresenter::GetInstance()->send_sport_cmd(traingbleInfo);
-      delete traingbleInfo;
-      flag = 1;
+  //蓝牙开启运动
+  if (request->msgId == TOPIC_EVENT_BLE_TRAINING) {
+    training_ble *traingbleInfo = new training_ble();
+    int rets = memcpy_s(traingbleInfo, sizeof(training_ble),
+                        (training_ble *)request->data, request->len);
+    if (rets != EOK) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "memcpy_s cywee_activity_result_t fail  ret = %d", rets);
+      return;
     }
-#endif
+    TraingCardPresenter::GetInstance()->send_sport_cmd(traingbleInfo);
+    delete traingbleInfo;
+  }
+  //增加训练runtime控制
+  if (uapi_dev_runtime_get_train_status() == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "uapi_dev_runtime_get_train_status %d",
+                  uapi_dev_runtime_get_train_status());
+    return;
+  }
+  //训练基本信息更新
+  if (request->msgId == TOPIC_EVENT_ACTIVITY_UPDATE) {
     cywee_activity_result_t *cyweeInfo = new cywee_activity_result_t();
     int rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t),
                         (cywee_activity_result_t *)request->data, request->len);
@@ -138,6 +149,7 @@ static void Notify(void *args, const Topic topic, Request *request) {
     TraingModel::GetInstance()->AnalysisData(cyweeInfo);
     delete cyweeInfo; // 释放内存
   }
+  //训练额外信息
   if (request->msgId == TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE) {
     cywee_activity_result_extre_info_t *cyweeInfo_ext =
         new cywee_activity_result_extre_info_t();
@@ -155,22 +167,11 @@ static void Notify(void *args, const Topic topic, Request *request) {
     TraingModel::GetInstance()->AnalysisExtraData(cyweeInfo_ext);
     delete cyweeInfo_ext; // 释放内存
   }
+  //训练心率
   if (request->msgId == TOPIC_EVENT_HEARTRATE_UPDATA) {
     uint8_t heart = *((u_int8_t *)(request->data)); // 进行类型转换
     TraingModel::GetInstance()->AnalysisHeartData(heart);
   }
-  if (request->msgId == TOPIC_EVENT_BLE_TRAINING) {
-    training_ble *traingbleInfo = new training_ble();
-    int rets = memcpy_s(traingbleInfo, sizeof(training_ble),
-                        (training_ble *)request->data, request->len);
-    if (rets != EOK) {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                    "memcpy_s cywee_activity_result_t fail  ret = %d", rets);
-      return;
-    }
-    TraingCardPresenter::GetInstance()->send_sport_cmd(traingbleInfo);
-    delete traingbleInfo;
-  }
 }
 #ifdef __cplusplus
 }
@@ -451,7 +452,9 @@ void TraingModel::AnalysisData(cywee_activity_result_t *cyweeInfo) {
         (!uapi_sleep_mode_flag_get())) {
       ui_api_vibrate_once_func();
     }
-    TraingCardView::GetInstance()->SetPopupViewStatus(HeartPopup, true);
+    if (TraingCardView::GetInstance()) {
+      TraingCardView::GetInstance()->SetPopupViewStatus(HeartPopup, true);
+    }
   }
 
   // 训练目标检查
@@ -466,9 +469,11 @@ void TraingModel::AnalysisData(cywee_activity_result_t *cyweeInfo) {
       if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb()) {
         ui_api_vibrate_once_func();
       }
-      TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
-      if (TraingCardView::GetInstance()->GetAnimator()) {
-        TraingCardView::GetInstance()->GetAnimator()->Start();
+      if (TraingCardView::GetInstance()) {
+        TraingCardView::GetInstance()->SetPopupViewStatus(GetTagPopup, true);
+        if (TraingCardView::GetInstance()->GetAnimator()) {
+          TraingCardView::GetInstance()->GetAnimator()->Start();
+        }
       }
       Gettagstuats = true;
     }
@@ -595,8 +600,8 @@ void TraingModel::SetTimestamp() {
     // 设置训练 runtime 为 1 训练中
     uapi_dev_runtime_set_train_status(1);
 
-    //更新用户数据
-    SetUserSportdata();
+    // 更新用户数据
+    // SetUserSportdata();
 
     ResetSharedTrainingData(); // 重置共享训练数据
 
@@ -865,7 +870,8 @@ void TraingModel::SetIntensity(int heart) {
   */
   // 确保最大心率为正值
   if (user_Intensity <= 0) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "maxHeartRate %d is error", user_Intensity);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "maxHeartRate %d is error",
+                  user_Intensity);
     return;
   }
 
@@ -1733,7 +1739,7 @@ bool TraingModel::CheckDataJson() {
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CheckDataJson is ok");
   return true;
 }
-#if 1
+
 bool TraingModel::SaveDataToJson(SportData *data) {
   FILE *fp;
   char *jsonStr = NULL;
@@ -1814,75 +1820,7 @@ bool TraingModel::SaveDataToJson(SportData *data) {
 
   return true;
 }
-#endif
-#if 0
-    bool TraingModel::SaveDataToJson(SportData *data)
-    {
-        if (data == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Data is null");
-            return false;
-        }
 
-        printf_data(data);
-
-        cJSON *root = cJSON_CreateObject(); // 创建一个新的 JSON 对象
-
-        // 创建或更新数据节点
-        cJSON *dataArray = cJSON_AddArrayToObject(root, "data");
-        cJSON *sportData = cJSON_CreateObject();
-        cJSON_AddNumberToObject(sportData, "sportTypeId", static_cast<int>(data->sportType));
-        cJSON_AddNumberToObject(sportData, "sportId", static_cast<int>(data->sportId));
-        cJSON_AddStringToObject(sportData, "startDate", data->start_date.c_str());
-        cJSON_AddStringToObject(sportData, "startTime", data->start_time.c_str());
-        cJSON_AddStringToObject(sportData, "endTime", data->end_time.c_str());
-        cJSON_AddNumberToObject(sportData, "goalDegree", data->goaldegree);
-        cJSON_AddNumberToObject(sportData, "duration", data->duration);
-        cJSON_AddNumberToObject(sportData, "distance", data->distance);
-        cJSON_AddNumberToObject(sportData, "avgHeartRate", data->avgheart);
-        cJSON_AddNumberToObject(sportData, "steps", data->steps);
-        cJSON_AddNumberToObject(sportData, "intensity", data->intensity);
-        cJSON_AddNumberToObject(sportData, "calories", data->calories);
-
-        cJSON_AddItemToArray(dataArray, sportData);
-
-        // 限制存储数量并删除多余数据
-        while (cJSON_GetArraySize(dataArray) > MAX_DATA_COUNT)
-        {
-            cJSON_DeleteItemFromArray(dataArray, 0);
-        }
-
-        // 将更新后的 JSON 数据写入文件
-        char *jsonStrNew = cJSON_Print(root);
-        if (jsonStrNew == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to serialize JSON data");
-            cJSON_Delete(root);
-            return false;
-        }
-
-        printf("jsonStrNew:%s\r\n", jsonStrNew);
-
-        FILE *fp = fopen(TRAINING_RECORD_FILE, "w");
-        if (fp == nullptr)
-        {
-            perror("fopen");
-            cJSON_Delete(root);
-            cJSON_free(jsonStrNew);
-            return false;
-        }
-
-        fwrite(jsonStrNew, strlen(jsonStrNew), 1, fp);
-        fclose(fp);
-
-        // 释放资源
-        cJSON_Delete(root);
-        cJSON_free(jsonStrNew);
-
-        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "SaveDataToJson succeeded");
-        return true;
-    }
-#endif
 /* 加载训练数据函数 */
 bool TraingModel::LoadDataFormJson(std::vector<SportData> &sportDataVector) {
   std::ifstream file(TRAINING_RECORD_FILE);
@@ -2014,6 +1952,12 @@ bool TraingModel::LoadDataFormJson(std::vector<SportData> &sportDataVector) {
     else
       isValid = false;
 
+    if (cJSON *caloriesItem = cJSON_GetObjectItem(item, "calories");
+        caloriesItem && cJSON_IsNumber(caloriesItem))
+      sportData.calories = caloriesItem->valueint;
+    else
+      isValid = false;
+
     // 只有在所有字段都有效的情况下才添加 sportData 到向量中
     if (isValid) {
       sportDataVector.push_back(sportData);
index fa2d03d..a967534 100644 (file)
@@ -370,13 +370,14 @@ bool TraingCardPresenter::OnKeyAct(UIView &view, const KeyEvent &event) {
 \r
 bool TraingCardPresenter::send_sport_cmd(training_ble *cmd) {\r
   if (cmd == nullptr) {\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "无效的运动命令");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "无效的运动命令 cmd 为空!");\r
     return false;\r
   }\r
 \r
   // 获取当前的运动状态\r
   ExerciseState currentState = TraingModel::GetInstance()->GetSportState();\r
   ExerciseState cmdstate = static_cast<ExerciseState>(cmd->controlmd);\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cmdstate:%d currentState:%d", cmdstate,currentState);\r
 \r
   switch (cmd->controlmd) {\r
   case SETGOAL:\r
@@ -384,7 +385,7 @@ bool TraingCardPresenter::send_sport_cmd(training_ble *cmd) {
     if (currentState == ExerciseState::General) {\r
       TraingModel::GetInstance()->SetSportTag(\r
           static_cast<ExerciseTag>(cmd->sportTagType), cmd->sportTag);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标设置成功!\r\n");\r
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "目标设置成功!\r\n");\r
       return true;\r
     }\r
     break;\r
@@ -392,7 +393,7 @@ bool TraingCardPresenter::send_sport_cmd(training_ble *cmd) {
   case SENDDATA:\r
     // 随时允许发送实时数据\r
     TraingModel::GetInstance()->SendLiveData();\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "实时数据发送成功!\r\n");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "实时数据发送成功!\r\n");\r
     return true;\r
 \r
   default:\r