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   //std::cout << getName() << " DESTRUCTOR!!!!!!!" << this << std::endl;
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     //std::cout << getName() << " setting up... " << this << std::endl;
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   //  for(int i=0; i<500; i++)
00037   //cout << "BLAH " << getName() << " 0" << endl;
00038   //serr->printf("BLAH %s %d\n",getName().c_str(),0);
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   //  for(int i=0; i<500; i++)
00045   //cout << "BLAH " << getName() << " 1" << endl;
00046   //serr->printf("BLAH %s %d\n",getName().c_str(),1);
00047   for(std::vector<StateNode*>::iterator it=nodes.begin(); it!=nodes.end(); it++)
00048     if((*it)->isActive())
00049       (*it)->DoStop();
00050   //for(int i=0; i<1000; i++)
00051   //cout << "BLAH 2" << endl;
00052   //serr->printf("BLAH %s %d\n",getName().c_str(),2);
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   ///for(int i=0; i<1000; i++)
00061   //cout << "BLAH 3" << endl;
00062   //serr->printf("BLAH %s %d\n",getName().c_str(),3);
00063   erouter->postEvent(EventBase::stateMachineEGID,reinterpret_cast<unsigned int>(this),EventBase::deactivateETID,0,getName(),0);
00064   //for(int i=0; i<1000; i++)
00065   //cout << "BLAH 4" << endl;
00066   //serr->printf("BLAH %s %d\n",getName().c_str(),4);
00067   BehaviorBase::DoStop();
00068   //for(int i=0; i<1000; i++)
00069   //cout << "BLAH 5" << endl;
00070   //serr->printf("BLAH %s %d\n",getName().c_str(),5);
00071 }
00072 
00073 void StateNode::setName(const std::string& n) {
00074   name=n;
00075 }
00076 
00077 void StateNode::transitionTo(StateNode*) {
00078   // may want to throw a status event here
00079 }
00080 
00081 void StateNode::transitionFrom(StateNode*) {
00082   // may want to throw a status event here
00083 }
00084 
00085 /*! @file 
00086  * @brief Describes StateNode, which is both a state machine controller as well as a node within a state machine itself
00087  * @author ejt (Creator)
00088  *
00089  * $Author: ejt $
00090  * $Name: tekkotsu-1_5 $
00091  * $Revision: 1.10 $
00092  * $State: Rel $
00093  * $Date: 2003/10/10 16:00:54 $
00094  */
00095 

Tekkotsu v1.5
Generated Fri Oct 10 15:52:00 2003 by Doxygen 1.3.4