diff --git a/resource/tasks.json b/resource/tasks.json index 809f49cdb7..0abf80400e 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -1345,6 +1345,12 @@ "maskRange": [ 1, 255 + ], + "roi": [ + 800, + 0, + 480, + 720 ] }, "InfrastClueOnTheRightSwipeBegin": { @@ -1356,8 +1362,8 @@ 300, 100 ], - "preDelay": 1000, - "rearDelay": 1000, + "preDelay": 500, + "rearDelay": 500, "maxTimes": 1, "Doc": "这里的preDelay作为滑动duration使用,rearDelay作为滑动额外延时使用,maxTimes作为重复次数使用" }, diff --git a/src/MeoAssistance/AsstMsg.h b/src/MeoAssistance/AsstMsg.h index 33e652b441..5fb6f4170f 100644 --- a/src/MeoAssistance/AsstMsg.h +++ b/src/MeoAssistance/AsstMsg.h @@ -42,7 +42,7 @@ namespace asst { OpersDetected = 4000, // 识别到了干员s OpersIdtfResult, // 干员识别结果(总的) InfrastComb, // 当前房间的最优干员组合 - EnterStation, // 进入某个房间 + EnterFacility, // 进入某个房间 StationInfo, // 当前房间信息 ReadyToShift, // 准备换班 ShiftCompleted, // 换班完成(单个房间) @@ -80,7 +80,7 @@ namespace asst { {AsstMsg::OpersDetected, "OpersDetected"}, {AsstMsg::OpersIdtfResult, "OpersIdtfResult"}, {AsstMsg::InfrastComb, "InfrastComb"}, - {AsstMsg::EnterStation, "EnterStation"}, + {AsstMsg::EnterFacility, "EnterFacility"}, {AsstMsg::StationInfo, "StationInfo"}, {AsstMsg::ReadyToShift, "ReadyToShift"}, {AsstMsg::ShiftCompleted, "ShiftCompleted"}, diff --git a/src/MeoAssistance/InfrastAbstractTask.cpp b/src/MeoAssistance/InfrastAbstractTask.cpp index 1f01d01ecf..2c1e79041b 100644 --- a/src/MeoAssistance/InfrastAbstractTask.cpp +++ b/src/MeoAssistance/InfrastAbstractTask.cpp @@ -5,18 +5,29 @@ #include "InfrastFacilityImageAnalyzer.h" #include "Controller.h" #include "Resource.h" +#include "Logger.hpp" +#include "AsstMsg.h" bool asst::InfrastAbstractTask::enter_facility(const std::string& facility, int index) { + LogTraceFunction; + json::value enter_json = json::object{ + { "facility", facility }, + { "index", index} + }; + m_callback(AsstMsg::EnterFacility, enter_json, m_callback_arg); + const auto& image = ctrler.get_image(); InfrastFacilityImageAnalyzer analyzer(image); analyzer.set_to_be_analyzed({ facility }); if (!analyzer.analyze()) { + log.trace("result is empty"); return false; } Rect rect = analyzer.get_rect(facility, index); if (rect.empty()) { + log.trace("facility index is out of range"); return false; } @@ -30,6 +41,8 @@ bool asst::InfrastAbstractTask::enter_facility(const std::string& facility, int bool asst::InfrastAbstractTask::enter_oper_list_page() { + LogTraceFunction; + auto image = ctrler.get_image(); // 识别右边的“进驻”按钮 @@ -40,25 +53,30 @@ bool asst::InfrastAbstractTask::enter_oper_list_page() // 如果没找到,说明“进驻信息”这个按钮没有被点开,那就点开它 if (!enter_analyzer.analyze()) { + log.trace("ready to analyze the stationed info button"); OcrImageAnalyzer station_analyzer(image); const auto stationedinfo_task_ptr = std::dynamic_pointer_cast( resource.task().task_ptr("InfrastStationedInfo")); station_analyzer.set_task_info(*stationedinfo_task_ptr); if (station_analyzer.analyze()) { + log.trace("the stationed info button found"); ctrler.click(station_analyzer.get_result().front().rect); sleep(stationedinfo_task_ptr->rear_delay); // 点开了按钮之后,再识别一次右边的 image = ctrler.get_image(); enter_analyzer.set_image(image); if (!enter_analyzer.analyze()) { + log.error("no enterlist button"); return false; } } else { + log.error("no stationed info button"); return false; } } + log.trace("ready to click the enterlist button"); ctrler.click(enter_analyzer.get_result().front().rect); sleep(enter_task_ptr->rear_delay); @@ -67,6 +85,7 @@ bool asst::InfrastAbstractTask::enter_oper_list_page() void asst::InfrastAbstractTask::async_swipe_of_operlist(bool reverse) { + LogTraceFunction; static Rect begin_rect = resource.task().task_ptr("InfrastOperListSwipeBegin")->specific_rect; static Rect end_rect = resource.task().task_ptr("InfrastOperListSwipeEnd")->specific_rect; static int duration = resource.task().task_ptr("InfrastOperListSwipeBegin")->pre_delay; @@ -81,6 +100,7 @@ void asst::InfrastAbstractTask::async_swipe_of_operlist(bool reverse) void asst::InfrastAbstractTask::await_swipe() { + LogTraceFunction; static int extra_delay = resource.task().task_ptr("InfrastOperListSwipeBegin")->rear_delay; ctrler.wait(m_last_swipe_id); @@ -89,6 +109,7 @@ void asst::InfrastAbstractTask::await_swipe() bool asst::InfrastAbstractTask::click_bottomleft_tab() { + LogTraceFunction; const auto task_ptr = resource.task().task_ptr("InfrastBottomLeftTab"); ctrler.click(task_ptr->specific_rect); sleep(task_ptr->rear_delay); @@ -97,6 +118,7 @@ bool asst::InfrastAbstractTask::click_bottomleft_tab() bool asst::InfrastAbstractTask::click_clear_button() { + LogTraceFunction; const auto task_ptr = resource.task().task_ptr("InfrastClearButton"); ctrler.click(task_ptr->specific_rect); sleep(task_ptr->rear_delay); @@ -105,6 +127,7 @@ bool asst::InfrastAbstractTask::click_clear_button() bool asst::InfrastAbstractTask::click_confirm_button() { + LogTraceFunction; const auto task_ptr = std::dynamic_pointer_cast( resource.task().task_ptr("InfrastConfirmButton")); ctrler.click(task_ptr->specific_rect); @@ -136,6 +159,7 @@ void asst::InfrastAbstractTask::sync_swipe_of_operlist(bool reverse) void asst::InfrastAbstractTask::swipe_to_the_left_of_operlist() { + LogTraceFunction; static Rect begin_rect = resource.task().task_ptr("InfrastOperListSwipeToTheLeftBegin")->specific_rect; static Rect end_rect = resource.task().task_ptr("InfrastOperListSwipeToTheLeftEnd")->specific_rect; static int duration = resource.task().task_ptr("InfrastOperListSwipeToTheLeftBegin")->pre_delay; @@ -153,6 +177,7 @@ void asst::InfrastAbstractTask::swipe_to_the_left_of_operlist() void asst::InfrastAbstractTask::swipe_to_the_left_of_main_ui() { + LogTraceFunction; static Rect begin_rect = resource.task().task_ptr("InfrastOperListSwipeToTheLeftBegin")->specific_rect; static Rect end_rect = resource.task().task_ptr("InfrastOperListSwipeToTheLeftEnd")->specific_rect; static int duration = resource.task().task_ptr("InfrastOperListSwipeToTheLeftBegin")->pre_delay; @@ -163,6 +188,7 @@ void asst::InfrastAbstractTask::swipe_to_the_left_of_main_ui() void asst::InfrastAbstractTask::swipe_to_the_right_of_main_ui() { + LogTraceFunction; static Rect begin_rect = resource.task().task_ptr("InfrastOperListSwipeToTheLeftBegin")->specific_rect; static Rect end_rect = resource.task().task_ptr("InfrastOperListSwipeToTheLeftEnd")->specific_rect; static int duration = resource.task().task_ptr("InfrastOperListSwipeToTheLeftBegin")->pre_delay; diff --git a/src/MeoAssistance/InfrastClueVacancyImageAnalyzer.cpp b/src/MeoAssistance/InfrastClueVacancyImageAnalyzer.cpp index b16331d9e8..9d4eb2cace 100644 --- a/src/MeoAssistance/InfrastClueVacancyImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastClueVacancyImageAnalyzer.cpp @@ -3,6 +3,7 @@ #include "MatchImageAnalyzer.h" #include "Resource.h" #include "AsstUtils.hpp" +#include "Logger.hpp" bool asst::InfrastClueVacancyImageAnalyzer::analyze() { @@ -14,9 +15,11 @@ bool asst::InfrastClueVacancyImageAnalyzer::analyze() resource.task().task_ptr(clue_vacancy + suffix)); analyzer.set_task_info(*task_ptr); if (!analyzer.analyze()) { + log.trace("no", clue_vacancy, suffix); continue; } Rect rect = analyzer.get_result().rect; + log.trace("has", clue_vacancy, suffix); #ifdef LOG_TRACE cv::rectangle(m_image_draw, utils::make_rect(rect), cv::Scalar(0, 0, 255), 2); cv::putText(m_image_draw, suffix, cv::Point(rect.x, rect.y + 1), 0, 1, cv::Scalar(0, 0, 255), 2); diff --git a/src/MeoAssistance/InfrastDormTask.cpp b/src/MeoAssistance/InfrastDormTask.cpp index b78ba23523..219eb69f7b 100644 --- a/src/MeoAssistance/InfrastDormTask.cpp +++ b/src/MeoAssistance/InfrastDormTask.cpp @@ -5,6 +5,7 @@ #include "InfrastMoodImageAnalyzer.h" #include "Resource.h" #include "Controller.h" +#include "Logger.hpp" const std::string asst::InfrastDormTask::FacilityName = "Dorm"; @@ -35,6 +36,7 @@ bool asst::InfrastDormTask::run() const auto& image = ctrler.get_image(); InfrastMoodImageAnalyzer mood_analyzer(image); if (!mood_analyzer.analyze()) { + log.error("mood analyze faild!"); return false; } mood_analyzer.sort_result(); @@ -46,6 +48,7 @@ bool asst::InfrastDormTask::run() return false; } if (quantity_selected >= MaxNumOfOpers) { + log.trace("quantity_selected:", quantity_selected, ", just break"); break; } switch (mood_info.smiley.type) @@ -53,6 +56,7 @@ bool asst::InfrastDormTask::run() case InfrastSmileyType::Rest: // 如果当前页面休息完成的人数超过5个,说明已经已经把所有心情不满的滑过一遍、没有更多的了,直接退出即可 if (++quantity_resting > MaxNumOfOpers) { + log.trace("quantity_resting:", quantity_resting, ", confirm"); click_confirm_button(); return true; } @@ -66,6 +70,7 @@ bool asst::InfrastDormTask::run() { ctrler.click(mood_info.rect); if (++quantity_selected >= MaxNumOfOpers) { + log.trace("quantity_selected:", quantity_selected, ", just break"); break; } } @@ -75,6 +80,7 @@ bool asst::InfrastDormTask::run() } } if (quantity_selected >= MaxNumOfOpers) { + log.trace("quantity_selected:", quantity_selected, ", just break"); break; } sync_swipe_of_operlist(); @@ -87,6 +93,8 @@ bool asst::InfrastDormTask::run() bool asst::InfrastDormTask::click_confirm_button() { + LogTraceFunction; + const auto task_ptr = std::dynamic_pointer_cast( resource.task().task_ptr("InfrastConfirmButton")); ctrler.click(task_ptr->specific_rect); diff --git a/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp b/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp index 9b39812793..a16e6d4a22 100644 --- a/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp @@ -3,6 +3,7 @@ #include "Resource.h" #include "MultiMatchImageAnalyzer.h" #include "AsstUtils.hpp" +#include "Logger.hpp" bool asst::InfrastFacilityImageAnalyzer::analyze() { @@ -32,13 +33,13 @@ bool asst::InfrastFacilityImageAnalyzer::analyze() int cor_suffix_index = -1; - for (const auto& [key, task_name] : facility_task_name) { - if (!m_to_be_analyzed.empty()) { // 若为空,则分析所有设施 - if (std::find(m_to_be_analyzed.cbegin(), m_to_be_analyzed.cend(), key) - == m_to_be_analyzed.cend()) { - continue; - } + for (const auto& key : m_to_be_analyzed) { + auto find_iter = facility_task_name.find(key); + if (find_iter == facility_task_name.cend()) { + log.error("facility name error", key); + continue; } + std::string task_name = find_iter->second; std::vector cur_facility_result; // 已知基建缩放状态的时候,只识别这个缩放状态下的就行了 // 否则识别所有状态,直到找出正确的当前缩放状态 diff --git a/src/MeoAssistance/InfrastFacilityImageAnalyzer.h b/src/MeoAssistance/InfrastFacilityImageAnalyzer.h index 7e14d4efc1..5c90a86c2e 100644 --- a/src/MeoAssistance/InfrastFacilityImageAnalyzer.h +++ b/src/MeoAssistance/InfrastFacilityImageAnalyzer.h @@ -11,7 +11,6 @@ namespace asst { virtual bool analyze() override; - // 若为空,则分析所有设施 void set_to_be_analyzed(std::vector facilities) noexcept { m_to_be_analyzed = std::move(facilities); } @@ -53,7 +52,7 @@ namespace asst { // key:设施名,value:所有这种设施的当前Rect(例如所有制造站的位置) std::unordered_map> m_result; - // 需要识别的设施名,若为空,则分析所有设施 + // 需要识别的设施名 std::vector m_to_be_analyzed; }; } diff --git a/src/MeoAssistance/InfrastInfoTask.cpp b/src/MeoAssistance/InfrastInfoTask.cpp index f886eb6c8d..781089288d 100644 --- a/src/MeoAssistance/InfrastInfoTask.cpp +++ b/src/MeoAssistance/InfrastInfoTask.cpp @@ -17,10 +17,7 @@ bool asst::InfrastInfoTask::run() const auto& image = ctrler.get_image(); InfrastFacilityImageAnalyzer analyzer(image); - std::vector all_facilities; - for (auto&& [key, _value] : resource.infrast().get_facility_info()) { - all_facilities.emplace_back(key); - } + analyzer.set_to_be_analyzed({ "Mfg", "Trade", "Power" }); if (!analyzer.analyze()) { return false; } diff --git a/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp b/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp index a95fb0e05d..739773f517 100644 --- a/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp @@ -8,12 +8,20 @@ bool asst::InfrastMoodImageAnalyzer::analyze() { + LogTraceFunction; + mood_detect(); mood_analyze(); hash_calc(); selected_analyze(); working_analyze(); + for (auto&& info : m_result) { + log.trace(info.hash, info.rect.to_string(), + "smiley:", (int)info.smiley.type, "mood:", info.percentage, + "selected:", info.selected, "working:", info.working); + } + return true; } diff --git a/src/MeoAssistance/InfrastProductionTask.cpp b/src/MeoAssistance/InfrastProductionTask.cpp index f367fe50f9..76cf038eb1 100644 --- a/src/MeoAssistance/InfrastProductionTask.cpp +++ b/src/MeoAssistance/InfrastProductionTask.cpp @@ -35,6 +35,7 @@ bool asst::InfrastProductionTask::shift_facility_list() { + LogTraceFunction; facility_list_detect(); if (need_exit()) { return false; @@ -57,6 +58,7 @@ bool asst::InfrastProductionTask::shift_facility_list() const auto& image = ctrler.get_image(); add_analyzer.set_image(image); if (!add_analyzer.analyze()) { + log.info("no add button, just continue"); continue; } Rect add_button = add_analyzer.get_result().rect; @@ -76,6 +78,7 @@ bool asst::InfrastProductionTask::shift_facility_list() } } set_product(cur_product); + log.info("cur product", cur_product); /* 进入干员选择页面 */ ctrler.click(add_button); sleep(add_task_ptr->rear_delay); @@ -110,6 +113,7 @@ bool asst::InfrastProductionTask::shift_facility_list() bool asst::InfrastProductionTask::opers_detect_with_swipe() { + LogTraceFunction; m_all_available_opers.clear(); int first_number = 0; @@ -118,6 +122,7 @@ bool asst::InfrastProductionTask::opers_detect_with_swipe() return false; } size_t num = opers_detect(); + log.trace("opers_detect return", num); // 这里本来是判断不相等就可以退出循环。 // 但是有时候滑动会把一个干员挡住一半,一个页面完整的干员真的只有10个,所以加个2的差值 @@ -137,6 +142,7 @@ bool asst::InfrastProductionTask::opers_detect_with_swipe() size_t asst::InfrastProductionTask::opers_detect() { + LogTraceFunction; const auto& image = ctrler.get_image(); InfrastSkillsImageAnalyzer skills_analyzer(image); @@ -187,6 +193,7 @@ size_t asst::InfrastProductionTask::opers_detect() bool asst::InfrastProductionTask::optimal_calc() { + LogTraceFunction; auto& facility_info = resource.infrast().get_facility_info(m_facility); int max_num_of_opers = facility_info.max_num_of_opers; @@ -333,6 +340,7 @@ bool asst::InfrastProductionTask::optimal_calc() bool asst::InfrastProductionTask::opers_choose() { + LogTraceFunction; bool has_error = false; while (true) { if (need_exit()) { @@ -403,6 +411,7 @@ bool asst::InfrastProductionTask::opers_choose() bool asst::InfrastProductionTask::facility_list_detect() { + LogTraceFunction; m_facility_list_tabs.clear(); const auto& image = ctrler.get_image(); diff --git a/src/MeoAssistance/InfrastReceptionTask.cpp b/src/MeoAssistance/InfrastReceptionTask.cpp index 30978a150e..33d596e1e6 100644 --- a/src/MeoAssistance/InfrastReceptionTask.cpp +++ b/src/MeoAssistance/InfrastReceptionTask.cpp @@ -38,6 +38,7 @@ bool asst::InfrastReceptionTask::run() bool asst::InfrastReceptionTask::harvest_clue() { + LogTraceFunction; std::vector tasks_vec = { "InfrastClueNew" }; while (!tasks_vec.empty()) { if (need_exit()) { @@ -74,6 +75,7 @@ bool asst::InfrastReceptionTask::harvest_clue() bool asst::InfrastReceptionTask::proc_clue() { + LogTraceFunction; const static std::string clue_vacancy = "InfrastClueVacancy"; const static std::vector clue_suffix = { "No1", "No2", "No3", "No4", "No5", "No6", "No7" }; @@ -119,6 +121,7 @@ bool asst::InfrastReceptionTask::proc_clue() bool asst::InfrastReceptionTask::proc_vacancy() { + LogTraceFunction; const static std::string clue_vacancy = "InfrastClueVacancy"; const static std::vector clue_suffix = { "No1", "No2", "No3", "No4", "No5", "No6", "No7" }; @@ -155,6 +158,7 @@ bool asst::InfrastReceptionTask::proc_vacancy() bool asst::InfrastReceptionTask::shift() { + LogTraceFunction; const auto& image = ctrler.get_image(); MatchImageAnalyzer add_analyzer(image); @@ -193,6 +197,7 @@ bool asst::InfrastReceptionTask::shift() bool asst::InfrastReceptionTask::swipe_to_the_bottom_of_clue_list_on_the_right() { + LogTraceFunction; static Rect begin_rect = resource.task().task_ptr("InfrastClueOnTheRightSwipeBegin")->specific_rect; static Rect end_rect = resource.task().task_ptr("InfrastClueOnTheRightSwipeEnd")->specific_rect; static int duration = resource.task().task_ptr("InfrastClueOnTheRightSwipeBegin")->pre_delay; diff --git a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp index 989f962bd8..4d07867f7b 100644 --- a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp @@ -8,6 +8,8 @@ bool asst::InfrastSkillsImageAnalyzer::analyze() { + LogTraceFunction; + m_skills_detected.clear(); m_skills_splited.clear(); m_result.clear(); @@ -18,11 +20,20 @@ bool asst::InfrastSkillsImageAnalyzer::analyze() skill_analyze(); + for (auto&& info : m_result) { + std::string skill_str; + for (auto&& skill : info.skills_comb.skills) { + skill_str += skill.names.front() + " "; + } + log.trace(info.hash, info.rect.to_string(), skill_str); + } + return true; } void asst::InfrastSkillsImageAnalyzer::sort_result() { + LogTraceFunction; // 按位置排个序 std::sort(m_result.begin(), m_result.end(), [](const auto& lhs, const auto& rhs) -> bool { @@ -38,6 +49,7 @@ void asst::InfrastSkillsImageAnalyzer::sort_result() bool asst::InfrastSkillsImageAnalyzer::skills_detect() { + LogTraceFunction; const auto upper_task_ptr = resource.task().task_ptr("InfrastSkillsUpper"); const auto lower_task_ptr = resource.task().task_ptr("InfrastSkillsLower"); const auto hash_task_ptr = resource.task().task_ptr("InfrastSkillsHash"); @@ -98,6 +110,7 @@ bool asst::InfrastSkillsImageAnalyzer::skills_detect() bool asst::InfrastSkillsImageAnalyzer::skills_split() { + LogTraceFunction; const auto task_ptr = std::dynamic_pointer_cast( resource.task().task_ptr("InfrastSkills")); const auto thres = task_ptr->hist_threshold; @@ -144,6 +157,7 @@ bool asst::InfrastSkillsImageAnalyzer::skills_split() bool asst::InfrastSkillsImageAnalyzer::skill_analyze() { + LogTraceFunction; const auto task_ptr = std::dynamic_pointer_cast( resource.task().task_ptr("InfrastSkills")); @@ -240,6 +254,7 @@ bool asst::InfrastSkillsImageAnalyzer::skill_analyze() bool asst::InfrastSkillsImageAnalyzer::selected_analyze(int smiley_x, int smiley_y) { + LogTraceFunction; const auto selected_task_ptr = std::dynamic_pointer_cast( resource.task().task_ptr("InfrastOperSelected")); cv::Rect selected_rect = utils::make_rect(selected_task_ptr->rect_move);