zynq_7010/zynq_7010_code/FsmState.h

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);
};