00001 #include "StateNode.h"
00002 #include "Events/EventRouter.h"
00003 #include "Wireless/Wireless.h"
00004
00005 StateNode::~StateNode() {
00006
00007 ASSERT(!isActive(), "Destructing while active?")
00008 for(std::vector<Transition*>::iterator it=transitions.begin(); it!=transitions.end(); it++)
00009 (*it)->RemoveReference();
00010 if(issetup) {
00011 for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00012 (*it)->RemoveReference();
00013 }
00014 }
00015
00016 void StateNode::addTransition(Transition* trans) {
00017 transitions.push_back(trans);
00018 trans->AddReference();
00019 }
00020
00021 void StateNode::DoStart() {
00022 BehaviorBase::DoStart();
00023 if(!issetup) {
00024
00025 setup();
00026 issetup=true;
00027 }
00028 for(std::vector<Transition*>::iterator it=transitions.begin(); it!=transitions.end(); it++)
00029 (*it)->DoStart();
00030 erouter->postEvent(EventBase::stateMachineEGID,reinterpret_cast<unsigned int>(this),EventBase::activateETID,0,getName(),1);
00031 if(parent!=NULL)
00032 parent->transitionTo(this);
00033 }
00034
00035 void StateNode::DoStop() {
00036
00037
00038
00039 for(std::vector<Transition*>::iterator it=transitions.begin(); it!=transitions.end(); it++) {
00040 ASSERT((*it)->isActive(),"Inactive transition");
00041 if((*it)->isActive())
00042 (*it)->DoStop();
00043 }
00044
00045
00046
00047 for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00048 if((*it)->isActive())
00049 (*it)->DoStop();
00050
00051
00052
00053 if(!retain) {
00054 std::cout << getName() << " unretaining... " << this << std::endl;
00055 for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00056 (*it)->RemoveReference();
00057 teardown();
00058 issetup=false;
00059 }
00060
00061
00062
00063 erouter->postEvent(EventBase::stateMachineEGID,reinterpret_cast<unsigned int>(this),EventBase::deactivateETID,0,getName(),0);
00064
00065
00066
00067 BehaviorBase::DoStop();
00068
00069
00070
00071 }
00072
00073 void StateNode::setName(const std::string& n) {
00074 name=n;
00075 }
00076
00077 void StateNode::transitionTo(StateNode*) {
00078
00079 }
00080
00081 void StateNode::transitionFrom(StateNode*) {
00082
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095