zynq_7010/zynq_7010_code/FsmState.cpp

326 lines
8.1 KiB
C++
Raw Normal View History

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()
{
printf("INIT FSM:扫描仪准备完成 \n");
2023-07-17 03:29:37 +00:00
scanner->getPanelLeds().setStatus(LedStatus::Ready);
doReset();
}
FsmState *StandbyState::on_event(ScanEvent event)
{
printf("FSM:扫描仪准备完成-->返回状态 %d \n", event);
2023-07-17 03:29:37 +00:00
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())
{
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()
{
printf("INIT 状态机检测:设备开盖 \n");
2023-07-17 03:29:37 +00:00
scanner->getPanelLeds().setStatus(LedStatus::CoverOpen);
}
FsmState *CoverOpenState::on_event(ScanEvent event)
{
printf("状态机检测:设备开盖--->返回状态: %s %d \n", event == S_EVT_COVER_CLOSED?"关盖":"开盖",event);
2023-07-17 03:29:37 +00:00
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)
{
if (!(scanner->getSensor().isCoverClosed()))
{
printf("FSM:开盖\r\n");
2023-07-17 03:29:37 +00:00
return FsmStateManagerEx<CoverOpenState>::GetState();
}
else if ((scanner->getSensor().isPaperIn()))
2023-07-17 03:29:37 +00:00
{
printf("FSM:卡纸\r\n");
return FsmStateManagerEx<ErrorJamState>::GetState();
2023-07-17 03:29:37 +00:00
}
else if (scanner->getSensor().isPaperStandby())
2023-07-17 03:29:37 +00:00
{
printf("FSM:有纸\r\n");
return FsmStateManagerEx<PaperReadyState>::GetState();
2023-07-17 03:29:37 +00:00
}
2023-07-17 03:29:37 +00:00
return FsmStateManagerEx<StandbyState>::GetState();
}
void InitState::initial()
{
printf("INIT FSM:初始化设备\r\n");
2023-07-17 03:29:37 +00:00
scanner->put(S_EVT_NORES);
}
void ErrorJamState::initial()
{
printf("INIT FSM:卡纸\r\n");
2023-07-17 03:29:37 +00:00
scanner->getPanelLeds().setStatus(LedStatus::Abnormal);
}
void ErrorJamState::doPaper_pullout()
{
scanner->paper_pullout();
}
FsmState *ErrorJamState::on_event(ScanEvent event)
{
2023-11-18 03:48:39 +00:00
printf("FSM :卡纸--->返回状态: %d \n",event);
2023-07-17 03:29:37 +00:00
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()
{
printf("啥玩意?????????????\r\n");
2023-07-17 03:29:37 +00:00
scanner->paper_pullout();
return this;
}
else if (event == S_EVT_CLEAR_ERR)
{
if (!scanner->getSensor().isCoverClosed())
{
return FsmStateManagerEx<CoverOpenState>::GetState();
}
else
2023-07-17 03:29:37 +00:00
{
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()
{
printf("INIT FSM:设备已放纸\r\n");
//typeName = "PaperReadyState";
2023-07-17 03:29:37 +00:00
scanner->getPanelLeds().setStatus(LedStatus::Ready);
}
FsmState *PaperReadyState::on_event(ScanEvent event)
{
printf("FSM :设备已放纸--->返回状态: %d \n",event);
2023-07-17 03:29:37 +00:00
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()
{
printf("ErrorState \n");
//typeName = "ErrorState";
2023-07-17 03:29:37 +00:00
scanner->getPanelLeds().setStatus(LedStatus::Abnormal);
}
FsmState *ErrorState::on_event(ScanEvent event)
{
printf("ErrorState on_event %d \n", event);
2023-07-17 03:29:37 +00:00
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)
{
printf("ErrorState on_event S_EVT_PAPER_STANDBY\n");
2023-07-17 03:29:37 +00:00
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()
{
printf("INIT FSM: 正在扫描中\n");
//typeName = "ScanningState";
2023-07-17 03:29:37 +00:00
scanner->getPanelLeds().setStatus(LedStatus::Scanning);
scanner->startScan();
}
FsmState *ScanningState::on_event(ScanEvent event)
{
printf("FSM: 正在扫描中-->返回状态:%d \n",event);
2023-07-17 03:29:37 +00:00
if (event == S_EVT_COVER_IN_OPEN)
{
return FsmStateManagerEx<CoverOpenState>::GetState();
}
else if (event == S_EVT_STOP_SCAN)
{
printf("ScanningState call for %d \n", event);
2023-07-17 03:29:37 +00:00
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)
{
printf("FSM :正在扫描中:开盖状态\r\n");
2023-07-17 03:29:37 +00:00
scanner->emergency_stop(S_EVT_COVER_OPENED);
return FsmStateManagerEx<CoverOpenState>::GetState();
}
else if (event == S_EVT_DOUBLEPAPER)
{
scanner->SetIsDoublePaper(true);
scanner->emergency_stop(S_EVT_ERROR_DOUBLEPAPER);
//scanner->stop_scan(); 保留双张就不需要紧急停止
printf("FSM :正在扫描中: 双张\n");
2023-07-17 03:29:37 +00:00
return FsmStateManagerEx<ErrorJamState>::GetState();
}
else if (event == S_EVT_JAM_IN)
{
scanner->emergency_stop(S_EVT_JAM_IN);
printf("FSM :正在扫描中: 搓纸失败 \n");
2023-07-17 03:29:37 +00:00
return FsmStateManagerEx<ErrorState>::GetState();
}
else if (event == S_EVT_JAM_OUT)
{
scanner->emergency_stop(S_EVT_JAM_OUT);
printf("FSM :正在扫描中: 卡纸 \n");
2023-07-17 03:29:37 +00:00
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;
}