#include "FsmState.h" #include "Scanner.h" Scanner *FsmState::scanner = NULL; FsmState::FsmState() { } FsmState::~FsmState() { } std::map> 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::GetState(); } else if (event == S_EVT_JAM_OUT) { return FsmStateManagerEx::GetState(); } else if (event == S_EVT_PAPER_STANDBY) { if (scanner->getSensor().isPaperStandby()) { LOG("StandbyState on_event : %s \n", "true"); return FsmStateManagerEx::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::GetState(); } else { return FsmStateManagerEx::GetState(); } } else if (event == S_EVT_CLEAR_ERR) { return FsmStateManagerEx::GetState(); } return this; } InitState::InitState() { } FsmState *InitState::on_event(ScanEvent event) { LOG("InitState on_event %d \n", event); if (!(scanner->getSensor().isCoverClosed())) { return FsmStateManagerEx::GetState(); } else if (scanner->getSensor().isPaperStandby()) { LOG("------------------有纸\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"; //啥用? 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::GetState(); } else if (event == S_EVT_COVER_OPENED) { return FsmStateManagerEx::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::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::GetState(); else return FsmStateManagerEx::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::GetState(); } else if (event == S_EVT_PAPER_NOT_STANDBY) { if (!scanner->getSensor().isPaperStandby()) { return FsmStateManagerEx::GetState(); } } else if (event == S_EVT_PAPER_AT_SCAN) { return FsmStateManagerEx::GetState(); } else if (event == S_EVT_START_SCAN) { return FsmStateManagerEx::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::GetState(); } if (scanner->getSensor().isCoverClosed() && !scanner->getSensor().isPaperStandby() && scanner->getSensor().isPaperIn()) { return FsmStateManagerEx::GetState(); } else if (event == S_EVT_PAPER_STANDBY) { LOG("ErrorState on_event S_EVT_PAPER_STANDBY\n"); if (scanner->getSensor().isPaperStandby()) //有纸 且没卡纸 { return FsmStateManagerEx::GetState(); } else { scanner->ResetJamIn(); return FsmStateManagerEx::GetState(); } } else if (event == S_EVT_CLEAR_ERR) { if (!scanner->getSensor().isCoverClosed()) //没关盖 { return FsmStateManagerEx::GetState(); } else if (!scanner->GetIsJamIn()) { if (scanner->getSensor().isPaperStandby()) //有纸 且没卡纸 { if (!scanner->getSensor().isPaperIn()) return FsmStateManagerEx::GetState(); } else { return FsmStateManagerEx::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::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::GetState() : FsmStateManagerEx::GetState(); return ret; } else if (event == S_EVT_COVER_OPENED) { //scanner->stop_scan(); 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()); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_JAM_IN) { scanner->emergency_stop(0); LOG("ScanningState S_EVT_JAM_IN \n"); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_JAM_OUT) { scanner->emergency_stop(0); LOG("ScanningState S_EVT_JAM_OUT \n"); return FsmStateManagerEx::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::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::GetState(); } } return this; }