Homepage Demos Overview Downloads Tutorials Reference
Credits

StateNode.cc

Go to the documentation of this file.
00001 #include "StateNode.h"
00002 #include "Events/EventRouter.h"
00003 #include "Wireless/Wireless.h"
00004 
00005 StateNode::~StateNode() {
00006   ASSERT(!isActive(), "Destructing while active?")
00007   for(std::vector<Transition*>::iterator it=transitions.begin(); it!=transitions.end(); it++)
00008     (*it)->RemoveReference();
00009   if(issetup) {
00010     for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00011       (*it)->RemoveReference();
00012   }
00013 }
00014 
00015 void StateNode::addTransition(Transition* trans) {
00016   transitions.push_back(trans);
00017   trans->AddReference();
00018   trans->addSource(this);
00019 }
00020 
00021 StateNode* StateNode::addNode(StateNode* node) {
00022   nodes.push_back(node);
00023   node->AddReference();
00024   if ( node->parent == NULL )
00025     node->parent = this;
00026   return node;
00027 }
00028 
00029 void StateNode::DoStart() {
00030   BehaviorBase::DoStart();
00031   if(!issetup) {
00032     setup();
00033     issetup=true;
00034   }
00035   for(std::vector<Transition*>::iterator it=transitions.begin(); it!=transitions.end(); it++)
00036     if ( !(*it)->isActive()  ) (*it)->DoStart();
00037   erouter->postEvent(EventBase::stateMachineEGID,reinterpret_cast<unsigned int>(this),EventBase::activateETID,0,getName(),1);
00038   if(parent!=NULL)
00039     parent->transitionTo(this);
00040 }
00041 
00042 void StateNode::DoStop() {
00043   for(std::vector<Transition*>::iterator it=transitions.begin(); it!=transitions.end(); it++) {
00044     if((*it)->isActive())
00045       (*it)->DoStop();
00046   }
00047   for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00048     if((*it)->isActive())
00049       (*it)->DoStop();
00050   if(!retain) {
00051     teardown();
00052     issetup=false;
00053     for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00054       (*it)->RemoveReference();
00055     nodes.clear();
00056   }
00057   erouter->postEvent(EventBase::stateMachineEGID,reinterpret_cast<unsigned int>(this),EventBase::deactivateETID,0,getName(),0);
00058   BehaviorBase::DoStop();
00059 }
00060 
00061 void StateNode::setName(const std::string& n) {
00062   name=n;
00063 }
00064 
00065 void StateNode::transitionTo(StateNode*) {
00066   // may want to throw a status event here
00067 }
00068 
00069 void StateNode::transitionFrom(StateNode*) {
00070   // may want to throw a status event here
00071 }
00072 
00073 /*! @file 
00074  * @brief Describes StateNode, which is both a state machine controller as well as a node within a state machine itself
00075  * @author ejt (Creator)
00076  *
00077  * $Author: dst $
00078  * $Name: tekkotsu-2_2 $
00079  * $Revision: 1.17 $
00080  * $State: Exp $
00081  * $Date: 2004/10/04 22:57:56 $
00082  */
00083 

Tekkotsu v2.2
Generated Tue Oct 19 14:19:16 2004 by Doxygen 1.3.9.1