diff --git a/zynq_7010_code/FsmState.cpp b/zynq_7010_code/FsmState.cpp index 5820e5d..e31aaa7 100644 --- a/zynq_7010_code/FsmState.cpp +++ b/zynq_7010_code/FsmState.cpp @@ -16,15 +16,15 @@ std::map> FsmStateManager::fsmStates; void StandbyState::initial() { - LOG("StandbyState \n"); - typeName = "StandbyState"; + printf("INIT FSM:扫描仪准备完成 \n"); + //typeName = "StandbyState"; scanner->getPanelLeds().setStatus(LedStatus::Ready); doReset(); } FsmState *StandbyState::on_event(ScanEvent event) { - LOG("StandbyState on_event %d \n", event); + printf("FSM:扫描仪准备完成-->返回状态 %d \n", event); if (event == S_EVT_COVER_OPENED) { return FsmStateManagerEx::GetState(); @@ -37,7 +37,6 @@ FsmState *StandbyState::on_event(ScanEvent event) { if (scanner->getSensor().isPaperStandby()) { - LOG("StandbyState on_event : %s \n", "true"); return FsmStateManagerEx::GetState(); } } @@ -58,14 +57,14 @@ void StandbyState::doReset() void CoverOpenState::initial() { - LOG("CoverOpenState \n"); - typeName = "CoverOpenState"; + printf("INIT 状态机检测:设备开盖 \n"); + scanner->getPanelLeds().setStatus(LedStatus::CoverOpen); } FsmState *CoverOpenState::on_event(ScanEvent event) { - LOG("CoverOpenState on_event %d \n", event); + printf("状态机检测:设备开盖--->返回状态: %s %d \n", event == S_EVT_COVER_CLOSED?"关盖":"开盖",event); if (event == S_EVT_COVER_CLOSED) { if (!scanner->getSensor().isPaperAtScan()) @@ -92,37 +91,34 @@ InitState::InitState() FsmState *InitState::on_event(ScanEvent event) { - LOG("InitState on_event %d \n", event); if (!(scanner->getSensor().isCoverClosed())) { + printf("FSM:开盖\r\n"); return FsmStateManagerEx::GetState(); } + else if ((scanner->getSensor().isPaperIn())) + { + printf("FSM:卡纸\r\n"); + return FsmStateManagerEx::GetState(); + } else if (scanner->getSensor().isPaperStandby()) { - LOG("------------------有纸\r\n"); + printf("FSM:有纸\r\n"); return FsmStateManagerEx::GetState(); } - else if ((scanner->getSensor().isPaperAtScan())) - { - LOG("------------------卡纸\r\n"); - return FsmStateManagerEx::GetState(); - } - else - LOG("---------扫描仪已经准备完成------\r\n"); + return FsmStateManagerEx::GetState(); } void InitState::initial() { - LOG("InitState 999 \n"); - typeName = "InitState"; //啥用? + printf("INIT FSM:初始化设备\r\n"); scanner->put(S_EVT_NORES); } void ErrorJamState::initial() { - LOG("ErrorJamState \n"); - typeName = "ErrorJamState"; + printf("INIT FSM:卡纸\r\n"); scanner->getPanelLeds().setStatus(LedStatus::Abnormal); } @@ -133,7 +129,7 @@ void ErrorJamState::doPaper_pullout() FsmState *ErrorJamState::on_event(ScanEvent event) { - //LOG("ErrorJamState on_event %d \n", event); + //printf("ErrorJamState on_event %d \n", event); if (scanner->getSensor().isCoverClosed() && !scanner->getSensor().isPaperStandby() && !scanner->getSensor().isPaperIn()) { return FsmStateManagerEx::GetState(); @@ -144,6 +140,7 @@ FsmState *ErrorJamState::on_event(ScanEvent event) } else if (event == S_EVT_PAPER_PULLOUT) // && scanner->GetIsDoublePaper() { + printf("啥玩意?????????????\r\n"); scanner->paper_pullout(); return this; } @@ -153,10 +150,8 @@ FsmState *ErrorJamState::on_event(ScanEvent event) { return FsmStateManagerEx::GetState(); } - else //if (scanner->getSensor().isPaperStandby() && !scanner->getSensor().isPaperIn()) + else { - //LOG("ErrorJamState GetIsDoublePaper %s \n", scanner->GetIsDoublePaper() ? "TRUE" : "FALSE"); - //LOG("ErrorJamState GetIsJamPaper %s \n", scanner->GetIsJamPaper() ? "TRUE" : "FALSE"); if (!scanner->GetIsDoublePaper() && !scanner->GetIsJamPaper() && !scanner->getSensor().isPaperAtScan()) { if (scanner->getSensor().isPaperStandby()) @@ -171,15 +166,14 @@ FsmState *ErrorJamState::on_event(ScanEvent event) void PaperReadyState::initial() { - - LOG("PaperReadyState setStatus(PanelLeds::Ready) \n"); - typeName = "PaperReadyState"; + printf("INIT FSM:设备已放纸\r\n"); + //typeName = "PaperReadyState"; scanner->getPanelLeds().setStatus(LedStatus::Ready); } FsmState *PaperReadyState::on_event(ScanEvent event) { - LOG("FsmState PaperReadyState on_event %d \n",event); + printf("FSM :设备已放纸--->返回状态: %d \n",event); if (event == S_EVT_COVER_OPENED) { return FsmStateManagerEx::GetState(); @@ -204,14 +198,14 @@ FsmState *PaperReadyState::on_event(ScanEvent event) void ErrorState::initial() { - LOG("ErrorState \n"); - typeName = "ErrorState"; + printf("ErrorState \n"); + //typeName = "ErrorState"; scanner->getPanelLeds().setStatus(LedStatus::Abnormal); } FsmState *ErrorState::on_event(ScanEvent event) { - LOG("ErrorState on_event %d \n", event); + printf("ErrorState on_event %d \n", event); if (event == S_EVT_COVER_OPENED) { return FsmStateManagerEx::GetState(); @@ -223,7 +217,7 @@ FsmState *ErrorState::on_event(ScanEvent event) } else if (event == S_EVT_PAPER_STANDBY) { - LOG("ErrorState on_event S_EVT_PAPER_STANDBY\n"); + printf("ErrorState on_event S_EVT_PAPER_STANDBY\n"); if (scanner->getSensor().isPaperStandby()) //有纸 且没卡纸 { return FsmStateManagerEx::GetState(); @@ -258,51 +252,52 @@ FsmState *ErrorState::on_event(ScanEvent event) void ScanningState::initial() { - LOG("ScanningState \n"); - typeName = "ScanningState"; + printf("INIT FSM: 正在扫描中\n"); + //typeName = "ScanningState"; scanner->getPanelLeds().setStatus(LedStatus::Scanning); scanner->startScan(); } FsmState *ScanningState::on_event(ScanEvent event) { - LOG("ScanningState on_event \n"); + printf("FSM: 正在扫描中-->返回状态:%d \n",event); if (event == S_EVT_COVER_IN_OPEN) { return FsmStateManagerEx::GetState(); } else if (event == S_EVT_STOP_SCAN) { - LOG("ScanningState call for %d \n", event); + printf("ScanningState call for %d \n", event); scanner->getPanelLeds().setStatus(LedStatus::StopScan); scanner->stop_scan(); auto ret = scanner->getSensor().isPaperStandby() ? FsmStateManagerEx::GetState() : FsmStateManagerEx::GetState(); return ret; - } else if (event == S_EVT_COVER_OPENED) { - //scanner->stop_scan(); + printf("FSM :正在扫描中:开盖状态\r\n"); scanner->emergency_stop(S_EVT_COVER_OPENED); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_DOUBLEPAPER) { scanner->SetIsDoublePaper(true); - scanner->emergency_stop(1); - LOG("\nScanningState S_EVT_DOUBLEPAPER %s \n",GetCurrentTimeStamp(2).c_str()); + scanner->emergency_stop(S_EVT_ERROR_DOUBLEPAPER); + + //scanner->stop_scan(); 保留双张就不需要紧急停止 + printf("FSM :正在扫描中: 双张\n"); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_JAM_IN) { - scanner->emergency_stop(0); - LOG("ScanningState S_EVT_JAM_IN \n"); + scanner->emergency_stop(S_EVT_JAM_IN); + printf("FSM :正在扫描中: 搓纸失败 \n"); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_JAM_OUT) { - scanner->emergency_stop(0); - LOG("ScanningState S_EVT_JAM_OUT \n"); + scanner->emergency_stop(S_EVT_JAM_OUT); + printf("FSM :正在扫描中: 卡纸 \n"); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_PAPER_AT_SCAN) diff --git a/zynq_7010_code/FsmState.h b/zynq_7010_code/FsmState.h index 6966aae..5a4a567 100644 --- a/zynq_7010_code/FsmState.h +++ b/zynq_7010_code/FsmState.h @@ -43,6 +43,29 @@ enum ScanEvent { class FsmState { public: + + char * int_to_string(ScanEvent event) + { + switch (event) + { + case S_EVT_COVER_OPENED: + return "开盖"; + case S_EVT_COVER_CLOSED: + return "关盖"; + case S_EVT_JAM_OUT: + return "卡纸"; + case S_EVT_PAPER_STANDBY: + return "纸张准备完成"; + case S_EVT_START_SCAN: + return "开始扫描"; + case S_EVT_CLEAR_ERR: + return "清除错误"; + + default: + break; + } + } + FsmState(); virtual ~FsmState(); @@ -62,6 +85,8 @@ class FsmStateManager { protected: static std::map> fsmStates; + + }; template @@ -72,12 +97,17 @@ public: { std::string type_name = typeid(T).name(); std::map>::iterator iter = fsmStates.find(type_name); - if (iter == fsmStates.end()) { + if (iter == fsmStates.end()) + { fsmStates.insert(std::pair>(type_name, std::shared_ptr(new T))); } fsmStates[type_name]->initial(); return fsmStates[type_name].get(); } + + static std::map fsm; + + }; //???? diff --git a/zynq_7010_code/MultiFrameCapture.cpp b/zynq_7010_code/MultiFrameCapture.cpp index f36dc61..01e934c 100644 --- a/zynq_7010_code/MultiFrameCapture.cpp +++ b/zynq_7010_code/MultiFrameCapture.cpp @@ -19,7 +19,6 @@ const int vsp_B = 45; #define ARRAYLEN(table) (sizeof(table) / sizeof(table[0])) // using namespace cv; MultiFrameCapture::MultiFrameCapture(ScannerGlue glue) : - snaped_index(0), frame_count(1), b_snap_run(true), b_stop_snap(false), @@ -104,7 +103,6 @@ void MultiFrameCapture::snap() video->HtCamStartVideoCapturing(); - snaped_index++; m_cv_snap.notify_all(); #endif } @@ -303,23 +301,28 @@ void MultiFrameCapture::waitsnapdone(int state) StopWatch sw; sw.reset(); - printf("!!!!!!!!!!!!!!!! m_cv_snapdone wait \n"); - V4L2_DATAINFO_Ex info; - info.snaped_index = snaped_index; - info.snap_end = true; - info.error_code = state; + HG_JpegCompressInfo ip; + ip.error_code = state; + ip.height = 0; + ip.width = 0; + ip.index_frame = 0; + ip.DataLength = sizeof("0"); + ip.first_frame = false; + ip.last_frame = true; + ip.pJpegData = (unsigned char*)"0"; + if (b_end_snap) - { - m_frameinfos.Put(info); + { + m_glue.m_imageready(ip); return; } sw.reset(); std::unique_lock lock(m_mtx_snapdone); m_cv_snapdone.wait(lock); + + m_glue.m_imageready(ip); //发一次空包 b_end_snap = true; - m_frameinfos.Put(info); printf("!!!!!!!!!!!!!!!! m_cv_snapdone wait done :%f \n",sw.elapsed_ms()); - } bool MultiFrameCapture::IsImageQueueEmpty() @@ -376,7 +379,7 @@ void MultiFrameCapture::configFPGAParam(int mode, int dpi) 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 info_ex, int channels,int &time_out,int i) { StopWatch sw; sw.reset(); @@ -391,9 +394,9 @@ void MultiFrameCapture::snaprun() 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(info_ex.height, info_ex.width, CV_8UC1, data, cv::Mat::AUTO_STEP); - // printf("获取数据 width:%d height:%d \r\n",frame_info.width,frame_info.height); + // printf("获取数据 width:%d height:%d \r\n",info_ex.width,info_ex.height); //cv::imwrite("/home/root/test+_" + to_string(i)+".bmp", mat); // printf("--------------frame_index------------:%d\r\n",frame_index); @@ -403,7 +406,7 @@ void MultiFrameCapture::snaprun() //cv::imwrite("/home/root/test.bmp", mat); //savebitmap(data,15552,512,"1.bmp"); } - //frame_info.mat = mat.clone(); + //info_ex.mat = mat.clone(); //JpegCompress cmp(90); //HG_JpegCompressInfo info = cmp.GetCompressedImg(mat); @@ -413,20 +416,19 @@ void MultiFrameCapture::snaprun() info.pJpegData = data; info.dpi = false ; - info.DataLength = frame_info.width * frame_info.height; - info.first_frame = frame_info.first_frame; - info.last_frame = frame_info.last_frame; - info.index_frame = frame_info.frame_index; - info.data_type = 0; - 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); + info.DataLength = info_ex.width * info_ex.height; + info.first_frame = info_ex.first_frame; + info.last_frame = info_ex.last_frame; + info.index_frame = info_ex.frame_index + 1; //这个 +1 是最后一帧的假包,作用是返回错误代码的时候和数据段一起。 + info.width = info_ex.width; + info.height = info_ex.height; + + //printf("获取数据 width:%d height:%d is_first:%d is_last:%d DataLength:%d\r\n",info_ex.width,info_ex.height,info.first_frame,info.last_frame,info.DataLength); m_glue.m_imageready(info); - //m_frameinfos.Put(frame_info); - //printf("采集图像耗时:%f\r\n",sw.elapsed_ms()); + //m_frameinfos.Put(info_ex); + printf("采集图像耗时:%f\r\n",sw.elapsed_ms()); } return ret; }; @@ -438,15 +440,15 @@ void MultiFrameCapture::snaprun() m_cv_snap_is_scaning = false; m_cv_snap.wait(lock); m_cv_snap_is_scaning = true; - V4L2_DATAINFO_Ex frame_info; - frame_info.pixtype = color_mode_; - frame_info.dpi = resolution_; - frame_info.width = pixels_width_; - frame_info.height = pixels_height_; - frame_info.error_code = 0; - frame_info.snaped_index = snaped_index; - frame_info.first_frame = false; - frame_info.last_frame = false; + + V4L2_DATAINFO_Ex frame_info_; + frame_info_.pixtype = color_mode_; + frame_info_.dpi = resolution_; + frame_info_.width = pixels_width_; + frame_info_.height = pixels_height_; + frame_info_.error_code = 0; + frame_info_.first_frame = false; + frame_info_.last_frame = false; int channels = color_mode_ == 1 ? 3 : 1; int color_mode = video->HtCamGetColorMode(); @@ -472,7 +474,7 @@ void MultiFrameCapture::snaprun() video->HtCamGetFrameCnt(frame_cnt); printf("获取设置的帧数:%d\r\n",frame_cnt); - frame_info.frame_index = frame_cnt + 1; + frame_info_.frame_index = frame_cnt + 1; // video->HtCamSetVsnpTime(ti); // printf("设置 vsnp:%d\r\n",ti); //ti++; @@ -484,13 +486,13 @@ void MultiFrameCapture::snaprun() printf("mill:%d\r\n",mill); StopWatch sw; sw.reset(); - for (size_t i = 1; i <= frame_info.frame_index ; i++) + for (size_t i = 1; i <= frame_info_.frame_index ; i++) { - printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info.frame_index,i); - frame_info.first_frame = i == 1 ? true : false; - frame_info.last_frame = i == frame_info.frame_index ? true : false; + printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info_.frame_index,i); + frame_info_.first_frame = i == 1 ? true : false; + //frame_info_.last_frame = i == frame_info_.frame_index ? true : false; - func_sig = snap_func(frame_info, channels,time_out,i); + func_sig = snap_func(frame_info_, channels,time_out,i); if (b_stop_snap) { @@ -501,12 +503,12 @@ void MultiFrameCapture::snaprun() while (val > 0) { - frame_info.last_frame = val == 1 ? true : false; - frame_info.frame_index = frame_num; + //frame_info_.last_frame = val == 1 ? true : false; + frame_info_.frame_index = frame_num; ind++; printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); - func_sig = snap_func(frame_info, channels,time_out ,ind);//同上面一样 + func_sig = snap_func(frame_info_, channels,time_out ,ind);//同上面一样 val--; if(resolution_ == DPI_600) @@ -538,47 +540,11 @@ void MultiFrameCapture::snaprun() void MultiFrameCapture::updatesnapstatus(int papertype) { b_stop_snap = false; - snaped_index = 0; } void MultiFrameCapture::procimage() { - static int idx = 0; - ThreadPool prc_pool(4); - std::queue> prc_fu; - unsigned int frames_height; - unsigned int frames_width = 0; - int cnt_ =0; - - while (b_imgproc) - { - - V4L2_DATAINFO_Ex frame = m_frameinfos.Take(); - static int inx = 0; - - if (!frame.mat.empty()) - { - JpegCompress cmp(100); - - HG_JpegCompressInfo info = cmp.GetCompressedImg(frame.mat); - - // info.pJpegData = (unsigned char *)malloc(frame.width * frame.height); - //memcpy(info.pJpegData,frame.mat.data,frame.width * frame.height); - //info.mat = frame.mat; - // frame.mat.copyTo(info.mat); - //info.mat = frame.mat.clone(); - //info.DataLength = frame.width * frame.height; - info.first_frame = frame.first_frame; - info.last_frame = frame.last_frame; - info.index_frame = frame.frame_index; - info.data_type = 0; - info.width = frame.width; - info.height = frame.height; - //cv::imwrite("/home/root/opencv"+to_string(cnt_++)+".bmp",frame.mat); - m_glue.m_imageready(info); - } - continue; - } + } static int temp_val = 0; #define CIS_6CH diff --git a/zynq_7010_code/MultiFrameCapture.h b/zynq_7010_code/MultiFrameCapture.h index 1bfd915..f28878e 100644 --- a/zynq_7010_code/MultiFrameCapture.h +++ b/zynq_7010_code/MultiFrameCapture.h @@ -29,7 +29,6 @@ typedef CSSIZE SIZE; class MultiFrameCapture : public ICapturer { private: - int frame_height = 60; int m_total_height = 0; int readframe_timeout = 100; @@ -42,7 +41,6 @@ private: bool b_end_snap; bool b_imgproc; bool is_size_error; - int snaped_index; bool bScanning; std::atomic iImageremain; FPGAConfigParam m_fpgaparam; diff --git a/zynq_7010_code/Scanner.cpp b/zynq_7010_code/Scanner.cpp index ca579ce..c35e19a 100644 --- a/zynq_7010_code/Scanner.cpp +++ b/zynq_7010_code/Scanner.cpp @@ -144,13 +144,21 @@ void Scanner::processevent(FsmState *fsmState, ScanEvent event) { return; } - - if (typeid(*fsmState) == typeid(CoverOpenState)) + //开盖模式:1 扫描中开盖 2 未扫描的时候开盖 ,目前我想不到更好的方法,暂时先这样处理 + if (event == S_EVT_COVER_OPENED && isScaning) { + //printf("回调:开盖\r\n"); m_glue.m_deviceevent(1, "Cover Open"); } + else if (typeid(*fsmState) == typeid(CoverOpenState) && !isScaning) + { + //printf("回调:开盖\r\n"); + m_glue.m_deviceevent(1, "Cover Open"); + } + else if (event == S_EVT_SCAN_STOPPED) { + //printf("回调:停止\r\n"); if (!m_correctting) { m_glue.m_deviceevent(70, "Scan done"); @@ -158,18 +166,24 @@ void Scanner::processevent(FsmState *fsmState, ScanEvent event) } else if (event == S_EVT_JAM_IN) { + //printf("回调:搓纸失败\r\n"); m_glue.m_deviceevent(4, "Feed error"); } else if (event == S_EVT_DOUBLEPAPER) { + //printf("回调:双张\r\n"); m_glue.m_deviceevent(16, "Double feed"); } else if (event == S_EVT_JAM_OUT || typeid(*fsmState) == typeid(ErrorJamState)) { + + //printf("回调:卡纸\r\n"); m_glue.m_deviceevent(8, "Jam out"); } else if (typeid(*fsmState) == typeid(ErrorState) && m_jamIn == true) { + + //printf("回调:搓纸失败\r\n"); m_glue.m_deviceevent(4, "Feed error"); } if (!IsScanning() && (typeid(*fsmState) == typeid(ErrorJamState) || @@ -178,6 +192,7 @@ void Scanner::processevent(FsmState *fsmState, ScanEvent event) { if (!m_correctting) { + //printf("回调:停止\r\n"); m_glue.m_deviceevent(70, "Scan Stop"); } } @@ -192,9 +207,10 @@ void Scanner::runScan() if (!isPaperInit) { - preFeed(); + preFeed(); isPaperInit = true; } + this_thread::sleep_for(std::chrono::milliseconds(200)); sensor->resetPaperPin(); @@ -208,8 +224,9 @@ void Scanner::runScan() m_config.params.pageSize==(int)PaperSize::G400_MAXSIZE; StopWatch sw; StopWatch sw1; - StopWatch sw2; + isScaning = true; + int error_code = 0; while (m_DstScannum > 0) { isScaning = true; @@ -235,7 +252,7 @@ void Scanner::runScan() break; } - motorCuozhi.startAsyn(); + motorCuozhi.startAsyn(); // if (!sensor->isPaperStandby()) { put(S_EVT_STOP_SCAN); @@ -270,29 +287,36 @@ void Scanner::runScan() max = m_config.params.dpi > 2 ? 30 : max * m_config.params.dpi; + if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19 || m_config.params.slow_moire) { max = 200; } - + + waitpapertime = 200; - sw2.reset(); while (!sensor->waitPaperOut(waitpapertime) && i < max) { - + //printf("max :%d i:%d\r\n",max,i); i++; if (!sensor->isPaperIn()) { - LOG("paper 假卡纸了。。。。。\n"); + printf("paper 假卡纸了。。。。。\n"); isScaning = false; break; } } + if (!sensor->isCoverClosed()) + { + break; + } + if (i == max && sensor->isPaperIn()) { if (!m_isDoublePaper) { + error_code = S_EVT_JAM_OUT; m_glue.m_deviceevent(8, "Jam out"); //卡纸 m_jamPaper = true; put(S_EVT_JAM_OUT); @@ -305,8 +329,7 @@ void Scanner::runScan() // LOG("paper 双张了。。。。。\n"); m_scaninfo.DoubleNum++; } - capturer->stopsnap(b_autosize); - capturer->waitsnapdone(1);//等待采集完成 + capturer->waitsnapdone(error_code);//等待采集完成 this_thread::sleep_for(std::chrono::milliseconds(500));//200 80ms 600 260ms isScaning = false; break; @@ -345,16 +368,17 @@ void Scanner::runScan() { m_glue.m_deviceevent((int)HG_ScannerStatus::PAPER_HOLE,"paper have hole"); - capturer->waitsnapdone(1);//等待采集完成 - - capturer->stopsnap(b_autosize); + capturer->waitsnapdone((int)HG_ScannerStatus::PAPER_HOLE);//等待采集完成 isScaning = false; break; } } capturer->stopsnap(b_autosize); - capturer->waitsnapdone(m_isDoublePaper || m_jamPaper);//等待采集完成 + + error_code = m_isDoublePaper ? S_EVT_DOUBLEPAPER : m_jamPaper ? S_EVT_JAM_OUT :0; + + capturer->waitsnapdone(error_code);//等待采集完成 m_DstScannum--; m_scaninfo.RollerNum++; m_scaninfo.TotalScanned++; @@ -391,6 +415,7 @@ void Scanner::runScan() sensor->enableDoubleSensor(false); sensor->resetPaperPin(); capturer->setScanFlag(false); + capturer->stopsnap(b_autosize); int t_delay = m_config.params.dpi == 0x02 ? 150 : (m_config.params.dpi == 0x03 ? 350 : 100); @@ -444,3 +469,70 @@ std::string Scanner::GetSysInfo() m_scansysinfo.reset(new SysInforTool(info)); return m_scansysinfo->GetSysInfo(); } + +void Scanner::emergency_stop(int id) +{ + sensor->cancelWaitPaper(); + sensor->enableDoubleSensor(false); + m_DstScannum = 0; + if (id == S_EVT_ERROR_DOUBLEPAPER) //双张 + m_glue.m_deviceevent(S_EVT_ERROR_DOUBLEPAPER, "double feed"); + // else if(id == S_EVT_COVER_OPENED) + // m_glue.m_deviceevent(S_EVT_COVER_OPENED, "cover opened"); + + motorCuozhi.stop(); + motorZouzhi.stop(); + + + capturer->stopsnap(true); + put(S_EVT_SCAN_STOPPED); + SaveScaninfo(m_scaninfo); + start_enter_lowpwoer(); + printf("emergency_stop capturer->close() \n"); +} +void Scanner::stop_scan() +{ + sensor->cancelWaitPaper(); + sensor->enableDoubleSensor(false); + m_DstScannum = 0; + if (threadRunScan.joinable()) + threadRunScan.join(); + motorZouzhi.stop(); + motorCuozhi.stop(); + + put(S_EVT_SCAN_STOPPED); + SaveScaninfo(m_scaninfo); + start_enter_lowpwoer(); + printf("stop_scan stop_scan stop_scan\r\n"); +} +void Scanner::reset() +{ + if (!sensor->isPaperStandby()) + { + motorCuozhi.reset(); + isRested = true; + isPaperInit = false; + LOG("Scanner->motorCuozhi is reseted \n"); + } +} +void Scanner::paper_pullout() +{ + if (!m_isPulling) + m_isPulling = true; + + motorCuozhi.stop(); + motorZouzhi.speedChange(1); + motorZouzhi.setDirection(1); + motorZouzhi.start(); + if (sensor->waitPaperOut(5000)) + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + motorZouzhi.stop(); + motorZouzhi.speedRecover(); + m_isPulling = false; +} + +void Scanner::UpdateScanInfo() +{ + m_scaninfo = GetScanInfoFromJson(); + updateSpeedMode(); +} \ No newline at end of file diff --git a/zynq_7010_code/Scanner.h b/zynq_7010_code/Scanner.h index a433c5c..8318c9b 100644 --- a/zynq_7010_code/Scanner.h +++ b/zynq_7010_code/Scanner.h @@ -23,146 +23,41 @@ class MemoryInfo; class Scanner { +public: + bool isRested = false; + bool isScaning = false; public: Scanner(ScannerGlue glue); ~Scanner(); -public: - bool isRested = false; - bool isScaning = false; void startScan(); - void emergency_stop(int id) - { - - sensor->cancelWaitPaper(); - m_DstScannum = 0; - if (id == 1) //双张 - m_glue.m_deviceevent(16, "double feed"); - - motorCuozhi.stop(); - motorZouzhi.stop(); - - put(S_EVT_SCAN_STOPPED); - SaveScaninfo(m_scaninfo); - start_enter_lowpwoer(); - printf("emergency_stop capturer->close() \n"); - } - - void stop_scan() - { - sensor->cancelWaitPaper(); - m_DstScannum = 0; - if (threadRunScan.joinable()) - threadRunScan.join(); - motorZouzhi.stop(); - motorCuozhi.stop(); - - put(S_EVT_SCAN_STOPPED); - SaveScaninfo(m_scaninfo); - start_enter_lowpwoer(); - LOG("stop_scan() exit22222222 \n"); - } - - Sensor &getSensor() { return *sensor.get(); } - PanelLeds &getPanelLeds() { return panelLeds; } - int readreg(int addr) { return capturer->read(addr); } - void put(ScanEvent evt) { sysEvent.Put(evt); } - void reset() - { - if (!sensor->isPaperStandby()) - { - motorCuozhi.reset(); - isRested = true; - isPaperInit = false; - LOG("Scanner->motorCuozhi is reseted \n"); - } - } - void paperReady() - { - LOG("paperReady 22222222 \n"); - motorZouzhi.start(); - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - motorZouzhi.stop(); - } - bool isFeederLoaded() { return sensor->isPaperStandby(); } - void ConfigScanParam(HG_ScanConfiguration config) - { - m_config = config; - LOG("m_config.params.dpi = %d \n \ - m_config.params.isColor = %d \n \ - m_config.params.pageSize = %d \n \ - m_config.params.isCorrect = %d \n", - m_config.params.dpi, - m_config.params.isColor, - m_config.params.pageSize, - m_config.params.isCorrect); - capturer->UpdateScanParam(config); - } - + void emergency_stop(int id); //只要调用 直接停止整个扫描流程 + void stop_scan(); //扫描线程结束才会停止 + void reset(); + void paper_pullout(); void CreatCorrectData(int correctmode); - void SetDstScanNum(int scannum) { m_DstScannum = scannum; } - void paper_pullout() - { - LOG("paper_pullout 22222222 \n"); - if (!m_isPulling) - m_isPulling = true; + void UpdateScanInfo(); + void updateSpeedMode(); + std::string GetSysInfo(); - motorCuozhi.stop(); - motorZouzhi.speedChange(1); - motorZouzhi.setDirection(1); - motorZouzhi.start(); - if (sensor->waitPaperOut(5000)) - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - motorZouzhi.stop(); - motorZouzhi.speedRecover(); - m_isPulling = false; - } +public: + Sensor &getSensor() { return *sensor.get(); } + PanelLeds &getPanelLeds() { return panelLeds; } + inline int readreg(int addr) { return capturer->read(addr); } + inline bool isFeederLoaded() { return sensor->isPaperStandby(); } + inline void put(ScanEvent evt) { sysEvent.Put(evt); } - void SetIsDoublePaper(bool isdoublepaper) - { - m_isDoublePaper = isdoublepaper; - } + inline void ConfigScanParam(HG_ScanConfiguration config) {capturer->UpdateScanParam(m_config = config); } + inline void SetDstScanNum(int scannum) { m_DstScannum = scannum; } + inline void SetIsDoublePaper(bool isdoublepaper) { m_isDoublePaper = isdoublepaper; } - bool GetIsDoublePaper() - { - return m_isDoublePaper; - } + inline bool GetIsDoublePaper() { return m_isDoublePaper; } + inline bool GetIsJamPaper() { return m_jamPaper; } + inline bool GetIsJamIn() { return m_jamIn; } + inline void ResetJamIn() { m_jamIn = false; } + inline bool IsScanning() { return !capturer->IsImageQueueEmpty(); } + inline void close_v4l2() { capturer->close(); } - bool GetIsJamPaper() - { - return m_jamPaper; - } - - bool GetIsJamIn() - { - return m_jamIn; - } - - void ResetJamIn() - { - m_jamIn = false; - } - bool IsScanning() - { - return !capturer->IsImageQueueEmpty(); - } - - void close_v4l2() - { - capturer->close(); - } - - void writeParamars(std::string type, int *value) - { - // capturer->m_configprop->writeParamars(type, value); - } - - void UpdateScanInfo() - { - m_scaninfo = GetScanInfoFromJson(); - printf(" UpdateScanInfo speed mode = %d \n",m_scaninfo.SpeedMode); - updateSpeedMode(); - } CaptureParams GetCaptureParams() { CaptureParams param; @@ -170,30 +65,19 @@ public: // return capturer->m_configprop->captureParmars; } - ScannerScanInfo &GetScanInfo() - { - return m_scaninfo; - } - void updateSpeedMode(); - void ResetCorrectflags() { m_correctting = false; } - void StopScan(int Evt) - { - put(S_EVT_STOP_SCAN); - //capturer->clearimages(); - //capturer->resetimageremain(); - //m_glue.m_deviceevent(70, "Scan done"); - } - std::string GetSysInfo(); + ScannerScanInfo &GetScanInfo() { return m_scaninfo; } + ScannerSysInfo &GetSysinfoStruct() { return m_scansysinfo->GetInfo(); } + void ResetCorrectflags() { m_correctting = false; } + void StopScan(int Evt) { put(S_EVT_STOP_SCAN); } - ScannerSysInfo &GetSysinfoStruct() { return m_scansysinfo->GetInfo(); } private: //处理事件 void processevent(FsmState *fsmState, ScanEvent event); - void startZouzhi() { motorZouzhi.start(); } - void stopZouzhi() { motorZouzhi.stop(); } - void startCuozhi() { motorCuozhi.start(); } - void stopCuozhi() { motorCuozhi.stop(); } + void startZouzhi() { motorZouzhi.start(); } + void stopZouzhi() { motorZouzhi.stop(); } + void startCuozhi() { motorCuozhi.start(); } + void stopCuozhi() { motorCuozhi.stop(); } //运行消息循环 void runMessageLoop(); void runScan(); @@ -202,29 +86,37 @@ private: private: ZouZhiMotor motorZouzhi; CuoZhiMotor motorCuozhi; - std::shared_ptr sensor; + PanelLeds panelLeds; std::thread threadRunScan; std::thread threadRunMessageLoop; - volatile bool bMsgLoop = true; + BlockingQueue sysEvent; - std::shared_ptr capturer; - std::shared_ptr m_keyboard; + ScannerGlue m_glue; HG_ScanConfiguration m_config; ScannerScanInfo m_scaninfo; std::thread m_correctThread; - volatile int m_DstScannum = 500; + bool m_isPulling; + + volatile bool bMsgLoop = true; + volatile int m_DstScannum = 500; volatile bool m_isDoublePaper; volatile bool m_jamPaper; volatile bool m_jamIn; - bool isPaperInit; volatile bool m_correctting; + + bool isPaperInit; + int waitpapertime; MemoryInfo *meminfo; CISVendor cisvendor; + std::shared_ptr m_scansysinfo; std::shared_ptr m_capturer; std::shared_ptr m_fpga; + std::shared_ptr capturer; + std::shared_ptr m_keyboard; + std::shared_ptr sensor; }; diff --git a/zynq_7010_code/Sensor.cpp b/zynq_7010_code/Sensor.cpp index bb68a53..655f992 100644 --- a/zynq_7010_code/Sensor.cpp +++ b/zynq_7010_code/Sensor.cpp @@ -149,6 +149,7 @@ void Sensor::monitor() StopWatch sw2; num = read(pfd.fd, buf, 8); // This is to clear the avaible read std::cout<<"read time "<< sw.elapsed_ms()< 0) @@ -178,6 +185,7 @@ void Sensor::monitor() buf[num - 1] = '\0'; ret = atoi(buf); bool b = false; + if (ret) { b = true; @@ -189,7 +197,11 @@ void Sensor::monitor() printf("检测纸张出去 time:%f\r\n",sw1.elapsed_ms()); sw2.reset(); if (!b) //理论上来说 + { + printf("没有检测到纸张进入\r\n"); continue; + } + } edges[ret]->notify_all(); @@ -270,11 +282,21 @@ void Sensor::monitor2() } if (i != 2 && i != 3) { - if(i == 1) + + int val = i * 2 + ret; + + if (is_open_cover && (val == 1 || val == 2 ||val == 3)) //这个地方主要作用是在开盖以防其他状态消息发送 + break; + + if(val == 1) { + is_open_cover = true; cv_paper_on.notify_all(); } - events.Put(evts[i * 2 + ret]); + if(val == 0) + is_open_cover = false; + + events.Put(evts[val]); } } } diff --git a/zynq_7010_code/Sensor.h b/zynq_7010_code/Sensor.h index 15f419a..4ba6ed5 100644 --- a/zynq_7010_code/Sensor.h +++ b/zynq_7010_code/Sensor.h @@ -66,6 +66,7 @@ private: volatile bool double_1 = false; volatile bool double_2 = false; volatile bool enbale_double_=false; + volatile bool is_open_cover = false; void monitor(); void monitor2(); int readfile(int fd,int num , char* buf); diff --git a/zynq_7010_code/UsbScanner.cpp b/zynq_7010_code/UsbScanner.cpp index c76b46a..40ffb15 100644 --- a/zynq_7010_code/UsbScanner.cpp +++ b/zynq_7010_code/UsbScanner.cpp @@ -133,7 +133,7 @@ UsbScanner::UsbScanner() : m_startscan(false), { imageremain++; m_images.Put(imageinfo); - printf("队列缓存张数 :%d\r\n",m_images.Size()); + LOG("队列缓存张数:%d\r\n",m_images.Size()); }; auto deviceevent = [this](const int eventID, std::string capmsg) @@ -297,7 +297,12 @@ void UsbScanner::ClearHWError() bool UsbScanner::GetImagequeueEmpty() { - return imageremain == 0; + if (m_images.Size() != 0) + { + LOG("队列剩余图像帧数:%d\r\n",m_images.Size()); + } + + return m_images.Size() == 0; } bool UsbScanner::GetEventQueueEmpty() @@ -358,8 +363,6 @@ void UsbScanner::SetFlatParam(int type, int *value) default: break; } - if (!ttype.empty()) - m_hgScanner->writeParamars(ttype, value); } CaptureParams UsbScanner::GetCaptureParams() { diff --git a/zynq_7010_code/main.cpp b/zynq_7010_code/main.cpp index ef1d17b..cf82e6a 100644 --- a/zynq_7010_code/main.cpp +++ b/zynq_7010_code/main.cpp @@ -311,6 +311,7 @@ int main(int argc, char *argv[]) // LOG("Scanning not scanning \n"); if (!m_scanner->GetImagequeueEmpty()) { + HG_JpegCompressInfo info = m_scanner->GetFrontImage(); sts.Data = (int)HG_ScannerStatus::HAVE_IMAGE; sts.Length = info.DataLength; @@ -342,10 +343,11 @@ int main(int argc, char *argv[]) break; case USBCommand::GET_IMAGE: { - printf("传图中\r\n"); HG_JpegCompressInfo info = m_scanner->GetImage(); - if (info.pJpegData != nullptr && info.DataLength != 0) + printf("USB error_code:%d\r\n",info.error_code); + if (info.pJpegData != nullptr && info.DataLength != 0 || info.error_code) { + int tt = m_scanner->write_bulk((void *)&info, sizeof(int) * 8); int index = 0; int total = info.DataLength; diff --git a/zynq_7010_code/scanservices_utils.h b/zynq_7010_code/scanservices_utils.h index fc0e0d6..d0e08b0 100644 --- a/zynq_7010_code/scanservices_utils.h +++ b/zynq_7010_code/scanservices_utils.h @@ -83,7 +83,7 @@ enum class LedStatus struct HG_JpegCompressInfo { - unsigned int data_type; + unsigned int error_code; unsigned int first_frame; unsigned int last_frame; unsigned int index_frame; @@ -222,7 +222,6 @@ struct V4L2_DATAINFO struct V4L2_DATAINFO_Ex:V4L2_DATAINFO { - unsigned int snaped_index; unsigned int frame_index; //总帧数 unsigned int dpi; //dpi unsigned int error_code;