diff --git a/src/MeoAssistant/AbstractTask.cpp b/src/MeoAssistant/AbstractTask.cpp index 2bbe48f57d..ef1ec3b814 100644 --- a/src/MeoAssistant/AbstractTask.cpp +++ b/src/MeoAssistant/AbstractTask.cpp @@ -22,8 +22,10 @@ AbstractTask::AbstractTask(AsstCallback callback, void* callback_arg) bool asst::AbstractTask::run() { + m_callback(AsstMsg::SubTaskStart, basic_info(), m_callback_arg); for (m_cur_retry = 0; m_cur_retry < m_retry_times; ++m_cur_retry) { if (_run()) { + m_callback(AsstMsg::SubTaskCompleted, basic_info(), m_callback_arg); return true; } if (need_exit()) { @@ -33,12 +35,25 @@ bool asst::AbstractTask::run() sleep(delay); if (!on_run_fails()) { + m_callback(AsstMsg::SubTaskError, basic_info(), m_callback_arg); return false; } } + m_callback(AsstMsg::SubTaskError, basic_info(), m_callback_arg); return false; } +json::value asst::AbstractTask::basic_info() const +{ + return json::object{ + { "taskchain", m_task_chain }, + { "class", typeid(*this).name() }, + { "details", json::object() } + //{ "CurRetryTimes", m_cur_retry }, + //{ "MaxRetryTimes", m_retry_times } + }; +} + bool AbstractTask::sleep(unsigned millisecond) { if (need_exit()) { @@ -50,9 +65,7 @@ bool AbstractTask::sleep(unsigned millisecond) auto start = std::chrono::steady_clock::now(); long long duration = 0; - json::value callback_json; - callback_json["time"] = millisecond; - m_callback(AsstMsg::ReadyToSleep, callback_json, m_callback_arg); + Log.trace("ready to sleep", millisecond); while (!need_exit() && duration < millisecond) { duration = std::chrono::duration_cast( @@ -60,7 +73,7 @@ bool AbstractTask::sleep(unsigned millisecond) std::this_thread::sleep_for(std::chrono::milliseconds(100)); std::this_thread::yield(); } - m_callback(AsstMsg::EndOfSleep, callback_json, m_callback_arg); + Log.trace("end of sleep", millisecond); return !need_exit(); } @@ -73,12 +86,6 @@ bool AbstractTask::save_image(const cv::Mat image, const std::string& dir) bool ret = cv::imwrite(filename, image); - json::value callback_json; - callback_json["filename"] = filename; - callback_json["ret"] = ret; - callback_json["offset"] = 0; - m_callback(AsstMsg::PrintWindow, callback_json, m_callback_arg); - return true; } diff --git a/src/MeoAssistant/AbstractTask.h b/src/MeoAssistant/AbstractTask.h index aa94f09f6f..815bcb9c28 100644 --- a/src/MeoAssistant/AbstractTask.h +++ b/src/MeoAssistant/AbstractTask.h @@ -8,6 +8,10 @@ namespace cv { class Mat; } +namespace json +{ + class value; +} namespace asst { @@ -30,6 +34,7 @@ namespace asst protected: virtual bool _run() = 0; virtual bool on_run_fails() { return true; } + virtual json::value basic_info() const; bool sleep(unsigned millisecond); bool save_image(const cv::Mat image, const std::string& dir); diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 8c3d5780d1..99bb27b9c1 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -45,9 +45,11 @@ Assistant::Assistant(std::string dirname, AsstCallback callback, void* callback_ throw error; } json::value callback_json; - callback_json["type"] = "resource broken"; - callback_json["what"] = error; - m_callback(AsstMsg::InitFaild, callback_json, m_callback_arg); + callback_json["what"] = "resource broken"; + callback_json["details"] = json::object{ + { "error", error } + }; + m_callback(AsstMsg::InitFailed, callback_json, m_callback_arg); throw error; } @@ -529,12 +531,13 @@ void Assistant::working_proc() auto task_ptr = m_tasks_queue.front(); std::string cur_taskchain = task_ptr->get_task_chain(); - json::value task_json = json::object{ - {"task_chain", cur_taskchain}, + json::value callback_json = json::object{ + {"taskchain", cur_taskchain}, + {"pre_taskchain", pre_taskchain} }; if (cur_taskchain != pre_taskchain) { - task_callback(AsstMsg::TaskChainStart, task_json, this); + task_callback(AsstMsg::TaskChainStart, callback_json, this); pre_taskchain = cur_taskchain; } @@ -542,17 +545,23 @@ void Assistant::working_proc() bool ret = task_ptr->run(); m_tasks_queue.pop(); - if (!ret) { - task_callback(AsstMsg::TaskError, task_json, this); + if (!m_tasks_queue.empty()) { + callback_json["next_taskchain"] = m_tasks_queue.front()->get_task_chain(); } - else if (m_tasks_queue.empty() || cur_taskchain != m_tasks_queue.front()->get_task_chain()) { - task_callback(AsstMsg::TaskChainCompleted, task_json, this); - } - if (m_tasks_queue.empty()) { - task_callback(AsstMsg::AllTasksCompleted, task_json, this); + else { + callback_json["next_taskchain"] = std::string(); } - //clear_cache(); + if (!ret) { + task_callback(AsstMsg::TaskChainError, callback_json, this); + } + else if (m_tasks_queue.empty() || cur_taskchain != m_tasks_queue.front()->get_task_chain()) { + task_callback(AsstMsg::TaskChainCompleted, callback_json, this); + } + + if (m_tasks_queue.empty()) { + task_callback(AsstMsg::AllTasksCompleted, callback_json, this); + } auto& delay = Resrc.cfg().get_options().task_delay; m_condvar.wait_for(lock, std::chrono::milliseconds(delay), @@ -562,7 +571,6 @@ void Assistant::working_proc() pre_taskchain.clear(); m_thread_idle = true; Log.flush(); - //controller.set_idle(true); m_condvar.wait(lock); } } @@ -600,13 +608,14 @@ void Assistant::task_callback(AsstMsg msg, const json::value& detail, void* cust Assistant* p_this = (Assistant*)custom_arg; json::value more_detail = detail; switch (msg) { - case AsstMsg::PtrIsNull: - case AsstMsg::ImageIsEmpty: + case AsstMsg::InternalError: + case AsstMsg::InitFailed: + case AsstMsg::ConnectionError: p_this->stop(false); break; - case AsstMsg::StageDrops: - more_detail = p_this->organize_stage_drop(more_detail); - break; + //case AsstMsg::StageDrops: + // more_detail = p_this->organize_stage_drop(more_detail); + // break; default: break; } diff --git a/src/MeoAssistant/AsstMsg.h b/src/MeoAssistant/AsstMsg.h index 09af748e6a..0b086324b8 100644 --- a/src/MeoAssistant/AsstMsg.h +++ b/src/MeoAssistant/AsstMsg.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include @@ -11,84 +10,41 @@ namespace asst { enum class AsstMsg { - /* Error Msg */ - PtrIsNull, // 指针为空 - ImageIsEmpty, // 图像为空 - WindowMinimized, // [已弃用] 窗口被最小化了 - InitFaild, // 初始化失败 - TaskError, // 任务错误(任务一直出错,retry次数达到上限) - OcrResultError, // Ocr识别结果错误 - /* Info Msg: about Task */ - TaskStart = 1000, // 任务开始 - TaskMatched, // 任务匹配成功 - ReachedLimit, // 单个原子任务达到次数上限 - ReadyToSleep, // 准备开始睡眠 - EndOfSleep, // 睡眠结束 - AppendProcessTask, // [已弃用] 新增流程任务,Assistant内部消息,外部不需要处理 - AppendTask, // [已弃用] 新增任务,Assistant内部消息,外部不需要处理 - TaskCompleted, // 单个原子任务完成 - PrintWindow, // 截图消息 - ProcessTaskStopAction, // 流程任务执行到了Stop的动作 - TaskChainCompleted, // 任务链完成 - ProcessTaskNotMatched, // 流程任务识别错误 - AllTasksCompleted, // 所有任务完成 - TaskChainStart, // 开始任务链 - /* Info Msg: about Identify */ - TextDetected = 2000, // 识别到文字 - ImageFindResult, // 查找图像的结果 - ImageMatched, // 图像匹配成功 - StageDrops, // 关卡掉落信息 - /* Open Recruit Msg */ - RecruitTagsDetected = 3000, // 公招识别到了Tags - RecruitSpecialTag, // 公招识别到了特殊的Tag - RecruitResult, // 公开招募结果 - RecruitSelected, // 选择了Tags - RecruitError, // 公招错误 - /* Infrast Msg */ - InfrastSkillsDetected = 4000, // 识别到了基建技能(当前页面) - InfrastSkillsResult, // 识别到的所有可用技能 - InfrastComb, // 当前房间的最优干员组合 - EnterFacility, // 进入某个房间 - FacilityInfo, // 当前设施信息 + /* Global Info */ + InternalError = 0, // 内部错误 + InitFailed, // 初始化失败 + ConnectionError, // 连接相关错误 + AllTasksCompleted, // 全部任务完成 + /* TaskChain Info */ + TaskChainError = 10000, // 任务链执行/识别错误 + TaskChainStart, // 任务链开始 + TaskChainCompleted, // 任务链完成 + TaskChainExtraInfo, // 任务链额外信息 + /* SubTask Info */ + SubTaskError = 20000, // 原子任务执行/识别错误 + SubTaskStart, // 原子任务开始 + SubTaskCompleted, // 原子任务完成 + SubTaskExtraInfo // 原子任务额外信息 }; inline std::ostream& operator<<(std::ostream& os, const AsstMsg& type) { static const std::unordered_map _type_name = { - { AsstMsg::PtrIsNull, "PtrIsNull" }, - { AsstMsg::ImageIsEmpty, "ImageIsEmpty" }, - { AsstMsg::RecruitSelected, "RecruitSelected" }, - { AsstMsg::WindowMinimized, "WindowMinimized" }, - { AsstMsg::InitFaild, "InitFaild" }, - { AsstMsg::TaskStart, "TaskStart" }, - { AsstMsg::ImageFindResult, "ImageFindResult" }, - { AsstMsg::ImageMatched, "ImageMatched" }, - { AsstMsg::StageDrops, "StageDrops" }, - { AsstMsg::TaskMatched, "TaskMatched" }, - { AsstMsg::RecruitError, "RecruitError" }, - { AsstMsg::ReachedLimit, "ReachedLimit" }, - { AsstMsg::ReadyToSleep, "ReadyToSleep" }, - { AsstMsg::EndOfSleep, "EndOfSleep" }, - { AsstMsg::AppendProcessTask, "AppendProcessTask" }, - { AsstMsg::TaskCompleted, "TaskCompleted" }, - { AsstMsg::TaskChainCompleted, "TaskChainCompleted" }, - { AsstMsg::TaskChainStart, "TaskChainStart" }, + /* Global Info */ + { AsstMsg::InternalError, "InternalError" }, + { AsstMsg::InitFailed, "InitFailed" }, + { AsstMsg::ConnectionError, "ConnectionError" }, { AsstMsg::AllTasksCompleted, "AllTasksCompleted" }, - { AsstMsg::PrintWindow, "PrintWindow" }, - { AsstMsg::TaskError, "TaskError" }, - { AsstMsg::ProcessTaskNotMatched, "ProcessTaskNotMatched" }, - { AsstMsg::ProcessTaskStopAction, "ProcessTaskStopAction" }, - { AsstMsg::TextDetected, "TextDetected" }, - { AsstMsg::RecruitTagsDetected, "RecruitTagsDetected" }, - { AsstMsg::OcrResultError, "OcrResultError" }, - { AsstMsg::RecruitSpecialTag, "RecruitSpecialTag" }, - { AsstMsg::RecruitResult, "RecruitResult" }, - { AsstMsg::AppendTask, "AppendTask" }, - { AsstMsg::InfrastSkillsDetected, "InfrastSkillsDetected" }, - { AsstMsg::InfrastSkillsResult, "InfrastSkillsResult" }, - { AsstMsg::InfrastComb, "InfrastComb" }, - { AsstMsg::EnterFacility, "EnterFacility" }, - { AsstMsg::FacilityInfo, "FacilityInfo" } + /* TaskChain Info */ + { AsstMsg::TaskChainError, "TaskChainError" }, + { AsstMsg::TaskChainStart, "TaskChainStart" }, + { AsstMsg::TaskChainCompleted, "TaskChainCompleted" }, + { AsstMsg::TaskChainExtraInfo, "TaskChainExtraInfo" }, + /* SubTask Info */ + { AsstMsg::SubTaskError, "SubTaskError" }, + { AsstMsg::SubTaskStart, "SubTaskStart" }, + { AsstMsg::SubTaskCompleted, "SubTaskCompleted" }, + { AsstMsg::SubTaskExtraInfo, "SubTaskExtraInfo" }, }; return os << _type_name.at(type); } diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp index 6acf6ce6a2..3d4063b9f3 100644 --- a/src/MeoAssistant/AutoRecruitTask.cpp +++ b/src/MeoAssistant/AutoRecruitTask.cpp @@ -34,12 +34,6 @@ void asst::AutoRecruitTask::set_use_expedited(bool use_or_not) noexcept bool asst::AutoRecruitTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "RecruitTask" }, - { "task_chain", m_task_chain }, - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - if (!check_recruit_home_page()) { return false; } @@ -117,7 +111,7 @@ bool asst::AutoRecruitTask::calc_and_recruit() // 识别错误,放弃这个公招位,直接返回 if (!recurit_task.run()) { - m_callback(AsstMsg::RecruitError, json::value(), m_callback_arg); + m_callback(AsstMsg::SubTaskError, basic_info(), m_callback_arg); click_return_button(); return true; } diff --git a/src/MeoAssistant/CreditShoppingTask.cpp b/src/MeoAssistant/CreditShoppingTask.cpp index 23e0ceecf1..a9b147a508 100644 --- a/src/MeoAssistant/CreditShoppingTask.cpp +++ b/src/MeoAssistant/CreditShoppingTask.cpp @@ -13,12 +13,6 @@ bool asst::CreditShoppingTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "CreditShoppingTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - const cv::Mat image = Ctrler.get_image(); CreditShopImageAnalyzer shop_analyzer(image); @@ -78,6 +72,5 @@ bool asst::CreditShoppingTask::_run() Ctrler.click(buy_it_rect); sleep(rare_delay); } - return true; } diff --git a/src/MeoAssistant/InfrastAbstractTask.cpp b/src/MeoAssistant/InfrastAbstractTask.cpp index abcc851f1f..f23628e79f 100644 --- a/src/MeoAssistant/InfrastAbstractTask.cpp +++ b/src/MeoAssistant/InfrastAbstractTask.cpp @@ -60,12 +60,13 @@ bool asst::InfrastAbstractTask::on_run_fails() bool asst::InfrastAbstractTask::enter_facility(const std::string& facility, int index) { - LogTraceFunction; - json::value enter_json = json::object{ + json::value info = basic_info(); + info["what"] = "EnterFacility"; + info["details"] = json::object{ { "facility", facility }, { "index", index } }; - m_callback(AsstMsg::EnterFacility, enter_json, m_callback_arg); + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); const auto image = Ctrler.get_image(); @@ -103,14 +104,14 @@ bool asst::InfrastAbstractTask::enter_oper_list_page() // 如果没找到,说明“进驻信息”这个按钮没有被点开,那就点开它 if (!enter_analyzer.analyze()) { - Log.trace("ready to analyze the stationed info button"); + Log.trace("ready to analyze the stationed basic_info button"); OcrImageAnalyzer station_analyzer(image); const auto stationedinfo_task_ptr = std::dynamic_pointer_cast( Task.get("InfrastStationedInfo")); station_analyzer.set_task_info(*stationedinfo_task_ptr); if (station_analyzer.analyze()) { - Log.trace("the stationed info button found"); + Log.trace("the stationed basic_info button found"); Ctrler.click(station_analyzer.get_result().front().rect); sleep(stationedinfo_task_ptr->rear_delay); // 点开了按钮之后,再识别一次右边的 @@ -122,7 +123,7 @@ bool asst::InfrastAbstractTask::enter_oper_list_page() } } else { - Log.error("no stationed info button"); + Log.error("no stationed basic_info button"); return false; } } diff --git a/src/MeoAssistant/InfrastControlTask.cpp b/src/MeoAssistant/InfrastControlTask.cpp index 3755ff3033..b66942d88e 100644 --- a/src/MeoAssistant/InfrastControlTask.cpp +++ b/src/MeoAssistant/InfrastControlTask.cpp @@ -4,12 +4,6 @@ const std::string asst::InfrastControlTask::FacilityName = "Control"; bool asst::InfrastControlTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastControlTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - set_facility(FacilityName); m_all_available_opers.clear(); diff --git a/src/MeoAssistant/InfrastDormTask.cpp b/src/MeoAssistant/InfrastDormTask.cpp index dd1996690c..6bef0bc88c 100644 --- a/src/MeoAssistant/InfrastDormTask.cpp +++ b/src/MeoAssistant/InfrastDormTask.cpp @@ -11,12 +11,6 @@ const std::string asst::InfrastDormTask::FacilityName = "Dorm"; bool asst::InfrastDormTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastDormTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - for (; m_cur_dorm_index < m_max_num_of_dorm; ++m_cur_dorm_index) { if (need_exit()) { return false; diff --git a/src/MeoAssistant/InfrastInfoTask.cpp b/src/MeoAssistant/InfrastInfoTask.cpp index ecdf8828fa..738ca62715 100644 --- a/src/MeoAssistant/InfrastInfoTask.cpp +++ b/src/MeoAssistant/InfrastInfoTask.cpp @@ -8,12 +8,6 @@ bool asst::InfrastInfoTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastInfoTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - swipe_to_the_left_of_main_ui(); const auto image = Ctrler.get_image(); diff --git a/src/MeoAssistant/InfrastMfgTask.cpp b/src/MeoAssistant/InfrastMfgTask.cpp index 14a8602a30..f96e60cf34 100644 --- a/src/MeoAssistant/InfrastMfgTask.cpp +++ b/src/MeoAssistant/InfrastMfgTask.cpp @@ -8,12 +8,6 @@ const std::string asst::InfrastMfgTask::FacilityName = "Mfg"; bool asst::InfrastMfgTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastMfgTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - set_facility(FacilityName); m_all_available_opers.clear(); diff --git a/src/MeoAssistant/InfrastOfficeTask.cpp b/src/MeoAssistant/InfrastOfficeTask.cpp index 066f4afd8c..a6be49acf8 100644 --- a/src/MeoAssistant/InfrastOfficeTask.cpp +++ b/src/MeoAssistant/InfrastOfficeTask.cpp @@ -6,12 +6,6 @@ const std::string asst::InfrastOfficeTask::FacilityName = "Office"; bool asst::InfrastOfficeTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastOfficeTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - set_facility(FacilityName); m_all_available_opers.clear(); diff --git a/src/MeoAssistant/InfrastPowerTask.cpp b/src/MeoAssistant/InfrastPowerTask.cpp index 75e49d56cb..419059cfd7 100644 --- a/src/MeoAssistant/InfrastPowerTask.cpp +++ b/src/MeoAssistant/InfrastPowerTask.cpp @@ -6,12 +6,6 @@ const std::string asst::InfrastPowerTask::FacilityName = "Power"; bool asst::InfrastPowerTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastPowerTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - set_facility(FacilityName); m_all_available_opers.clear(); diff --git a/src/MeoAssistant/InfrastProductionTask.cpp b/src/MeoAssistant/InfrastProductionTask.cpp index 5108607de1..58aa830fe5 100644 --- a/src/MeoAssistant/InfrastProductionTask.cpp +++ b/src/MeoAssistant/InfrastProductionTask.cpp @@ -41,11 +41,13 @@ bool asst::InfrastProductionTask::shift_facility_list() return false; } if (index != 0) { - json::value enter_json = json::object{ + json::value info = basic_info(); + info["what"] = "EnterFacility"; + info["details"] = json::object{ { "facility", m_facility }, { "index", index } }; - m_callback(AsstMsg::EnterFacility, enter_json, m_callback_arg); + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); } ++index; diff --git a/src/MeoAssistant/InfrastReceptionTask.cpp b/src/MeoAssistant/InfrastReceptionTask.cpp index a6f92bd5a7..8e54ad7653 100644 --- a/src/MeoAssistant/InfrastReceptionTask.cpp +++ b/src/MeoAssistant/InfrastReceptionTask.cpp @@ -12,12 +12,6 @@ const std::string asst::InfrastReceptionTask::FacilityName = "Reception"; bool asst::InfrastReceptionTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastReceptionTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - set_facility(FacilityName); m_all_available_opers.clear(); diff --git a/src/MeoAssistant/InfrastTradeTask.cpp b/src/MeoAssistant/InfrastTradeTask.cpp index 0fc9f15f43..eb08e6a08e 100644 --- a/src/MeoAssistant/InfrastTradeTask.cpp +++ b/src/MeoAssistant/InfrastTradeTask.cpp @@ -4,12 +4,6 @@ const std::string asst::InfrastTradeTask::FacilityName = "Trade"; bool asst::InfrastTradeTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "InfrastTradeTask" }, - { "task_chain", m_task_chain } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - set_facility(FacilityName); m_all_available_opers.clear(); diff --git a/src/MeoAssistant/ProcessTask.cpp b/src/MeoAssistant/ProcessTask.cpp index c7a42d105c..a9651dea81 100644 --- a/src/MeoAssistant/ProcessTask.cpp +++ b/src/MeoAssistant/ProcessTask.cpp @@ -25,20 +25,41 @@ asst::ProcessTask::ProcessTask(AbstractTask&& abs, std::vector task m_cur_tasks_name(std::move(tasks_name)) {} +bool asst::ProcessTask::run() +{ + for (m_cur_retry = 0; m_cur_retry < m_retry_times; ++m_cur_retry) { + if (_run()) { + return true; + } + if (need_exit()) { + return false; + } + int delay = Resrc.cfg().get_options().task_delay; + sleep(delay); + + if (!on_run_fails()) { + return false; + } + } + m_callback(AsstMsg::SubTaskError, basic_info(), m_callback_arg); + return false; +} + bool ProcessTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "ProcessTask" }, - { "task_chain", m_task_chain }, - { "tasks", json::array(m_cur_tasks_name) } - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + LogTraceFunction; auto& task_delay = Resrc.cfg().get_options().task_delay; while (!m_cur_tasks_name.empty()) { if (need_exit()) { return false; } + json::value info = basic_info(); + info["details"] = json::object{ + {"to_be_recognized", json::array(m_cur_tasks_name)} + }; + Log.info(info.to_string()); + Rect rect; // 如果第一个任务是JustReturn的,那就没必要再截图并计算了 if (auto front_task_ptr = Task.get(m_cur_tasks_name.front()); @@ -69,39 +90,29 @@ bool ProcessTask::_run() int& exec_times = m_exec_times[cur_name]; - json::value callback_json = json::object{ - { "name", cur_name }, - { "type", static_cast(m_cur_task_ptr->action) }, - { "exec_times", exec_times }, - { "max_times", m_cur_task_ptr->max_times }, - { "task_type", "ProcessTask" }, - { "algorithm", static_cast(m_cur_task_ptr->algorithm) } - }; - m_callback(AsstMsg::TaskMatched, callback_json, m_callback_arg); - int max_times = m_cur_task_ptr->max_times; if (auto iter = m_times_limit.find(cur_name); iter != m_times_limit.cend()) { max_times = iter->second; - callback_json["times_limit"] = max_times; } + info["details"] = json::object{ + { "task", cur_name }, + { "action", static_cast(m_cur_task_ptr->action) }, + { "exec_times", exec_times }, + { "max_times", max_times }, + { "algorithm", static_cast(m_cur_task_ptr->algorithm) } + }; + if (exec_times >= max_times) { - m_callback(AsstMsg::ReachedLimit, callback_json, m_callback_arg); - - json::value next_json = callback_json; - next_json["tasks"] = json::array(m_cur_task_ptr->exceeded_next); - next_json["retry_times"] = m_retry_times; - next_json["task_chain"] = m_task_chain; - //m_callback(AsstMsg::AppendProcessTask, next_json, m_callback_arg); - //return true; - - Log.trace(next_json.to_string()); + Log.info("exec times exceeds the limit", info.to_string()); set_tasks(m_cur_task_ptr->exceeded_next); sleep(task_delay); continue; } + m_callback(AsstMsg::SubTaskStart, info, m_callback_arg); + // 前置固定延时 if (!sleep(m_cur_task_ptr->pre_delay)) { return false; @@ -127,7 +138,7 @@ bool ProcessTask::_run() case ProcessTaskAction::DoNothing: break; case ProcessTaskAction::Stop: - m_callback(AsstMsg::ProcessTaskStopAction, json::object{ { "task_chain", m_task_chain } }, m_callback_arg); + Log.info("stop action", info.to_string()); need_stop = true; break; case ProcessTaskAction::StageDrops: { @@ -137,7 +148,6 @@ bool ProcessTask::_run() break; } m_cur_retry = 0; - ++exec_times; Status.set("Last" + cur_name, time(nullptr)); @@ -149,13 +159,6 @@ bool ProcessTask::_run() --m_exec_times[reduce]; } - if (need_stop) { - return true; - } - - callback_json["exec_times"] = exec_times; - m_callback(AsstMsg::TaskCompleted, callback_json, m_callback_arg); - // 后置固定延时 int rear_delay = m_cur_task_ptr->rear_delay; if (auto iter = m_rear_delay.find(cur_name); @@ -166,12 +169,12 @@ bool ProcessTask::_run() return false; } - json::value next_json = callback_json; - next_json["task_chain"] = m_task_chain; - next_json["retry_times"] = m_retry_times; - next_json["tasks"] = json::array(m_cur_task_ptr->next); - Log.trace(next_json.to_string()); + info["exec_times"] = exec_times; + m_callback(AsstMsg::SubTaskCompleted, info.to_string(), m_callback_arg); + if (need_stop) { + return true; + } set_tasks(m_cur_task_ptr->next); sleep(task_delay); } @@ -183,7 +186,12 @@ void asst::ProcessTask::exec_stage_drops() { cv::Mat image = Ctrler.get_image(true); std::string res = Resrc.penguin().recognize(image); - m_callback(AsstMsg::StageDrops, json::parse(res).value(), m_callback_arg); + + json::value info = basic_info(); + info["what"] = "StageDrops"; + info["details"] = json::parse(res).value(); + + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); if (m_rear_delay.find("StartButton2") == m_rear_delay.cend()) { int64_t start_times = Status.get("LastStartButton2"); diff --git a/src/MeoAssistant/ProcessTask.h b/src/MeoAssistant/ProcessTask.h index a4b0e464cb..5d6facd28e 100644 --- a/src/MeoAssistant/ProcessTask.h +++ b/src/MeoAssistant/ProcessTask.h @@ -15,6 +15,8 @@ namespace asst virtual ~ProcessTask() = default; + virtual bool run() override; + void set_tasks(std::vector tasks_name) noexcept { m_cur_tasks_name = std::move(tasks_name); @@ -26,6 +28,7 @@ namespace asst protected: virtual bool _run() override; + void exec_stage_drops(); void exec_click_task(const Rect& matched_rect); void exec_swipe_task(ProcessTaskAction action); diff --git a/src/MeoAssistant/RecruitTask.cpp b/src/MeoAssistant/RecruitTask.cpp index 087623d046..2ebc65b701 100644 --- a/src/MeoAssistant/RecruitTask.cpp +++ b/src/MeoAssistant/RecruitTask.cpp @@ -12,22 +12,11 @@ using namespace asst; bool RecruitTask::_run() { - json::value task_start_json = json::object{ - { "task_type", "RecruitTask_run" }, - { "task_chain", m_task_chain }, - }; - m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - m_maybe_level = 0; m_has_special_tag = false; m_has_refresh = false; const cv::Mat image = Ctrler.get_image(); - if (image.empty()) { - m_callback(AsstMsg::ImageIsEmpty, task_start_json, m_callback_arg); - return false; - } - RecruitImageAnalyzer analyzer(image); if (!analyzer.analyze()) { @@ -48,29 +37,29 @@ bool RecruitTask::_run() all_tags_name.emplace(text_area.text); all_tags_json_vector.emplace_back(text_area.text); } - json::value all_tags_json; - all_tags_json["tags"] = json::array(all_tags_json_vector); - all_tags_json["task_chain"] = m_task_chain; /* 过滤tags数量不足的情况(可能是识别漏了) */ if (all_tags.size() != RecruitConfiger::CorrectNumberOfTags) { - //all_tags_json["type"] = "OpenRecruit"; - //m_callback(AsstMsg::OcrResultError, all_tags_json, m_callback_arg); return false; } - - m_callback(AsstMsg::RecruitTagsDetected, all_tags_json, m_callback_arg); + json::value info = basic_info(); + info["what"] = "RecruitTagsDetected"; + info["details"] = json::object{ + { "tags", json::array(all_tags_json_vector) } + }; + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); /* 针对特殊Tag的额外回调消息 */ static const std::string SeniorOper = "高级资深干员"; - static const std::string SupportMachine = "支援机械"; - const std::vector SpecialTags = { SeniorOper, SupportMachine }; + const std::vector SpecialTags = { SeniorOper, "资深干员" }; auto special_iter = std::find_first_of(SpecialTags.cbegin(), SpecialTags.cend(), all_tags_name.cbegin(), all_tags_name.cend()); if (special_iter != SpecialTags.cend()) { - json::value special_tag_json; - special_tag_json["tag"] = *special_iter; - m_callback(AsstMsg::RecruitSpecialTag, special_tag_json, m_callback_arg); + info["what"] = "RecruitSpecialTag"; + info["details"] = json::object{ + { "tag", *special_iter } + }; + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); m_has_special_tag = true; } @@ -174,8 +163,7 @@ bool RecruitTask::_run() /* 整理识别结果Json */ json::value results_json; results_json["result"] = json::array(); - results_json["maybe_level"] = m_maybe_level; - results_json["task_chain"] = m_task_chain; + results_json["level"] = m_maybe_level; std::vector result_json_vector; for (const auto& comb : result_vec) { @@ -196,10 +184,12 @@ bool RecruitTask::_run() opers_json_vector.emplace_back(std::move(oper_json)); } comb_json["opers"] = json::array(std::move(opers_json_vector)); - comb_json["tag_level"] = comb.min_level; + comb_json["level"] = comb.min_level; results_json["result"].as_array().emplace_back(std::move(comb_json)); } - m_callback(AsstMsg::RecruitResult, results_json, m_callback_arg); + info["what"] = "RecruitResult"; + info["details"] = results_json; + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); if (!result_vec.empty()) { /* 点击最优解的tags */ @@ -212,10 +202,11 @@ bool RecruitTask::_run() } } - json::value selected_json; - selected_json["tags"] = json::array(final_tags_name); - selected_json["task_chain"] = m_task_chain; - m_callback(AsstMsg::RecruitSelected, selected_json, m_callback_arg); + info["what"] = "RecruitTagsSelected"; + info["details"] = json::object{ + { "tags", json::array(final_tags_name) } + }; + m_callback(AsstMsg::SubTaskExtraInfo, info, m_callback_arg); } }