diff --git a/3rdPart/include/meojson/json_array.h b/3rdPart/include/meojson/json_array.h index ff9bf022a9..5520e1d448 100644 --- a/3rdPart/include/meojson/json_array.h +++ b/3rdPart/include/meojson/json_array.h @@ -23,6 +23,15 @@ namespace json array(const raw_array &arr); array(raw_array &&arr) noexcept; array(std::initializer_list init_list); + template + array(std::vector vec) { + static_assert( + std::is_constructible::value, + "Parameter can't be used to construct a json::value"); + for (auto&& ele : vec) { + _array_data.emplace_back(std::move(ele)); + } + } ~array() noexcept = default; diff --git a/3rdPart/include/meojson/json_value.h b/3rdPart/include/meojson/json_value.h index 511cca501b..147c86c4f1 100644 --- a/3rdPart/include/meojson/json_value.h +++ b/3rdPart/include/meojson/json_value.h @@ -125,7 +125,18 @@ namespace json value &operator[](size_t pos); value &operator[](const std::string &key); value &operator[](std::string &&key); - explicit operator bool() const noexcept { return valid(); } + //explicit operator bool() const noexcept { return valid(); } + + explicit operator bool() const { return as_boolean(); } + explicit operator int() const { return as_integer(); } + explicit operator long() const { return as_long(); } + explicit operator unsigned long() const { return as_unsigned_long(); } + explicit operator long long() const { return as_long_long(); } + explicit operator unsigned long long() const { return as_unsigned_long_long(); } + explicit operator float() const { return as_float(); } + explicit operator double() const { return as_double(); } + explicit operator long double() const { return as_long_double(); } + explicit operator std::string() const { return as_string(); } private: template diff --git a/MeoAssistance.sln b/MeoAssistance.sln index 46743b4e4e..8de8d0fa24 100644 --- a/MeoAssistance.sln +++ b/MeoAssistance.sln @@ -44,6 +44,7 @@ Global {FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.Release|x64.ActiveCfg = Release|Any CPU {FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.Release|x64.Build.0 = Release|Any CPU {FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|Any CPU + {FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|Any CPU {4AC1CFFF-D7B8-4FDA-BCFD-E4754275979B}.Release|x64.ActiveCfg = Release|x64 {4AC1CFFF-D7B8-4FDA-BCFD-E4754275979B}.Release|x64.Build.0 = Release|x64 {4AC1CFFF-D7B8-4FDA-BCFD-E4754275979B}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 diff --git a/MeoAssistance/MeoAssistance.vcxproj b/MeoAssistance/MeoAssistance.vcxproj index 29c2d71cf2..ee204706a3 100644 --- a/MeoAssistance/MeoAssistance.vcxproj +++ b/MeoAssistance/MeoAssistance.vcxproj @@ -27,7 +27,8 @@ - + + @@ -37,7 +38,8 @@ - + + @@ -112,7 +114,7 @@ true - $(ProjectDir)include;$(SolutionDir)3rdPart\include;$(SolutionDir)3rdPart\include\meojson;$(SolutionDir)\3rdPart\include\opencv;$(SolutionDir)\3rdPart\include\opencv2;$(SolutionDir)3drPart\include\OcrLiteNcnn;;$(IncludePath) + $(ProjectDir)include;$(SolutionDir)3rdPart\include;$(SolutionDir)3rdPart\include\meojson;$(SolutionDir)3rdPart\include\opencv;$(SolutionDir)3rdPart\include\opencv2;$(SolutionDir)3drPart\include\OcrLiteNcnn;$(IncludePath) $(TargetDir);$(Solution)\3rdPart\lib;$(LibraryPath) @@ -153,12 +155,12 @@ true true true - NDEBUG;_CONSOLE;MEO_DLL_EXPORTS;%(PreprocessorDefinitions) + NDEBUG;_CONSOLE;CSHARP_API;MEO_DLL_EXPORTS;%(PreprocessorDefinitions) true stdcpp17 stdc11 MultiThreaded - Disabled + MaxSpeed Console @@ -190,15 +192,18 @@ xcopy /e /y /i $(SolutionDir)3rdPart\resource $(TargetDir)resource Level3 - true + + false true - NDEBUG;_CONSOLE;MEO_DLL_EXPORTS;LOG_TRACE;%(PreprocessorDefinitions) + NDEBUG;_CONSOLE;CSHARP_API;MEO_DLL_EXPORTS;LOG_TRACE;%(PreprocessorDefinitions) true stdcpp17 stdc11 MultiThreaded Disabled + false + EnableFastChecks Console diff --git a/MeoAssistance/MeoAssistance.vcxproj.filters b/MeoAssistance/MeoAssistance.vcxproj.filters index 904727b4d8..8c07d230c9 100644 --- a/MeoAssistance/MeoAssistance.vcxproj.filters +++ b/MeoAssistance/MeoAssistance.vcxproj.filters @@ -45,12 +45,15 @@ 头文件 - + 头文件 头文件 + + 头文件 + @@ -71,7 +74,10 @@ 源文件 - + + 源文件 + + 源文件 diff --git a/MeoAssistance/README.md b/MeoAssistance/README.md new file mode 100644 index 0000000000..5fccb04d51 --- /dev/null +++ b/MeoAssistance/README.md @@ -0,0 +1,19 @@ +# MeoAssistance + +辅助的底层C++模块 + +## 控制 + +- 窗口控制、点击、截图,使用Win32 Api +- 部分不响应句柄消息的模拟器,使用Adb控制 + +## 识别 + +- 图像识别:[opencv](https://github.com/opencv/opencv.git) +- 文字识别:[chineseocr_lite](https://github.com/DayBreak-u/chineseocr_lite.git),进行了封装和魔改的版本[MistEO/chineseocr_lite](https://github.com/MistEO/chineseocr_lite) + +## 解析 + +- Json解析:[meojson](https://github.com/MistEO/meojson.git) (我感谢我自己!) +- 公招干员信息:[明日方舟工具箱](https://www.bigfun.cn/tools/aktools/hr) +- 公招新增干员信息:[PRTS.wiki](http://prts.wiki/w/%E9%A6%96%E9%A1%B5) diff --git a/MeoAssistance/include/Assistance.h b/MeoAssistance/include/Assistance.h index b194ffd2a5..d990586a21 100644 --- a/MeoAssistance/include/Assistance.h +++ b/MeoAssistance/include/Assistance.h @@ -6,11 +6,10 @@ #include #include #include +#include -#include "AsstPort.h" #include "AsstDef.h" -#include "Configer.h" -#include "RecruitConfiger.h" +#include "Task.h" namespace cv { class Mat; @@ -20,54 +19,58 @@ namespace asst { class WinMacro; class Identify; - class MEOAPI_PORT Assistance + class Assistance { public: - Assistance(); + Assistance(TaskCallback callback = nullptr, void * callback_arg = nullptr); ~Assistance(); std::optional catch_emulator(const std::string& emulator_name = std::string()); - void start(const std::string& task); + // ʼˢ + void start_sanity(); + // ʼʻ + void start_visit(); + // ʼļ + void start_open_recruit(const std::vector& required_level, bool set_time = true); + // ʼƥ񣬵 + void start_match_task(const std::string& task, bool block = true); + void stop(bool block = true); bool set_param(const std::string& type, const std::string& param, const std::string& value); - std::optional get_param(const std::string& type, const std::string& param); - bool print_window(const std::string& filename, bool block = true); - - // 㹫ļҪǰѡTagҳ - // - // required_levelҪĵȼϵ͵ȼrequired_levelУŻе - // set_timeǷԶʱ䣨9Сʱ - // ֵ - // std::vector< std::pair < TagsvectorTagsϿܳĸԱ > > - std::optional, OperCombs>>> - open_recruit(const std::vector& required_level, bool set_time = true); private: - static void working_proc(Assistance* pThis); + static void working_proc(Assistance* p_this); + static void msg_proc(Assistance* p_this); + static void task_callback(TaskMsg msg, const json::value& detail, void* custom_arg); - cv::Mat get_format_image(); - void set_control_scale(int cur_width, int cur_height); + void append_match_task(const std::vector& tasks); + void append_task(const json::value& detail); + void clear_exec_times(); - // for debug - bool find_text_and_click(const std::string& text, bool block = true); - - std::shared_ptr m_pWindow = nullptr; - std::shared_ptr m_pView = nullptr; - std::shared_ptr m_pCtrl = nullptr; - std::shared_ptr m_pIder = nullptr; + std::shared_ptr m_window_ptr = nullptr; + std::shared_ptr m_view_ptr = nullptr; + std::shared_ptr m_control_ptr = nullptr; + std::shared_ptr m_identify_ptr = nullptr; bool m_inited = false; + bool m_thread_exit = false; + std::queue> m_tasks_queue; + TaskCallback m_callback = nullptr; + void* m_callback_arg = nullptr; + + bool m_thread_idle = true; std::thread m_working_thread; std::mutex m_mutex; std::condition_variable m_condvar; - bool m_thread_exit = false; - bool m_thread_running = false; - std::vector m_next_tasks; - Configer m_configer; - RecruitConfiger m_recruit_configer; + std::thread m_msg_thread; + std::queue> m_msg_queue; + std::mutex m_msg_mutex; + std::condition_variable m_msg_condvar; + + }; } \ No newline at end of file diff --git a/MeoAssistance/include/AsstCaller.h b/MeoAssistance/include/AsstCaller.h index 7c435febd1..b9dcd5be6c 100644 --- a/MeoAssistance/include/AsstCaller.h +++ b/MeoAssistance/include/AsstCaller.h @@ -1,19 +1,23 @@ #pragma once -#include "Assistance.h" +#include "AsstPort.h" #ifdef __cplusplus extern "C" { #endif +namespace asst { + class Assistance; +} +typedef void (MEO_CALL *AsstCallback)(int msg, const char* detail_json, void* custom_arg); -MEOAPI_PORT asst::Assistance* CreateAsst(); -MEOAPI_PORT void DestoryAsst(asst::Assistance* p_asst); +MEOAPI_PORT asst::Assistance* AsstCreate(); +MEOAPI_PORT asst::Assistance* AsstCreateEx(AsstCallback callback, void* custom_arg); +MEOAPI_PORT void AsstDestory(asst::Assistance* p_asst); MEOAPI_PORT bool AsstCatchEmulator(asst::Assistance* p_asst); MEOAPI_PORT void AsstStart(asst::Assistance* p_asst, const char* task); MEOAPI_PORT void AsstStop(asst::Assistance* p_asst); MEOAPI_PORT bool AsstSetParam(asst::Assistance* p_asst, const char* type, const char* param, const char* value); -MEOAPI_PORT bool AsstGetParam(asst::Assistance* p_asst, const char* type, const char* param, char * buffer, int buffer_size); -MEOAPI_PORT bool AsstRunOpenRecruit(asst::Assistance* p_asst, const int required_level[], bool set_time, char * result_buffer, int bufsize, int& maybe_level); +MEOAPI_PORT bool AsstRunOpenRecruit(asst::Assistance* p_asst, const int required_level[], bool set_time); MEOAPI_PORT bool CheckVersionUpdate(char* tag_buffer, int tag_bufsize, char* html_url_buffer, int html_bufsize, char* body_buffer, int body_bufsize); diff --git a/MeoAssistance/include/AsstDef.h b/MeoAssistance/include/AsstDef.h index 15570ba8ad..16477dc4bc 100644 --- a/MeoAssistance/include/AsstDef.h +++ b/MeoAssistance/include/AsstDef.h @@ -25,51 +25,24 @@ namespace asst { return os << _type_name.at(type); } - enum class TaskType { + enum class MatchTaskType { Invalid = 0, - BasicClick = 1, - DoNothing = 2, - Stop = 4, - PrintWindow, - ClickSelf = 8 | BasicClick, - ClickRect = 16 | BasicClick, - ClickRand = 32 | BasicClick, - Ocr = 64, - OcrAndClick = Ocr | BasicClick + BasicClick = 0x100, + ClickSelf = BasicClick | 1, // ģλ + ClickRect = BasicClick | 2, // ָ + ClickRand = BasicClick | 4, // + DoNothing = 0x200, // ʲô + Stop = 0x400, // ֹͣ߳ + PrintWindow = 0x800, // ͼ + OpenRecruit = 0x1000 // ļ }; - static bool operator&(const TaskType& lhs, const TaskType& rhs) - { - return static_cast::type>(lhs) & static_cast::type>(rhs); - } - static std::ostream& operator<<(std::ostream& os, const TaskType& task) - { - static std::unordered_map _type_name = { - {TaskType::Invalid, "Invalid"}, - {TaskType::BasicClick, "BasicClick"}, - {TaskType::ClickSelf, "ClickSelf"}, - {TaskType::ClickRect, "ClickRect"}, - {TaskType::ClickRand, "ClickRand"}, - {TaskType::DoNothing, "DoNothing"}, - {TaskType::Stop, "Stop"}, - {TaskType::PrintWindow, "PrintWindow"} - }; - return os << _type_name.at(task); - } enum class AlgorithmType { JustReturn, MatchTemplate, - CompareHist + CompareHist, + OcrDetect }; - static std::ostream& operator<<(std::ostream& os, const AlgorithmType& type) - { - static std::unordered_map _type_name = { - {AlgorithmType::JustReturn, "JustReturn"}, - {AlgorithmType::MatchTemplate, "MatchTemplate"}, - {AlgorithmType::CompareHist, "CompareHist"} - }; - return os << _type_name.at(type); - } struct Point { @@ -147,10 +120,11 @@ namespace asst { }; struct TaskInfo { + std::string name; // std::string template_filename; // ƥģͼƬļ - double threshold = 0; // ģƥֵ - double cache_threshold = 0; // ֱͼȽֵ - TaskType type = TaskType::Invalid; // + double templ_threshold = 0; // ģƥֵ + double hist_threshold = 0; // ֱͼȽֵ + MatchTaskType type = MatchTaskType::Invalid; // std::vector next; // һܵб int exec_times = 0; // ִ˶ٴ int max_times = INT_MAX; // ִжٴ @@ -164,7 +138,8 @@ namespace asst { struct Options { bool identify_cache = false; // ͼʶ𻺴湦ܣԴCPUģҪ֤Ҫʶİťÿελòı - int identify_delay = 0; // ͼʶʱԽԽ죬CPU + int task_identify_delay = 0; // ʶʱԽԽ죬CPU + int task_control_delay = 0; // ӳ٣ԽԽ죬̫˾ܲӦ int control_delay_lower = 0; // ʱޣÿεʱ int control_delay_upper = 0; // ʱޣÿεʱ bool print_window = false; // ͼܣÿνͼscreenshotĿ¼ diff --git a/MeoAssistance/include/AsstPort.h b/MeoAssistance/include/AsstPort.h index 9331a8d654..516f6743f5 100644 --- a/MeoAssistance/include/AsstPort.h +++ b/MeoAssistance/include/AsstPort.h @@ -1,5 +1,14 @@ #pragma once +// The way how the function is called +#if !defined(MEO_CALL) +#if defined(_WIN32) +#define MEO_CALL __stdcall +#else +#define ISSCALL +#endif /* _WIN32 */ +#endif /* ISSCALL */ + // The function exported symbols #if defined _WIN32 || defined __CYGWIN__ #define MEO_DLL_IMPORT __declspec(dllimport) @@ -22,3 +31,7 @@ #else #define MEOAPI_PORT MEO_DLL_IMPORT #endif // MEO_DLL_EXPORTS + +#define MEOAPI MEOAPI_PORT MEO_CALL + +#define MEOLOCAL MEO_DLL_LOCAL MEO_CALL \ No newline at end of file diff --git a/MeoAssistance/include/Configer.h b/MeoAssistance/include/Configer.h index 73dc391b91..cf293cd9cc 100644 --- a/MeoAssistance/include/Configer.h +++ b/MeoAssistance/include/Configer.h @@ -11,34 +11,36 @@ namespace asst { class Configer { public: - Configer() = default; ~Configer() = default; - Configer(const Configer& rhs) = default; - Configer(Configer&& rhs) noexcept = default; + static Configer& get_instance() { + static Configer unique_instance; + return unique_instance; + } bool load(const std::string& filename); bool set_param(const std::string& type, const std::string& param, const std::string& value); - std::optional get_param(const std::string& type, const std::string& param); - - void clear_exec_times(); Configer& operator=(const Configer& rhs) = default; Configer& operator=(Configer&& rhs) noexcept = default; constexpr static int DefaultWindowWidth = 1280; constexpr static int DefaultWindowHeight = 720; - constexpr static double DefaultThreshold = 0.9; - constexpr static double DefaultCacheThreshold = 0.9; + constexpr static double Defaulttempl_threshold = 0.9; + constexpr static double DefaultCachetempl_threshold = 0.9; std::string m_version; Options m_options; - std::unordered_map m_tasks; + std::unordered_map m_all_tasks_info; std::unordered_map m_handles; std::unordered_map m_ocr_replace; private: + Configer() = default; + Configer(const Configer & rhs) = default; + Configer(Configer && rhs) noexcept = default; + bool _load(const std::string& filename); }; } diff --git a/MeoAssistance/include/Identify.h b/MeoAssistance/include/Identify.h index 9ee22aae83..353f982b62 100644 --- a/MeoAssistance/include/Identify.h +++ b/MeoAssistance/include/Identify.h @@ -27,7 +27,7 @@ namespace asst { bool add_image(const std::string& name, const std::string& path); // return tuple< algorithmType, suitability, matched asst::rect> - std::tuple find_image(const cv::Mat& image, const std::string& templ, double threshold = 0.99); + std::tuple find_image(const cv::Mat& image, const std::string& templ, double templ_threshold = 0.99); void clear_cache(); diff --git a/MeoAssistance/include/Logger.hpp b/MeoAssistance/include/Logger.hpp index 77626b5bc3..7fa962cf61 100644 --- a/MeoAssistance/include/Logger.hpp +++ b/MeoAssistance/include/Logger.hpp @@ -11,7 +11,7 @@ #include "Version.h" namespace asst { - class MEOAPI_PORT Logger { + class Logger { public: ~Logger() = default; @@ -110,4 +110,5 @@ namespace asst { #define DebugTrace Logger::get_instance().log_trace #define DebugTraceInfo Logger::get_instance().log_info #define DebugTraceError Logger::get_instance().log_error -#define DebugTraceFunction LoggerAux _func_aux(__FUNCTION__) \ No newline at end of file +#define DebugTraceFunction LoggerAux _func_aux(__FUNCTION__) +#define DebugTraceScope LoggerAux _func_aux \ No newline at end of file diff --git a/MeoAssistance/include/OpenRecruitConfiger.h b/MeoAssistance/include/OpenRecruitConfiger.h new file mode 100644 index 0000000000..d0524055f5 --- /dev/null +++ b/MeoAssistance/include/OpenRecruitConfiger.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +#include "AsstDef.h" + +namespace asst { + class OpenRecruitConfiger + { + public: + ~OpenRecruitConfiger() = default; + + static OpenRecruitConfiger& get_instance() { + static OpenRecruitConfiger unique_instance; + return unique_instance; + } + + bool load(const std::string& filename); + + OpenRecruitConfiger& operator=(const OpenRecruitConfiger& rhs) = default; + OpenRecruitConfiger& operator=(OpenRecruitConfiger&& rhs) noexcept = default; + + std::unordered_set m_all_tags; + std::unordered_set m_all_types; + + std::vector m_all_opers; + + constexpr static int CorrectNumberOfTags = 5; + + private: + OpenRecruitConfiger() = default; + OpenRecruitConfiger(const OpenRecruitConfiger & rhs) = default; + OpenRecruitConfiger(OpenRecruitConfiger && rhs) noexcept = default; + + bool _load(const std::string& filename); + }; + +} \ No newline at end of file diff --git a/MeoAssistance/include/RecruitConfiger.h b/MeoAssistance/include/RecruitConfiger.h deleted file mode 100644 index 69dd3b8737..0000000000 --- a/MeoAssistance/include/RecruitConfiger.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "AsstDef.h" - -namespace asst { - class RecruitConfiger - { - public: - - RecruitConfiger() = default; - ~RecruitConfiger() = default; - - RecruitConfiger(const RecruitConfiger& rhs) = default; - RecruitConfiger(RecruitConfiger&& rhs) noexcept = default; - - bool load(const std::string& filename); - - - RecruitConfiger& operator=(const RecruitConfiger& rhs) = default; - RecruitConfiger& operator=(RecruitConfiger&& rhs) noexcept = default; - - std::unordered_set m_all_tags; - std::unordered_set m_all_types; - - std::vector m_opers; - - private: - bool _load(const std::string& filename); - }; - -} \ No newline at end of file diff --git a/MeoAssistance/include/Task.h b/MeoAssistance/include/Task.h new file mode 100644 index 0000000000..08dcced6b9 --- /dev/null +++ b/MeoAssistance/include/Task.h @@ -0,0 +1,205 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "AsstDef.h" +#include "AsstAux.h" + +#include + +namespace cv +{ + class Mat; +} +namespace json +{ + class value; +} + +namespace asst { + + class WinMacro; + class Identify; + class Configer; + class OpenRecruitConfiger; + + enum TaskType { + TaskTypeInvalid = 0, + TaskTypeWindowZoom = 1, + TaskTypeRecognition = 2, + TaskTypeClick = 4 + }; + + enum class TaskMsg { + /* Error Msg */ + PtrIsNull, + ImageIsEmpty, + WindowMinimized, + /* Info Msg */ + TaskStart, + ImageMatched, + TaskMatched, + ReachedLimit, + ReadyToSleep, + EndOfSleep, + AppendMatchTask, + AppendTask, + TaskCompleted, + PrintWindow, + TaskStop, + /* Open Recruit Msg */ + TextDetected, + RecruitTagsDetected, + OcrResultError, + RecruitSpecialTag, + RecruitResult + }; + static std::ostream& operator<<(std::ostream& os, const TaskMsg& type) + { + static const std::unordered_map _type_name = { + {TaskMsg::PtrIsNull, "PtrIsNull"}, + {TaskMsg::ImageIsEmpty, "ImageIsEmpty"}, + {TaskMsg::WindowMinimized, "WindowMinimized"}, + {TaskMsg::TaskStart, "TaskStart"}, + {TaskMsg::ImageMatched, "ImageMatched"}, + {TaskMsg::TaskMatched, "TaskMatched"}, + {TaskMsg::ReachedLimit, "ReachedLimit"}, + {TaskMsg::ReadyToSleep, "ReadyToSleep"}, + {TaskMsg::EndOfSleep, "EndOfSleep"}, + {TaskMsg::AppendMatchTask, "AppendMatchTask"}, + {TaskMsg::TaskCompleted, "TaskCompleted"}, + {TaskMsg::PrintWindow, "PrintWindow"}, + {TaskMsg::TaskStop, "TaskStop"}, + {TaskMsg::TextDetected, "TextDetected"}, + {TaskMsg::RecruitTagsDetected, "RecruitTagsDetected"}, + {TaskMsg::OcrResultError, "OcrResultError"}, + {TaskMsg::RecruitSpecialTag, "RecruitSpecialTag"}, + {TaskMsg::RecruitResult, "RecruitResult"}, + {TaskMsg::AppendTask, "AppendTask"} + }; + return os << _type_name.at(type); + } + + // TaskCallback TaskϢص + // + // TaskMsg Ϣ + // const json::value& ϢjsonÿϢͬTodoҪЭĵɶ + // void* ⲿԶÿλصȥ鴫(void*)thisָ + using TaskCallback = std::function; + + class AbstractTask + { + public: + AbstractTask(TaskCallback callback, void* callback_arg); + ~AbstractTask() = default; + AbstractTask(const AbstractTask&) = default; + AbstractTask(AbstractTask&&) = default; + + virtual void set_ptr( + std::shared_ptr window_ptr, + std::shared_ptr view_ptr, + std::shared_ptr control_ptr, + std::shared_ptr identify_ptr); + virtual bool run() = 0; + + virtual void set_exit_flag(bool* exit_flag); + virtual int get_task_type() { return m_task_type; } + virtual void set_retry_times(int times) { m_retry_times = times; } + virtual int get_retry_times() { return m_retry_times; } + protected: + virtual cv::Mat get_format_image(); + virtual bool set_control_scale(int cur_width, int cur_height); + virtual void sleep(unsigned millisecond); + virtual bool print_window(const std::string& dir); + + std::shared_ptr m_window_ptr = nullptr; + std::shared_ptr m_view_ptr = nullptr; + std::shared_ptr m_control_ptr = nullptr; + std::shared_ptr m_identify_ptr = nullptr; + + TaskCallback m_callback; + void* m_callback_arg = NULL; + bool* m_exit_flag = NULL; + int m_task_type = TaskType::TaskTypeInvalid; + int m_retry_times = INT_MAX; + }; + + class ClickTask : public AbstractTask + { + public: + ClickTask(TaskCallback callback, void* callback_arg) + : AbstractTask(callback, callback_arg) + { + m_task_type = TaskType::TaskTypeClick; + } + virtual bool run() override; + void set_rect(asst::Rect rect) { m_rect = std::move(rect); }; + protected: + asst::Rect m_rect; + }; + + class MatchTask : public AbstractTask + { + public: + MatchTask(TaskCallback callback, void* callback_arg); + + virtual bool run() override; + + virtual void set_tasks(const std::vector& cur_tasks_name) { + m_cur_tasks_name = cur_tasks_name; + } + + protected: + std::optional match_image(asst::Rect* matched_rect = NULL); + void exec_click_task(TaskInfo& task, const asst::Rect& matched_rect); + + std::vector m_cur_tasks_name; + }; + + class OcrAbstractTask : public AbstractTask + { + public: + OcrAbstractTask(TaskCallback callback, void* callback_arg); + virtual bool run() override = 0; + + protected: + std::vector