Revision: 8590
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8590&view=rev
Author:   rtv
Date:     2010-03-15 18:01:48 +0000 (Mon, 15 Mar 2010)

Log Message:
-----------
refactored callback code for simplicity and speed - will break many clients, 
but the API just shrank quite a bit

Modified Paths:
--------------
    code/stage/trunk/examples/ctrl/fasr.cc
    code/stage/trunk/examples/ctrl/fasr2.cc
    code/stage/trunk/examples/ctrl/pioneer_flocking.cc
    code/stage/trunk/examples/ctrl/source.cc
    code/stage/trunk/examples/ctrl/wander.cc
    code/stage/trunk/examples/ctrl/wander_pioneer.cc
    code/stage/trunk/libstage/model.cc
    code/stage/trunk/libstage/model_callbacks.cc
    code/stage/trunk/libstage/model_getset.cc
    code/stage/trunk/libstage/model_load.cc
    code/stage/trunk/libstage/stage.hh
    code/stage/trunk/worlds/benchmark/expand_pioneer.cc
    code/stage/trunk/worlds/benchmark/expand_swarm.cc
    code/stage/trunk/worlds/pioneer_flocking.world

Modified: code/stage/trunk/examples/ctrl/fasr.cc
===================================================================
--- code/stage/trunk/examples/ctrl/fasr.cc      2010-03-15 17:54:04 UTC (rev 
8589)
+++ code/stage/trunk/examples/ctrl/fasr.cc      2010-03-15 18:01:48 UTC (rev 
8590)
@@ -93,15 +93,15 @@
         //      pos->GetUnusedModelOfType( "laser" );
         
         // PositionUpdate() checks to see if we reached source or sink
-        pos->AddUpdateCallback( (stg_model_callback_t)PositionUpdate, this );
+        pos->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)PositionUpdate, this );
         pos->Subscribe();
 
         // LaserUpdate() controls the robot, by reading from laser and
         // writing to position
-        laser->AddUpdateCallback( (stg_model_callback_t)LaserUpdate, this );
+        laser->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)LaserUpdate, this );
         laser->Subscribe();
 
-        fiducial->AddUpdateCallback( (stg_model_callback_t)FiducialUpdate, 
this );              
+        fiducial->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)FiducialUpdate, this );          
         fiducial->Subscribe();
         
         //gripper->AddUpdateCallback( (stg_model_callback_t)GripperUpdate, 
this );              

Modified: code/stage/trunk/examples/ctrl/fasr2.cc
===================================================================
--- code/stage/trunk/examples/ctrl/fasr2.cc     2010-03-15 17:54:04 UTC (rev 
8589)
+++ code/stage/trunk/examples/ctrl/fasr2.cc     2010-03-15 18:01:48 UTC (rev 
8590)
@@ -283,19 +283,12 @@
         //      pos->GetUnusedModelOfType( "laser" );
         
         // PositionUpdate() checks to see if we reached source or sink
-        pos->AddUpdateCallback( (stg_model_callback_t)UpdateCallback, this );
+        pos->AddCallback(  Model::CB_UPDATE, 
(stg_model_callback_t)UpdateCallback, this );
         pos->Subscribe();
         
         
         // no other callbacks - we access all other data from the position
         // callback 
-
-        // start with only the laser enabled - we switch laser, ranger and
-        // fiducial on and off as needed to save energy and compute time
-        
-        //laser->AddUpdateCallback( 
(stg_model_callback_t)Robot::LaserUpdateCallback, this );
-
-
         EnableLaser(true);
 
         pos->AddVisualizer( &graphvis, true );

Modified: code/stage/trunk/examples/ctrl/pioneer_flocking.cc
===================================================================
--- code/stage/trunk/examples/ctrl/pioneer_flocking.cc  2010-03-15 17:54:04 UTC 
(rev 8589)
+++ code/stage/trunk/examples/ctrl/pioneer_flocking.cc  2010-03-15 18:01:48 UTC 
(rev 8590)
@@ -50,11 +50,11 @@
   assert( robot->ranger );
   
   // ask Stage to call into our ranger update function
-  robot->ranger->AddUpdateCallback( (stg_model_callback_t)RangerUpdate, robot 
);
+  robot->ranger->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)RangerUpdate, robot );
  
   robot->fiducial = (ModelFiducial*)mod->GetUnusedModelOfType( "fiducial" ) ;
   assert( robot->fiducial );
