From 6d96c88225e06d6c076c664d01553414e3b79e89 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Wed, 21 Feb 2024 10:44:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AE=A1=E9=81=93=E9=80=9A?= =?UTF-8?q?=E4=BF=A1=E7=B2=98=E5=8C=85BUG=EF=BC=9B=E7=94=B5=E6=9C=BA?= =?UTF-8?q?=E6=9D=BF=E4=BA=8B=E4=BB=B6=E7=BB=9F=E4=B8=80=E9=80=9A=E8=BF=87?= =?UTF-8?q?hardware=E5=B1=82=E9=80=9A=E7=9F=A5UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hardware/hardware.cpp | 64 ++++++++++++++++++++++++++++++----- hardware/hardware.h | 2 +- hardware/motor/motorboard.cpp | 12 +++---- sdk/base/ui.cpp | 50 ++++++++++++++------------- sdk/base/ui.h | 8 ++--- ui/dev_menu.cpp | 58 +++++++++++++++++++++++-------- ui/dev_menu.h | 4 +++ xmake.lua | 4 +-- 8 files changed, 143 insertions(+), 59 deletions(-) diff --git a/hardware/hardware.cpp b/hardware/hardware.cpp index ba44d8d..371af34 100644 --- a/hardware/hardware.cpp +++ b/hardware/hardware.cpp @@ -399,26 +399,35 @@ void scanner_hw::thread_image_capture(bool paper_ready) motor_->pick_paper(); // scanning ONE turn ... + int turn_cnt = 0; while(scanning_ && motor_->wait_paper_out(to_paper_out_)) { uint32_t pass = watch.elapse_ms(); - if(mb_events_.take(mbev) && mbev.first == MOTOR_BORD_EVENT_ERROR) + + mbev.first = -1; + mbev.second = 0; + turn_cnt++; + if(mb_events_.take(mbev, true, 10) && mbev.first == MOTOR_BORD_EVENT_ERROR) { - err = trans_motorboard_err_2_hg_error(mbev.second); + printf("%02d: error: 0x%08x\n", turn_cnt, mbev.second); + devui::send_message(devui::UI_STATUS_PAPER_CNT, (uint8_t*)&pass, sizeof(pass)); + err = trans_motorboard_err_2_hg_error(mbev.second, true); if(err != SCANNER_ERR_DEVICE_DOUBLE_FEEDING) break; } else if(mbev.first == MOTOR_BORD_EVENT_SCAN_DONE) { + printf("-->scan done event received from motorboard.\n"); break; } else { + printf("%02d: normal\n", turn_cnt); + devui::send_message(devui::UI_STATUS_PAPER_CNT, (uint8_t*)&pass, sizeof(pass)); err = SCANNER_ERR_OK; } img.pos.paper_ind++; - devui::send_message(devui::UI_STATUS_PAPER_CNT, (uint8_t*)&pass, sizeof(pass)); if(!count_mode_) { @@ -459,6 +468,7 @@ void scanner_hw::thread_image_capture(bool paper_ready) watch.reset(); motor_->pick_paper(); } + printf("Scan turn finished with event(%d - 0x%08x).\n", mbev.first, mbev.second); // retrieve v4l2-mem ... int ind = -1; @@ -488,6 +498,7 @@ void scanner_hw::thread_image_capture(bool paper_ready) if(mbev.first == MOTOR_BORD_EVENT_PAPER_READY) { printf("paper ready: %d-%x\n", mbev.first, mbev.second); + paper_ready = true; motor_->start(); break; } @@ -793,6 +804,7 @@ int scanner_hw::open(std::function image_handler, std::stri auto cb = [this](int ev, unsigned int data) -> void { mb_events_.save(std::make_pair(ev, data), true); + printf("push event(%d - 0x%08x)\n", ev, data); }; mb_events_.clear(); motor_.reset(new MotorBoard(cb)); @@ -914,6 +926,8 @@ int scanner_hw::start_scan(void) } int scanner_hw::stop_scan(void) { + bool working = scanning_; + scanning_ = auto_scan_ = false; mb_events_.trigger(); if(motor_.get()) @@ -926,6 +940,16 @@ int scanner_hw::stop_scan(void) // camera_->stop(); // mb_events_.clear(); + if(!working) + { + devui::SCANSTREAM stream; + stream.err = 0; + stream.mode = devui::SCAN_STOPPED; + stream.speed = 0; + + devui::send_message(devui::UI_STATUS_SCANNING, (uint8_t*)&stream, sizeof(stream)); + } + return 0; } int scanner_hw::close(bool from_worker) @@ -951,21 +975,43 @@ int scanner_hw::close(bool from_worker) return 0; } -int scanner_hw::trans_motorboard_err_2_hg_error(int mberr) +int scanner_hw::trans_motorboard_err_2_hg_error(int mberr, bool to_ui) { unsigned int val = mberr; - SMBSTATUS* s = (SMBSTATUS*)&val; - if(s->open_machine) - mberr = SCANNER_ERR_DEVICE_COVER_OPENNED; - else if(s->pick_failed) - mberr = SCANNER_ERR_DEVICE_FEEDING_PAPER; + SMBSTATUS *s = (SMBSTATUS*)&val; + int msg = 0; + if(s->open_machine) + { + mberr = SCANNER_ERR_DEVICE_COVER_OPENNED; + msg = ID_WORDS_STATUS_COVER_OPEN; + } + else if(s->pick_failed) + { + mberr = SCANNER_ERR_DEVICE_FEEDING_PAPER; + msg = ID_WORDS_STATUS_FEED_ERR; + } else if(s->double_paper) + { mberr = SCANNER_ERR_DEVICE_DOUBLE_FEEDING; + msg = ID_WORDS_STATUS_DOUBLE_FEED; + } else if(s->staple) + { mberr = SCANNER_ERR_DEVICE_STAPLE_ON; + msg = ID_WORDS_STATUS_STAPLE; + } else if(s->papertilted) + { mberr = SCANNER_ERR_DEVICE_PAPER_SKEW; + msg = ID_WORDS_STATUS_ASKEW; + } + + if(to_ui && msg) + { + printf("status message: %s\n", words_from_id(msg)); + devui::send_status_message(msg); + } return mberr; } diff --git a/hardware/hardware.h b/hardware/hardware.h index 0f3878d..816ebaf 100644 --- a/hardware/hardware.h +++ b/hardware/hardware.h @@ -123,7 +123,7 @@ public: int start_scan(void); int stop_scan(void); int close(bool from_worker = false); - int trans_motorboard_err_2_hg_error(int mberr); + int trans_motorboard_err_2_hg_error(int mberr, bool to_ui = false); int hg_err_2_image_status(int hgerr); bool is_scanning(void); }; diff --git a/hardware/motor/motorboard.cpp b/hardware/motor/motorboard.cpp index df75543..31c77b8 100644 --- a/hardware/motor/motorboard.cpp +++ b/hardware/motor/motorboard.cpp @@ -400,7 +400,7 @@ static int countindex =0; void MotorBoard::pin_call(unsigned int pinNum) { static int index = 0; - // int os_m = os_mode(); //安路屏蔽计数 扫描过程中无法操作按键 + // int os_m = os_mode(); //安路屏蔽计数 扫描过程中无法操作按? // if (m_os_mode != os_m) // { // m_os_mode = os_m; @@ -409,7 +409,7 @@ void MotorBoard::pin_call(unsigned int pinNum) // m_glue.m_os_mode_call(m_os_mode); // } - // if (m_os_mode) //安路屏蔽计数返回 以刷新计数状态 + // if (m_os_mode) //安路屏蔽计数返回 以刷新计数状? // { // LOG_TRACE("not scan mode"); // return; @@ -460,13 +460,13 @@ void MotorBoard::pin_call(unsigned int pinNum) else{ // PutMsg(STATUS_WORDS_ID(READY), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID); // m_statecontrol?m_statecontrol->setcoverstate(false):void(); - printf("pin_call(%x)\n", val); + // printf("pin_call(%x)\n", val); } return; } // if(smb_status->double_clean_f) // PutMsg(STATUS_WORDS_ID(READY), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID); - printf("pin_call(%x)\n", val); + // printf("pin_call(%x)\n", val); return; } else @@ -602,7 +602,7 @@ void MotorBoard::start_countmode() void MotorBoard::PutMsg(int words, int align_v, int align_h, int font, int clear_method) { - devui::send_status_message(words, align_h, align_v, font, clear_method); + // devui::send_status_message(words, align_h, align_v, font, clear_method); } void MotorBoard::errormsg(uint value) @@ -760,7 +760,7 @@ void MotorBoard::startcapimage(bool value) bool MotorBoard::set_sensor_pwm_duty(int sensorid,int duty) { - //1:扫描;2:开盖;3:歪斜—1;4:歪斜-2;5:出纸口;6:有无纸 + //1:扫描;2:开盖;3:歪斜??:歪?2?:出纸口?:有无纸 printf("set_sensor_pwm_duty type = %d duty = %d \n",sensorid,duty); unsigned int val; if (!read(MB_PORT_TIME, val)) diff --git a/sdk/base/ui.cpp b/sdk/base/ui.cpp index 6190e3f..292a2c3 100644 --- a/sdk/base/ui.cpp +++ b/sdk/base/ui.cpp @@ -247,29 +247,26 @@ namespace devui this->close(); break; } + else if(r == 0) + { + // peer closed, wait 10ms ... + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + continue; + } + + rcv += std::string(buf, r); if(rcv.length()) - { - rcv += std::string(buf, r); - pack = (LPMSGSTREAM)&rcv[0]; - if(pack->whole_size() <= rcv.length()) - { - cb_(pack); - rcv.erase(0, pack->whole_size()); - } - } - else { int off = 0; - pack = (LPMSGSTREAM)buf; - if(pack->whole_size() <= r) + pack = (LPMSGSTREAM)&rcv[off]; + while(pack->whole_size() <= rcv.length() - off) { cb_(pack); - off = pack->whole_size(); - } - if(off < r) - { - rcv = std::string(buf + off, r - off); + off += pack->whole_size(); + pack = (LPMSGSTREAM)&rcv[off]; } + if(off) + rcv.erase(0, off); } } printf("ui-receiver exited.\n"); @@ -362,16 +359,23 @@ namespace devui std::string stream(""); MSGSTREAM pack; bool ret = false; + size_t fix = sizeof(pack.data); memset(&pack, 0, sizeof(pack)); pack.ver = 1; pack.msg = msgid; - pack.size = size; - if(size) - pack.data[0] = data[0]; - stream = std::string((char*)&pack, sizeof(pack)); - if(size > 1) - stream += std::string((char*)data + 1, size - 1); + pack.size = size; + if(size > fix) + { + memcpy(pack.data, data, fix); + stream = std::string((char*)&pack, sizeof(pack)); + stream += std::string((char*)data + fix, size - fix); + } + else + { + memcpy(pack.data, data, size); + stream = std::string((char*)&pack, sizeof(pack)); + } { SIMPLE_LOCK(msg_lk_); diff --git a/sdk/base/ui.h b/sdk/base/ui.h index 9e084dd..a965a6f 100644 --- a/sdk/base/ui.h +++ b/sdk/base/ui.h @@ -45,14 +45,14 @@ namespace devui typedef struct _msg_stream { uint16_t ver; - uint32_t msg; uint16_t size; // bytes of data - uint8_t data[1]; + uint32_t msg; + uint8_t data[4]; uint32_t whole_size(void) { - if(size) - return sizeof(*this) + size - 1; + if(size > sizeof(data)) + return sizeof(*this) + size - sizeof(data); else return sizeof(*this); } diff --git a/ui/dev_menu.cpp b/ui/dev_menu.cpp index 335b850..8eb4f6b 100644 --- a/ui/dev_menu.cpp +++ b/ui/dev_menu.cpp @@ -468,34 +468,26 @@ ui_mgr::ui_mgr() : disp_data_("lcd-msg") auto statu = [this](devui::LPMSGSTREAM pack) -> void { + utils::log_mem_info("status message", pack, pack->whole_size()); + if(pack->msg == devui::UI_STATUS_SCANNING) { devui::LPSCANSTREAM scan = (devui::LPSCANSTREAM)pack->data; scanning_ = scan->mode != devui::SCAN_STOPPED; - set_ready_status_enabled(!scanning_ && scan->err == 0); + set_ready_status_enabled(!scanning_ && (scan->err == 0 || stopped_by_ui_)); if(scanning_) { paper_cnt_ = 0; - if(pack->data[0] == devui::SCAN_PAUSED) + if(scan->mode == devui::SCAN_PAUSED) { perm_data_->save(); } else { - DISPDATA dd; - + scan_mode_ = scan->mode; + display_scan_title(); perm_data_->set_speed(scan->speed); paper_total_ = 0; - memset(&dd, 0, sizeof(dd)); - dd.cnt = dd.mask = -1; - dd.method = DISP_METHOD_CLEAR; - disp_data_.save(dd, true); - dd.mask = 0; - dd.cnt = custom_font::get_string_font(pack->data[0] == devui::SCAN_NORMAL ? WORDS_STATUS_SCANNING_NORMAL : WORDS_STATUS_SCANNING_COUNT, dd.ptr); - hold_pos_.x = dd.ptr[0][0] * 1; - hold_pos_.y = dd.ptr[0][1]; - dd.method = DISP_METHOD_WHOLE_LINE; - disp_data_.save(dd, true); } } else @@ -505,6 +497,9 @@ ui_mgr::ui_mgr() : disp_data_("lcd-msg") } else if(pack->msg == devui::UI_STATUS_PAPER_CNT) { + if(int_by_status_) + display_scan_title(); + DISPDATA dd; char num[40] = {0}; int cnt = 0; @@ -516,6 +511,7 @@ ui_mgr::ui_mgr() : disp_data_("lcd-msg") dd.x = hold_pos_.x; dd.y = hold_pos_.y; dd.method = DISP_METHOD_PART_LINE; + dd.mask = 0; dd.cnt = custom_font::get_string_font(num, dd.ptr); cnt = disp_data_.save(dd, true); @@ -529,6 +525,7 @@ ui_mgr::ui_mgr() : disp_data_("lcd-msg") } else if(pack->msg == devui::UI_STATUS_MESSAGE) { + int_by_status_ = true; display_status(pack->data); } }; @@ -987,6 +984,21 @@ void ui_mgr::thread_display(void) } } } +void ui_mgr::display_scan_title(void) +{ + DISPDATA dd; + + int_by_status_ = stopped_by_ui_ = false; + memset(&dd, 0, sizeof(dd)); + dd.method = DISP_METHOD_CLEAR; + disp_data_.save(dd, true); + + dd.cnt = custom_font::get_string_font(scan_mode_ == devui::SCAN_NORMAL ? WORDS_STATUS_SCANNING_NORMAL : WORDS_STATUS_SCANNING_COUNT, dd.ptr); + hold_pos_.x = dd.ptr[0][0] * 1; + hold_pos_.y = dd.ptr[0][1]; + dd.method = DISP_METHOD_PART_LINE; + disp_data_.save(dd, true); +} void ui_mgr::display_ready(void) { set_ready_status_enabled(false); @@ -1049,6 +1061,23 @@ void ui_mgr::display_status(void* data) set_ready_status_enabled(false); disp_data_.save(dd, true); + + if(paper_total_) + { + DISPDATA dd; + char num[40] = {0}; + int cnt = 0; + + sprintf(num, "%s%d", WORDS_STATUS_TOTAL, paper_total_); + dd.x = Lcd::LCD_WIDTH; + dd.cnt = custom_font::get_string_font(num, dd.ptr, custom_font::FONT_SIZE_8); + for(int i = 0; i < dd.cnt; ++i) + dd.x -= dd.ptr[i][0] + 1; + dd.y = Lcd::LCD_HEIGHT - dd.ptr[0][1]; + dd.method = DISP_METHOD_PART_LINE; + dd.mask = 0; + cnt = disp_data_.save(dd, true); + } } void ui_mgr::set_ready_status_enabled(bool enable) { @@ -1074,6 +1103,7 @@ void ui_mgr::key_event(int key) { if(key == (int)KeyMonitor::HGKey::Key_Cancle) { + stopped_by_ui_ = true; utils::to_log(LOG_LEVEL_DEBUG, "Do menu command: %s\n", "Stop scanning Immediately"); devui::send_message(devui::UI_CMD_STOP_SCAN); } diff --git a/ui/dev_menu.h b/ui/dev_menu.h index 6e6b9b6..d5dadd3 100644 --- a/ui/dev_menu.h +++ b/ui/dev_menu.h @@ -95,6 +95,9 @@ class ui_mgr : public refer volatile bool run_ = true; volatile bool ready_enable_ = true; bool scanning_ = false; + bool stopped_by_ui_ = false; // enable ready message when error occurs in auto-scan + bool int_by_status_ = false; + int scan_mode_ = 0; int paper_total_ = 0; int paper_cnt_ = 0; SIZE font_size_ = {16, 16}; @@ -305,6 +308,7 @@ class ui_mgr : public refer safe_thread disp_thrd_; void thread_display(void); + void display_scan_title(void); void display_ready(void); void display_status(void* data); void set_ready_status_enabled(bool enable); // disable ready message, the last message will display until keyboard event triggered diff --git a/xmake.lua b/xmake.lua index 005dfbe..b0b2a8d 100644 --- a/xmake.lua +++ b/xmake.lua @@ -60,8 +60,8 @@ add_packagedirs("sdk") add_defines("BUILD_AS_DEVICE") add_defines("VER_MAIN=2") add_defines("VER_FAMILY=200") -add_defines("VER_DATE=20240220") -add_defines("VER_BUILD=17") +add_defines("VER_DATE=20240221") +add_defines("VER_BUILD=4") target("conf") set_kind("phony")