00001
00002 #ifndef INCLUDED_TimeOutTrans_h_
00003 #define INCLUDED_TimeOutTrans_h_
00004
00005 #include "Behaviors/Transition.h"
00006 #include "Events/EventRouter.h"
00007
00008
00009
00010
00011
00012 class TimeOutTrans : public Transition {
00013 public:
00014
00015 TimeOutTrans(StateNode* destination, unsigned int delay)
00016 : Transition("TimeOutTrans","TimeOutTrans",destination), d(delay),
00017 eventargcount(0), egid(EventBase::unknownEGID), esid(0), etid(EventBase::statusETID) {}
00018
00019
00020 TimeOutTrans(StateNode* destination, unsigned int delay, EventBase::EventGeneratorID_t gid)
00021 : Transition("TimeOutTrans","TimeOutTrans",destination), d(delay),
00022 eventargcount(1), egid(gid), esid(0), etid(EventBase::statusETID) {}
00023
00024
00025 TimeOutTrans(StateNode* destination, unsigned int delay, EventBase::EventGeneratorID_t gid, unsigned int sid)
00026 : Transition("TimeOutTrans","TimeOutTrans",destination), d(delay),
00027 eventargcount(2), egid(gid), esid(sid), etid(EventBase::statusETID) {}
00028
00029
00030 TimeOutTrans(StateNode* destination, unsigned int delay, EventBase::EventGeneratorID_t gid, unsigned int sid, EventBase::EventTypeID_t tid)
00031 : Transition("TimeOutTrans","TimeOutTrans",destination), d(delay),
00032 eventargcount(3), egid(gid), esid(sid), etid(tid) {}
00033
00034
00035 virtual void DoStart() {
00036 Transition::DoStart();
00037 switch (eventargcount) {
00038 case 1: erouter->addListener(this,egid); break;
00039 case 2: erouter->addListener(this,egid,esid); break;
00040 case 3: erouter->addListener(this,egid,esid,etid); break;
00041 };
00042 resetTimer();
00043 }
00044
00045
00046 virtual void DoStop() {
00047 erouter->removeListener(this);
00048 Transition::DoStop();
00049 }
00050
00051
00052 void resetTimer() {
00053
00054 erouter->addTimer(this,0,d,false);
00055 }
00056
00057
00058 virtual void processEvent(const EventBase& e) {
00059
00060 if(e.getGeneratorID()==EventBase::timerEGID)
00061 fire();
00062 else
00063 resetTimer();
00064 }
00065
00066 protected:
00067
00068 TimeOutTrans(const std::string& classname, const std::string& instancename, StateNode* destination, unsigned int delay)
00069 : Transition(classname,instancename,destination), d(delay),
00070 eventargcount(0), egid(EventBase::unknownEGID), esid(0), etid(EventBase::statusETID) {}
00071
00072
00073 unsigned int d;
00074
00075
00076 unsigned int eventargcount;
00077
00078 EventBase::EventGeneratorID_t egid;
00079 unsigned int esid;
00080 EventBase::EventTypeID_t etid;
00081
00082 };
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 #endif