-  robot->fiducial->AddUpdateCallback( (stg_model_callback_t)FiducialUpdate, 
robot );
+  robot->fiducial->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)FiducialUpdate, robot );
 
   robot->fiducial->Subscribe();
   robot->ranger->Subscribe();

Modified: code/stage/trunk/examples/ctrl/source.cc
===================================================================
--- code/stage/trunk/examples/ctrl/source.cc    2010-03-15 17:54:04 UTC (rev 
8589)
+++ code/stage/trunk/examples/ctrl/source.cc    2010-03-15 18:01:48 UTC (rev 
8590)
@@ -1,7 +1,7 @@
 #include "stage.hh"
 using namespace Stg;
 
-const int INTERVAL = 100;
+const unsigned int INTERVAL = 100;
 const double FLAGSZ = 0.25;
 const unsigned int CAPACITY = 1;
 
@@ -18,7 +18,7 @@
 // Stage calls this when the model starts up
 extern "C" int Init( Model* mod )
 {
-  mod->AddUpdateCallback( (stg_model_callback_t)Update, NULL );  
+  mod->AddCallback( Model::CB_UPDATE, (stg_model_callback_t)Update, NULL );  
   mod->Subscribe();
   return 0; //ok
 }

Modified: code/stage/trunk/examples/ctrl/wander.cc
===================================================================
--- code/stage/trunk/examples/ctrl/wander.cc    2010-03-15 17:54:04 UTC (rev 
8589)
+++ code/stage/trunk/examples/ctrl/wander.cc    2010-03-15 18:01:48 UTC (rev 
8590)
@@ -37,7 +37,7 @@
   
   robot->pos = (ModelPosition*)mod;
   robot->laser = (ModelLaser*)mod->GetChild( "laser:0" );
-  robot->laser->AddUpdateCallback( (stg_model_callback_t)LaserUpdate, robot );
+  robot->laser->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)LaserUpdate, robot );
   
   robot->laser->Subscribe(); // starts the laser updates
   robot->pos->Subscribe(); // starts the position updates

Modified: code/stage/trunk/examples/ctrl/wander_pioneer.cc
===================================================================
--- code/stage/trunk/examples/ctrl/wander_pioneer.cc    2010-03-15 17:54:04 UTC 
(rev 8589)
+++ code/stage/trunk/examples/ctrl/wander_pioneer.cc    2010-03-15 18:01:48 UTC 
(rev 8590)
@@ -50,12 +50,12 @@
   robot->ranger = (ModelRanger*)mod->GetUnusedModelOfType( "ranger" );
   assert( robot->ranger );
   // ask Stage to call into our ranger update function whenever the ranger is 
updated
-  robot->ranger->AddUpdateCallback( (stg_model_callback_t)RangerUpdate, robot 
);
+  robot->ranger->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)RangerUpdate, robot );
   
   robot->fiducial = (ModelFiducial*)mod->GetUnusedModelOfType( "fiducial" ) ;
   assert( robot->fiducial );
   // ask Stage to call into our fiducial update function whenever the fiducial 
is updated
-  robot->fiducial->AddUpdateCallback( (stg_model_callback_t)FiducialUpdate, 
robot );
+  robot->fiducial->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)FiducialUpdate, robot );
   
   // subscribe to the laser, though we don't use it for navigating
   //robot->laser = (ModelLaser*)mod->GetModel( "laser:0" );

Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc  2010-03-15 17:54:04 UTC (rev 8589)
+++ code/stage/trunk/libstage/model.cc  2010-03-15 18:01:48 UTC (rev 8590)
@@ -162,7 +162,7 @@
 uint64_t Model::trail_interval = 5;
 std::map<stg_id_t,Model*> Model::modelsbyid;
 std::map<std::string, creator_t> Model::name_map;
-std::map<void*, std::set<Model::stg_cb_t> > Model::callbacks;
+//std::map<void*, std::set<Model::stg_cb_t> > Model::callbacks;
 
 void Size::Load( Worldfile* wf, int section, const char* keyword )
 {
@@ -268,6 +268,7 @@
   blockgroup(),
   blocks_dl(0),
   boundary(false),
+       callbacks(__CB_TYPE_COUNT), 
   color( 1,0,0 ), // red
   data_fresh(false),
   disabled(false),
@@ -361,7 +362,7 @@
 
 void Model::InitControllers()
 {
-  CallCallbacks( &hooks.init );
+  CallCallbacks( CB_INIT );
 }
 
 
@@ -370,7 +371,7 @@
   if( flag )
         {
                flag_list.push_back( flag );            
-               CallCallbacks( &hooks.flag_incr );              
+               CallCallbacks( CB_FLAGINCR );
         }
 }
 
