From d02a40e6dd74dea42d31938d06daeb9574acc9f7 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Tue, 9 Jan 2024 15:32:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=BC=A0=E8=B5=B0=E7=BA=B8?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E9=A1=BB=E7=AD=89=E5=BE=85=E5=8D=87=E9=99=8D?= =?UTF-8?q?=E5=8F=B0=E5=88=B0=E4=BD=8D=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hardware/hardware.cpp | 26 +++++++++++++++++++++----- hardware/hardware.h | 2 ++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/hardware/hardware.cpp b/hardware/hardware.cpp index 4a880cc..71233c6 100644 --- a/hardware/hardware.cpp +++ b/hardware/hardware.cpp @@ -17,9 +17,11 @@ static std::string device_opt_json[] = { ///////////////////////////////////////////////////////////////////////////////////////////////////////// // scanner_hw -scanner_hw::scanner_hw() +scanner_hw::scanner_hw() : mb_events_("motorboard-event") { set_where("hardware"); + mb_events_.enable_wait_log(false); + init(); } scanner_hw::~scanner_hw() @@ -302,6 +304,8 @@ void scanner_hw::thread_image_capture(void) PACKIMAGE img; safe_fifo avail_mem("v4l2-mem"); int used_v4l2_mem = 0, times = 0; + std::pair mbev; + auto put_v4l2_mem = [&](BEFORE_DESTROY_PARAM) -> BEFORE_DESTROY_RET { int ind = (int)(long)param; @@ -314,8 +318,10 @@ void scanner_hw::thread_image_capture(void) memset(&img, 0, sizeof(img)); motor_->clear_error(); camera_->start(); + img_controller_->capture(); motor_->start(); - while(scanning_) // auto scan cycle ... + mb_events_.take(mbev, true); + while(scanning_ && mbev.first == MOTOR_BORD_EVENT_LIFTER_READY) // auto scan cycle ... { motor_->pick_paper(); @@ -324,9 +330,14 @@ void scanner_hw::thread_image_capture(void) { size_t size = 0; int ind = -1; - void* frame = camera_->read_frame(1000, size, ind); - dyn_mem_shared_ptr mem = new dyn_mem_shared(frame, size, put_v4l2_mem, (void*)ind); + void* frame = camera_->read_frame(10 * 1000, size, ind); + dyn_mem_shared_ptr mem = nullptr; + if(!frame) + { + break; + } + mem = new dyn_mem_shared(frame, size, put_v4l2_mem, (void*)ind); used_v4l2_mem++; img.pos.paper_ind++; img.pos.status = IMG_STATUS_OK; @@ -490,7 +501,12 @@ int scanner_hw::open(std::function image_handler) camera_.reset(new GVideoISP1()); camera_->open(cis_length_, 1000); - motor_.reset(new MotorBoard(nullptr)); + auto cb = [this](int ev, unsigned int data) -> void + { + mb_events_.save(std::make_pair(ev, data), true); + }; + mb_events_.clear(); + motor_.reset(new MotorBoard(cb)); motor_->set_double_inpect(double_chk_); motor_->set_staple_inpect(staple_chk_); motor_->set_screw_inpect(screw_chk_); diff --git a/hardware/hardware.h b/hardware/hardware.h index 93b8c47..4c13d19 100644 --- a/hardware/hardware.h +++ b/hardware/hardware.h @@ -10,6 +10,7 @@ #include #include #include +#include // image handler callback proto // @@ -33,6 +34,7 @@ class scanner_hw : public sane_opt_provider std::unique_ptr camera_; std::unique_ptr motor_; std::unique_ptr scan_thread_; + safe_fifo> mb_events_; enum {