From ae44bc73a4adf0ac33f850cf6d43a7ff8d4ebf1e Mon Sep 17 00:00:00 2001 From: MistEO Date: Tue, 21 Sep 2021 22:24:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=BF=9E=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=8A=A0USB?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/AsstCaller.h | 3 ++ resource/config.json | 25 +++++++++++-- src/MeoAssistance/Assistance.cpp | 35 +++++++++++++++++++ src/MeoAssistance/Assistance.h | 4 +++ src/MeoAssistance/AsstCaller.cpp | 30 ++++++++++++++++ src/MeoAssistance/AsstDef.h | 8 +++++ src/MeoAssistance/Configer.cpp | 2 ++ src/MeoAssistance/OpenRecruitTask.cpp | 10 ++++-- src/MeoAssistance/ProcessTask.cpp | 8 ++--- src/MeoAssistance/TaskConfiger.cpp | 1 + src/MeoAssistance/WinMacro.cpp | 20 ++++++++++- src/MeoAssistance/WinMacro.h | 5 ++- src/MeoAsstGui/Helper/AsstProxy.cs | 6 ++-- .../ViewModels/MainFunctionViewModel.cs | 4 +-- 14 files changed, 146 insertions(+), 15 deletions(-) diff --git a/include/AsstCaller.h b/include/AsstCaller.h index 606cf0937c..ee53eade2d 100644 --- a/include/AsstCaller.h +++ b/include/AsstCaller.h @@ -13,7 +13,10 @@ extern "C" { MEOAPI_PORT asst::Assistance* MEO_CALL AsstCreate(); MEOAPI_PORT asst::Assistance* MEO_CALL AsstCreateEx(AsstCallback callback, void* custom_arg); void MEOAPI AsstDestory(asst::Assistance* p_asst); + + bool MEOAPI AsstCatchDefault(asst::Assistance* p_asst); bool MEOAPI AsstCatchEmulator(asst::Assistance* p_asst); + bool MEOAPI AsstCatchUSB(asst::Assistance* p_asst); bool MEOAPI AsstCatchRemote(asst::Assistance* p_asst, const char* address); bool MEOAPI AsstStartSanity(asst::Assistance* p_asst); diff --git a/resource/config.json b/resource/config.json index be439995b0..582c9fe17c 100644 --- a/resource/config.json +++ b/resource/config.json @@ -1,12 +1,16 @@ { - "version": "0.5", + "version": "0.6", "options": { + "connectType" : 0, + "connectType_Doc": "连接类型:0-连接电脑上的模拟器,1-连接USB连接的安卓设备,2-连接局域网中的安卓设备。默认0", + "connectRemoteAddress": "", + "connectRemoteAddress_Doc": "连接局域网中的安卓设备的地址,仅在connectType为2时生效。格式举例:192.168.1.123:5678", "taskDelay": 1000, "taskDelay_Doc": "识别的延迟:越快识别频率越快,但会增加CPU消耗。单位毫秒,默认1000", "printWindow": true, "printWindow_Doc": "截图功能:开启后每次结算界面会截图到screenshot目录下。true-开启,false-关闭,默认true", "printWindowDelay": 3000, - "printWindowDelay_Doc": "截图延时:每次到结算界面,掉落物品不是一次性出来的,有个动画,所以需要等一会再截图。单位毫秒,默认3000", + "printWindowDelay_Doc": "截图延时:每次到结算界面,掉落物品不是一次性出来的,有个动画,所以需要等一会再截图。单位毫秒,默认3000,仅在printWindow为true时生效", "controlDelayRange": [ 0, 0 @@ -66,6 +70,23 @@ "displayRegex": "cur=%dx%d", "screencap": "[Adb] -s [Address] exec-out screencap -p" } + }, + "USB": { + "handle": { + "class": "USB Class", + "window": "USB Window", + "Doc": "这俩不是用来捕获窗口的,是为了兼容现有的捕获模拟器的字段,随手写的,这两个字段实际不会使用到" + }, + "adb": { + "Doc": "USB连接暂时不兼容多设备的情况", + "path": "[ExecDir]platform-tools\\adb.exe", + "connect": "[Adb] devices", + "click": "[Adb] shell input tap [x] [y]", + "swipe": "[Adb] shell input swipe [x1] [y1] [x2] [y2] [duration]", + "display": "[Adb] shell dumpsys window displays | grep init= | awk ' { print $3 } '", + "displayRegex": "cur=%dx%d", + "screencap": "[Adb] exec-out screencap -p" + } } }, "ocrReplace_Doc": "下面为常见的文字识别错误纠正,不需要修改", diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index 674e18d7a0..e5aedbfea9 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -133,6 +133,23 @@ Assistance::~Assistance() } } +bool asst::Assistance::catch_default() +{ + DebugTraceFunction; + + switch (Configer::get_instance().m_options.connect_type) + { + case ConnectType::Emulator: + return catch_emulator(); + case ConnectType::USB: + return catch_usb(); + case ConnectType::Remote: + return catch_remote(Configer::get_instance().m_options.connect_remote_address); + default: + return false; + } +} + bool Assistance::catch_emulator(const std::string& emulator_name) { DebugTraceFunction; @@ -162,6 +179,24 @@ bool Assistance::catch_emulator(const std::string& emulator_name) return ret; } +bool asst::Assistance::catch_usb() +{ + DebugTraceFunction; + + stop(); + + bool ret = false; + + std::unique_lock lock(m_mutex); + + EmulatorInfo remote_info = Configer::get_instance().m_handles["USB"]; + + ret = m_controller_ptr->try_capture(remote_info, true); + + m_inited = ret; + return ret; +} + bool asst::Assistance::catch_remote(const std::string& address) { DebugTraceFunction; diff --git a/src/MeoAssistance/Assistance.h b/src/MeoAssistance/Assistance.h index b92a385735..e3b42599fe 100644 --- a/src/MeoAssistance/Assistance.h +++ b/src/MeoAssistance/Assistance.h @@ -26,8 +26,12 @@ namespace asst { Assistance(AsstCallback callback = nullptr, void* callback_arg = nullptr); ~Assistance(); + // 根据配置文件,决定捕获模拟器、USB 还是远程设备 + bool catch_default(); // 捕获模拟器 bool catch_emulator(const std::string& emulator_name = std::string()); + // 捕获usb设备 + bool catch_usb(); // 捕获远程地址(安卓手机) bool catch_remote(const std::string& address); diff --git a/src/MeoAssistance/AsstCaller.cpp b/src/MeoAssistance/AsstCaller.cpp index 3ea6556638..9202320dce 100644 --- a/src/MeoAssistance/AsstCaller.cpp +++ b/src/MeoAssistance/AsstCaller.cpp @@ -60,6 +60,21 @@ void AsstDestory(asst::Assistance* p_asst) p_asst = NULL; } +bool AsstCatchDefault(asst::Assistance* p_asst) +{ + if (p_asst == NULL) { + return false; + } + + auto&& ret = p_asst->catch_default(); + if (ret) { + return true; + } + else { + return false; + } +} + bool AsstCatchEmulator(asst::Assistance* p_asst) { if (p_asst == NULL) { @@ -75,6 +90,21 @@ bool AsstCatchEmulator(asst::Assistance* p_asst) } } +bool AsstCatchUSB(asst::Assistance* p_asst) +{ + if (p_asst == NULL) { + return false; + } + + auto&& ret = p_asst->catch_usb(); + if (ret) { + return true; + } + else { + return false; + } +} + bool AsstCatchRemote(asst::Assistance* p_asst, const char* address) { if (p_asst == NULL) { diff --git a/src/MeoAssistance/AsstDef.h b/src/MeoAssistance/AsstDef.h index 83eaed781a..0589c09e3a 100644 --- a/src/MeoAssistance/AsstDef.h +++ b/src/MeoAssistance/AsstDef.h @@ -156,7 +156,15 @@ namespace asst { bool cache = false; // 是否使用缓存(直方图),false时就一直用模板匹配。默认为true }; + enum class ConnectType { + Emulator, + USB, + Remote + }; + struct Options { + ConnectType connect_type; // 连接类型 + std::string connect_remote_address; // 连接局域网中的安卓设备的地址,仅在connectType为Remote时生效 int task_delay = 0; // 任务间延时:越快操作越快,但会增加CPU消耗 int control_delay_lower = 0; // 点击随机延时下限:每次点击操作会进行随机延时 int control_delay_upper = 0; // 点击随机延时上限:每次点击操作会进行随机延时 diff --git a/src/MeoAssistance/Configer.cpp b/src/MeoAssistance/Configer.cpp index 7b778bb9a6..73e62c61a0 100644 --- a/src/MeoAssistance/Configer.cpp +++ b/src/MeoAssistance/Configer.cpp @@ -16,6 +16,8 @@ bool asst::Configer::parse(const json::value& json) const json::value& options_json = json.at("options"); { + m_options.connect_type = static_cast(options_json.at("connectType").as_integer()); + m_options.connect_remote_address = options_json.at("connectRemoteAddress").as_string(); m_options.task_delay = options_json.at("taskDelay").as_integer(); //m_options.identify_cache = options_json.at("identifyCache").as_boolean(); m_options.control_delay_lower = options_json.at("controlDelayRange")[0].as_integer(); diff --git a/src/MeoAssistance/OpenRecruitTask.cpp b/src/MeoAssistance/OpenRecruitTask.cpp index b7fd06140d..ba488be0a0 100644 --- a/src/MeoAssistance/OpenRecruitTask.cpp +++ b/src/MeoAssistance/OpenRecruitTask.cpp @@ -30,13 +30,18 @@ bool OpenRecruitTask::run() m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); const cv::Mat& image = m_controller_ptr->get_image(); + if (image.empty()) { + m_callback(AsstMsg::ImageIsEmpty, task_start_json, m_callback_arg); + return false; + } /* 设置招募时间9小时 */ auto set_time_foo = [&](bool flag) -> void { if (!flag) { return; } - const static cv::Rect identify_area(340, 140, 510, 160); + const static cv::Rect identify_area = make_rect( + m_controller_ptr->shaped_correct(Rect(340, 140, 510, 160))); auto&& [algorithm, score, second_confirm_rect] = m_identify_ptr->find_image(image(identify_area), "RecruitTime"); @@ -49,7 +54,8 @@ bool OpenRecruitTask::run() }; std::future set_time_future = std::async(std::launch::async, set_time_foo, m_set_time); - const static cv::Rect identify_area(360, 340, 520, 160); + const static cv::Rect identify_area = make_rect( + m_controller_ptr->shaped_correct(Rect(360, 320, 520, 200))); /* Find all text */ std::vector