Revision: 7280
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7280&view=rev
Author:   rtv
Date:     2009-01-18 01:56:16 +0000 (Sun, 18 Jan 2009)

Log Message:
-----------
added simple charger and visualizations

Modified Paths:
--------------
    code/stage/trunk/libstage/CMakeLists.txt
    code/stage/trunk/libstage/canvas.cc
    code/stage/trunk/libstage/model.cc
    code/stage/trunk/libstage/model.hh
    code/stage/trunk/libstage/powerpack.cc
    code/stage/trunk/libstage/stage.hh
    code/stage/trunk/libstage/world.cc
    code/stage/trunk/worlds/fasr.world

Added Paths:
-----------
    code/stage/trunk/libstage/charger.cc

Modified: code/stage/trunk/libstage/CMakeLists.txt
===================================================================
--- code/stage/trunk/libstage/CMakeLists.txt    2009-01-18 00:10:21 UTC (rev 
7279)
+++ code/stage/trunk/libstage/CMakeLists.txt    2009-01-18 01:56:16 UTC (rev 
7280)
@@ -8,6 +8,7 @@
        blockgroup.cc
        camera.cc
        canvas.cc
+       charger.cc
        file_manager.cc
        file_manager.hh
        gl.cc

Modified: code/stage/trunk/libstage/canvas.cc
===================================================================
--- code/stage/trunk/libstage/canvas.cc 2009-01-18 00:10:21 UTC (rev 7279)
+++ code/stage/trunk/libstage/canvas.cc 2009-01-18 01:56:16 UTC (rev 7280)
@@ -898,7 +898,9 @@
   for( GList* it=selected_models; it; it=it->next )
         ((Model*)it->data)->DrawSelected();
 
-  
+  for( GList* it=world->chargers; it; it=it->next )
+        ((Charger*)it->data)->Visualize();
+
   // useful debug - puts a point at the origin of each model
   //for( GList* it = world->World::children; it; it=it->next ) 
   // ((Model*)it->data)->DrawOriginTree();

Added: code/stage/trunk/libstage/charger.cc
===================================================================
--- code/stage/trunk/libstage/charger.cc                                (rev 0)
+++ code/stage/trunk/libstage/charger.cc        2009-01-18 01:56:16 UTC (rev 
7280)
@@ -0,0 +1,115 @@
+/** charger.cc
+        Simple model of energy storage
+        Richard Vaughan
+        Created 2009.1.15
+    SVN: $Id: stage.hh 7279 2009-01-18 00:10:21Z rtv $
+*/
+
+
+#include "stage_internal.hh"
+
+Charger::Charger( World* world ) 
+  : world( world ), watts( 1000.0 )
+{
+  printf( "Charger constructed" );
+}
+
+void Charger::ChargeIfContained( PowerPack* pp, Pose pose )
+{
+  if( Contains( pose ) )
+        Charge( pp );
+}
+
+bool Charger::Contains( Pose pose )
+{
+  return( pose.x >= volume.x.min &&
+                        pose.x  < volume.x.max &&
+                        pose.y >= volume.y.min &&
+                        pose.y  < volume.y.max &&
+                        pose.z >= volume.z.min &&
+                        pose.z  < volume.z.max );
+}
+        
+void Charger::Charge( PowerPack* pp )
+{
+  double given = watts * world->interval_sim * 1e-6;
+  
+  pp->stored += given;
+  
+  // do not exceed capacity
+  pp->stored = MIN( pp->stored, pp->capacity );
+  pp->charging = true;
+  /*
+        printf( "charger %p  at [%.2f %.2f] [%.2f %.2f] [%.2f %.2f] gave pack 
%p %.3f joules\n",
+        this,
+        volume.x.min,
+        volume.x.max,
+        volume.y.min,
+        volume.y.max,
+        volume.z.min,
+        volume.z.max,
+        pp, given );
+  
+  pp->Print( "just charged" );
+  */
+}
+
+void Charger::Visualize()
+{
+
+  glPushMatrix();
+  glPolygonMode( GL_FRONT, GL_FILL );
+  glColor4f( 1, 0.5,0,0.4 );
+  glTranslatef( 0,0,volume.z.min);
+  glRectf( volume.x.min, volume.y.min, volume.x.max, volume.y.max );
+  
+  glTranslatef( 0,0,volume.z.max );
+  glRectf( volume.x.min, volume.y.min, volume.x.max, volume.y.max );
+  glPopMatrix();
+
+  glPushMatrix();
+  glPolygonMode( GL_FRONT, GL_LINE );
+  glColor4f( 1, 0.5,0,0.8 );
+  glTranslatef( 0,0,volume.z.min);
+  glRectf( volume.x.min, volume.y.min, volume.x.max, volume.y.max );
+  
+  glTranslatef( 0,0,volume.z.max );
+  glRectf( volume.x.min, volume.y.min, volume.x.max, volume.y.max );
+  glPopMatrix();
+
+  // ?
+  glPolygonMode( GL_FRONT, GL_FILL );
+}
+
+void swap( double &a, double &b )
+{
+  double keep = a;
+  a = b;
+  b = keep;
+}
+
+void Charger::Load( Worldfile* wf, int entity )
+{
+  if( wf->PropertyExists( entity, "volume" ) )
+        {
+               volume.x.min = wf->ReadTupleLength( entity, "volume", 0, 
volume.x.min );
+               volume.x.max = wf->ReadTupleLength( entity, "volume", 1, 
volume.x.max );
+               volume.y.min = wf->ReadTupleLength( entity, "volume", 2, 
volume.y.min );
+               volume.y.max = wf->ReadTupleLength( entity, "volume", 3, 
volume.y.max );
+               volume.z.min = wf->ReadTupleLength( entity, "volume", 4, 
volume.z.min );
+               volume.z.max = wf->ReadTupleLength( entity, "volume", 5, 
volume.z.max );
+               
+               // force the windings for GL's sake
+               if( volume.x.min > volume.x.max )
+                 swap( volume.x.min, volume.x.max );
+               
+               if( volume.y.min > volume.y.max )
+                 swap( volume.y.min, volume.y.max );
+
+               if( volume.z.min > volume.z.max )
+                 swap( volume.z.min, volume.z.max );
+               
+        }
+  
+  watts = wf->ReadFloat( entity, "watts", watts );
+}