@@ -379,17 +380,17 @@
   if( flag )
         {
                EraseAll( flag, flag_list );
-               CallCallbacks( &hooks.flag_decr );
+               CallCallbacks( CB_FLAGDECR );
         }
 }
 
 void Model::PushFlag( Flag* flag )
 {
   if( flag )
-        {
-               flag_list.push_front( flag);
-               CallCallbacks( &hooks.flag_incr );
-        }
+               {
+                       flag_list.push_front( flag);
+                       CallCallbacks( CB_FLAGINCR );
+               }
 }
 
 Model::Flag* Model::PopFlag()
@@ -400,8 +401,8 @@
   Flag* flag = flag_list.front();
   flag_list.pop_front();
   
-  CallCallbacks( &hooks.flag_decr );
-  
+       CallCallbacks( CB_FLAGDECR );
+
   return flag;
 }
 
@@ -716,13 +717,13 @@
   if( FindPowerPack() )
         world->active_energy.insert( this );
   
-  CallCallbacks( &hooks.startup );
+       CallCallbacks( CB_STARTUP );
 }
 
 void Model::Shutdown( void )
 {
   //printf( "Shutdown model %s\n", this->token );
-  CallCallbacks( &hooks.shutdown );
+       CallCallbacks( CB_SHUTDOWN );
 
   world->active_energy.erase( this );
   world->active_velocity.erase( this );
@@ -734,9 +735,8 @@
 
 void Model::Update( void )
 { 
-  if( hooks.attached_update )
-        CallCallbacks( &hooks.update );  
-  
+       CallCallbacks( CB_UPDATE );
+
   last_update = world->sim_time;  
   world->Enqueue( event_queue_num, interval, this );
 }
@@ -1045,7 +1045,6 @@
 void Model::SetFriction( double friction )
 {
   this->friction = friction;
-  CallCallbacks( &this->friction );
 }
 
 Model* Model::GetChild( const std::string& modelname ) const

Modified: code/stage/trunk/libstage/model_callbacks.cc
===================================================================
--- code/stage/trunk/libstage/model_callbacks.cc        2010-03-15 17:54:04 UTC 
(rev 8589)
+++ code/stage/trunk/libstage/model_callbacks.cc        2010-03-15 18:01:48 UTC 
(rev 8590)
@@ -2,54 +2,33 @@
 using namespace Stg;
 using namespace std;
 
-void Model::AddCallback( void* address, 
-                                                stg_model_callback_t cb, 
-                                                void* user )
+void Model::AddCallback( callback_type_t type, 
+                                                                               
                 stg_model_callback_t cb, 
+                                                                               
                 void* user )
 {
-  callbacks[address].insert( stg_cb_t( cb, user ));
-       
-       // count the number of callbacks attached to pose and
-       // velocity. These are changed very often, so we avoid looking up
-       // the callbacks if these values are zero. */
-       if( address == &this->pose )
-               ++hooks.attached_pose;
-       else if( address == &this->velocity )
-               ++hooks.attached_velocity;      
-       else if( address == &this->hooks.update )
-               ++hooks.attached_update;        
+  //callbacks[address].insert( stg_cb_t( cb, user ));  
+       callbacks[type].insert( stg_cb_t( cb, user ));
 }
 
 
-int Model::RemoveCallback( void* address,
+int Model::RemoveCallback( callback_type_t type,
                                                                                
                         stg_model_callback_t callback )
 {
-       set<stg_cb_t>& callset = callbacks[address];
-       
+       set<stg_cb_t>& callset = callbacks[type];       
        callset.erase( stg_cb_t( callback, NULL) );
        
-       // count the number of callbacks attached to pose and velocity. Can
-       // not go below zero.
-       if( address == &pose )
-               hooks.attached_pose = max( --hooks.attached_pose, 0 );
-       else if( address == &velocity )
-               hooks.attached_velocity = max( --hooks.attached_velocity, 0 );
-       else if( address == &hooks.update )
-               hooks.attached_update = max( --hooks.attached_update, 0 );
-
        // return the number of callbacks remaining for this address. Useful
        // for detecting when there are none.
        return callset.size();
 }
 
 
-int Model::CallCallbacks( void* address )
+int Model::CallCallbacks( callback_type_t type )
 {
-       assert( address );
-       
        // maintain a list of callbacks that should be cancelled
        vector<stg_cb_t> doomed;
        
-       set<stg_cb_t>& callset = callbacks[address];
+       set<stg_cb_t>& callset = callbacks[type];
        
        FOR_EACH( it, callset )
          {  

Modified: code/stage/trunk/libstage/model_getset.cc
===================================================================
--- code/stage/trunk/libstage/model_getset.cc   2010-03-15 17:54:04 UTC (rev 
8589)
+++ code/stage/trunk/libstage/model_getset.cc   2010-03-15 18:01:48 UTC (rev 
8590)
@@ -14,32 +14,28 @@
   
   MapWithChildren();
   
-  CallCallbacks( &geom );
+  CallCallbacks( CB_GEOM );
 }
 
 void Model::SetColor( Color val )
 {
   color = val;
   NeedRedraw();
-  CallCallbacks( &color );
 }
 
 void Model::SetMass( stg_kg_t val )
 {
   mass = val;
-  CallCallbacks( &mass );
 }
 
 void Model::SetStall( stg_bool_t val )
 {
   stall = val;
-  CallCallbacks( &stall );
 }
 
 void Model::SetGripperReturn( int val )
 {
   vis.gripper_return = val;
-  CallCallbacks( &vis.gripper_return );
 }
 
 void Model::SetFiducialReturn(  int val )
@@ -52,80 +48,66 @@
         world->FiducialErase( this );
   else
         world->FiducialInsert( this );
-       
-  CallCallbacks( &vis.fiducial_return );
 }
 
 void Model::SetFiducialKey( int val )
 {
   vis.fiducial_key = val;
-  CallCallbacks( &vis.fiducial_key );
 }
 
 void Model::SetLaserReturn( stg_laser_return_t val )
 {
   vis.laser_return = val;
-  CallCallbacks( &vis.laser_return );
 }
 
 void Model::SetObstacleReturn( int val )
 {
   vis.obstacle_return = val;
-  CallCallbacks( &vis.obstacle_return );
 }
 
 void Model::SetBlobReturn( int val )
 {
   vis.blob_return = val;
-  CallCallbacks( &vis.blob_return );
 }
 
 void Model::SetRangerReturn( int val )
 {
   vis.ranger_return = val;
-  CallCallbacks( &vis.ranger_return );
 }
 
 void Model::SetBoundary( int val )
 {
   boundary = val;
-  CallCallbacks( &boundary );
 }
 
 void Model::SetGuiNose(  int val )
 {
   gui.nose = val;
-  CallCallbacks( &gui.nose );
 }
 
 void Model::SetGuiMove( int val )
 {
   gui.move = val;
-  CallCallbacks( &gui.move );
 }
 
 void Model::SetGuiGrid(  int val )
 {
   gui.grid = val;
-  CallCallbacks( &this->gui.grid );
 }
 
 void Model::SetGuiOutline( int val )
 {
   gui.outline = val;
-  CallCallbacks( &gui.outline );
 }
 
 void Model::SetWatts( stg_watts_t val )
 {
   watts = val;
-  CallCallbacks( &watts );
 }
 
 void Model::SetMapResolution(  stg_meters_t val )
 {
   map_resolution = val;
-  CallCallbacks( &map_resolution );
 }
 
 // set the pose of model in global coordinates 
@@ -146,7 +128,7 @@
   // link from the model to its new parent
   this->parent = newparent;
 
-  CallCallbacks( &this->parent );
+       CallCallbacks( CB_PARENT );
   return 0; //ok
 }
 
@@ -213,9 +195,7 @@
 void Model::SetVelocity( const Velocity& val )
 {
   velocity = val;  
-
-       if( hooks.attached_velocity )
-               CallCallbacks( &velocity );
+       CallCallbacks( CB_VELOCITY );
 }
 
 
@@ -237,6 +217,5 @@
       world->dirty = true;
     }
 
