diff --git a/docs/任务流程协议.md b/docs/任务流程协议.md index a51a30753b..b5eb56bbb6 100644 --- a/docs/任务流程协议.md +++ b/docs/任务流程协议.md @@ -30,6 +30,15 @@ // - SwipeToTheLeft: 滑动到最左侧 // - SwipeToTheRight: 滑动到最右侧 + "sub": [ "SubTaskName1", "SubTaskName2" ], + // 可选项,子任务。会在执行完当前任务后,依次执行每一个子任务 + // 可以套娃,子任务再套子任务。但要注意不要写出了死循环 + + "subErrorIgnored": true, // 可选项,是否忽略子任务的错误。 + // 不填写默认 true + // 为 false 时,若某个子任务出错,则不继续执行后续任务(相当于本任务出错了) + // 为 true 时,子任务是否出错没有影响 + "next": [ "OtherTaskName1", "OtherTaskName2"], // 可选项,表示执行完当前任务后,下一个要执行的任务 // 会从前往后依次去识别,去执行第一个匹配上的 diff --git a/src/MeoAssistant/AsstTypes.h b/src/MeoAssistant/AsstTypes.h index 9dd8bc8948..c9fb50623a 100644 --- a/src/MeoAssistant/AsstTypes.h +++ b/src/MeoAssistant/AsstTypes.h @@ -219,6 +219,8 @@ namespace asst AlgorithmType::Invalid; ProcessTaskAction action = // 要进行的操作 ProcessTaskAction::Invalid; + std::vector sub; // 子任务(列表) + bool sub_error_ignored = true; // 子任务如果失败了,是否继续执行剩下的任务 std::vector next; // 下一个可能的任务(列表) int max_times = INT_MAX; // 任务最多执行多少次 std::vector exceeded_next; // 达到最多次数了之后,下一个可能的任务(列表) diff --git a/src/MeoAssistant/ProcessTask.cpp b/src/MeoAssistant/ProcessTask.cpp index 87a1c8ec36..c33c96f397 100644 --- a/src/MeoAssistant/ProcessTask.cpp +++ b/src/MeoAssistant/ProcessTask.cpp @@ -224,6 +224,13 @@ bool ProcessTask::_run() return false; } + for (const std::string& sub : cur_task_ptr->sub) { + bool sub_ret = ProcessTask(*this, { sub }).run(); + if (!sub_ret && !cur_task_ptr->sub_error_ignored) { + return false; + } + } + callback(AsstMsg::SubTaskCompleted, info); if (cur_task_ptr->next.empty()) { diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index 7ce41871d8..4bad10f883 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -189,11 +189,19 @@ bool asst::TaskData::parse(const json::value& json) task_info_ptr->roi = Rect(); } + if (task_json.contains("sub")) { + for (const json::value& sub : task_json.at("sub").as_array()) { + task_info_ptr->sub.emplace_back(sub.as_string()); + } + } + task_info_ptr->sub_error_ignored = task_json.get("subErrorIgnored", true); + if (task_json.contains("next")) { for (const json::value& next : task_json.at("next").as_array()) { task_info_ptr->next.emplace_back(next.as_string()); } } + if (task_json.contains("rectMove")) { const json::array& move_arr = task_json.at("rectMove").as_array(); task_info_ptr->rect_move = Rect(