zynq_7010/zynq_7010_code/FsmState.h

149 lines
2.6 KiB
C++

#pragma once
#include <memory>
#include <map>
#include <typeinfo>
#include <string>
#include "scanservices_utils.h"
#include "utilsfunc.h"
class Scanner;
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();
virtual FsmState* on_event(ScanEvent event) = 0;
virtual void initial() {}
static void setScanner(Scanner* scan) {
scanner = scan;
}
std::string typeName = "FsmState";
protected:
static Scanner* scanner;
};
class FsmStateManager
{
protected:
static std::map<std::string, std::shared_ptr<FsmState>> fsmStates;
};
template<typename T>
class FsmStateManagerEx : public FsmStateManager
{
public:
static FsmState* GetState()
{
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())
{
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;
};
//????
class StandbyState :public FsmState {
public:
virtual void initial();
virtual FsmState* on_event(ScanEvent event);
protected:
virtual void doReset();
};
//?????
class CoverOpenState : public FsmState {
public:
virtual void initial();
virtual FsmState* on_event(ScanEvent event);
};
class InitState :public FsmState {
public:
InitState();
virtual FsmState* on_event(ScanEvent event);
virtual void initial();
};
class ErrorJamState : public FsmState {
public:
ErrorJamState() {}
virtual void initial();
virtual FsmState* on_event(ScanEvent event);
void doPaper_pullout();
};
class PaperReadyState : public FsmState {
public:
PaperReadyState() {}
virtual void initial();
FsmState* on_event(ScanEvent event);
};
class ErrorState : public FsmState {
public:
ErrorState() {}
virtual void initial();
virtual FsmState* on_event(ScanEvent event);
};
class ScanningState : public FsmState {
public:
ScanningState() {}
virtual void initial();
virtual FsmState* on_event(ScanEvent event);
};