-       if( hooks.attached_pose )
-               CallCallbacks( &this->pose );
+               CallCallbacks( CB_POSE );
 }

Modified: code/stage/trunk/libstage/model_load.cc
===================================================================
--- code/stage/trunk/libstage/model_load.cc     2010-03-15 17:54:04 UTC (rev 
8589)
+++ code/stage/trunk/libstage/model_load.cc     2010-03-15 18:01:48 UTC (rev 
8590)
@@ -242,7 +242,7 @@
         Subscribe();
        
   // call any type-specific load callbacks
-  this->CallCallbacks( &hooks.load );
+  this->CallCallbacks( CB_LOAD );
     
   // we may well have changed blocks or geometry
   blockgroup.CalcSize();
@@ -265,42 +265,42 @@
         return;
 
   assert( wf_entity );
-               
+       
   PRINT_DEBUG4( "saving model %s pose %.2f %.2f %.2f",
-               this->token,
-               this->pose.x,
-               this->pose.y,
-               this->pose.a );
-
+                                                               token,
+                                                               pose.x,
+                                                               pose.y,
+                                                               pose.a );
+       
   // just in case
   pose.a = normalize( pose.a );
   geom.pose.a = normalize( geom.pose.a );
   
   if( wf->PropertyExists( wf_entity, "pose" ) )
     {
-      wf->WriteTupleLength( wf_entity, "pose", 0, this->pose.x);
-      wf->WriteTupleLength( wf_entity, "pose", 1, this->pose.y);
-      wf->WriteTupleLength( wf_entity, "pose", 2, this->pose.z);
-      wf->WriteTupleAngle( wf_entity, "pose", 3, this->pose.a );
+      wf->WriteTupleLength( wf_entity, "pose", 0, pose.x);
+      wf->WriteTupleLength( wf_entity, "pose", 1, pose.y);
+      wf->WriteTupleLength( wf_entity, "pose", 2, pose.z);
+      wf->WriteTupleAngle( wf_entity, "pose", 3, pose.a );
     }
   
   if( wf->PropertyExists( wf_entity, "size" ) )
     {
-      wf->WriteTupleLength( wf_entity, "size", 0, this->geom.size.x);
-      wf->WriteTupleLength( wf_entity, "size", 1, this->geom.size.y);
-      wf->WriteTupleLength( wf_entity, "size", 2, this->geom.size.z);
+      wf->WriteTupleLength( wf_entity, "size", 0, geom.size.x);
+      wf->WriteTupleLength( wf_entity, "size", 1, geom.size.y);
+      wf->WriteTupleLength( wf_entity, "size", 2, geom.size.z);
     }
   
   if( wf->PropertyExists( wf_entity, "origin" ) )
     {
-      wf->WriteTupleLength( wf_entity, "origin", 0, this->geom.pose.x);
-      wf->WriteTupleLength( wf_entity, "origin", 1, this->geom.pose.y);
-      wf->WriteTupleLength( wf_entity, "origin", 2, this->geom.pose.z);
-      wf->WriteTupleAngle( wf_entity, "origin", 3, this->geom.pose.a);
+      wf->WriteTupleLength( wf_entity, "origin", 0, geom.pose.x);
+      wf->WriteTupleLength( wf_entity, "origin", 1, geom.pose.y);
+      wf->WriteTupleLength( wf_entity, "origin", 2, geom.pose.z);
+      wf->WriteTupleAngle( wf_entity, "origin", 3, geom.pose.a);
     }
 
   // call any type-specific save callbacks
