2023-07-17 03:29:37 +00:00
|
|
|
#include "FsmState.h"
|
|
|
|
#include "Scanner.h"
|
|
|
|
|
|
|
|
|
|
|
|
Scanner *FsmState::scanner = NULL;
|
|
|
|
|
|
|
|
FsmState::FsmState()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState::~FsmState()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
std::map<std::string, std::shared_ptr<FsmState>> FsmStateManager::fsmStates;
|
|
|
|
|
|
|
|
void StandbyState::initial()
|
|
|
|
{
|
|
|
|
LOG("StandbyState \n");
|
|
|
|
typeName = "StandbyState";
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::Ready);
|
|
|
|
doReset();
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *StandbyState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
LOG("StandbyState on_event %d \n", event);
|
|
|
|
if (event == S_EVT_COVER_OPENED)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_JAM_OUT)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<ErrorJamState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_STANDBY)
|
|
|
|
{
|
|
|
|
if (scanner->getSensor().isPaperStandby())
|
|
|
|
{
|
|
|
|
LOG("StandbyState on_event : %s \n", "true");
|
|
|
|
return FsmStateManagerEx<PaperReadyState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_START_SCAN)
|
|
|
|
{
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::NoPaper);
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1200));
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::Ready);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void StandbyState::doReset()
|
|
|
|
{
|
|
|
|
if (!scanner->isRested)
|
|
|
|
scanner->reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CoverOpenState::initial()
|
|
|
|
{
|
|
|
|
LOG("CoverOpenState \n");
|
|
|
|
typeName = "CoverOpenState";
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::CoverOpen);
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *CoverOpenState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
LOG("CoverOpenState on_event %d \n", event);
|
|
|
|
if (event == S_EVT_COVER_CLOSED)
|
|
|
|
{
|
|
|
|
if (!scanner->getSensor().isPaperAtScan())
|
|
|
|
{
|
|
|
|
std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
|
|
scanner->reset();
|
|
|
|
return FsmStateManagerEx<InitState>::GetState();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<ErrorJamState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_CLEAR_ERR)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<InitState>::GetState();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
InitState::InitState()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *InitState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
LOG("InitState on_event %d \n", event);
|
|
|
|
if (!(scanner->getSensor().isCoverClosed()))
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
else if (scanner->getSensor().isPaperStandby())
|
|
|
|
{
|
|
|
|
LOG("------------------有纸\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"; //啥用?
|
|
|
|
scanner->put(S_EVT_NORES);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ErrorJamState::initial()
|
|
|
|
{
|
|
|
|
LOG("ErrorJamState \n");
|
|
|
|
typeName = "ErrorJamState";
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::Abnormal);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ErrorJamState::doPaper_pullout()
|
|
|
|
{
|
|
|
|
scanner->paper_pullout();
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *ErrorJamState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
//LOG("ErrorJamState on_event %d \n", event);
|
|
|
|
if (scanner->getSensor().isCoverClosed() && !scanner->getSensor().isPaperStandby() && !scanner->getSensor().isPaperIn())
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_COVER_OPENED)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_PULLOUT) // && scanner->GetIsDoublePaper()
|
|
|
|
{
|
|
|
|
scanner->paper_pullout();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_CLEAR_ERR)
|
|
|
|
{
|
|
|
|
if (!scanner->getSensor().isCoverClosed())
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
else //if (scanner->getSensor().isPaperStandby() && !scanner->getSensor().isPaperIn())
|
|
|
|
{
|
|
|
|
//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())
|
|
|
|
return FsmStateManagerEx<PaperReadyState>::GetState();
|
|
|
|
else
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void PaperReadyState::initial()
|
|
|
|
{
|
|
|
|
|
|
|
|
LOG("PaperReadyState setStatus(PanelLeds::Ready) \n");
|
|
|
|
typeName = "PaperReadyState";
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::Ready);
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *PaperReadyState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
LOG("FsmState PaperReadyState on_event %d \n",event);
|
|
|
|
if (event == S_EVT_COVER_OPENED)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_NOT_STANDBY)
|
|
|
|
{
|
|
|
|
if (!scanner->getSensor().isPaperStandby())
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_AT_SCAN)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<ErrorState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_START_SCAN)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<ScanningState>::GetState();
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ErrorState::initial()
|
|
|
|
{
|
|
|
|
LOG("ErrorState \n");
|
|
|
|
typeName = "ErrorState";
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::Abnormal);
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *ErrorState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
LOG("ErrorState on_event %d \n", event);
|
|
|
|
if (event == S_EVT_COVER_OPENED)
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (scanner->getSensor().isCoverClosed() && !scanner->getSensor().isPaperStandby() && scanner->getSensor().isPaperIn())
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_STANDBY)
|
|
|
|
{
|
|
|
|
LOG("ErrorState on_event S_EVT_PAPER_STANDBY\n");
|
|
|
|
if (scanner->getSensor().isPaperStandby()) //有纸 且没卡纸
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<PaperReadyState>::GetState();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
scanner->ResetJamIn();
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_CLEAR_ERR)
|
|
|
|
{
|
|
|
|
if (!scanner->getSensor().isCoverClosed()) //没关盖
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<CoverOpenState>::GetState();
|
|
|
|
}
|
|
|
|
else if (!scanner->GetIsJamIn())
|
|
|
|
{
|
|
|
|
if (scanner->getSensor().isPaperStandby()) //有纸 且没卡纸
|
|
|
|
{
|
|
|
|
if (!scanner->getSensor().isPaperIn())
|
|
|
|
return FsmStateManagerEx<PaperReadyState>::GetState();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScanningState::initial()
|
|
|
|
{
|
|
|
|
LOG("ScanningState \n");
|
|
|
|
typeName = "ScanningState";
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::Scanning);
|
|
|
|
scanner->startScan();
|
|
|
|
}
|
|
|
|
|
|
|
|
FsmState *ScanningState::on_event(ScanEvent event)
|
|
|
|
{
|
|
|
|
LOG("ScanningState on_event \n");
|
|
|
|
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);
|
|
|
|
scanner->getPanelLeds().setStatus(LedStatus::StopScan);
|
|
|
|
scanner->stop_scan();
|
|
|
|
auto ret = scanner->getSensor().isPaperStandby() ? FsmStateManagerEx<PaperReadyState>::GetState() : FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
return ret;
|
2023-08-09 07:31:27 +00:00
|
|
|
|
2023-07-17 03:29:37 +00:00
|
|
|
}
|
|
|
|
else if (event == S_EVT_COVER_OPENED)
|
|
|
|
{
|
|
|
|
//scanner->stop_scan();
|
|
|
|
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());
|
|
|
|
return FsmStateManagerEx<ErrorJamState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_JAM_IN)
|
|
|
|
{
|
|
|
|
scanner->emergency_stop(0);
|
|
|
|
LOG("ScanningState S_EVT_JAM_IN \n");
|
|
|
|
return FsmStateManagerEx<ErrorState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_JAM_OUT)
|
|
|
|
{
|
|
|
|
scanner->emergency_stop(0);
|
|
|
|
LOG("ScanningState S_EVT_JAM_OUT \n");
|
|
|
|
return FsmStateManagerEx<ErrorJamState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_AT_SCAN)
|
|
|
|
{
|
|
|
|
//ToDo:add notifyAll operation
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_NOT_AT_SCAN)
|
|
|
|
{
|
|
|
|
//ToDo:add notifyAll operation
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_SAMPLE_ERR)
|
|
|
|
{
|
|
|
|
scanner->stop_scan();
|
|
|
|
return FsmStateManagerEx<ErrorState>::GetState();
|
|
|
|
}
|
|
|
|
else if (event == S_EVT_PAPER_NOT_STANDBY)
|
|
|
|
{
|
|
|
|
std::this_thread::sleep_for(chrono::milliseconds(100));
|
|
|
|
if(!scanner->getSensor().isPaperStandby())
|
|
|
|
{
|
|
|
|
scanner->stop_scan();
|
|
|
|
return FsmStateManagerEx<StandbyState>::GetState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|