#pragma once #include #include #include #include #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> fsmStates; }; template class FsmStateManagerEx : public FsmStateManager { public: static FsmState* GetState() { std::string type_name = typeid(T).name(); std::map>::iterator iter = fsmStates.find(type_name); if (iter == fsmStates.end()) { fsmStates.insert(std::pair>(type_name, std::shared_ptr(new T))); } fsmStates[type_name]->initial(); return fsmStates[type_name].get(); } static std::map 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); };