-  this->CallCallbacks( &hooks.save );
+  CallCallbacks( CB_SAVE );
 
   PRINT_DEBUG1( "Model \"%s\" saving complete.", token );
 }
@@ -345,7 +345,7 @@
                  }
                //else
                
-               AddCallback( &hooks.init, initfunc, new 
CtrlArgs(lib,World::ctrlargs) ); // pass complete string into initfunc
+               AddCallback( CB_INIT, initfunc, new 
CtrlArgs(lib,World::ctrlargs) ); // pass complete string into initfunc
     }
   else
     {

Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh  2010-03-15 17:54:04 UTC (rev 8589)
+++ code/stage/trunk/libstage/stage.hh  2010-03-15 18:01:48 UTC (rev 8590)
@@ -841,7 +841,6 @@
                  avoids searching the whole world for fiducials. */
         ModelPtrVec models_with_fiducials;
         
-                               
         /** Add a model to the set of models with non-zero fiducials, if not 
already there. */
         void FiducialInsert( Model* mod )
         { 
@@ -917,6 +916,7 @@
         /** Remove a callback function. Any argument data passed to
                  AddUpdateCallback is not automatically freed. */
         int RemoveUpdateCallback( stg_world_callback_t cb, void* user );
+
         /** Log the state of a Model */
         void Log( Model* mod );
 
@@ -1016,16 +1016,34 @@
       Event( stg_usec_t time, Model* mod ) 
                  : time(time), mod(mod) {}
       
-      stg_usec_t time; // time that event occurs
-      Model* mod; // model to update
+      stg_usec_t time; ///< time that event occurs
+      Model* mod; ///< model to update
       
+                       /** order by time. Break ties by value of Model*. 
+                                       @param event to compare with this one. 
*/
       bool operator<( const Event& other ) const;
     };
         
+               /** Queue of pending simulation events for the main thread to 
handle. */
         std::vector<std::priority_queue<Event> > event_queues;
+
+               /** Create a new simulation event to be handled in the future.
+
+                               @param queue_num Specify which queue the event 
should be on. The main
+                               thread is 0.  
+
+                               @param delay The time from now until the event 
occurs, in
+                               microseconds.
+
+                               @param mod The model that should have its 
Update() method
+                               called at the specified time.
+               */
         void Enqueue( unsigned int queue_num, stg_usec_t delay, Model* mod );
         
+               /** Set of models that require energy calculations at each 
World::Update(). */
         std::set<Model*> active_energy;
+
+               /** Set of models that require their positions to be 
recalculated at each World::Update(). */
         std::set<Model*> active_velocity;
 
         /** The amount of simulated time to run for each call to Update() */
@@ -1047,22 +1065,53 @@
                
     virtual ~World();
        
+               /** Returns the current simulated time in this world, in 
microseconds. */
     stg_usec_t SimTimeNow(void) const { return sim_time; }
                
+               /** Returns a pointer to the currently-open worlddfile object, 
or
+                               NULL if there is none. */
     Worldfile* GetWorldFile()  { return wf; };
                
+               /** Returns true iff this World implements a GUI. The base World
+                               class returns false, but subclasses can 
override this
+                               behaviour. */
     virtual bool IsGUI() const { return false; }
         
+               /** Open the file at the specified location, create a Worldfile
+                               object, read the file and configure the world 
from the
+                               contents, creating models as necessary. The 
created object
+                               persists, and can be retrieved later with
+                               World::GetWorldFile(). */
     virtual void Load( const char* worldfile_path );
+
     virtual void UnLoad();
+
     virtual void Reload();
+
+               /** Save the current world state into a worldfile with the given
+                               filename.  @param Filename to save as. */
     virtual bool Save( const char* filename );
+
+               /** Run one simulation timestep. Advances the simulation clock,
+                               executes all simulation updates due at the 
current time, then
+                               queues up future events. */
     virtual bool Update(void);
         
+               /** Returns true iff either the local or global quit flag was 
set,
+                               which usually happens because someone called 
Quit() or
+                               QuitAll(). */
     bool TestQuit() const { return( quit || quit_all );  }
+               
+               /** Request the world quits simulation before the next 
timestep. */
     void Quit(){ quit = true; }
+
+               /** Requests all worlds quit simulation before the next 
timestep. */
     void QuitAll(){ quit_all = true; }
+
+               /** Cancel a local quit request. */
     void CancelQuit(){ quit = false; }
+
+               /** Cancel a global quit request. */
     void CancelQuitAll(){ quit_all = false; }
         
         void TryCharge( PowerPack* pp, const Pose& pose );
@@ -1663,7 +1712,7 @@
         bool alwayson;
 
         /** If true, the model is rendered lazily into the regions, to reduce 
memory use. */
-        // bool background;
+        // TODO bool background;
 
         BlockGroup blockgroup;
         /**  OpenGL display list identifier for the blockgroup */
@@ -1715,24 +1764,56 @@
                void Draw(  GLUquadric* quadric );
         };
 
