zynq_7010/FsmState.h

148 lines
2.9 KiB
C++

#pragma once
#include <memory>
#include <map>
#include <typeinfo>
#include <string>
#include "scanservices_utils.h"
#include "utilsfunc.h"
class Scanner;
enum ScanEvent {
S_EVT_NORES = 0x0,
S_EVT_SCAN_FINISHED = 0x2,
S_EVT_CLEAR_ERR = 0x03,
S_EVT_PAPER_PULLOUT = 0x05,
S_EVT_COVER_OPENED = 0x01,
S_EVT_COVER_CLOSED = 0x102,
S_EVT_PAPER_AT_SCAN = 0x08,
S_EVT_PAPER_NOT_AT_SCAN = 0x106,
S_EVT_DOUBLEPAPER = 0x110,
S_EVT_NOT_DOUBLEPAPER = 0x111,
S_EVT_START_SCAN = 0x45,
S_EVT_STOP_SCAN = 0x46,
S_EVT_SCAN_STARTED = 0x112,
S_EVT_SCAN_STOPPED = 0x113,
S_EVT_JAM_IN = 0x114,
S_EVT_JAM_OUT = 0x115,
S_EVT_SAMPLE_ERR = 0x116,
S_EVT_COVER_IN_OPEN = 0x117,
S_EVT_ERROR_PICKING = 0x4,
S_EVT_ERROR_JAM = 0x8,
S_EVT_ERROR_DOUBLEPAPER = 0x10,
S_EVT_ERROR_STAPLE = 0x20,
S_EVT_ERROR_FPGA = 0x44,
S_EVT_HAVING_IMAGE = 0x47,
S_EVT_ONE_PAPER_END = 0x59,
S_EVT_PAPER_NOT_STANDBY = 0,//?
S_EVT_PAPER_STANDBY = 0 //?
};
class FsmState
{
public:
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();
}
};
//????
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);
};