Modified: code/stage/trunk/libstage/model.cc
===================================================================
--- code/stage/trunk/libstage/model.cc  2009-01-18 00:10:21 UTC (rev 7279)
+++ code/stage/trunk/libstage/model.cc  2009-01-18 01:56:16 UTC (rev 7280)
@@ -659,22 +659,29 @@
   //                    this->world->sim_time, this->token, this->subs );
   
   // f we're drawing current and a power pack has been installed
-  if( power_pack && (watts > 0) )
+  if( power_pack )
         {
-               // consume  energy stored in the power pack
-               stg_joules_t consumed =  watts * (world->interval_sim * 1e-6); 
-               power_pack->stored -= consumed;
-
-               /*              
-               printf ( "%s current %.2f consumed %.6f ppack @ %p [ %.2f/%.2f 
(%.0f)\n",
-                                       token, 
-                                       watts, 
-                                       consumed, 
-                                       power_pack, 
-                                       power_pack->stored, 
-                                       power_pack->capacity, 
-                                       power_pack->stored / 
power_pack->capacity * 100.0 );
-               */
+               if( watts > 0 )
+                 {
+                        // consume  energy stored in the power pack
+                        stg_joules_t consumed =  watts * (world->interval_sim 
* 1e-6); 
+                        power_pack->stored -= consumed;
+                        
+                        /*             
+                                               printf ( "%s current %.2f 
consumed %.6f ppack @ %p [ %.2f/%.2f (%.0f)\n",
+                                               token, 
+                                               watts, 
+                                               consumed, 
+                                               power_pack, 
+                                               power_pack->stored, 
+                                               power_pack->capacity, 
+                                               power_pack->stored / 
power_pack->capacity * 100.0 );
+                        */
+                 }
+               
+               // I own this power pack, see if the world wants to recharge it 
*/
+               if( power_pack->mod == this )
+                 world->TryCharge( power_pack, GetGlobalPose() );
         }
 
   CallCallbacks( &hooks.update );

Modified: code/stage/trunk/libstage/model.hh
===================================================================
--- code/stage/trunk/libstage/model.hh  2009-01-18 00:10:21 UTC (rev 7279)
+++ code/stage/trunk/libstage/model.hh  2009-01-18 01:56:16 UTC (rev 7280)
@@ -23,6 +23,10 @@
 
   /** OpenGL visualization of the powerpack state */
   void Visualize( Camera* cam );
+
+  /** Print human-readable status on stdout, prefixed with the
+               argument string */
+  void Print( char* prefix );
 };
 
 class Visibility

Modified: code/stage/trunk/libstage/powerpack.cc
===================================================================
--- code/stage/trunk/libstage/powerpack.cc      2009-01-18 00:10:21 UTC (rev 
7279)
+++ code/stage/trunk/libstage/powerpack.cc      2009-01-18 01:56:16 UTC (rev 
7280)
@@ -2,23 +2,28 @@
         Simple model of energy storage
         Richard Vaughan
         Created 2009.1.15
-        $Id$
+    SVN: $Id: stage.hh 7279 2009-01-18 00:10:21Z rtv $
 */
 
 #include "stage_internal.hh"
 
 PowerPack::PowerPack( Model* mod ) :
