调整整体的一个状态机流程,让无用状态不在响应

This commit is contained in:
modehua 2023-11-14 02:02:27 -08:00
parent a792d08fce
commit 51afbd33e2
11 changed files with 309 additions and 309 deletions

View File

@ -16,15 +16,15 @@ std::map<std::string, std::shared_ptr<FsmState>> 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<CoverOpenState>::GetState();
@ -37,7 +37,6 @@ FsmState *StandbyState::on_event(ScanEvent event)
{
if (scanner->getSensor().isPaperStandby())
{
LOG("StandbyState on_event : %s \n", "true");
return FsmStateManagerEx<PaperReadyState>::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<CoverOpenState>::GetState();
}
else if ((scanner->getSensor().isPaperIn()))
{
printf("FSM:卡纸\r\n");
return FsmStateManagerEx<ErrorJamState>::GetState();
}
else if (scanner->getSensor().isPaperStandby())
{
LOG("------------------有纸\r\n");
printf("FSM:有纸\r\n");
return FsmStateManagerEx<PaperReadyState>::GetState();
}
else if ((scanner->getSensor().isPaperAtScan()))
{
LOG("------------------卡纸\r\n");
return FsmStateManagerEx<ErrorJamState>::GetState();
}
else
LOG("---------扫描仪已经准备完成------\r\n");
return FsmStateManagerEx<StandbyState>::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<StandbyState>::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<CoverOpenState>::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<CoverOpenState>::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<CoverOpenState>::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<PaperReadyState>::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<CoverOpenState>::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<PaperReadyState>::GetState() : FsmStateManagerEx<StandbyState>::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<CoverOpenState>::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<ErrorJamState>::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<ErrorState>::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<ErrorJamState>::GetState();
}
else if (event == S_EVT_PAPER_AT_SCAN)

View File

@ -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<std::string, std::shared_ptr<FsmState>> fsmStates;
};
template<typename T>
@ -72,12 +97,17 @@ public:
{
std::string type_name = typeid(T).name();
std::map<std::string, std::shared_ptr<FsmState>>::iterator iter = fsmStates.find(type_name);
if (iter == fsmStates.end()) {
if (iter == fsmStates.end())
{
fsmStates.insert(std::pair<std::string, std::shared_ptr<FsmState>>(type_name, std::shared_ptr<FsmState>(new T)));
}
fsmStates[type_name]->initial();
return fsmStates[type_name].get();
}
static std::map<ScanEvent , T> fsm;
};
//????

View File

@ -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<std::mutex> 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<std::future<cv::Mat>> 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

View File

@ -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<int> iImageremain;
FPGAConfigParam m_fpgaparam;

View File

@ -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();
}

View File

@ -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> sensor;
PanelLeds panelLeds;
std::thread threadRunScan;
std::thread threadRunMessageLoop;
volatile bool bMsgLoop = true;
BlockingQueue<ScanEvent> sysEvent;
std::shared_ptr<ICapturer> capturer;
std::shared_ptr<huagao::Keyboard> 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<SysInforTool> m_scansysinfo;
std::shared_ptr<ICapturer> m_capturer;
std::shared_ptr<FpgaComm> m_fpga;
std::shared_ptr<ICapturer> capturer;
std::shared_ptr<huagao::Keyboard> m_keyboard;
std::shared_ptr<Sensor> sensor;
};

View File

@ -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()<<std::endl;
int indx = 0;
while (bMonitor)
{
ret = poll(&pfd, 1, 1000);
@ -160,7 +161,13 @@ void Sensor::monitor()
{
if(sw.elapsed_ms() < 10)
{
printf("扫描传感器消抖。。。\r\n");
indx++;
if (indx % 10 == 0)
{
printf("扫描传感器消抖数:%d\r\n",indx);
}
sw.reset();
ret = poll(&pfd, 1, 1);
if (ret > 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]);
}
}
}

View File

@ -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);

View File

@ -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()
{

View File

@ -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;

View File

@ -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;