196 lines
4.1 KiB
C++
196 lines
4.1 KiB
C++
#pragma once
|
|
#include <memory>
|
|
#include <map>
|
|
#include <typeinfo>
|
|
#include <string>
|
|
#include "scanservices_utils.h"
|
|
#include "utilsfunc.h"
|
|
|
|
class Scanner;
|
|
|
|
|
|
/*####################状态机注意事项##################*/
|
|
/*无纸:扫描完成 放纸栏无纸 触发无纸传感器返回无纸信息,需要转换成停止扫描,不需要上报无纸状态*/
|
|
/*无纸:未启动扫描,直接返回无纸*/
|
|
|
|
class FsmState
|
|
{
|
|
public:
|
|
FsmState();
|
|
virtual ~FsmState();
|
|
|
|
virtual FsmState* on_event(ScanEvent &event) = 0;
|
|
virtual void initial(void *data) {}
|
|
|
|
static void setScanner(Scanner* scan)
|
|
{
|
|
scanner = scan;
|
|
}
|
|
std::string typeName = "FsmState";
|
|
protected:
|
|
static Scanner* scanner;
|
|
void SetLedStatus(LedStatus s);
|
|
seria_parse_data seria_parse_;
|
|
};
|
|
class FsmStateManager
|
|
{
|
|
protected:
|
|
static std::map<std::string, std::shared_ptr<FsmState>> fsmStates;
|
|
};
|
|
template<typename T>
|
|
class FsmStateManagerEx : public FsmStateManager
|
|
{
|
|
public:
|
|
static FsmState* GetState(void *data)
|
|
{
|
|
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(data);
|
|
return fsmStates[type_name].get();
|
|
}
|
|
};
|
|
|
|
class InitState :public FsmState {
|
|
public:
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
virtual void initial(void *data);
|
|
};
|
|
class NoPaperState :public FsmState {
|
|
public:
|
|
virtual void initial(void *data);
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class PaperReadyState : public FsmState {
|
|
public:
|
|
PaperReadyState() {}
|
|
virtual void initial(void *data);
|
|
|
|
FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class ScanningState : public FsmState {
|
|
|
|
public:
|
|
ScanningState() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class CoverOpenState : public FsmState {
|
|
public:
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class CoverCloseState : public FsmState {
|
|
public:
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class Double_Paper_State : public FsmState {
|
|
public:
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class Boundary_Detection_State : public FsmState {
|
|
public:
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class ErrorJamState : public FsmState {
|
|
|
|
public:
|
|
ErrorJamState() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
void doPaper_pullout();
|
|
};
|
|
class ErrorState : public FsmState {
|
|
public:
|
|
ErrorState() {}
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class EmergencyStopScanState : public FsmState {
|
|
|
|
public:
|
|
EmergencyStopScanState() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class StopScanState : public FsmState {
|
|
|
|
public:
|
|
StopScanState() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
class ScrewDetectionState : public FsmState {
|
|
|
|
public:
|
|
ScrewDetectionState() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class seria_stop : public FsmState {
|
|
|
|
public:
|
|
seria_stop() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
|
|
class seria_start : public FsmState {
|
|
|
|
public:
|
|
seria_start() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
|
|
class seria_get_status : public FsmState {
|
|
|
|
public:
|
|
seria_get_status() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
|
|
class seria_set_speed_mode : public FsmState {
|
|
|
|
public:
|
|
seria_set_speed_mode() {}
|
|
|
|
virtual void initial(void *data);
|
|
|
|
virtual FsmState* on_event(ScanEvent &event);
|
|
};
|
|
|