-  mod( mod), stored( 0.0 ), capacity( 0.0 )
+  mod( mod), stored( 0.0 ), capacity( 0.0 ), charging( false )
 { 
   // nothing to do 
 };
 
 
+void PowerPack::Print( char* prefix )
+{
+  printf( "%s stored %.2f/%.2f joules\n", prefix, stored, capacity );
+}
+
 /** OpenGL visualization of the powerpack state */
 void PowerPack::Visualize( Camera* cam )
 {
   const double height = 0.5;
-  const double width = 0.3;
+  const double width = 0.2;
 
   double percent = stored/capacity * 100.0;
 
@@ -42,13 +47,25 @@
   // outline the charge-o-meter
   glTranslatef( 0,0,0.001 );
   glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+
   glColor4f( 0,0,0,0.7 );
+  
   glRectf( 0,0,width, height );
-
+  
   glBegin( GL_LINES );
   glVertex2f( 0, fullness );
   glVertex2f( width, fullness );
   glEnd();
+  
+  if( charging )
+        {
+               glLineWidth( 6.0 );
+               glColor4f( 1,0,0,0.7 );
+               
+               glRectf( 0,0,width, height );
+               
+               glLineWidth( 1.0 );
+        }
 
   // draw the percentage
   //gl_draw_string( -0.2, 0, 0, buf );

Modified: code/stage/trunk/libstage/stage.hh
===================================================================
--- code/stage/trunk/libstage/stage.hh  2009-01-18 00:10:21 UTC (rev 7279)
+++ code/stage/trunk/libstage/stage.hh  2009-01-18 01:56:16 UTC (rev 7280)
@@ -809,7 +809,24 @@
   class Region;
   class SuperRegion;
   class BlockGroup;
+  class PowerPack;
 
+  /// %Charger class
+  class Charger
+  {
+        World* world;
+        stg_watts_t watts;
+        stg_bounds3d_t volume;
+        
+  public:
+        Charger( World* world );
+        void ChargeIfContained( PowerPack* pp, Pose pose );
+        bool Contains( Pose pose );
+        void Charge( PowerPack* pp );
+        void Visualize();
+        void Load( Worldfile* wf, int entity );
+  };
+
   /// %World class
   class World : public Ancestor
   {
@@ -817,7 +834,8 @@
     friend class Block;
     //friend class StgTime;
     friend class Canvas;
-  
+        friend class Charger;
+
   private:
   
     static GList* world_list; ///< all the worlds that exist
@@ -825,6 +843,7 @@
     static void UpdateCb( World* world);
     static unsigned int next_id; ///<initially zero, used to allocate unique 
sequential world ids
         
+        GList* chargers;
     bool destroy;
     bool dirty; ///< iff true, a gui redraw would be required
     GHashTable* models_by_name; ///< the models that make up the world, 
indexed by name
@@ -866,6 +885,7 @@
     void LoadModel( Worldfile* wf, int entity, GHashTable* entitytable );
     void LoadBlock( Worldfile* wf, int entity, GHashTable* entitytable );
     void LoadBlockGroup( Worldfile* wf, int entity, GHashTable* entitytable );
+    void LoadCharger( Worldfile* wf, int entity );
 
     SuperRegion* AddSuperRegion( const stg_point_int_t& coord );
     SuperRegion* GetSuperRegion( const stg_point_int_t& coord );
@@ -982,6 +1002,8 @@
     void CancelQuit(){ quit = false; }
     void CancelQuitAll(){ quit_all = false; }
         
+        void TryCharge( PowerPack* pp, Pose pose );
+
     /** Get the resolution in pixels-per-metre of the underlying
        discrete raytracing model */ 
     double Resolution(){ return ppm; };

Modified: code/stage/trunk/libstage/world.cc
===================================================================
--- code/stage/trunk/libstage/world.cc  2009-01-18 00:10:21 UTC (rev 7279)
+++ code/stage/trunk/libstage/world.cc  2009-01-18 01:56:16 UTC (rev 7280)
@@ -69,6 +69,7 @@
              double ppm )
   : 
   // private
+  chargers( NULL ),
   destroy( false ),
   dirty( true ),
   models_by_name( g_hash_table_new( g_str_hash, g_str_equal ) ),
@@ -310,20 +311,22 @@
   for( int entity = 1; entity < wf->GetEntityCount(); entity++ )
     {
       const char *typestr = (char*)wf->GetEntityType(entity);            
-                
+               
       // don't load window entries here
       if( strcmp( typestr, "window" ) == 0 )
-       {
-         /* do nothing here */
-       }
+                 {
+                        /* do nothing here */
+                 }
       //else if( strcmp( typestr, "blockgroup" ) == 0 )
       //LoadBlockGroup( wf, entity, entitytable );             
       else if( strcmp( typestr, "block" ) == 0 )
-       LoadBlock( wf, entity, entitytable );
-      else
-       LoadModel( wf, entity, entitytable );
+                 LoadBlock( wf, entity, entitytable );
+               else if( strcmp( typestr, "charger" ) == 0 )
+                 LoadCharger( wf, entity );
+               else
+                 LoadModel( wf, entity, entitytable );
     }
-       
+  
 
   // warn about unused WF lines
   wf->WarnUnused();
@@ -342,7 +345,16 @@
     putchar( '\n' );
 }
 