+               typedef enum {
+                       CB_FLAGDECR,
+                       CB_FLAGINCR,
+                       CB_GEOM,
+                       CB_INIT,
+                       CB_LOAD,
+                       CB_PARENT,
+                       CB_POSE,
+                       CB_SAVE,
+                       CB_SHUTDOWN,
+                       CB_STARTUP,
+                       CB_UPDATE,
+                       CB_VELOCITY,
+                       //CB_POSTUPDATE,
+                       __CB_TYPE_COUNT // must be the last entry: counts the 
number of types
+               } callback_type_t;
+               
   protected:
-        /** A list of callback functions can be attached to any
-                 address. When Model::CallCallbacks( void*) is called, the
-                 callbacks are called.*/
-        static std::map<void*, std::set<stg_cb_t> > callbacks;
+               /** A list of callback functions can be attached to any
+                               address. When Model::CallCallbacks( void*) is 
called, the
+                               callbacks are called.*/
+               std::vector<std::set<stg_cb_t> > callbacks;
                
+
         /** Default color of the model's blocks.*/
         Color color;
+               
+               /** Model the interaction between the model's blocks and the
+                               surface they touch. @todo primitive at the 
moment */
         double friction;
                
         /** This can be set to indicate that the model has new data that
                  may be of interest to users. This allows polling the model
                  instead of adding a data callback. */
         bool data_fresh;
