From 34472cf74042e34c3a7db4f49ed7ac5079832afa Mon Sep 17 00:00:00 2001 From: modehua Date: Wed, 13 Sep 2023 19:46:04 -0700 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=9B=BE=E6=B5=81=E7=A8=8B=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CameraParams.h | 7 + CuoZhiMotor.cpp | 6 +- HCamDevice.cpp | 38 +++- HCamDevice.h | 8 +- ICapturer.h | 1 + IScanner.h | 2 + MultiFrameCapture.cpp | 461 +++++++++++++++++------------------------- MultiFrameCapture.h | 13 +- Scanner.cpp | 61 +++--- Scanner.h | 5 + UsbScanner.cpp | 6 +- UsbScanner.h | 4 + ZouZhiMotor.cpp | 12 +- main.cpp | 93 +++++---- 14 files changed, 351 insertions(+), 366 deletions(-) diff --git a/CameraParams.h b/CameraParams.h index 245b400..825a417 100644 --- a/CameraParams.h +++ b/CameraParams.h @@ -15,6 +15,12 @@ union CamZ_Reg_2Short int value; }; +union CamZ_Reg_2char +{ + unsigned char NChar[2]; + int value; +}; + union CamZ_Reg_4 { int value; @@ -55,6 +61,7 @@ union CamZ_Reg_4_New unsigned int clr_exp:1; //曝光清除 低电平 有效 unsigned int soft_rst_n:1; //软复位 unsigned int en_pattern:1; //使能自测试数据 + unsigned int en_line:1; //行计数 }; }; diff --git a/CuoZhiMotor.cpp b/CuoZhiMotor.cpp index bd3c6ee..3a088b9 100644 --- a/CuoZhiMotor.cpp +++ b/CuoZhiMotor.cpp @@ -4,7 +4,7 @@ CuoZhiMotor::CuoZhiMotor() : Motor(motorPorts_Cuozhi) { - auto t_smbtype = smbtype == SMBType::MB_DRV_TMC216 ? MotorConfig::MTBDType::MT_TMC : MotorConfig::MTBDType::MT_DRV; + auto t_smbtype = MotorConfig::MTBDType::MT_TMC;//SMBType::MB_DRV_TMC216;//smbtype == SMBType::MB_DRV_TMC216 ? MotorConfig::MTBDType::MT_TMC : MotorConfig::MTBDType::MT_DRV; m_cuoparamex = m_mtconfig->GetMotorSpeedParam(false, t_smbtype, 4, 1, 1); speedConfig(); mspCuozhiFeeding = {.finalPeriod = 1427500, .Fmin = 2027500, .stepnum = 30, .a = 100, .offset = 4, .finalDelay = 3000}; @@ -100,7 +100,7 @@ void CuoZhiMotor::feeding() void CuoZhiMotor::speedChange(int speed, int dpi, int colormode) // speed should be in range [0,5] (by ply,at 2019.5.23) { - auto t_smbtype = smbtype == SMBType::MB_DRV_8825 ? MotorConfig::MTBDType::MT_DRV : MotorConfig::MTBDType::MT_TMC; + auto t_smbtype = MotorConfig::MTBDType::MT_TMC;//SMBType::MB_DRV_TMC216;//smbtype == SMBType::MB_DRV_8825 ? MotorConfig::MTBDType::MT_DRV : MotorConfig::MTBDType::MT_TMC; m_cuoparamex = m_mtconfig->GetMotorSpeedParam(false, t_smbtype, speed, colormode, dpi); speedConfig(); } @@ -112,7 +112,7 @@ void CuoZhiMotor::speedRecover() void CuoZhiMotor::speedConfig() { - LOG("CuoZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ", + printf("CuoZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ", m_cuoparamex.speed, m_cuoparamex.dpi, m_cuoparamex.colormode, diff --git a/HCamDevice.cpp b/HCamDevice.cpp index 8d25412..6f0e8c3 100644 --- a/HCamDevice.cpp +++ b/HCamDevice.cpp @@ -96,15 +96,16 @@ HCamDevice::HCamDevice() memfd = 0; subDeviceName = "/dev/v4l-subdev0"; videoDevName = "/dev/video0"; - subDevicefd = 0; - videofd = 0; + subDevicefd = -1; + videofd = -1; v4lWidth = 5184;//@300dpi 5184 @600dpi 5184*2 v4lHeight = 513 ;//* 3;//color_h/gray_h = 3 比如:目标复原图像高度为128 则灰度需要FPGA采集128 彩色采集128*3 - v4lBufferCount = 30; + v4lBufferCount = 32; v4l2buftype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; nplanes = 1; // only use one plane drivertype = V4L2_CAP_VIDEO_CAPTURE_MPLANE; + //drivertype == V4L2_BUF_TYPE_VIDEO_CAPTURE; v4l2memtype = V4L2_MEMORY_MMAP; captureBufers = NULL; @@ -145,7 +146,7 @@ HCamDevice::HCamDevice() HtCamWriteFpgaRegs(16, VSNP | value); } - HtCamWriteFpgaRegs(16, 0x0B0B); //相位 + HtCamWriteFpgaRegs(16, 0x0A0A); //相位0x0B0B 2023-9-4 0A0B, 2023-9-11 0a0a //HtCamChangeTriggerInAndEXt(1); @@ -241,6 +242,12 @@ int HCamDevice::open_device(int width , int height) } int HCamDevice::close_device() { + printf("videofd:%d subDevicefd:%d\r\n",videofd,subDevicefd); + if (videofd == -1 || subDevicefd == -1) + { + return 0; + } + HtCamStopVideoCapturing(); uint8_t i; int ret = 0; @@ -252,9 +259,11 @@ int HCamDevice::close_device() } ret = close(videofd); + videofd = -1; camera_print("close video_fd :%s is:[%s] \n",videoDevName.c_str(),ret < 0 ? "fail" : "succeed"); ret = close(subDevicefd); + subDevicefd = -1; camera_print("close sub_device_fd :%s is:[%s] \n",subDeviceName.c_str(),ret < 0 ? "fail" : "succeed"); return ret; @@ -460,7 +469,12 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout) if (!HtCamWaitVideoCapture(timeout)) { camera_err("read frame time out\n"); + // if ((lastSucceedBufferIndex + 1) >= v4lBufferCount) + // *pbuf = captureBufers[0].start; + // else + *pbuf = captureBufers[lastSucceedBufferIndex + 1].start; + printf("timeout !!! captureBufers[lastSucceedBufferIndex].length :%d\r\n",captureBufers[lastSucceedBufferIndex].length); return -1; } struct v4l2_buffer buf; @@ -486,7 +500,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout) int ret = 0; if (( ret = ioctl(videofd, VIDIOC_DQBUF, &buf)) == 0) //这个地方入栈失败好像下面就都不用操作了 ??? 毕竟已经丢帧了算 { - camera_dbg("*****DQBUF[%d] FINISH*****\n", buf.index); + camera_print("*****DQBUF[%d] FINISH*****\n", buf.index); } else { @@ -495,7 +509,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout) } if (ioctl(videofd, VIDIOC_QBUF, &buf) == 0) //出栈一样 { - camera_dbg("************QBUF[%d] FINISH**************\n", buf.index); + camera_print("************QBUF[%d] FINISH**************\n", buf.index); } else { @@ -603,6 +617,7 @@ void HCamDevice::HtCamChangeAdjustPhase(uint16_t times, uint8_t dir) // This function is prohibited int HCamDevice::HtCamStartSampling() { + //ioctl(subDevicefd,0x40,NULL); uint32_t *CamReg; if (virBaseAddr == NULL) return -1; @@ -626,6 +641,7 @@ int HCamDevice::HtCamStopSampling() CamReg[10] |= (HT_CAM_REG_CR_STOPSAMPLE_MASK); CamReg[10] &= ~(HT_CAM_REG_CR_STOPSAMPLE_MASK); + //ioctl(subDevicefd,0x40,NULL); return 0; } @@ -747,6 +763,7 @@ int HCamDevice::init_video_buffer() req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; else req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + req.memory = v4l2memtype; printf("I GET THE drivertype %d\n",drivertype); @@ -759,7 +776,7 @@ int HCamDevice::init_video_buffer() } v4lBufferCount = req.count; - camera_dbg(" reqbuf number is %d\n", v4lBufferCount); + camera_print(" reqbuf number is %d\n", v4lBufferCount); if (captureBufers != NULL) free(captureBufers); @@ -1179,10 +1196,10 @@ void HCamDevice::HtCamGetStSp(uint32_t &start_smaple) void HCamDevice::HtCamSetVsnpTime(int color) { - CamZ_Reg_2Short st_sp; + CamZ_Reg_2char st_sp; st_sp.value = HtCamReadFpgaRegs(0x10); - st_sp.NShort[0] = color; - st_sp.NShort[1] = 0; + st_sp.NChar[0] = color; + st_sp.NChar[1] = color; HtCamWriteFpgaRegs(0x10 , st_sp.value); } void HCamDevice::HtCamSetFrameCnt(uint32_t val) @@ -1270,6 +1287,7 @@ void HCamDevice::HtCamSetClolr(int color) reg_4.color_mode = color; reg_4.en_frameset = 1; //帧计数默认开启 reg_4.en_pattern = 0; + reg_4.en_line = 1; HtCamWriteFpgaRegs(0x04,reg_4.value); // HtCamSetStSp(color); diff --git a/HCamDevice.h b/HCamDevice.h index ca290eb..e4171b7 100644 --- a/HCamDevice.h +++ b/HCamDevice.h @@ -51,12 +51,12 @@ public: void HtCamSetPeriod(uint32_t *reg_value); //设置扫描仪传感器占空比 - void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 - void HtCamGetFrameNum(uint32_t &val);//获取当前已经采集到的第几帧 + void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 需要采集的帧数,设置为0x05表示采集六帧后停止 + void HtCamSetFrameCnt(uint32_t val);//需要采集的帧数,设置为0x05表示采集六帧后停止 + + void HtCamGetFrameNum(uint32_t &val);//采集到的帧数,如果为0x0005则表示采集到了5帧 - void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数 - uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值 void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 reg_value //灰度内触发间隔 val读写间隔//影响到图像得拉伸 //2023-8-28 val 改为曝光间隔, void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime diff --git a/ICapturer.h b/ICapturer.h index 793143a..af72f46 100644 --- a/ICapturer.h +++ b/ICapturer.h @@ -12,6 +12,7 @@ class FpgaComm; class ICapturer { public: +bool is_image_ = false; ICapturer() {} virtual ~ICapturer() {} diff --git a/IScanner.h b/IScanner.h index c423558..644f048 100644 --- a/IScanner.h +++ b/IScanner.h @@ -36,6 +36,8 @@ public: virtual ScannerScanInfo GetScanInfo() = 0; virtual void SetLEDStatus(LedStatus status) = 0; + virtual void close_v4l2()= 0; + protected: BlockingQueue m_images; BlockingQueue m_scannerEvents; diff --git a/MultiFrameCapture.cpp b/MultiFrameCapture.cpp index 033e905..9266a5e 100644 --- a/MultiFrameCapture.cpp +++ b/MultiFrameCapture.cpp @@ -36,10 +36,10 @@ MultiFrameCapture::MultiFrameCapture(ScannerGlue glue,std::shared_ptr ////////////////默认300dpi 和灰度设置 resolution_(DPI_300), - cis_width_(WIDTH), - cis_height_(HEIGHT), + v4l2_width_(WIDTH), + v4l2_height_(HEIGHT), pixels_width_(WIDTH), - pixels_height_(HEIGHT), + fpga_height_(HEIGHT), paper_size_((unsigned int)PaperSize::G400_AUTO), color_mode_(GRAY), is_correct_(0), @@ -88,7 +88,7 @@ void MultiFrameCapture::SetParent(void *scanner) void MultiFrameCapture::open() { - int ret = video->open_device(cis_width_,cis_height_); + int ret = video->open_device(v4l2_width_,v4l2_height_); if(ret < -1) return; @@ -106,7 +106,12 @@ void MultiFrameCapture::snap() #ifndef TEST_SIMCAP std::lock_guard m_lock(m_mtx_snap); b_stop_snap = b_end_snap = false; - + // if (resolution_ == DPI_600) + // { + // this_thread::sleep_for(std::chrono::milliseconds(30)); + // } + + video->HtCamStartVideoCapturing(); snaped_index++; @@ -140,21 +145,31 @@ void *MultiFrameCapture::readFrameTest(int timeout) { return nullptr; } +#include uint32_t MultiFrameCapture::compute_frame(int paper_size,int dpi) { SIZE size = GetPaperSize((PaperSize)paper_size,dpi); - int val = size.cy /cis_height_ + 1; //1:可能会被四舍五入,只能大不能小 - int cnt = color_mode_ ? val * 3 : val; //val * 3 彩色设置 513 但是采集实际高度是513 / 3 - return cnt; //四舍五入的情况下再多去一帧 + int val = ceil((float)size.cy /(float)pixels_height_); + return val + 1; +} +void MultiFrameCapture::compute_height(int width,int height) +{ + //////这块配置一定要注意 + v4l2_width_ = resolution_ == 0 ? width * 2 : width; //宽 :DPI不变下 彩色灰度是一样的 + //width_ = paper_size_ == PaperSize::G400_MAXSIZE || paper_size_ ==PaperSize::G400_MAXAUTO && + v4l2_height_ = height; + + pixels_width_ = color_mode_ == 1 ? v4l2_width_ * 3 : v4l2_width_; + pixels_height_ = color_mode_ == 1 ? v4l2_height_ / 3 : v4l2_height_; } SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi) { if (paper_map_.find(paper) != paper_map_.end()) { - SIZE resize{2338,3307}; + SIZE resize{2480,3507}; resize.cx = paper_map_[paper].cx * dpi / 25.4; resize.cy = paper_map_[paper].cy * dpi / 25.4; - printf("resize.cx:%d resize.cy:%d\r\n",resize.cy / cis_height_,resize.cx); + printf("resize.cx:%d resize.cy:%d\r\n",resize.cx,resize.cy); return resize; } return SIZE{2338, 3307}; @@ -175,30 +190,27 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) is_correct_ = config.params.isCorrect; paper_size_ = config.params.pageSize; is_double_paper_ = config.params.doubleFeeded; - - cis_width_ = resolution_ == 0 ? WIDTH * 2 : WIDTH; //宽 :DPI不变下 彩色灰度是一样的 - //width_ = paper_size_ == PaperSize::G400_MAXSIZE || paper_size_ ==PaperSize::G400_MAXAUTO && - cis_height_ = HEIGHT; - pixels_width_ = color_mode_ == 1 ? cis_width_ * 3 : cis_width_; - pixels_height_ = color_mode_ == 1 ? cis_height_ / 3 : cis_height_; + //width_ = paper_size_ == PaperSize::G400_MAXSIZE || paper_size_ ==PaperSize::G400_MAXAUTO && + + + int height = resolution_ == DPI_600 ? 1200 : 660; + + compute_height(WIDTH , height); video->HtCamSetClolr(color_mode_); video->HtCamSetDpi(resolution_); - - FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color); - video->HtCamSetSpTime(fpgaparam.Sp, 49); // 2344 灰色 //2023-8-10 最新2650 + video->HtCamSetSpTime(fpgaparam.Sp, fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650 if (color_mode_) { video->HtCamSetSpTime2(fpgaparam.HRatio); } - video->HtCamSetStSp(fpgaparam.MaxBright); configFPGAParam(config_color, config_dpi); - printf(" -----------------------resolution = %d color_mode_ = %d config_dpi:%d------------------\r\n",resolution_, color_mode_,config_dpi); + { int val = config.params.dpi == 3 ? 600 :(config.params.dpi == 2?300:200); printf("val = %d\r\n",val); @@ -206,40 +218,18 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) video->HtCamSetFrameCnt(cnt); printf(" -----------------------设置帧数:%d------------------\r\n",cnt); } - //if(!lut.empty()) - //lut.release(); - //calcLUT(config.params.dpi,config.params.isColor,true,lut); - printf("lut channels = %d lut width = %d \n",lut.channels(),lut.cols); + + printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色"); + printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300); + printf("V4L2宽:%d 高:%d\r\n",v4l2_width_,v4l2_height_); + printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_); + printf("fpga_height_:%d\r\n", fpga_height_); + printf("resolution_:%d\r\n", resolution_); printf("color_mode_:%d\r\n", color_mode_); printf("paper_size_:%d\r\n", paper_size_); - printf("cis_width_:%d\r\n", cis_width_); - printf("cis_height_:%d\r\n", cis_height_); - printf("pixels_width_:%d\r\n", pixels_width_); - printf("pixels_height_:%d\r\n", pixels_height_); - -#ifdef TEST_SIMCAP - if (m_test_pimg) - free(m_test_pimg); - - FILE *f_img; - if (m_config.params.isColor == 1) // color - f_img = fopen("/home/root/color.bmp", "rb"); - else - f_img = fopen("/home/root/gray.bmp", "rb"); - - if (f_img == nullptr) - printf("!!!!!!!!!! error while reading image \r\n"); - - fseek(f_img, 0, SEEK_END); - m_test_pimg_len = ftell(f_img); - m_test_pimg = (unsigned char*)malloc(m_test_pimg_len); - fseek(f_img, 0, SEEK_SET); - fread(m_test_pimg,1,m_test_pimg_len,f_img); - printf("!!!!!!!!!! info: reading image len = %d m_test_pimg = %p \r\n", m_test_pimg_len, m_test_pimg); - fclose(f_img); -#endif + printf("paper_size_:%d\r\n", paper_size_); } void MultiFrameCapture::createCorrect(int correctmode) @@ -274,6 +264,8 @@ bool MultiFrameCapture::capturerImage() void MultiFrameCapture::waitsnapdone(int state) { + StopWatch sw; + sw.reset(); #ifdef TEST_SIMCAP HG_JpegCompressInfo info; info.DataLength = m_test_pimg_len; @@ -295,7 +287,7 @@ void MultiFrameCapture::waitsnapdone(int state) m_cv_snapdone.wait(lock); b_end_snap = true; m_frameinfos.Put(info); - //printf("!!!!!!!!!!!!!!!! m_cv_snapdone wait done \n"); + printf("!!!!!!!!!!!!!!!! m_cv_snapdone wait done :%f \n",sw.elapsed_ms()); #endif } @@ -380,29 +372,27 @@ int MultiFrameCapture::color() void MultiFrameCapture::snaprun() { //frame_info 发送得数据信息 channels 图像位深 num 需要取得帧数 time_out读图超时时间设置 - auto snap_func = [this](V4L2_DATAINFO_Ex frame_info, int channels,int time_out,int i) + auto snap_func = [this](V4L2_DATAINFO_Ex frame_info, int channels,int &time_out,int i) { StopWatch sw; sw.reset(); unsigned char *data = NULL; + printf("设置超时时间:%d\r\n",time_out); int ret = video->HtCamReadCaptureFrame((void **)&data, time_out); - - if (ret == -1 || ret == -2) - { - printf("----------------获取图像超时或者失败------------\r\n"); - return ret; - } - + time_out = resolution_ == DPI_600 ? sw.elapsed_ms() + 600 : sw.elapsed_ms() + 20; uint32_t sendLine = video->HtCamReadFpgaRegs(0x000e);////0x000e 取出来的实际行数 - //printf("--------------fpga send line ------------:%d\r\n",sendLine); + printf("--------------fpga send line ------------:%d \r\n",sendLine); + if (data) { - //cv::Mat mat = cv::Mat(frame_info.height, frame_info.width, CV_8UC1, data, cv::Mat::AUTO_STEP); - //cv::imwrite("/home/root/test.png", mat); + + //cv::Mat mat = cv::Mat(317, 15552, CV_8UC1, data, cv::Mat::AUTO_STEP); + + //cv::imwrite("/home/root/test.bmp", mat); // printf("--------------frame_index------------:%d\r\n",frame_index); - if (i == 5) + if (i == 2) { - //cv::imwrite("/home/root/test.bmp", mat); + // cv::imwrite("/home/root/test.bmp", mat); //cv::imwrite("/home/root/test.bmp", mat); //savebitmap(data,15552,512,"1.bmp"); } @@ -412,9 +402,10 @@ void MultiFrameCapture::snaprun() //HG_JpegCompressInfo info = cmp.GetCompressedImg(mat); HG_JpegCompressInfo info ; - - info.pJpegData = (unsigned char *)malloc(frame_info.height * frame_info.width); - memcpy(info.pJpegData , data , frame_info.height * frame_info.width); + + info.pJpegData = data;//(unsigned char *)malloc(frame_info.height * frame_info.width); + //memcpy(info.pJpegData , data , frame_info.height * frame_info.width); + info.DataLength = frame_info.width * frame_info.height; info.first_frame = frame_info.first_frame; info.last_frame = frame_info.last_frame; @@ -424,8 +415,7 @@ void MultiFrameCapture::snaprun() info.height = frame_info.height; printf("获取数据 width:%d height:%d is_first:%d is_last:%d DataLength:%d\r\n",frame_info.width,frame_info.height,info.first_frame,info.last_frame,info.DataLength); - - //cv::imwrite("/home/root/opencv"+to_string(cnt_++)+".bmp",frame.mat); + m_glue.m_imageready(info); //m_frameinfos.Put(frame_info); @@ -434,9 +424,11 @@ void MultiFrameCapture::snaprun() return ret; }; - //static int ti = 0; + static int ti = 100; while (b_snap_run) { + StopWatch sw; + std::unique_lock lock(m_mtx_snap); m_cv_snap.wait(lock); @@ -453,50 +445,58 @@ void MultiFrameCapture::snaprun() int channels = color_mode_ == 1 ? 3 : 1; int color_mode = video->HtCamGetColorMode(); int func_sig = 0; - int time_out = color_mode == 1 ? 800 : 400; + int time_out = resolution_ == DPI_600 ? 400 : 200; ///这个时间是根据每帧的数据量来进行调测的 int time_out_cnt = 0; uint32_t frame_num = 0; uint32_t frame_cnt = 0; - - video->HtCamGetFrameCnt(frame_cnt); - frame_info.frame_index = frame_cnt + 1; - //video->HtCamSetVsnpTime(6); - //printf("设置 vsnp:%d\r\n",ti); - //ti++; + video->HtCamGetFrameCnt(frame_cnt); + printf("获取设置的帧数:%d\r\n",frame_cnt); + frame_info.frame_index = frame_cnt + 1; + // video->HtCamSetVsnpTime(ti); + // printf("设置 vsnp:%d\r\n",ti); + //ti++; + // video->HtCamSetStSp(ti); + // printf("设置 StSp%d\r\n",ti); + // ti++; + int mill = 0; //= resolution_ == DPI_600 ? 30 : 25; + //mill = color_mode == 1?mill*3:mill; + printf("mill:%d\r\n",mill); // printf("--------------------- frame_info.width ------------------ :%d\r\n",frame_info.width ); // printf("--------------------- frame_info.height ------------------ :%d\r\n",frame_info.height ); // printf("--------------------- frame_info.pixtype ------------------ :%d\r\n",frame_info.pixtype ); // printf("--------------------- frame_info.dpi ------------------ :%d\r\n",frame_info.dpi ); - - for (size_t i = 1; i <= frame_cnt; i++) + sw.reset(); + for (size_t i = 0; i <= frame_cnt ; i++) //frame_cnt -1 目前最好一帧采集会超时 所以多采集一帧 { printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info.frame_index,i); - frame_info.first_frame = i == 1 ? true : false; + frame_info.first_frame = i == 0 ? true : false; frame_info.last_frame = i == frame_cnt ? true : false; func_sig = snap_func(frame_info, channels,time_out,i); - if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? - { - i--; - time_out +=200; - time_out_cnt ++; - if (time_out_cnt >=5) - { - break; - } - continue; - } + + // if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? + // { + // i--; + // time_out +=200; + // time_out_cnt ++; + // if (time_out_cnt >=5) + // { + // break; + // } + // continue; + // } if (b_stop_snap) { video->HtCamGetFrameNum(frame_num); - int val = frame_num - i; //剩余还未采集的帧数 - int ind = i + 1; //只是计数确认采集到低多少帧,无其他实用意义 + int ind = i; //已采集了的帧数 + int val = frame_num - ind; //剩余还未采集的帧数 + while (val) { frame_info.last_frame = val == 1 ? true : false; @@ -504,19 +504,20 @@ void MultiFrameCapture::snaprun() func_sig = snap_func(frame_info, channels,time_out ,ind);//同上面一样 printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); - if (func_sig == -1 ) - { - time_out +=200; - time_out_cnt ++; - if (time_out_cnt >=5) - { - break; - } - continue; - } - val--; - ind++; - this_thread::sleep_for(std::chrono::milliseconds(65)); + // if (func_sig == -1 ) + // { + // time_out +=200; + // time_out_cnt ++; + // if (time_out_cnt >=5) + // { + // break; + // } + // continue; + // } + val--; + ind++; + + //this_thread::sleep_for(std::chrono::milliseconds(mill)); } break; } @@ -526,14 +527,14 @@ void MultiFrameCapture::snaprun() ////////////////////////////采集过快会导致队列堆积///////////////////////// ////////////////////////////所以这个延时是采集速度和传图速度的差值///////////////////////// ////////////////////////////DPI 颜色不同 会导致数据大小不同所以这个地方延时肯定不一样 目前 60是200dpi///////////////////////// - int mill = resolution_ == DPI_600 ? 60 * 10 : 60; - printf("mill:%d\r\n",mill); - this_thread::sleep_for(std::chrono::milliseconds(mill)); - + // if(resolution_ == DPI_600) + // this_thread::sleep_for(std::chrono::milliseconds(20)); } - + uint32_t in=0; + video->HtCamStopVideoCapturing(); - printf("---------- 退出图像采集流程 ----------\r\n"); + video->HtCamGetFrameNum(in); + printf("----------整张采集结束 总共采集帧数:%d 耗时:%f----------\r\n",in,sw.elapsed_ms()); m_cv_snapdone.notify_all(); b_end_snap = true; @@ -548,7 +549,6 @@ void MultiFrameCapture::updatesnapstatus(int papertype) void MultiFrameCapture::procimage() { - static int idx = 0; ThreadPool prc_pool(4); std::queue> prc_fu; @@ -782,7 +782,7 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { int k = (3 * s + x); // int diff = LIGHT_DIFF(*((double *)values + k)); - int diff = 170 - *((double *)values + k);;//param.MaxBright - *((double *)values + k); + int diff = 210 - *((double *)values + k);;//param.MaxBright - *((double *)values + k); log += " 明场:" + std::to_string(k) + ";diff:" + std::to_string(diff) + "\r\n"; double step = diff * radio; @@ -848,7 +848,7 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { int *exposures = (int *)(s == 0 ? param.ExposureF : param.ExposureB); // int diff = LIGHT_DIFF(values[s]); - int diff = 170 - values[s];;//param.MaxBright - values[s]; + int diff = 200 - values[s]; double step = diff * radio; log += " 明场:" + to_string(s) + ";diff:" + to_string(diff) + "\r\n"; int preStep = expStep[s][0]; @@ -932,76 +932,67 @@ void MultiFrameCapture::correctcolor(int correctmode) { StopWatch sw_correct; std::string loginfo = "Start Correctcolor 300DPI Gray \r\n"; - //printf("----------- %s \n",loginfo.c_str()); - //creatcorrectconfig(0x02, IMAGE_GRAY); - //printf("----------- done \n",loginfo.c_str()); - loginfo = "Start Correctcolor 300DPI COLOR \r\n"; - printf("----------- %s \n",loginfo.c_str()); - creatcorrectconfig(0x02, IMAGE_COLOR); - printf("----------- done \n",loginfo.c_str()); - - - // if ((correctmode == 0) || (correctmode == 2)) - // { - // loginfo = "Start Correctcolor 200DPI COLOR \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // creatcorrectconfig(0x01, IMAGE_COLOR); - // loginfo = "-----------200DPI COLOR Correct Done----------- \r\n\r\n "; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // } - // if ((correctmode == 0) || (correctmode == 1)) - // { - // loginfo = "Start Correctcolor 200DPI GRAY \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // creatcorrectconfig(0x01, IMAGE_GRAY); - // loginfo = "-----------200DPI Gray Correct Done----------- \r\n\r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // } - // if ((correctmode == 0) || (correctmode == 4)) - // { - // loginfo = " Start Correctcolor 300DPI COLOR \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // creatcorrectconfig(0x02, IMAGE_COLOR); - // loginfo = "-----------300DPI COLOR Correct Done----------- \r\n\r\n "; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // } - // if ((correctmode == 0) || (correctmode == 3)) - // { - // loginfo = "Start Correctcolor 300DPI GRAY \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // creatcorrectconfig(0x02, IMAGE_GRAY); - // loginfo = "-----------300DPI Gray Correct Done----------- \r\n\r\n "; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // } - // if ((correctmode == 0) || (correctmode == 6)) - // { - // loginfo = "Start Correctcolor 600DPI COLOR \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // creatcorrectconfig(0x03, IMAGE_COLOR); - // loginfo = "-----------600DPI COLOR Correct Done----------- \r\n\r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // } - // if ((correctmode == 0) || (correctmode == 5)) - // { - // loginfo = " Start Correctcolor 600DPI GRAY \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // creatcorrectconfig(0x03, IMAGE_GRAY); - // loginfo = "-----------600DPI Gray Correct Done----------- \r\n\r\n "; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - // } + if ((correctmode == 0) || (correctmode == 2)) + { + loginfo = "Start Correctcolor 200DPI COLOR \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + creatcorrectconfig(0x01, IMAGE_COLOR); + loginfo = "-----------200DPI COLOR Correct Done----------- \r\n\r\n "; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + } + if ((correctmode == 0) || (correctmode == 1)) + { + loginfo = "Start Correctcolor 200DPI GRAY \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + creatcorrectconfig(0x01, IMAGE_GRAY); + loginfo = "-----------200DPI Gray Correct Done----------- \r\n\r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + } + if ((correctmode == 0) || (correctmode == 4)) + { + loginfo = " Start Correctcolor 300DPI COLOR \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + creatcorrectconfig(0x02, IMAGE_COLOR); + loginfo = "-----------300DPI COLOR Correct Done----------- \r\n\r\n "; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + } + if ((correctmode == 0) || (correctmode == 3)) + { + loginfo = "Start Correctcolor 300DPI GRAY \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + creatcorrectconfig(0x02, IMAGE_GRAY); + loginfo = "-----------300DPI Gray Correct Done----------- \r\n\r\n "; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + } + if ((correctmode == 0) || (correctmode == 6)) + { + loginfo = "Start Correctcolor 600DPI COLOR \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + creatcorrectconfig(0x03, IMAGE_COLOR); + loginfo = "-----------600DPI COLOR Correct Done----------- \r\n\r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + } + if ((correctmode == 0) || (correctmode == 5)) + { + loginfo = " Start Correctcolor 600DPI GRAY \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + creatcorrectconfig(0x03, IMAGE_GRAY); + loginfo = "-----------600DPI Gray Correct Done----------- \r\n\r\n "; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + } if ((correctmode < 0) || (correctmode > 6)) { loginfo = "不支持的校正模式...\r\n"; @@ -1027,13 +1018,10 @@ void MultiFrameCapture::openDevice(int dpi, int mode) resolution_ = dpi == 3 ? DPI_600 : DPI_300; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 2代表300 3代表600 color_mode_ = mode == 1 ? COLOR : GRAY; - cis_width_ = resolution_ == 0 ? WIDTH * 2 : WIDTH; //宽 :DPI不变下 彩色灰度是一样的 - cis_height_ = mode == 0x01 ? 60 * 3 : 60; - pixels_width_ = color_mode_ == 1 ? cis_width_ * 3 : cis_width_; - pixels_height_ = color_mode_ == 1 ? cis_height_ / 3 : cis_height_; + + compute_height(WIDTH , HEIGHT); - int config_dpi = resolution_ == DPI_600 ? 3 : 2; int config_color = color_mode_ ==COLOR ? 1:0; @@ -1060,23 +1048,19 @@ void MultiFrameCapture::openDevice(int dpi, int mode) video->HtCamSetFrameCnt(val); printf(" -----------------------设置帧数:%d------------------\r\n",val); } - printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色"); printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300); - printf("采集宽:%d 高:%d\r\n",cis_width_,cis_height_); + printf("V4L2宽:%d 高:%d\r\n",v4l2_width_,v4l2_height_); printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_); + printf("resolution_:%d\r\n", resolution_); printf("color_mode_:%d\r\n", color_mode_); printf("paper_size_:%d\r\n", paper_size_); printf("paper_size_:%d\r\n", paper_size_); - printf("cis_width_:%d\r\n", cis_width_); - printf("cis_height_:%d\r\n", cis_height_); - printf("pixels_width_:%d\r\n", pixels_width_); - printf("pixels_height_:%d\r\n", pixels_height_); - int ret = video->open_device(cis_width_,cis_height_); + int ret = video->open_device(v4l2_width_,v4l2_height_); if(ret < -1) return; @@ -1086,7 +1070,6 @@ void MultiFrameCapture::openDevice(int dpi, int mode) { i = video->HtCamReadCaptureFrame((void **)&buf, 500); } - //video->close_video(); printf("opened video with width = %d height = %d time eplased = %.2f pbuffer = %p \n", width, 60 * 2, swwv4l2open.elapsed_ms(),buf); } @@ -1109,7 +1092,7 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) int config_dpi = resolution_ == DPI_600 ? 3 : 2; int config_color = color_mode_ ==COLOR ? 1:0; - configFPGAParam(config_color, config_dpi); + configFPGAParam(mode, dpi); // ftt.append_log(log); printf("log :%s\r\n",log.c_str()); std::this_thread::sleep_for(std::chrono::milliseconds(5)); @@ -1119,43 +1102,33 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) video->HtCamChangeExposureValueB(F); std::this_thread::sleep_for(std::chrono::milliseconds(5)); - - video->HtCamStartVideoCapturing(); std::this_thread::sleep_for(std::chrono::milliseconds(5)); isDone = saveLutImg(dpi, mode, true); // 0 color_black 1 color_white 2 gray_balck 3 gray_white video->HtCamStopVideoCapturing(); - //video->close_device(); this_thread::sleep_for(std::chrono::milliseconds(200)); - i++; - - //return ; + i++; } + isDone = false; formatStep(); while (!isDone) // 后明场 { string log = "==============================第" + to_string(i) + "次===============================\r\n"; - // ftt.append_log(log); + if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); configFPGAParam(mode, dpi); - // ftt.append_log(log); + printf("log :%s\r\n", log.c_str()); std::this_thread::sleep_for(std::chrono::milliseconds(5)); - //unsigned int F[3] = {1, 1, 1}; - //video->HtCamChangeExposureValueF(F); - //video->HtCamChangeExposureValueB(F); - //std::this_thread::sleep_for(std::chrono::milliseconds(5)); - video->HtCamStartVideoCapturing(); std::this_thread::sleep_for(std::chrono::milliseconds(5)); isDone = saveLutImg(dpi, mode, false); // 0 color_black 1 color_white 2 gray_balck 3 gray_white video->HtCamStopVideoCapturing(); - // video->close_device(); this_thread::sleep_for(std::chrono::seconds(2)); i++; } @@ -1164,65 +1137,3 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) video->close_device(); } -// void MultiFrameCapture::myFloodFill(cv::Mat& image, bool isTwoSide) -// { -// int w = image.cols; -// int h = image.rows; -// cv::Vec3b lt, rt, lb, rb; -// const double threshold = 10; - -// if (!isTwoSide) -// { -// lt = image.channels() == 3 ? image.at(0, 0) : image.at(0, 0); -// if (lt[0] < threshold && lt[1] < threshold && lt[2] < threshold) -// cv::floodFill(image, cv::Point(0, 0), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// rt = image.channels() == 3 ? image.at(0, w - 1) : image.at(0, w - 1); -// if (rt[0] < threshold) -// cv::floodFill(image, cv::Point(w - 1, 0), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// lb = image.channels() == 3 ? image.at(h - 1, 0) : image.at(h - 1, 0); -// if (lb[0] < threshold) -// cv::floodFill(image, cv::Point(0, h - 1), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// rb = image.channels() == 3 ? image.at(h - 1, w - 1) : image.at(h - 1, w - 1); -// if (rb[0] < threshold) -// cv::floodFill(image, cv::Point(w - 1, h - 1), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); -// } -// else -// { -// int w_ = w / 2; -// lt = image.channels() == 3 ? image.at(0, 0) : image.at(0, 0); -// if (lt[0] < threshold && lt[1] < threshold && lt[2] < threshold) -// cv::floodFill(image, cv::Point(0, 0), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// rt = image.channels() == 3 ? image.at(0, w_ - 1) : image.at(0, w_ - 1); -// if (rt[0] < threshold && rt[1] < threshold && rt[2] < threshold) -// cv::floodFill(image, cv::Point(w_ - 1, 0), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// lb = image.channels() == 3 ? image.at(h - 1, 0) : image.at(h - 1, 0); -// if (lb[0] < threshold && lb[1] < threshold && lb[2] < threshold) -// cv::floodFill(image, cv::Point(0, h - 1), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// rb = image.channels() == 3 ? image.at(h - 1, w_ - 1) : image.at(h - 1, w_ - 1); -// if (rb[0] < threshold && rb[1] < threshold && rb[2] < threshold) -// cv::floodFill(image, cv::Point(w_ - 1, h - 1), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// lt = image.channels() == 3 ? image.at(0, w_) : image.at(0, w_); -// if (lt[0] < threshold && lt[1] < threshold && lt[2] < threshold) -// cv::floodFill(image, cv::Point(w_, 0), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// rt = image.channels() == 3 ? image.at(0, w - 1) : image.at(0, w - 1); -// if (rt[0] < threshold && rt[1] < threshold && rt[2] < threshold) -// cv::floodFill(image, cv::Point(w - 1, 0), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// lb = image.channels() == 3 ? image.at(h - 1, w_) : image.at(h - 1, w_); -// if (lb[0] < threshold && lb[1] < threshold && lb[2] < threshold) -// cv::floodFill(image, cv::Point(w_, h - 1), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); - -// rb = image.channels() == 3 ? image.at(h - 1, w - 1) : image.at(h - 1, w - 1); -// if (rb[0] < threshold && rb[1] < threshold && rb[2] < threshold) -// cv::floodFill(image, cv::Point(w - 1, h - 1), cv::Scalar::all(255), 0, cv::Scalar::all(5), cv::Scalar::all(40), cv::FLOODFILL_FIXED_RANGE); -// } -// } - diff --git a/MultiFrameCapture.h b/MultiFrameCapture.h index ca2eb39..aff6b20 100644 --- a/MultiFrameCapture.h +++ b/MultiFrameCapture.h @@ -12,7 +12,7 @@ class Gpio; class GpioOut; #define WIDTH 5184 -#define HEIGHT 650 //只能为3的倍数 +#define HEIGHT 951 //只能为3的倍数 #define DPI_600 0 #define DPI_300 1 #define COLOR 1 @@ -85,14 +85,18 @@ private: private: unsigned int resolution_; // 分辨率 //0:600dpi 1:300dpi - unsigned int cis_width_; // CIS 图像宽 - unsigned int cis_height_; // CIS 图像高 + + unsigned int v4l2_width_; // v4l2 图像宽 + unsigned int v4l2_height_; // v4l2 图像高 unsigned int pixels_height_; // opencv需要生成的高 unsigned int pixels_width_ ; // opencv需要生成的宽 + unsigned int fpga_height_; // PGPA 需要的高的是三倍数 ,发950 就是指951 + unsigned int paper_size_; // 纸张大小 unsigned int color_mode_; // 颜色模式 unsigned int is_correct_; // 是否校正 unsigned int is_double_paper_; // 是否启动双张检测 + cv::Mat lut; std::map paper_map_ @@ -115,6 +119,7 @@ private: SIZE GetPaperSize(PaperSize paper, int dpi); uint32_t compute_frame(int paper_size,int dpi); //计算固定幅面需要采集的帧数 + void compute_height(int width,int height); //在open 之前调用 public: MultiFrameCapture(ScannerGlue glue, std::shared_ptr fpga, CISVendor vendor); @@ -124,6 +129,8 @@ public: virtual void open() override; + ////这个地方非常重要 目的是检测到有纸之后 ,继续走纸接近CIS 在启动采集 ,但是这个地方风险也很大,需要调的尽量完美,如果出现最上面几行图像和最下面图像不显示请看一下这里吧!!!! + ////走纸速度影响吗??? YES virtual void snap() override; virtual void stopsnap(bool autosize) override; diff --git a/Scanner.cpp b/Scanner.cpp index 3ca8247..8cb3cd3 100644 --- a/Scanner.cpp +++ b/Scanner.cpp @@ -113,8 +113,8 @@ void Scanner::updateSpeedMode(int speed) m_scaninfo = GetScanInfoFromJson(); if(m_scaninfo.SpeedMode==0) m_scaninfo.SpeedMode=3; - LOG("Scanner SET updateSpeedMode %d------ \n",m_scaninfo.SpeedMode); - unsigned int t_dpi=m_config.params.dpi; + printf("速度模式:%d dpi:%d 颜色:%d \n",m_scaninfo.SpeedMode,m_config.params.dpi,m_config.params.isColor); + unsigned int t_dpi = m_config.params.dpi; // if(typeid(*capturer)==typeid(MonoCapturer)) // { // if(m_config.params.dpi==0x03&& m_scansysinfo->IsSmallRam()) @@ -122,9 +122,11 @@ void Scanner::updateSpeedMode(int speed) // else // t_dpi = m_config.params.dpi; // } - //if(typeid(*capturer)==typeid(MultiFrameCapture)) - //if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19) //长文稿采用600dpi模式扫描 - t_dpi = 1; + if(typeid(*capturer)==typeid(MultiFrameCapture)) + if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19) //长文稿采用600dpi模式扫描 + t_dpi = 3; + + motorCuozhi.speedChange(m_scaninfo.SpeedMode, t_dpi,m_config.params.isColor); motorZouzhi.speedChange(m_scaninfo.SpeedMode, t_dpi,m_config.params.isColor); } @@ -238,8 +240,11 @@ void Scanner::runScan() m_config.params.pageSize==(int)PaperSize::G400_MAXAUTO || m_config.params.pageSize==(int)PaperSize::G400_MAXSIZE; StopWatch sw; + StopWatch sw1; + StopWatch sw2; while (m_DstScannum > 0) { + sw1.reset(); m_isDoublePaper = false; m_jamPaper = false; m_jamIn = false; @@ -288,30 +293,31 @@ void Scanner::runScan() } break; } - + printf("检测到纸张的时间:%f\r\n",sw.elapsed_ms());//检测到纸张 + capturer->snap(); motorCuozhi.pauseWaitForThread(); int i = 0; int max = 7; -#ifdef G400 - if(m_config.params.pageSize >= (int)PaperSize::G400_LONGLETTER) - max = m_scaninfo.SpeedMode>3?10:16; - else - max = m_scaninfo.SpeedMode>3?5:8; -#else + if(m_config.params.pageSize >= (int)PaperSize::G400_LONGLETTER) max = m_scaninfo.SpeedMode>3?10:25; else max = m_scaninfo.SpeedMode>3?5:8; -#endif - + max = m_config.params.dpi > 2 ? 30 : max * m_config.params.dpi; + if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19) + { max = 200; + } + LOG("paper pauseWaitForThread \n"); waitpapertime = 200; + sw2.reset(); while (!sensor->waitPaperOut(waitpapertime) && i < max) { + i++; if (!sensor->isPaperIn()) { @@ -319,6 +325,7 @@ void Scanner::runScan() break; } } + printf("等待纸张出去?????????????%f\r\n",sw2.elapsed_ms()); LOG("paper isPaperIn \n"); if (i == max && sensor->isPaperIn()) { @@ -351,10 +358,14 @@ void Scanner::runScan() int dly_speed= (5 - m_scaninfo.SpeedMode)*10; int delay = m_config.params.dpi==0x02?70:(m_config.params.dpi==0x03?350: 20); if((m_config.params.pageSize == 17 || m_config.params.pageSize == 19)&&(delay < 350)) + { delay = 350; + } + if(m_config.params.pageSize == 18) delay = std::max(delay,80); - delay+=dly_speed; + + delay += dly_speed; //LOG("AutoSize sleep_for delay=%d \n",delay); this_thread::sleep_for(std::chrono::milliseconds(delay));//200 80ms 600 260ms } @@ -370,9 +381,9 @@ void Scanner::runScan() capturer->stopsnap(b_autosize); break; } - std::this_thread::sleep_for(std::chrono::milliseconds(50)); + //std::this_thread::sleep_for(std::chrono::milliseconds(50)); } - //std::this_thread::sleep_for(std::chrono::milliseconds(500)); + LOG("\nclose b_autosize %s\n",GetCurrentTimeStamp(2).c_str()); capturer->stopsnap(b_autosize); capturer->waitsnapdone(m_isDoublePaper || m_jamPaper);//等待采集完成 @@ -389,15 +400,11 @@ void Scanner::runScan() break; } sw.reset(); - while (meminfo->GetMemoryUsed() > 85.0f||(m_config.params.dpi ==0x03 && capturer->getimageremain()>1)) //内存占用高于75% + while (meminfo->GetMemoryUsed() > 90.0f||(m_config.params.dpi ==0x03 && capturer->getimageremain()>1)) //内存占用高于75% { if (sw.elapsed_s() < 50.0) { - - std::this_thread::yield(); - - this_thread::sleep_for(std::chrono::milliseconds(200)); } else { @@ -407,7 +414,9 @@ void Scanner::runScan() } } - printf("正常结束\r\n"); + printf("一张纸完成时间:%f\r\n",sw1.elapsed_ms()); + if( m_config.params.dpi == 3) + this_thread::sleep_for(std::chrono::milliseconds(3000)); } m_DstScannum = 0; @@ -417,11 +426,11 @@ void Scanner::runScan() int t_delay = m_config.params.dpi == 0x02 ? 150 : (m_config.params.dpi == 0x03 ? 350 : 100); - this_thread::sleep_for(std::chrono::milliseconds(t_delay)); //走纸多转一会儿 确保扫描传感器过了之后 纸能出完 + //this_thread::sleep_for(std::chrono::milliseconds(2000)); //走纸多转一会儿 确保扫描传感器过了之后 纸能出完 capturer->setFanMode(0); + - - capturer->close(); + //capturer->close(); LOG("\n--------------------------scan done --------------------------------\n"); diff --git a/Scanner.h b/Scanner.h index c73ded9..68cbf14 100644 --- a/Scanner.h +++ b/Scanner.h @@ -157,6 +157,11 @@ public: return !capturer->IsImageQueueEmpty(); } + void close_v4l2() + { + capturer->close(); + } + void writeParamars(std::string type, int *value) { // capturer->m_configprop->writeParamars(type, value); diff --git a/UsbScanner.cpp b/UsbScanner.cpp index 6a26a61..e6e5601 100644 --- a/UsbScanner.cpp +++ b/UsbScanner.cpp @@ -126,7 +126,7 @@ UsbScanner::UsbScanner() : m_startscan(false), { imageremain++; m_images.Put(imageinfo); - printf("m_images size :%d\r\n",m_images.Size()); + printf("队列缓存张数 :%d\r\n",m_images.Size()); // LOG("Enqueue image index :%d ptr:%p length:%d\n", ++enqueueindex,imageinfo.pJpegData, imageinfo.DataLength); }; @@ -307,6 +307,10 @@ bool UsbScanner::GetEventQueueEmpty() return eventsramain == 0; } +void UsbScanner::close_v4l2() +{ + m_hgScanner->close_v4l2(); +} HG_JpegCompressInfo UsbScanner::GetFrontImage() { HG_JpegCompressInfo ret = {0}; diff --git a/UsbScanner.h b/UsbScanner.h index b0b87a1..a1d10b3 100644 --- a/UsbScanner.h +++ b/UsbScanner.h @@ -39,6 +39,10 @@ public: virtual void UpdateScanInfo(int type,void* data) override; virtual ScannerScanInfo GetScanInfo() override; virtual void SetLEDStatus(LedStatus status) override; + + + + virtual void close_v4l2()override; std::string GetSysInfo(); int read_bulk(void *pdata, int length); int write_bulk(void *pdata, int length); diff --git a/ZouZhiMotor.cpp b/ZouZhiMotor.cpp index 3e46bcb..59e3888 100644 --- a/ZouZhiMotor.cpp +++ b/ZouZhiMotor.cpp @@ -4,8 +4,7 @@ ZouZhiMotor::ZouZhiMotor() : Motor(motorPorts_Zouzhi) { - //auto t_smbtype = smbtype == SMBType::MB_DRV_TMC216 ? MotorConfig::MTBDType::MT_TMC : MotorConfig::MTBDType::MT_DRV; - auto t_smbtype = MotorConfig::MTBDType::MT_TMC; + auto t_smbtype =MotorConfig::MTBDType::MT_TMC;//SMBType::MB_DRV_TMC216;// smbtype == SMBType::MB_DRV_TMC216 ? MotorConfig::MTBDType::MT_TMC : MotorConfig::MTBDType::MT_DRV; m_zouparamex = m_mtconfig->GetMotorSpeedParam(true, t_smbtype, 4, 1, 1); speedConfig(); } @@ -16,14 +15,12 @@ ZouZhiMotor::~ZouZhiMotor() void ZouZhiMotor::start() { - Motor::setDirection(0); Motor::start(delays, m_zouparamex.mt_param); } void ZouZhiMotor::speedChange(int speed, int dpi, int colormode) // speed should be in range [0,5] (by ply,at 2019.5.23) { - //auto t_smbtype = smbtype == SMBType::MB_DRV_TMC216 ? MotorConfig::MTBDType::MT_TMC : MotorConfig::MTBDType::MT_DRV; - auto t_smbtype = MotorConfig::MTBDType::MT_TMC; + auto t_smbtype = MotorConfig::MTBDType::MT_TMC;//SMBType::MB_DRV_TMC216;//smbtype == SMBType::MB_DRV_TMC216 ? MotorConfig::MTBDType::MT_TMC : MotorConfig::MTBDType::MT_DRV; m_zouparamex = m_mtconfig->GetMotorSpeedParam(true, t_smbtype, speed, colormode, dpi); speedConfig(); } @@ -35,7 +32,7 @@ void ZouZhiMotor::speedRecover() void ZouZhiMotor::speedConfig() { - LOG("ZouZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ", + printf("ZouZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ", m_zouparamex.speed, m_zouparamex.dpi, m_zouparamex.colormode, @@ -50,5 +47,4 @@ void ZouZhiMotor::speedConfig() delays = speedup_cfg(m_zouparamex.mt_param.finalPeriod, m_zouparamex.mt_param.Fmin, m_zouparamex.mt_param.stepnum, m_zouparamex.mt_param.a, m_zouparamex.mt_param.offset, m_zouparamex.mt_param.finalDelay); -} - +} \ No newline at end of file diff --git a/main.cpp b/main.cpp index 191dcf7..2972c3b 100644 --- a/main.cpp +++ b/main.cpp @@ -292,6 +292,7 @@ int main(int argc, char *argv[]) { sts.Data = m_scanner->GetEvent().code; // 确保第一张扫描之前所发生的异常事件能够被通知 } + } else { @@ -300,6 +301,8 @@ int main(int argc, char *argv[]) if (evt != (int)HG_ScannerStatus::NORMAL && evt != (int)HG_ScannerStatus::STOP_SCAN) { sts.Data = m_scanner->GetEvent().code; // 扫描中途的事件能够被通知 + printf("关闭V4L2 333\r\n"); + m_scanner->close_v4l2(); } else { @@ -322,7 +325,13 @@ int main(int argc, char *argv[]) { auto data = m_scanner->GetEvent(); if (data.code == (int)(HG_ScannerStatus::STOP_SCAN)) + { system("cpufreq-set -g ondemand"); + printf("关闭V4L2 4444\r\n"); + m_scanner->close_v4l2(); + } + + sts.Data = data.code; if (data.code == (int)HG_ScannerStatus::AUTO_FLATTING || data.code == (int)HG_ScannerStatus::AUTO_FLAT_FINISHED) { @@ -330,6 +339,8 @@ int main(int argc, char *argv[]) m_scanner->write_bulk(&sts, sizeof(sts)); auto msg = data.msg; m_scanner->write_bulk(&msg[0], msg.length()); + //printf("关闭V4L2 111\r\n"); + //m_scanner->close_v4l2(); break; } } @@ -345,10 +356,10 @@ int main(int argc, char *argv[]) if (info.pJpegData != nullptr && info.DataLength != 0) { int tt = m_scanner->write_bulk((void *)&info, sizeof(int) * 7); - - // int tt = m_scanner->write_bulk(info.pJpegData, info.DataLength); - // free(info.pJpegData); - + printf("USB传输第一次write_bulk时间 :%f \r\n",sw.elapsed_ms()); + // tt = m_scanner->write_bulk(info.pJpegData, info.DataLength); + // //free(info.pJpegData); + // printf("USB传输第二次write_bulk时间 :%f \r\n",sw.elapsed_ms()); // break; // tt = m_scanner->write_bulk(info.mat.data, info.DataLength); @@ -359,7 +370,7 @@ int main(int argc, char *argv[]) int total = info.DataLength; while (total > 0) { - int dstlength = 1024 * 512; + int dstlength = 1024 * 1024; if (total <= dstlength) { dstlength = total; @@ -371,6 +382,7 @@ int main(int argc, char *argv[]) } int tt = m_scanner->write_bulk(info.pJpegData + index, dstlength); + //printf("USB传输第二次write_bulk时间 :%f \r\n",sw.elapsed_ms()); // printf("write_bulk info.pJpegData+index = %p index = %d dstlength =%d tt = %d \n", info.pJpegData + index, index, dstlength, tt); if (tt <= -1) @@ -382,10 +394,10 @@ int main(int argc, char *argv[]) else index += tt; } - // free(info.pJpegData); - tjFree(info.pJpegData); - LOG("Free info.pJpegData done\n"); - // printf("TIME!!!!!!!!!!!!! :%f info.DataLength:%d\r\n",sw.elapsed_ms(),info.DataLength); + //dnasfree(info.pJpegData); + //tjFree(info.pJpegData); + //LOG("Free info.pJpegData done\n"); + printf("USB传输一帧时间 :%f \r\n",sw.elapsed_ms()); } } break; @@ -504,16 +516,16 @@ int main(int argc, char *argv[]) m_scanner->SetFlatParam(usbcb.Command, buffer); } break; - case USBCommand::GET_FLAT_DATA: - { - LOG("enter GET_FLAT_DATA \n"); - int buffer[128]; - auto params = m_scanner->GetCaptureParams(); - LOG("size of params %d \n", sizeof(params)); - memcpy(buffer, ¶ms, sizeof(params)); - m_scanner->write_bulk(&buffer, sizeof(int) * 128); - } - break; + // case USBCommand::GET_FLAT_DATA: + // { + // LOG("enter GET_FLAT_DATA \n"); + // int buffer[128]; + // auto params = m_scanner->GetCaptureParams(); + // LOG("size of params %d \n", sizeof(params)); + // memcpy(buffer, ¶ms, sizeof(params)); + // m_scanner->write_bulk(&buffer, sizeof(int) * 128); + // } + // break; case USBCommand::PRE_UPGRADE: { writesyslog(LOG_INFO, "start updating system\n"); @@ -760,54 +772,63 @@ int main(int argc, char *argv[]) break; case USBCommand::GET_FLAT_DATA: { - FLAT_INFO *flatinfo = static_cast(usbcb.Data); + FLAT_INFO flatinfo ; + flatinfo.value = usbcb.Data; + flatinfo.params.status = 100; ////正常状态 unsigned char *lut_buffer; - if (flatinfo->params.dpi != 0) + if (flatinfo.params.dpi != 0) { std::ifstream lut_item; - int dpi = flatinfo->params.dpi == 0x01 ? 200 : (flatinfo->params.dpi == 0x02 ? 300 : 600); - std::string mode = flatinfo->params.colormode ? "clr" : "gray"; - std::string is_white_lut = flatinfo->params.is_whiteimage ? "white" : "bw"; + int dpi = flatinfo.params.dpi == 0x01 ? 200 : (flatinfo.params.dpi == 0x02 ? 300 : 600); + std::string mode = flatinfo.params.colormode ? "clr" : "gray"; + std::string is_white_lut = flatinfo.params.is_whiteimage ? "white" : "bw"; std::string lut_path = "/mnt/conf-disk/huago/lut" + std::to_string(dpi) + mode + is_white_lut + ".bmp"; lut_item.open(lut_path, std::ios_base::in | std::ios_base::binary); + + if (!lut_item.is_open()) { - flatinfo->params.datalen = 0; - flatinfo->params.status = 1; // 文件打开失败 + flatinfo.params.datalen = 0; + flatinfo.params.status = 1; // 文件打开失败 } else { lut_item.seekg(0, std::ios::end); size_t length = lut_item.tellg(); lut_item.seekg(0, std::ios::beg); - flatinfo->params.datalen = length + flatinfo.params.datalen = length; } - if (flatinfo->params.datalen != 0) + if (flatinfo.params.datalen != 0 && flatinfo.params.status == 100) { - lut_buffer = new unsigned char[flatinfo->params.datalen]; + lut_buffer = new unsigned char[flatinfo.params.datalen]; if (lut_buffer) - lut_item.read(lut_buffer, flatinfo->params.datalen); + { + lut_item.read((char *)lut_buffer, flatinfo.params.datalen); + } + else { - flatinfo->params.status = 2; // OOM 异常 - flatinfo->params.datalen = 0; + flatinfo.params.status = 2; // OOM 异常 + flatinfo.params.datalen = 0; } } } else { - flatinfo->params.datalen = 0; - flatinfo->params.status = 3; // 未知dpi + flatinfo.params.datalen = 0; + flatinfo.params.status = 3; // 未知dpi } - usbcb.Data = flatinfo->value; + usbcb.Data = flatinfo.value; + printf("flatinfo.params.status:%d flatinfo.params.datalen:%d flatinfo.value:%d\r\n",flatinfo.params.status,flatinfo.params.datalen,flatinfo.value); m_scanner->write_bulk(&usbcb, sizeof(usbcb)); if (lut_buffer) { - m_scanner->write_bulk(lut_buffer, flatinfo->params.datalen); + m_scanner->write_bulk(lut_buffer, flatinfo.params.datalen); delete[] lut_buffer; + lut_buffer = NULL; } } break;