+void World::LoadCharger( Worldfile* wf, int entity )
+{
+  Charger* chg = new Charger( this );
+  
+  chargers = g_list_prepend( chargers, chg );
 
+  chg->Load( wf, entity );
+}
+
+
 // delete a model from the hash table
 static void destroy_model( gpointer dummy1, Model* mod, gpointer dummy2 )
 {
@@ -916,5 +928,16 @@
   extent.z.max = MAX( extent.z.max, pt.z );
 }
 
+void World::TryCharge( PowerPack* pack, Pose pose )
+{
+  pack->charging = false;
 
+  // see if the pose lies within any of the charging rectangles
+  for( GList* it = chargers; it; it = it->next )
+        {
+               Charger* chg = (Charger*)it->data;              
+               chg->ChargeIfContained( pack, pose );
+        }
+}
 
+

Modified: code/stage/trunk/worlds/fasr.world
===================================================================
--- code/stage/trunk/worlds/fasr.world  2009-01-18 00:10:21 UTC (rev 7279)
+++ code/stage/trunk/worlds/fasr.world  2009-01-18 01:56:16 UTC (rev 7280)
@@ -7,7 +7,7 @@
 include "sick.inc"
 
 interval_sim 100  # simulation timestep in milliseconds
-interval_real 00 # real-time interval between simulation updates in 
milliseconds 
+interval_real 0 # real-time interval between simulation updates in 
milliseconds 
 paused 1
 
 resolution 0.02
@@ -20,9 +20,9 @@
 # configure the GUI window
 window
 ( 
-  size [ 600.000 600.000 ] 
+  size [ 600.000 599.000 ] 
 
-  center [ -0.521 -0.218 ] 
+  center [ -0.424 -0.218 ] 
   rotate [ 0 0 ]
   scale 30.883 
 
@@ -45,6 +45,18 @@
   bitmap "bitmaps/cave.png"
 )
 
+charger
+(
+  volume [ 5 6 -2 -3 0 0.1 ]
+  watts 200
+)
+
+charger
+(
+  volume [ 5 6 -4 -5 0 0.1 ]
+  watts 200
+)
+
 zone
 (
   color "green"
@@ -61,12 +73,6 @@
   ctrl "sink"
 )
 
-#charger
-#(
-# pose
-#                
-#)
-
 define autorob pioneer2dx                
 (               
  sicklaser( samples 32 range_max 5 laser_return 2 watts 30 )
@@ -78,9 +84,9 @@
 autorob( pose [6.471 5.304 0 14.941] )
 autorob( pose [5.937 4.858 0 -147.503] )
 autorob( pose [7.574 6.269 0 -111.715] )
-autorob( pose [5.664 5.938 0 -51.799] )
+autorob( pose [5.664 5.938 0 107.666] )
 autorob( pose [7.016 6.428 0 -128.279] )
-autorob( pose [5.911 4.040 0 -97.047] )
+autorob( pose [5.750 4.137 0 -97.047] )
 autorob( pose [4.909 6.097 0 -44.366] )
 autorob( pose [6.898 4.775 0 -117.576] )
 autorob( pose [7.012 5.706 0 129.497] )
@@ -88,13 +94,13 @@
 autorob( pose [6.616 6.893 0 170.743] )
 autorob( pose [6.451 4.189 0 -61.453] )
 autorob( pose [5.098 6.788 0 -61.295] )
-autorob( pose [4.374 5.163 0 -90.417] )
-autorob( pose [4.999 4.230 0 -42.157] )
-autorob( pose [4.331 4.217 0 -95.000] )
+autorob( pose [4.374 5.163 0 -147.713] )
+autorob( pose [4.999 4.230 0 -125.236] )
+autorob( pose [4.007 4.249 0 78.789] )
 autorob( pose [5.440 5.317 0 -26.545] )
 autorob( pose [7.518 6.973 0 163.239] )
 autorob( pose [7.559 4.764 0 -139.066] )
-autorob( pose [4.839 3.595 0 -179.567] )
+autorob( pose [5.940 6.768 0 77.301] )
 
 #autorob( pose [7.122 4.175 0 -31.440] )
 #autorob( pose [6.203 6.963 0 2.937] )


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

------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to