From 96e71d9415ef8ab7da8f5effd481e6eb6c85e3cb Mon Sep 17 00:00:00 2001 From: modehua Date: Sun, 3 Sep 2023 20:28:08 -0700 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=B4=E4=BD=93=E5=87=BA?= =?UTF-8?q?=E5=9B=BE=E6=B5=81=E7=A8=8B=E5=8F=8A=E6=A0=A1=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CuoZhiMotor.cpp | 6 ++--- HCamDevice.cpp | 10 +++---- HCamDevice.h | 2 +- MultiFrameCapture.cpp | 62 +++++++++++++++++-------------------------- MultiFrameCapture.h | 2 +- Scanner.cpp | 20 ++++---------- Sensor.cpp | 15 ++++++++++- scanservices_utils.h | 2 +- 8 files changed, 54 insertions(+), 65 deletions(-) diff --git a/CuoZhiMotor.cpp b/CuoZhiMotor.cpp index 52cf1bb..bd3c6ee 100644 --- a/CuoZhiMotor.cpp +++ b/CuoZhiMotor.cpp @@ -4,8 +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; + auto t_smbtype = 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}; @@ -101,8 +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; + auto t_smbtype = 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(); } diff --git a/HCamDevice.cpp b/HCamDevice.cpp index 4a7b744..8d25412 100644 --- a/HCamDevice.cpp +++ b/HCamDevice.cpp @@ -101,7 +101,7 @@ HCamDevice::HCamDevice() v4lWidth = 5184;//@300dpi 5184 @600dpi 5184*2 v4lHeight = 513 ;//* 3;//color_h/gray_h = 3 比如:目标复原图像高度为128 则灰度需要FPGA采集128 彩色采集128*3 - v4lBufferCount = 10; + v4lBufferCount = 30; v4l2buftype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; nplanes = 1; // only use one plane drivertype = V4L2_CAP_VIDEO_CAPTURE_MPLANE; @@ -845,12 +845,12 @@ void HCamDevice::HtCamChangeExposureValueB(uint32_t* value) return ; } uint32_t *pCamCtrlReg = virBaseAddr; - pCamCtrlReg[5] = value[1]<<16;//G 通道 + pCamCtrlReg[5] = value[0]<<16;//G 通道 std::this_thread::sleep_for(std::chrono::milliseconds(5)); CamZ_Reg_2Short rgb; rgb.value = HtCamReadFpgaRegs(0x06); - rgb.NShort[0] = value[0]; // R通道 + rgb.NShort[0] = value[1]; // R通道 rgb.NShort[1] = value[2]; //B 通道 HtCamWriteFpgaRegs(0x06,rgb.value); @@ -879,11 +879,11 @@ void HCamDevice::HtCamChangeExposureValueF(uint32_t* value) return ; } uint32_t *pCamCtrlReg = virBaseAddr; - pCamCtrlReg[11] = value[1] << 16;//G 通道 + pCamCtrlReg[11] = value[0] << 16;//G 通道 std::this_thread::sleep_for(std::chrono::milliseconds(5)); CamZ_Reg_2Short rgb; rgb.value = HtCamReadFpgaRegs(0x0C); - rgb.NShort[0] = value[0];// R通道 + rgb.NShort[0] = value[1];// R通道 rgb.NShort[1] = value[2]; //B 通道 HtCamWriteFpgaRegs(0x0C,rgb.value); diff --git a/HCamDevice.h b/HCamDevice.h index e40e20d..ca290eb 100644 --- a/HCamDevice.h +++ b/HCamDevice.h @@ -64,7 +64,7 @@ public: void HtCamSetStSp(int start_sample);//0x0d //2023 /8/23 灰度彩色默认:200 //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移 void HtCamGetStSp(uint32_t &start_sample); - void HtCamSetVsnpTime(int color); + void HtCamSetVsnpTime(int color); //相位 void HtCamChangeExposureValueF(uint32_t* value); //曝光值设置 void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置 diff --git a/MultiFrameCapture.cpp b/MultiFrameCapture.cpp index 4c25d36..5347e4f 100644 --- a/MultiFrameCapture.cpp +++ b/MultiFrameCapture.cpp @@ -189,7 +189,7 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color); - video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.Sp - 49); // 2344 灰色 //2023-8-10 最新2650 + video->HtCamSetSpTime(fpgaparam.Sp, 49); // 2344 灰色 //2023-8-10 最新2650 if (color_mode_) { video->HtCamSetSpTime2(fpgaparam.HRatio); @@ -342,22 +342,6 @@ void MultiFrameCapture::configFPGAParam(int mode, int dpi) video->HtCamChangeExposureValueF(fpgaparam.ExposureF); video->HtCamChangeExposureValueB(fpgaparam.ExposureB); - - std::vector vals={fpgaparam.ExposureF[0],fpgaparam.ExposureF[1],fpgaparam.ExposureF[2],fpgaparam.ExposureB[0],fpgaparam.ExposureB[1],fpgaparam.ExposureB[2]}; - unsigned int max_val=0; - for (size_t i = 0; i < vals.size(); i++) - { - if(i==0) - max_val = vals[i]; - else - { - if(max_val <= vals[i]) - max_val = vals[i]; - } - } - printf("---------- max_val = %d \n",max_val+15); - video->HtCamSetSpTime(fpgaparam.Sp,max_val+15); - for (int i = 0; i < 6; i++) { @@ -392,11 +376,11 @@ int MultiFrameCapture::color() #include "bmp.h" -static int cnt = 0; + void MultiFrameCapture::snaprun() { //frame_info 发送得数据信息 channels 图像位深 num 需要取得帧数 time_out读图超时时间设置 - auto snap_func = [this](V4L2_DATAINFO_Ex frame_info, int channels,int time_out) + auto snap_func = [this](V4L2_DATAINFO_Ex frame_info, int channels,int time_out,int i) { StopWatch sw; sw.reset(); @@ -408,21 +392,20 @@ void MultiFrameCapture::snaprun() printf("----------------获取图像超时或者失败------------\r\n"); return ret; } - + uint32_t sendLine = video->HtCamReadFpgaRegs(0x000e);////0x000e 取出来的实际行数 //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::Mat mat = cv::Mat(frame_info.height, frame_info.width, CV_8UC1, data, cv::Mat::AUTO_STEP); //cv::imwrite("/home/root/test.png", mat); // printf("--------------frame_index------------:%d\r\n",frame_index); - if (cnt == 2) + if (i == 5) { //cv::imwrite("/home/root/test.bmp", mat); //cv::imwrite("/home/root/test.bmp", mat); //savebitmap(data,15552,512,"1.bmp"); } - cnt++; //frame_info.mat = mat.clone(); //JpegCompress cmp(90); @@ -440,18 +423,18 @@ void MultiFrameCapture::snaprun() info.width = frame_info.width; 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); + 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); - //printf("采集图像耗时:%f\r\n",sw.elapsed_ms()); + printf("采集图像耗时:%f\r\n",sw.elapsed_ms()); } return ret; }; - static int ti = 0; + //static int ti = 0; while (b_snap_run) { std::unique_lock lock(m_mtx_snap); @@ -478,7 +461,7 @@ void MultiFrameCapture::snaprun() video->HtCamGetFrameCnt(frame_cnt); frame_info.frame_index = frame_cnt; - //video->HtCamSetVsnpTime(ti); + //video->HtCamSetVsnpTime(6); //printf("设置 vsnp:%d\r\n",ti); //ti++; @@ -491,12 +474,12 @@ void MultiFrameCapture::snaprun() for (size_t i = 1; i <= frame_cnt; i++) { - //printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_cnt,i); + printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_cnt,i); frame_info.first_frame = i == 1 ? true : false; frame_info.last_frame = i == frame_cnt ? true : false; - func_sig = snap_func(frame_info, channels,time_out); + func_sig = snap_func(frame_info, channels,time_out,i); if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? { i--; @@ -513,12 +496,12 @@ void MultiFrameCapture::snaprun() { video->HtCamGetFrameNum(frame_num); int val = frame_num - i; //剩余还未采集的帧数 - int ind = i++; //只是计数确认采集到低多少帧,无其他实用意义 + int ind = i + 1; //只是计数确认采集到低多少帧,无其他实用意义 while (val) { frame_info.last_frame = val == 1 ? true : false; - func_sig = snap_func(frame_info, channels,time_out);//同上面一样 - //printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); + func_sig = snap_func(frame_info, channels,time_out ,ind);//同上面一样 + printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); if (func_sig == -1 ) { @@ -542,7 +525,9 @@ void MultiFrameCapture::snaprun() ////////////////////////////采集过快会导致队列堆积///////////////////////// ////////////////////////////所以这个延时是采集速度和传图速度的差值///////////////////////// ////////////////////////////DPI 颜色不同 会导致数据大小不同所以这个地方延时肯定不一样 目前 60是200dpi///////////////////////// - this_thread::sleep_for(std::chrono::milliseconds(35)); + int mill = resolution_ == DPI_600 ? 60 * 10 : 10; + + this_thread::sleep_for(std::chrono::milliseconds(mill)); } video->HtCamStopVideoCapturing(); @@ -613,8 +598,10 @@ void MultiFrameCapture::procimage() static int temp_val = 0; bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { + printf("校正DPI[%d] 校正颜色:%s\n",dpi==1?200:(dpi==2?300:600),mode == IMAGE_COLOR?"彩色":"灰色"); int config_dpi = dpi == 1 ? 2 : dpi; const int offset_indexs[] = {3, 4, 5, 2, 1, 0 ,0, 1, 2, 5, 4, 3}; + int channels = mode == IMAGE_COLOR ? 3 : 1; int height = 60; int width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 864); @@ -943,9 +930,9 @@ void MultiFrameCapture::correctcolor(int correctmode) { StopWatch sw_correct; std::string loginfo = "Start Correctcolor 300DPI Gray \r\n"; - printf("----------- %s \n",loginfo.c_str()); + //printf("----------- %s \n",loginfo.c_str()); //creatcorrectconfig(0x02, IMAGE_GRAY); - printf("----------- done \n",loginfo.c_str()); + //printf("----------- done \n",loginfo.c_str()); loginfo = "Start Correctcolor 300DPI COLOR \r\n"; printf("----------- %s \n",loginfo.c_str()); @@ -1067,8 +1054,9 @@ void MultiFrameCapture::openDevice(int dpi, int mode) configFPGAParam(config_color, config_dpi); printf(" -----------------------resolution = %d config_color = %d config_dpi:%d------------------\r\n",resolution_, config_color,config_dpi); { - video->HtCamSetFrameCnt(1); - printf(" -----------------------设置帧数:%d------------------\r\n",cnt); + int val = 1; + video->HtCamSetFrameCnt(val); + printf(" -----------------------设置帧数:%d------------------\r\n",val); } diff --git a/MultiFrameCapture.h b/MultiFrameCapture.h index ee4de07..ca2eb39 100644 --- a/MultiFrameCapture.h +++ b/MultiFrameCapture.h @@ -12,7 +12,7 @@ class Gpio; class GpioOut; #define WIDTH 5184 -#define HEIGHT 513 //只能为3的倍数 +#define HEIGHT 650 //只能为3的倍数 #define DPI_600 0 #define DPI_300 1 #define COLOR 1 diff --git a/Scanner.cpp b/Scanner.cpp index 5adde26..3ca8247 100644 --- a/Scanner.cpp +++ b/Scanner.cpp @@ -210,14 +210,10 @@ void Scanner::runScan() { LOG("-------------Scanner RunScan Start-------------\r\n"); capturer->open(); - printf("11111111111111111111\r\n"); motorZouzhi.start(); - motorCuozhi.pauseWaitForThread(); - //capturer->open(); - //sensor->enableDoubleSensor(false); - + if (!isPaperInit) { @@ -225,10 +221,7 @@ void Scanner::runScan() isPaperInit = true; } - // for (size_t i = 0; i < 16; i++) - // { - // std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl; - // } + this_thread::sleep_for(std::chrono::milliseconds(200)); imageindex = 0; //*capturer->setFPGATriggerMode(false, 0); @@ -238,11 +231,8 @@ void Scanner::runScan() sensor->resetPaperPin(); capturer->clearimages(); - capturer->resetimageremain(); - capturer->setScanFlag(true); - bool b_autosize = m_config.params.pageSize==(int)PaperSize::G400_AUTO || m_config.params.pageSize==(int)PaperSize::G400_MAXAUTO || @@ -269,7 +259,7 @@ void Scanner::runScan() } sensor->enableDoubleSensor(m_config.params.doubleFeeded); - LOG("enableDoubleSensor QQQQQQQ:%s %s\n", m_config.params.doubleFeeded ? "true" : "false",GetCurrentTimeStamp(2).c_str()); + //LOG("enableDoubleSensor QQQQQQQ:%s %s\n", m_config.params.doubleFeeded ? "true" : "false",GetCurrentTimeStamp(2).c_str()); if (m_DstScannum == 0) //被取消扫描了 { LOG("canceled canceled canceled 999999999999999999999999999999999999999999 \n"); @@ -353,7 +343,7 @@ void Scanner::runScan() LOG("\n ----------------EXIT 11111---------------- \n"); break; } - LOG("\nclose double sensor %s\n",GetCurrentTimeStamp(2).c_str()); + //LOG("\nclose double sensor %s\n",GetCurrentTimeStamp(2).c_str()); sensor->enableDoubleSensor(false); if(b_autosize) @@ -406,7 +396,7 @@ void Scanner::runScan() std::this_thread::yield(); - //printf("7777777777777777777777777777777777777\r\n"); + this_thread::sleep_for(std::chrono::milliseconds(200)); } else diff --git a/Sensor.cpp b/Sensor.cpp index 687ef17..dccf172 100644 --- a/Sensor.cpp +++ b/Sensor.cpp @@ -145,6 +145,8 @@ void Sensor::monitor() pfd.events = POLLPRI; StopWatch sw; + StopWatch sw1; + StopWatch sw2; num = read(pfd.fd, buf, 8); // This is to clear the avaible read std::cout<<"read time "<< sw.elapsed_ms()<notify_all(); - LOG("\n *************scanpin %d time = %s ********* \n",ret,GetCurrentTimeStamp(2).c_str()); + printf("\n *************scanpin %d time = %s ********* \n",ret,GetCurrentTimeStamp(2).c_str()); //sw.reset(); while(sw.elapsed_ms() < 10) { diff --git a/scanservices_utils.h b/scanservices_utils.h index d8bf7ca..341f6e8 100644 --- a/scanservices_utils.h +++ b/scanservices_utils.h @@ -293,7 +293,7 @@ struct V4L2_DATAINFO struct V4L2_DATAINFO_Ex:V4L2_DATAINFO { unsigned int snaped_index; - unsigned int frame_index; //采集第几帧 + unsigned int frame_index; //总帧数 unsigned int dpi; //dpi unsigned int error_code; unsigned int first_frame; //第一帧