zynq_7010/zynq_7010_code/FsmState.h

196 lines
4.1 KiB
C
Raw Normal View History

2023-07-17 03:29:37 +00:00
#pragma once
#include <memory>
#include <map>
#include <typeinfo>
#include <string>
#include "scanservices_utils.h"
#include "utilsfunc.h"
class Scanner;
2024-02-23 07:29:14 +00:00
/*####################状态机注意事项##################*/
/*无纸:扫描完成 放纸栏无纸 触发无纸传感器返回无纸信息,需要转换成停止扫描,不需要上报无纸状态*/
/*无纸:未启动扫描,直接返回无纸*/
2023-07-17 03:29:37 +00:00
class FsmState
{
public:
FsmState();
virtual ~FsmState();
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event) = 0;
virtual void initial(void *data) {}
2023-07-17 03:29:37 +00:00
static void setScanner(Scanner* scan)
{
2023-07-17 03:29:37 +00:00
scanner = scan;
}
std::string typeName = "FsmState";
protected:
static Scanner* scanner;
2024-02-22 06:05:17 +00:00
void SetLedStatus(LedStatus s);
seria_parse_data seria_parse_;
2023-07-17 03:29:37 +00:00
};
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)
2023-07-17 03:29:37 +00:00
{
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())
{
2023-07-17 03:29:37 +00:00
fsmStates.insert(std::pair<std::string, std::shared_ptr<FsmState>>(type_name, std::shared_ptr<FsmState>(new T)));
}
fsmStates[type_name]->initial(data);
2023-07-17 03:29:37 +00:00
return fsmStates[type_name].get();
}
};
2024-02-22 06:05:17 +00:00
class InitState :public FsmState {
public:
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
virtual void initial(void *data);
2024-02-22 06:05:17 +00:00
};
2024-02-23 07:29:14 +00:00
class NoPaperState :public FsmState {
2023-07-17 03:29:37 +00:00
public:
virtual void initial(void *data);
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2023-07-17 03:29:37 +00:00
};
2024-02-22 06:05:17 +00:00
class PaperReadyState : public FsmState {
public:
PaperReadyState() {}
virtual void initial(void *data);
2024-02-22 06:05:17 +00:00
2024-02-23 07:29:14 +00:00
FsmState* on_event(ScanEvent &event);
2024-02-22 06:05:17 +00:00
};
class ScanningState : public FsmState {
public:
ScanningState() {}
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2024-02-22 06:05:17 +00:00
};
2023-07-17 03:29:37 +00:00
class CoverOpenState : public FsmState {
public:
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2023-07-17 03:29:37 +00:00
};
2024-02-22 06:05:17 +00:00
class CoverCloseState : public FsmState {
public:
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2024-02-22 06:05:17 +00:00
};
class Double_Paper_State : public FsmState {
2023-07-17 03:29:37 +00:00
public:
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2024-02-22 06:05:17 +00:00
};
class Boundary_Detection_State : public FsmState {
public:
virtual void initial(void *data);
2024-02-22 06:05:17 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2023-07-17 03:29:37 +00:00
};
class ErrorJamState : public FsmState {
public:
ErrorJamState() {}
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2023-07-17 03:29:37 +00:00
void doPaper_pullout();
};
2024-02-22 06:05:17 +00:00
class ErrorState : public FsmState {
2023-07-17 03:29:37 +00:00
public:
2024-02-22 06:05:17 +00:00
ErrorState() {}
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2023-07-17 03:29:37 +00:00
};
2024-02-22 06:05:17 +00:00
class EmergencyStopScanState : public FsmState {
2023-07-17 03:29:37 +00:00
public:
2024-02-22 06:05:17 +00:00
EmergencyStopScanState() {}
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
2023-07-17 03:29:37 +00:00
};
2024-02-22 06:05:17 +00:00
class StopScanState : public FsmState {
2023-07-17 03:29:37 +00:00
public:
2024-02-22 06:05:17 +00:00
StopScanState() {}
2023-07-17 03:29:37 +00:00
virtual void initial(void *data);
2023-07-17 03:29:37 +00:00
2024-02-23 07:29:14 +00:00
virtual FsmState* on_event(ScanEvent &event);
};
class ScrewDetectionState : public FsmState {
public:
ScrewDetectionState() {}
virtual void initial(void *data);
2024-02-23 07:29:14 +00:00
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);
};