145 lines
2.7 KiB
C++
145 lines
2.7 KiB
C++
#pragma once
|
|
#include <memory>
|
|
#include <map>
|
|
#include <typeinfo>
|
|
#include <string>
|
|
|
|
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);
|
|
}; |