#pragma once #include #include #include #include class Scanner; enum ScanEvent { S_EVT_NORES = 0x0, S_EVT_SCAN_FINISHED = 0x2, S_EVT_CLEAR_ERR = 0x03, S_EVT_PAPER_PULLOUT = 0x05, S_EVT_COVER_OPENED = 0x01, S_EVT_COVER_CLOSED = 0x102, S_EVT_PAPER_AT_SCAN = 0x08, S_EVT_PAPER_NOT_AT_SCAN = 0x106, S_EVT_DOUBLEPAPER = 0x110, S_EVT_NOT_DOUBLEPAPER = 0x111, S_EVT_START_SCAN = 0x45, S_EVT_STOP_SCAN = 0x46, S_EVT_SCAN_STARTED = 0x112, S_EVT_SCAN_STOPPED = 0x113, S_EVT_JAM_IN = 0x114, S_EVT_JAM_OUT = 0x115, S_EVT_SAMPLE_ERR = 0x116, S_EVT_COVER_IN_OPEN = 0x117, S_EVT_ERROR_PICKING = 0x4, S_EVT_ERROR_JAM = 0x8, S_EVT_ERROR_DOUBLEPAPER = 0x10, S_EVT_ERROR_STAPLE = 0x20, S_EVT_ERROR_FPGA = 0x44, S_EVT_HAVING_IMAGE = 0x47, S_EVT_ONE_PAPER_END = 0x59, S_EVT_PAPER_NOT_STANDBY = 0,//? S_EVT_PAPER_STANDBY = 0 //? }; class FsmState { public: 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(); } }; 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); };