#include "FsmState.h" #include "Scanner.h" Scanner *FsmState::scanner = NULL; FsmState::FsmState() { } FsmState::~FsmState() { } std::map> FsmStateManager::fsmStates; void StandbyState::initial() { printf("INIT FSM:扫描仪准备完成 \n"); scanner->getPanelLeds().setStatus(LedStatus::Ready); doReset(); } FsmState *StandbyState::on_event(ScanEvent event) { printf("FSM:扫描仪准备完成-->返回状态 %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()) { 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() { printf("INIT 状态机检测:设备开盖 \n"); scanner->getPanelLeds().setStatus(LedStatus::CoverOpen); } FsmState *CoverOpenState::on_event(ScanEvent event) { printf("状态机检测:设备开盖--->返回状态: %s %d \n", event == S_EVT_COVER_CLOSED?"关盖":"开盖",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) { 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()) { printf("FSM:有纸\r\n"); return FsmStateManagerEx::GetState(); } return FsmStateManagerEx::GetState(); } void InitState::initial() { printf("INIT FSM:初始化设备\r\n"); scanner->put(S_EVT_NORES); } void ErrorJamState::initial() { printf("INIT FSM:卡纸\r\n"); scanner->getPanelLeds().setStatus(LedStatus::Abnormal); } void ErrorJamState::doPaper_pullout() { scanner->paper_pullout(); } FsmState *ErrorJamState::on_event(ScanEvent event) { printf("FSM :卡纸--->返回状态: %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() { printf("啥玩意?????????????\r\n"); scanner->paper_pullout(); return this; } else if (event == S_EVT_CLEAR_ERR) { if (!scanner->getSensor().isCoverClosed()) { return FsmStateManagerEx::GetState(); } else { if (!scanner->GetIsDoublePaper() && !scanner->GetIsJamPaper() && !scanner->getSensor().isPaperAtScan()) { if (scanner->getSensor().isPaperStandby()) return FsmStateManagerEx::GetState(); else return FsmStateManagerEx::GetState(); } } } return this; } void PaperReadyState::initial() { printf("INIT FSM:设备已放纸\r\n"); //typeName = "PaperReadyState"; scanner->getPanelLeds().setStatus(LedStatus::Ready); } FsmState *PaperReadyState::on_event(ScanEvent event) { printf("FSM :设备已放纸--->返回状态: %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() { printf("ErrorState \n"); //typeName = "ErrorState"; scanner->getPanelLeds().setStatus(LedStatus::Abnormal); } FsmState *ErrorState::on_event(ScanEvent event) { printf("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) { printf("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() { printf("INIT FSM: 正在扫描中\n"); //typeName = "ScanningState"; scanner->getPanelLeds().setStatus(LedStatus::Scanning); scanner->startScan(); } FsmState *ScanningState::on_event(ScanEvent event) { printf("FSM: 正在扫描中-->返回状态:%d \n",event); if (event == S_EVT_COVER_IN_OPEN) { return FsmStateManagerEx::GetState(); } else if (event == S_EVT_STOP_SCAN) { 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) { 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(S_EVT_ERROR_DOUBLEPAPER); //scanner->stop_scan(); 保留双张就不需要紧急停止 printf("FSM :正在扫描中: 双张\n"); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_JAM_IN) { scanner->emergency_stop(S_EVT_JAM_IN); printf("FSM :正在扫描中: 搓纸失败 \n"); return FsmStateManagerEx::GetState(); } else if (event == S_EVT_JAM_OUT) { scanner->emergency_stop(S_EVT_JAM_OUT); printf("FSM :正在扫描中: 卡纸 \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; }