增加app对运动状态控制的限制
authorCaisking <3449750381@qq.com>
Mon, 30 Sep 2024 10:19:27 +0000 (18:19 +0800)
committerCaisking <3449750381@qq.com>
Mon, 30 Sep 2024 10:19:27 +0000 (18:19 +0800)
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp

index 725313a..340571f 100644 (file)
@@ -363,88 +363,105 @@ void TraingCardPresenter::OnSwipe(UISwipeView &view) {
 }\r
 /* -------------------------------- 协议发起运动处理\r
  * -------------------------------- */\r
+\r
 bool TraingCardPresenter::send_sport_cmd(training_ble *cmd) {\r
   if (cmd == nullptr) {\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid sport command");\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "无效的运动命令");\r
     return false;\r
   }\r
 \r
+  // 获取当前的运动状态\r
+  ExerciseState currentState = TraingModel::GetInstance()->GetSportState();\r
+  ExerciseState cmdstate = static_cast<ExerciseState>(cmd->controlmd);\r
+\r
   switch (cmd->controlmd) {\r
   case SETGOAL:\r
-    if (TraingModel::GetInstance()->GetSportState() == ExerciseState::General) {\r
-      // 设置目标:在非运动情况下设置  [单指令,执行后退出]\r
+    // 仅在一般状态下允许设置目标\r
+    if (currentState == ExerciseState::General) {\r
       TraingModel::GetInstance()->SetSportTag(\r
           static_cast<ExerciseTag>(cmd->sportTagType), cmd->sportTag);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetSportTag is succeed!\r\n");\r
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "目标设置成功!\r\n");\r
       return true;\r
     }\r
     break;\r
 \r
   case SENDDATA:\r
-    TraingModel::GetInstance()\r
-        ->SendLiveData(); // 发送实时数据 [单指令,执行后退出]\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SendLiveData is succeed!\r\n");\r
+    // 随时允许发送实时数据\r
+    TraingModel::GetInstance()->SendLiveData();\r
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "实时数据发送成功!\r\n");\r
     return true;\r
+\r
   default:\r
     break;\r
   }\r
 \r
-  if (TraingCardView::GetInstance() == nullptr) {\r
-    uapi_set_screen_on_api(); // 亮屏\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD);\r
-    // 设置目标类型和项目有且只有一次\r
-    switch (cmd->sportType) {\r
-    case 0:\r
-      TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORWALKING);\r
-      OpenSensor(ExerciseClass::OUTDOOR);\r
-      break;\r
-    case 1:\r
-      TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORRUNNING);\r
-      OpenSensor(ExerciseClass::OUTDOOR);\r
-      break;\r
-    case 2:\r
-      TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORBIKING);\r
-      OpenSensor(ExerciseClass::FREE_TRAINING);\r
-      break;\r
-    default:\r
-      break;\r
+  // 仅在一般状态下允许开始运动\r
+  if (cmdstate == ExerciseState::Start &&\r
+      currentState == ExerciseState::General) {\r
+    if (TraingCardView::GetInstance() == nullptr) {\r
+      uapi_set_screen_on_api(); // 亮屏\r
+      NativeAbility::GetInstance().ChangeSlice(VIEW_TRAININGCRAD);\r
+      // 设置目标类型和项目有且只有一次\r
+      switch (cmd->sportType) {\r
+      case 0:\r
+        TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORWALKING);\r
+        OpenSensor(ExerciseClass::OUTDOOR);\r
+        break;\r
+      case 1:\r
+        TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORRUNNING);\r
+        OpenSensor(ExerciseClass::OUTDOOR);\r
+        break;\r
+      case 2:\r
+        TraingModel::GetInstance()->SetSportEvent(STR_EXERCISE_OUTDOORBIKING);\r
+        OpenSensor(ExerciseClass::FREE_TRAINING);\r
+        break;\r
+      default:\r
+        break;\r
+      }\r
     }\r
-  }\r
 \r
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,\r
-                "cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],"\r
-                "cmd->sportTag[%d]\r\n",\r
-                cmd->sportType, cmd->controlmd, cmd->sportTagType,\r
-                cmd->sportTag);\r
+    handleStartState();\r
+    return true;\r
+  }\r
 \r
-  ExerciseState cmdState = static_cast<ExerciseState>(cmd->controlmd);\r
-  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ExerciseState::End   [%d]\r\n",\r
-                cmdState);\r
+  // 仅在运动状态为开始或继续时允许暂停\r
+  if (cmdstate == ExerciseState::Pause) {\r
+    if (currentState == ExerciseState::Start ||\r
+        currentState == ExerciseState::Continue) {\r
+      reply_APP_SportPasueResetCmd(TraingModel::GetInstance()->GetSportTime());\r
+      handlePauseState();\r
+      return true;\r
+    }\r
+  }\r
 \r
-  uint32_t sport_time = TraingModel::GetInstance()->GetSportTime();\r
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sport_time[%d]\r\n", sport_time);\r
+  // 仅在暂停状态下允许恢复运动\r
+  if (cmdstate == ExerciseState::Continue &&\r
+      currentState == ExerciseState::Pause) {\r
+    reply_APP_SportPasueResetCmd(TraingModel::GetInstance()->GetSportTime());\r
+    handleContinueState();\r
+    return true;\r
+  }\r
 \r
-  switch (cmdState) {\r
-  case ExerciseState::End:\r
+  // 仅在运动状态为开始、继续或暂停时允许结束运动\r
+  if (cmdstate == ExerciseState::End &&\r
+      (currentState == ExerciseState::Start ||\r
+       currentState == ExerciseState::Continue ||\r
+       currentState == ExerciseState::Pause)) {\r
+    uint32_t sport_time = TraingModel::GetInstance()->GetSportTime();\r
     reply_APP_SportStopModeCmd(sport_time);\r
     handleEndState();\r
-    break;\r
-  case ExerciseState::Pause:\r
-    reply_APP_SportPasueResetCmd(sport_time);\r
-    handlePauseState();\r
-    break;\r
-  case ExerciseState::Continue:\r
-    reply_APP_SportPasueResetCmd(sport_time);\r
-    handleContinueState();\r
-    break;\r
-  case ExerciseState::Start:\r
-    handleStartState();\r
-    break;\r
-  default:\r
-    break;\r
+    return true;\r
   }\r
 \r
-  return true;\r
+  // 如果到达这里,命令未执行\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                "cmd->sportType[%d],cmd->controlmd[%d],cmd->sportTagType[%d],"\r
+                "cmd->sportTag[%d]\r\n",\r
+                cmd->sportType, cmd->controlmd, cmd->sportTagType,\r
+                cmd->sportTag);\r
+\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "由于状态限制,命令未执行。\r\n");\r
+  return false; // 没有执行任何命令\r
 }\r
 \r
 /*训练结束*/\r