149 lines
2.6 KiB
C++
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);
|
|
}; |