From 18a044f584636d6f449d932829d0bbe2779cfdb6 Mon Sep 17 00:00:00 2001 From: MistEO Date: Mon, 17 Jan 2022 15:48:00 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E6=96=B0=E5=A2=9E=E4=BA=86=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E5=92=8C=E7=82=B9=E5=87=BB=E7=9A=84=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=88C=E5=B1=82=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/AsstCaller.h | 5 +++++ src/MeoAssistant/Assistant.cpp | 11 +++++++++++ src/MeoAssistant/Assistant.h | 5 +++++ src/MeoAssistant/AsstCaller.cpp | 22 ++++++++++++++++++++++ src/MeoAssistant/Controller.cpp | 33 +++++++++++++++++++++++++++------ src/MeoAssistant/Controller.h | 3 ++- 6 files changed, 72 insertions(+), 7 deletions(-) diff --git a/include/AsstCaller.h b/include/AsstCaller.h index f644354d57..215eb1d313 100644 --- a/include/AsstCaller.h +++ b/include/AsstCaller.h @@ -2,6 +2,8 @@ #include "AsstPort.h" +typedef unsigned long long size_t; + namespace asst { class Assistant; @@ -38,6 +40,9 @@ extern "C" { bool ASSTAPI AsstSetPenguinId(asst::Assistant* p_asst, const char* id); // bool ASSTAPI AsstSetParam(asst::Assistant* p_asst, const char* type, const char* param, const char* value); + size_t ASSTAPI AsstGetImage(asst::Assistant* p_asst, void* buff, size_t buff_size); + bool ASSTAPI AsstCtrlerClick(asst::Assistant* p_asst, int x, int y, bool block); + ASSTAPI_PORT const char* ASST_CALL AsstGetVersion(); #ifdef __cplusplus } diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 4aad89e244..209be07dec 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -463,6 +463,17 @@ void asst::Assistant::set_penguin_id(const std::string& id) else { opt.penguin_report.extra_param = "-H \"authorization: PenguinID " + id + "\""; } +} + +std::vector asst::Assistant::get_image() const +{ + return Ctrler.get_image_encode(); +} + +bool asst::Assistant::ctrler_click(int x, int y, bool block) +{ + Ctrler.click_without_scale(Point(x, y), block); + return true; } bool asst::Assistant::start(bool block) diff --git a/src/MeoAssistant/Assistant.h b/src/MeoAssistant/Assistant.h index c4f659287e..4168c9bb06 100644 --- a/src/MeoAssistant/Assistant.h +++ b/src/MeoAssistant/Assistant.h @@ -13,6 +13,8 @@ #include "AsstMsg.h" #include "AsstInfrastDef.h" +typedef unsigned char uchar; + namespace cv { class Mat; @@ -76,6 +78,9 @@ namespace asst // 设置企鹅数据汇报个人ID void set_penguin_id(const std::string& id); + std::vector get_image() const; + bool ctrler_click(int x, int y, bool block = true); + [[deprecated]] bool set_param(const std::string& type, const std::string& param, const std::string& value); static constexpr int ProcessTaskRetryTimesDefault = AbstractTask::RetryTimesDefault; diff --git a/src/MeoAssistant/AsstCaller.cpp b/src/MeoAssistant/AsstCaller.cpp index f79fae97e4..573a006747 100644 --- a/src/MeoAssistant/AsstCaller.cpp +++ b/src/MeoAssistant/AsstCaller.cpp @@ -248,6 +248,28 @@ bool AsstSetPenguinId(asst::Assistant* p_asst, const char* id) p_asst->set_penguin_id(id); return true; +} + +size_t ASSTAPI AsstGetImage(asst::Assistant* p_asst, void* buff, size_t buff_size) +{ + if (p_asst == nullptr || buff == nullptr) { + return 0; + } + auto img_data = p_asst->get_image(); + size_t data_size = img_data.size(); + if (buff_size < data_size) { + return 0; + } + memcpy(buff, img_data.data(), data_size); + return data_size; +} + +bool ASSTAPI AsstCtrlerClick(asst::Assistant* p_asst, int x, int y, bool block) +{ + if (p_asst == nullptr) { + return false; + } + return p_asst->ctrler_click(x, y, block); } //bool AsstSetParam(asst::Assistant* p_asst, const char* type, const char* param, const char* value) diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 2ec1a91f56..08db1351d6 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -601,19 +601,28 @@ bool asst::Controller::screencap() if (is_all_zero) { return false; } - - m_cache_image = cv::Mat( + cv::Mat temp = cv::Mat( adb.display_height, adb.display_width, CV_8UC4, unzip_data.data() + header_size); - cv::cvtColor(m_cache_image, m_cache_image, cv::COLOR_RGB2BGR); - return !m_cache_image.empty(); + if (temp.empty()) { + return false; + } + cv::cvtColor(temp, temp, cv::COLOR_RGB2BGR); + std::unique_lock image_lock(m_image_mutex); + m_cache_image = temp; + return true; }; DecodeFunc decode_encode = [&](const std::vector& data) -> bool { - m_cache_image = cv::imdecode(data, cv::IMREAD_COLOR); - return !m_cache_image.empty(); + cv::Mat temp = cv::imdecode(data, cv::IMREAD_COLOR); + if (temp.empty()) { + return false; + } + std::unique_lock image_lock(m_image_mutex); + m_cache_image = temp; + return true; }; switch (adb.screencap_method) { @@ -818,4 +827,16 @@ cv::Mat asst::Controller::get_image(bool raw) cv::resize(m_cache_image, resized_mat, dsize); return resized_mat; } +} + +std::vector asst::Controller::get_image_encode() +{ + std::shared_lock image_lock(m_image_mutex); + + std::vector buf; + cv::imencode(".png", m_cache_image, buf); + + image_lock.unlock(); + + return buf; } diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index b90ae96429..919a3fb92f 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -38,6 +38,7 @@ namespace asst bool try_capture(const EmulatorInfo& info, bool without_handle = false); cv::Mat get_image(bool raw = false); + std::vector get_image_encode(); // 点击和滑动都是异步执行,返回该任务的id int click(const Point& p, bool block = true); @@ -89,7 +90,7 @@ namespace asst std::atomic m_completed_id = 0; unsigned m_push_id = 0; // push_id的自增总是伴随着queue的push,肯定是要上锁的,所以没必要原子 - //std::shared_mutex m_image_mutex; + std::shared_mutex m_image_mutex; cv::Mat m_cache_image; constexpr static int PipeBuffSize = 4 * 1024 * 1024; // 管道缓冲区大小