-        stg_bool_t disabled; ///< if non-zero, the model is disabled  
+
+               /** If set true, Update() is not called on this model. Useful
+                               e.g. for temporarily disabling updates when 
dragging models
+                               with the mouse.*/
+               stg_bool_t disabled; 
+
+               /** Container for Visualizers attached to this model. */
         std::list<Visualizer*> cv_list;
+
+               /** Container for flags attached to this model. */
         std::list<Flag*> flag_list;
-        Geom geom;
+               
+               /** Specifies the the size of this model's bounding box, and the
+                               offset of its local coordinate system wrt that 
its parent. */
+               Geom geom;
 
         /** Records model state and functionality in the GUI, if used */
         class GuiState
@@ -1748,38 +1829,8 @@
         } gui;
         
         bool has_default_block;
+                               
   
-        /* Hooks for attaching special callback functions (not used as
-                variables - we just need unique addresses for them.) */  
-        class CallbackHooks
-        {
-        public:
-               int flag_incr;
-               int flag_decr;
-               int init;
-               int load;
-               int save;
-               int shutdown;
-               int startup;
-               int update;
-               int update_done;
-
-                /* optimization: record the number of attached callbacks for 
pose
-                               and velocity, so we can cheaply determine 
whether we need to
-                               call a callback for SetPose() and 
SetVelocity(), which happen
-                               very frequently. */
-                int attached_velocity;
-                int attached_pose;
-                int attached_update;
-                
-                CallbackHooks() : 
-                        attached_velocity(0), 
-                        attached_pose(0), 
-                        attached_update(0) 
-                {}
-
-        } hooks;
-  
         /** unique process-wide identifier for this model */
         uint32_t id;   
         stg_usec_t interval; ///< time between updates in usec  
@@ -2120,7 +2171,7 @@
         void PushFlag( Flag* flag );
         Flag* PopFlag();
        
-        int GetFlagCount() const { return flag_list.size(); }
+        unsigned int GetFlagCount() const { return flag_list.size(); }
     
         /** Disable the model. Its pose will not change due to velocity
                  until re-enabled using Enable(). This is used for example when
@@ -2271,65 +2322,26 @@
         void SetFriction( double friction );
        
         bool DataIsFresh() const { return this->data_fresh; }
-       
-        /* attach callback functions to data members. The function gets
-                called when the member is changed using SetX() accessor method 
*/
                
-        void AddCallback( void* address, 
-                                                        stg_model_callback_t 
cb, 
-                                                        void* user );
+               /* attach callback functions to data members. The function gets
+                        called when the member is changed using SetX() 
accessor method */
                
-        int RemoveCallback( void* member,
-                                                               
stg_model_callback_t callback );
+               /** Add a callback. The specified function is called whenever 
the
+                               indicated model method is called, and passed 
the user
+                               data.  @param cb Pointer the function to be 
called.  @param
+                               user Pointer to arbitrary user data, passed to 
the callback
+                               when called.
+               */
+               void AddCallback( callback_type_t type, 
+                                                                               
        stg_model_callback_t cb, 
+                                                                               
        void* user );
                
-        int CallCallbacks(  void* address );
+               int RemoveCallback( callback_type_t type,
+                                                                               
                stg_model_callback_t callback );
                
-        /* wrappers for the generic callback add & remove functions that hide
-                some implementation detail */
-       
-        void AddStartupCallback( stg_model_callback_t cb, void* user )
-        { AddCallback( &hooks.startup, cb, user ); };
-       
-        void RemoveStartupCallback( stg_model_callback_t cb )
-        { RemoveCallback( &hooks.startup, cb ); };
-       
-        void AddShutdownCallback( stg_model_callback_t cb, void* user )
-        { AddCallback( &hooks.shutdown, cb, user ); };
-       
-        void RemoveShutdownCallback( stg_model_callback_t cb )
-        { RemoveCallback( &hooks.shutdown, cb ); }
-       
-        void AddLoadCallback( stg_model_callback_t cb, void* user )
-        { AddCallback( &hooks.load, cb, user ); }
-       
-        void RemoveLoadCallback( stg_model_callback_t cb )
-        { RemoveCallback( &hooks.load, cb ); }
-       
-        void AddSaveCallback( stg_model_callback_t cb, void* user )
-        { AddCallback( &hooks.save, cb, user ); }
-       
-        void RemoveSaveCallback( stg_model_callback_t cb )
-        { RemoveCallback( &hooks.save, cb ); }
-  
-        void AddUpdateCallback( stg_model_callback_t cb, void* user )
-        { AddCallback( &hooks.update, cb, user ); }
-        
-        void RemoveUpdateCallback( stg_model_callback_t cb )
-        {      RemoveCallback( &hooks.update, cb ); }
-        
-        void AddFlagIncrCallback( stg_model_callback_t cb, void* user )
-        {      AddCallback( &hooks.flag_incr, cb, user ); }
-       
-        void RemoveFlagIncrCallback( stg_model_callback_t cb )
-        {      RemoveCallback( &hooks.flag_incr, cb ); }
-
-        void AddFlagDecrCallback( stg_model_callback_t cb, void* user )
-        {      AddCallback( &hooks.flag_decr, cb, user ); }
-       
-        void RemoveFlagDecrCallback( stg_model_callback_t cb )
-        {      RemoveCallback( &hooks.flag_decr, cb ); }
-        
+               int CallCallbacks(  callback_type_t type );
                
+               
         virtual void Print( char* prefix ) const;
         virtual const char* PrintWithPose() const;
        

Modified: code/stage/trunk/worlds/benchmark/expand_pioneer.cc
===================================================================
--- code/stage/trunk/worlds/benchmark/expand_pioneer.cc 2010-03-15 17:54:04 UTC 
(rev 8589)
+++ code/stage/trunk/worlds/benchmark/expand_pioneer.cc 2010-03-15 18:01:48 UTC 
(rev 8590)
@@ -43,7 +43,7 @@
   assert( robot->ranger );
   
   // ask Stage to call into our ranger update function
-  robot->ranger->AddUpdateCallback( (stg_model_callback_t)RangerUpdate, robot 
);
+  robot->ranger->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)RangerUpdate, robot );
   
   // subscribe to the laser, though we don't use it for navigating
   //robot->laser = (ModelLaser*)mod->GetUnusedModelOfType( "laser" );

Modified: code/stage/trunk/worlds/benchmark/expand_swarm.cc
===================================================================
--- code/stage/trunk/worlds/benchmark/expand_swarm.cc   2010-03-15 17:54:04 UTC 
(rev 8589)
+++ code/stage/trunk/worlds/benchmark/expand_swarm.cc   2010-03-15 18:01:48 UTC 
(rev 8590)
@@ -42,7 +42,7 @@
 
 
   // ask Stage to call into our ranger update function
-  robot->ranger->AddUpdateCallback( (stg_model_callback_t)RangerUpdate, robot 
);
+  robot->ranger->AddCallback( Model::CB_UPDATE, 
(stg_model_callback_t)RangerUpdate, robot );
 
   // subscribe to the laser, though we don't use it for navigating
   //robot->laser = (ModelLaser*)mod->GetUnusedModelofType( "laser" );

Modified: code/stage/trunk/worlds/pioneer_flocking.world
===================================================================
--- code/stage/trunk/worlds/pioneer_flocking.world      2010-03-15 17:54:04 UTC 
(rev 8589)
+++ code/stage/trunk/worlds/pioneer_flocking.world      2010-03-15 18:01:48 UTC 
(rev 8590)
@@ -29,9 +29,9 @@
 floorplan
 ( 
   name "cave"
-#  size [100.000 100.000 0.800]
-    size [32.000 32.000 0.600]
-pose [-24 -16 0 0]
+  size [100.000 100.000 0.800]
+#    size [32.000 32.000 0.600]
+# pose [-24 -16 0 0]
   bitmap "bitmaps/cave.png"  
 )
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to