Revision: 8615
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8615&view=rev
Author:   natepak
Date:     2010-04-23 23:57:16 +0000 (Fri, 23 Apr 2010)

Log Message:
-----------
Updates to gazebomodel tool

Modified Paths:
--------------
    code/gazebo/trunk/libgazebo/SimIface.cc
    code/gazebo/trunk/libgazebo/gz.h
    code/gazebo/trunk/server/Common.cc
    code/gazebo/trunk/server/Common.hh
    code/gazebo/trunk/server/Factory.cc
    code/gazebo/trunk/server/Model.cc
    code/gazebo/trunk/server/World.cc
    code/gazebo/trunk/server/World.hh
    code/gazebo/trunk/server/gui/MainMenu.cc
    code/gazebo/trunk/server/gui/Sidebar.cc
    code/gazebo/trunk/server/physics/Body.cc
    code/gazebo/trunk/server/physics/ode/ODEGeom.cc
    code/gazebo/trunk/tools/CMakeLists.txt
    code/gazebo/trunk/tools/gazebomodel.cc

Modified: code/gazebo/trunk/libgazebo/SimIface.cc
===================================================================
--- code/gazebo/trunk/libgazebo/SimIface.cc     2010-04-19 22:39:25 UTC (rev 
8614)
+++ code/gazebo/trunk/libgazebo/SimIface.cc     2010-04-23 23:57:16 UTC (rev 
8615)
@@ -14,6 +14,17 @@
 
 using namespace gazebo;
 
+
+union semun 
+{
+  int              val;    /* Value for SETVAL */
+  struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
+  unsigned short  *array;  /* Array for GETALL, SETALL */
+  struct seminfo  *__buf;
+} arg;
+
+
+
 
////////////////////////////////////////////////////////////////////////////////
 /// Create an interface
 SimulationIface::SimulationIface()
@@ -63,14 +74,6 @@
 /// Create a simulation interface
 void SimulationIface::Create(Server *server, std::string id)
 {
-  union semun 
-  {
-    int              val;    /* Value for SETVAL */
-    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
-    unsigned short  *array;  /* Array for GETALL, SETALL */
-    struct seminfo  *__buf;
-  } arg;
-
   Iface::Create(server,id); 
   this->data = (SimulationData*)((char*)this->mMap+sizeof(SimulationIface)); 
 
@@ -90,6 +93,20 @@
    printf("Semctl failed\n"); 
 }
 
+//////////////////////////////////////////////////////////////////////////////
+// Destroy the interface (server)
+void SimulationIface::Destroy()
+{
+  if (this->data && semctl(this->data->semId, 0, IPC_RMID, arg) < 0)
+  {
+    std::ostringstream stream;
+    stream << "failed to deallocate semaphore [" << strerror(errno) << "]";
+    throw(stream.str());
+  }
+
+  Iface::Destroy();
+}
+
 
////////////////////////////////////////////////////////////////////////////////
 /// Open a simulation interface
 void SimulationIface::Open(Client *client, std::string id)
@@ -591,3 +608,91 @@
 
   return true;
 }
+
+////////////////////////////////////////////////////////////////////////////////
+/// Get the number of parameters for an entity 
+bool SimulationIface::GetEntityParamCount(const std::string &entityName, 
+                                          unsigned int &num)
+{
+  this->Lock(1);
+  this->data->responseCount = 0;
+
+  SimulationRequestData *request;
+ 
+  request = &(this->data->requests[this->data->requestCount++]);
+  request->type = SimulationRequestData::GET_ENTITY_PARAM_COUNT;
+
+  memset(request->name, 0, 512);
+  strncpy(request->name, entityName.c_str(), 512);
+  request->name[511] = '\0';
+
+  this->Unlock();
+
+  if (!this->WaitForResponse())
+    return false;
+
+  assert(this->data->responseCount == 1);
+  num = data->responses[0].uintValue;
+
+  return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Get a param key for an entity
+bool SimulationIface::GetEntityParamKey(const std::string &entityName, 
+    unsigned int paramIndex, std::string &paramKey )
+{
+  this->Lock(1);
+
+  this->data->responseCount = 0;
+  SimulationRequestData *request;
+
+  request = &(this->data->requests[this->data->requestCount++]);
+  request->type = SimulationRequestData::GET_ENTITY_PARAM_KEY;
+
+  memset(request->name, 0, 512);
+  strncpy(request->name, entityName.c_str(), 512);
+  request->name[511] = '\0';
+
+  request->uintValue = paramIndex;
+
+  this->Unlock();
+
+  if (!this->WaitForResponse())
+    return false;
+
+  assert(this->data->responseCount == 1);
+  paramKey = data->responses[0].strValue;
+
+  return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+/// Get a param value from an entity
+bool SimulationIface::GetEntityParamValue(const std::string &entityName, 
+    unsigned int paramIndex, std::string &paramValue )
+{
+  this->Lock(1);
+
+  this->data->responseCount = 0;
+  SimulationRequestData *request;
+
+  request = &(this->data->requests[this->data->requestCount++]);
+  request->type = SimulationRequestData::GET_ENTITY_PARAM_VALUE;
+
+  memset(request->name, 0, 512);
+  strncpy(request->name, entityName.c_str(), 512);
+  request->name[511] = '\0';
+
+  request->uintValue = paramIndex;
+
+  this->Unlock();
+
+  if (!this->WaitForResponse())
+    return false;
+
+  assert(this->data->responseCount == 1);
+  paramValue = data->responses[0].strValue;
+
+  return true;
+}

Modified: code/gazebo/trunk/libgazebo/gz.h
===================================================================
--- code/gazebo/trunk/libgazebo/gz.h    2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/libgazebo/gz.h    2010-04-23 23:57:16 UTC (rev 8615)
@@ -317,7 +317,7 @@
               int parentModelId);
 
   /// \brief Destroy the interface (server)
-  public: void Destroy();
+  public: virtual void Destroy();
 
   /// \brief Open an existing interface
   /// \param client Pointer to the client
@@ -429,6 +429,9 @@
                       GET_STATE,
                       GO,
                       GET_ENTITY_TYPE,
+                      GET_ENTITY_PARAM_COUNT,
+                      GET_ENTITY_PARAM_KEY,
+                      GET_ENTITY_PARAM_VALUE,
                       GET_MODEL_TYPE,
                       GET_NUM_MODELS,
                       GET_NUM_CHILDREN,
@@ -502,6 +505,10 @@
   /// \brief id String id
   public: virtual void Create(Server *server, std::string id);
 
+  /// \brief Destroy the interface (server)
+  public: virtual void Destroy();
+
+
   /// \brief Open a simulation interface
   /// \param client Pointer to the client
   /// \param id String name of the client
@@ -599,6 +606,19 @@
   public: bool GetModelFiducialID(const std::string &modelName, 
                                   unsigned int &id);
 
+  /// \brief Get the number of parameters for an entity 
+  public: bool GetEntityParamCount(const std::string &entityName, 
+                                    unsigned int &num);
+
+  /// \brief Get a param key for an entity
+  public: bool GetEntityParamKey(const std::string &entityName, 
+                          unsigned int paramIndex, std::string &paramKey );
+
+  /// \brief Get a param value from an entity
+  public: bool GetEntityParamValue(const std::string &entityName, 
+                          unsigned int paramIndex, std::string &paramValue );
+
+
   public: void GoAckWait();
   public: void GoAckPost();
 

Modified: code/gazebo/trunk/server/Common.cc
===================================================================
--- code/gazebo/trunk/server/Common.cc  2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/server/Common.cc  2010-04-23 23:57:16 UTC (rev 8615)
@@ -67,13 +67,24 @@
 }
 
 
////////////////////////////////////////////////////////////////////////////////
-/// Get the parameters 
-std::vector<Param*> *Common::GetParams()
+/// Get the count of the parameters
+unsigned int Common::GetParamCount() const
 {
-  return &this->parameters;
+  return this->parameters.size();
 }
 
 
////////////////////////////////////////////////////////////////////////////////
+/// Get a param by index
+Param *Common::GetParam(unsigned int index) const
+{
+  if (index < this->parameters.size())
+    return this->parameters[index];
+  else
+    gzerr(0) << "Invalid index[" << index << "]\n";
+  return NULL;
+}
+
+////////////////////////////////////////////////////////////////////////////////
 /// Get a parameter by name
 Param *Common::GetParam(const std::string &key) const
 {

Modified: code/gazebo/trunk/server/Common.hh
===================================================================
--- code/gazebo/trunk/server/Common.hh  2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/server/Common.hh  2010-04-23 23:57:16 UTC (rev 8615)
@@ -51,9 +51,12 @@
     /// \return Name of the entity
     public: std::string GetName() const;
 
-    /// \brief Get the parameters 
-    public: std::vector<Param*> *GetParams();
+    /// \brief Get the count of the parameters
+    public: unsigned int GetParamCount() const;
 
+    /// \brief Get a param by index
+    public: Param *GetParam(unsigned int index) const;
+
     /// \brief Get a parameter by name
     public: Param *GetParam(const std::string &key) const;
    

Modified: code/gazebo/trunk/server/Factory.cc
===================================================================
--- code/gazebo/trunk/server/Factory.cc 2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/server/Factory.cc 2010-04-23 23:57:16 UTC (rev 8615)
@@ -111,7 +111,8 @@
   // Attempt to delete a model by name, if the string is present
   if (strcmp((const char*)this->factoryIface->data->deleteModel,"")!=0)
   {
-    World::Instance()->DeleteEntity((const 
char*)this->factoryIface->data->deleteModel);
+    const std::string m = (const char*)this->factoryIface->data->deleteModel;
+    World::Instance()->DeleteEntity(m);
 
     strcpy((char*)this->factoryIface->data->deleteModel,"");
   }

Modified: code/gazebo/trunk/server/Model.cc
===================================================================
--- code/gazebo/trunk/server/Model.cc   2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/server/Model.cc   2010-04-23 23:57:16 UTC (rev 8615)
@@ -165,6 +165,7 @@
   scopedName = this->GetScopedName();
 
   dup = World::Instance()->GetEntityByName(scopedName);
+
   // Look for existing models by the same name
   if(dup != NULL && dup != this)
   {

Modified: code/gazebo/trunk/server/World.cc
===================================================================
--- code/gazebo/trunk/server/World.cc   2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/server/World.cc   2010-04-23 23:57:16 UTC (rev 8615)
@@ -518,13 +518,25 @@
     // maybe try try_lock here instead
     boost::recursive_mutex::scoped_lock 
lock(*Simulator::Instance()->GetMDMutex());
 
+
     // Remove and delete all models that are marked for deletion
-    std::vector< Model* >::iterator miter;
+    std::vector< std::string>::iterator miter;
     for (miter=this->toDeleteModels.begin();
         miter!=this->toDeleteModels.end(); miter++)
     {
-      (*miter)->Fini();
-      delete (*miter);
+      Entity *entity = this->GetEntityByName(*miter);
+      std::cout << "Process Entity to Delete[" << (*miter) << "]\n";
+      if (entity)
+      {
+        Model *model = dynamic_cast<Model*>(entity);
+        if (model)
+        {
+          model->Fini();
+          this->models.erase( std::find(this->models.begin(), 
+                this->models.end(), model) );
+        }
+        delete (entity);
+      }
     }
 
     this->toDeleteModels.clear();
@@ -534,19 +546,19 @@
 
 
////////////////////////////////////////////////////////////////////////////////
 /// Delete an entity by name
-void World::DeleteEntity(const char *name)
+void World::DeleteEntity(const std::string &name)
 {
   std::vector< Model* >::iterator miter;
 
-  // Update all the models
-  for (miter=this->models.begin(); miter!=this->models.end(); miter++)
-  {
-    if ((*miter)->GetCompleteScopedName() == name)
-    {
-      this->toDeleteModels.push_back(*miter);
-      this->models.erase( std::remove(this->models.begin(), 
this->models.end(), *miter));
-    }
-  }
+  Entity *entity = this->GetEntityByName(name);
+
+  if (!entity)
+    return;
+
+  Model *model = dynamic_cast<Model*>(entity);
+
+  if (model)
+    this->toDeleteModels.push_back(model->GetName());
 }
 
 
@@ -950,6 +962,70 @@
           break;
         }
 
+      case SimulationRequestData::GET_ENTITY_PARAM_KEY:
+        {
+          Entity *entity = this->GetEntityByName((char*)req->name);
+          if (entity)
+          {
+            Param *param = entity->GetParam(req->uintValue);
+            response->type= req->type;
+            memset(response->strValue, 0, 512);
+
+            if (param)
+              strncpy(response->strValue, param->GetKey().c_str(), 512);
+
+            response->strValue[511] = '\0';
+
+            response++;
+            this->simIface->data->responseCount += 1;
+          }
+          else
+            gzerr(0) << "Invalid entity name[" << req->name << "] in 
simulation interface GET_ENTITY_PARAM.\n";
+
+          break;
+        }
+
+      case SimulationRequestData::GET_ENTITY_PARAM_VALUE:
+        {
+          Entity *entity = this->GetEntityByName((char*)req->name);
+          if (entity)
+          {
+            Param *param = entity->GetParam(req->uintValue);
+            response->type= req->type;
+            memset(response->strValue, 0, 512);
+
+            if (param)
+              strncpy(response->strValue, param->GetAsString().c_str(), 512);
+
+            response->strValue[511] = '\0';
+            response++;
+            this->simIface->data->responseCount += 1;
+          }
+          else
+            gzerr(0) << "Invalid entity name[" << req->name << "] in 
simulation interface GET_ENTITY_PARAM.\n";
+
+          break;
+        }
+
+
+
+      case SimulationRequestData::GET_ENTITY_PARAM_COUNT:
+        {
+          Entity *entity = this->GetEntityByName((char*)req->name);
+          if (entity)
+          {
+            unsigned int count = entity->GetParamCount();
+            response->type= req->type;
+            response->uintValue = count;
+            response++;
+            this->simIface->data->responseCount += 1;
+          }
+          else
+            gzerr(0) << "Invalid entity name[" << req->name << "] in 
simulation interface GET_ENTITY_PARAM_COUNT.\n";
+
+          break;
+        }
+
       case SimulationRequestData::GET_MODEL_NAME:
         {
           unsigned int index = req->uintValue;

Modified: code/gazebo/trunk/server/World.hh
===================================================================
--- code/gazebo/trunk/server/World.hh   2010-04-19 22:39:25 UTC (rev 8614)
+++ code/gazebo/trunk/server/World.hh   2010-04-23 23:57:16 UTC (rev 8615)
@@ -155,7 +155,7 @@
 
   /// \brief Delete an entity by name
   /// \param name The name of the entity to delete
-  public: void DeleteEntity(const char *name);
+  public: void DeleteEntity(const std::string &name);
 
   /// \brief Get a pointer to a entity based on a name
   public: Entity *GetEntityByName(const std::string &name) const;
@@ -344,7 +344,7 @@
   private: std::vector<Model*> models;
 
   /// List of models to delete from the world
-  private: std::vector< Model* > toDeleteModels;
+  private: std::vector< std::string > toDeleteModels;
 
   private: std::vector< std::string > toLoadEntities;
 

Modified: code/gazebo/trunk/server/gui/MainMenu.cc
===================================================================
--- code/gazebo/trunk/server/gui/MainMenu.cc    2010-04-19 22:39:25 UTC (rev 
8614)
+++ code/gazebo/trunk/server/gui/MainMenu.cc    2010-04-23 23:57:16 UTC (rev 
8615)
@@ -51,10 +51,10 @@
   {
     { "File", 0, 0, 0, FL_SUBMENU,  FL_NORMAL_LABEL, 0, 14, 0 },
     //  { "Open", 0, &gazebo::MainMenu::OpenCB, 0, 0, FL_NORMAL_LABEL,0, 14,0 
},
-    { "Save World", 0, &gazebo::MainMenu::SaveWorldCB, 0, 0, 
FL_NORMAL_LABEL,0, 14,0 },
+    { "Save World", FL_CTRL+'s', &gazebo::MainMenu::SaveWorldCB, 0, 0, 
FL_NORMAL_LABEL,0, 14,0 },
     { "Save Frames", 0, &gazebo::MainMenu::SaveFramesCB, 0, FL_MENU_TOGGLE, 
FL_NORMAL_LABEL,0, 14,0 },
-    { "Reset", 0, &gazebo::MainMenu::ResetCB, 0, 0, FL_NORMAL_LABEL,0, 14,0 },
-    { "Quit", 0, &gazebo::MainMenu::QuitCB, 0, 0, FL_NORMAL_LABEL,0, 14,0 },
+    { "Reset", FL_CTRL+'r', &gazebo::MainMenu::ResetCB, 0, 0, 
FL_NORMAL_LABEL,0, 14,0 },
+    { "Quit", FL_CTRL+'q', &gazebo::MainMenu::QuitCB, 0, 0, FL_NORMAL_LABEL,0, 
14,0 },
     { 0 },
 
     { "View", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},

Modified: code/gazebo/trunk/server/gui/Sidebar.cc
===================================================================
--- code/gazebo/trunk/server/gui/Sidebar.cc     2010-04-19 22:39:25 UTC (rev 
8614)
+++ code/gazebo/trunk/server/gui/Sidebar.cc     2010-04-23 23:57:16 UTC (rev 
8615)
@@ -351,23 +351,20 @@
 // Add entity to browser
 void Sidebar::AddEntityToParamBrowser(Common *entity, std::string prefix)
 {
-  std::vector<Param*> *parameters;
-  std::vector<Param*>::iterator iter;
   std::string value;
   std::string colorStr = "";
 
-  parameters = entity->GetParams();
-
   // Process all the parameters in the entity
-  for (iter = parameters->begin(); iter != parameters->end(); iter++)
+  for (unsigned int i=0; i < entity->GetParamCount(); i++)
   {
+    Param *param = entity->GetParam(i);
 
     /*if ( i%2 == 0)
       colorStr = "@B50";
       */
 
-    value = colorStr + "@b...@s" + prefix + (*iter)->GetKey() + ":~" + 
-      colorStr + "@s" + (*iter)->GetAsString();
+    value = colorStr + "@b...@s" + prefix + param->GetKey() + ":~" + 
+      colorStr + "@s" + param->GetAsString();
 
     this->AddToParamBrowser( value );
   }

Modified: code/gazebo/trunk/server/physics/Body.cc
===================================================================
--- code/gazebo/trunk/server/physics/Body.cc    2010-04-19 22:39:25 UTC (rev 
8614)
+++ code/gazebo/trunk/server/physics/Body.cc    2010-04-23 23:57:16 UTC (rev 
8615)
@@ -55,6 +55,7 @@
 Body::Body(Entity *parent)
     : Entity(parent)
 {
+  this->type = Entity::BODY;
   this->comEntity = new Entity(this);
   this->comEntity->SetName("COM Entity");
 

Modified: code/gazebo/trunk/server/physics/ode/ODEGeom.cc
===================================================================
--- code/gazebo/trunk/server/physics/ode/ODEGeom.cc     2010-04-19 22:39:25 UTC 
(rev 8614)
+++ code/gazebo/trunk/server/physics/ode/ODEGeom.cc     2010-04-23 23:57:16 UTC 
(rev 8615)
@@ -138,7 +138,7 @@
 // Save the body based on our XMLConfig node
 void ODEGeom::Save(std::string &prefix, std::ostream &stream)
 {
-  if (this->GetType() == Shape::RAY)
+  if (this->GetShapeType() == Shape::RAY)
     return;
 
   Geom::Save(prefix, stream);

Modified: code/gazebo/trunk/tools/CMakeLists.txt
===================================================================
--- code/gazebo/trunk/tools/CMakeLists.txt      2010-04-19 22:39:25 UTC (rev 
8614)
+++ code/gazebo/trunk/tools/CMakeLists.txt      2010-04-23 23:57:16 UTC (rev 
8615)
@@ -8,4 +8,4 @@
 
 add_executable(gazebomodel gazebomodel.cc)
 
-target_link_libraries(gazebomodel gazebo boost_program_options)
+target_link_libraries(gazebomodel gazebo boost_program_options yaml)

Modified: code/gazebo/trunk/tools/gazebomodel.cc
===================================================================
--- code/gazebo/trunk/tools/gazebomodel.cc      2010-04-19 22:39:25 UTC (rev 
8614)
+++ code/gazebo/trunk/tools/gazebomodel.cc      2010-04-23 23:57:16 UTC (rev 
8615)
@@ -1,12 +1,21 @@
 #include <iostream>
-//#include <gazebo/gazebo.h>
+#include <stdio.h>
+#include <sys/select.h>
+#include <boost/algorithm/string.hpp>
 #include "libgazebo/gz.h"
 
+#include <yaml.h>
+
 gazebo::Client *client = NULL;
 gazebo::SimulationIface *simIface = NULL;
 gazebo::FactoryIface *factoryIface = NULL;
 
+std::map<std::string, std::string> yamlValues;
+std::vector<std::string> params;
 
+yaml_parser_t parser;
+yaml_event_t event;
+
 
////////////////////////////////////////////////////////////////////////////////
 // Print out info for one model. Recurses through all child models
 void print_model(std::string name, std::string prefix)
@@ -14,19 +23,7 @@
   std::string type;
   gazebo::Pose pose;
 
-  /*if (!simIface->GetPose3d(name, pose))
-    std::cerr << "Unable to get model[" << name << "] pose\n";
-  if (!simIface->GetModelType(name, type))
-    std::cerr << "Unable to get model[" << name << "] type\n";
-    */
-
   std::cout << prefix << name << "\n";
-  /*std::cout << prefix << "  Type: " << type << "\n";
-  std::cout << prefix << "  XYZ: " << pose.pos.x << " " << pose.pos.y 
-            << " " << pose.pos.z << "\n";
-  std::cout << prefix << "  RPY: " << pose.roll << " " << pose.pitch 
-            << " " << pose.yaw << "\n";
-            */
 
   unsigned int children;
   if (!simIface->GetNumChildren(name, children))
@@ -51,7 +48,7 @@
 
 
////////////////////////////////////////////////////////////////////////////////
 // Print out a list of all the models
-void list(int argc, char **argv)
+void list()
 {
   unsigned int numModels = 0;
 
@@ -71,26 +68,93 @@
 
 
////////////////////////////////////////////////////////////////////////////////
 // Show info for a model
-void show(int argc, char **argv)
+void show()
 {
-  if (argc < 3)
+  if (params.size() < 2)
     std::cerr << "Missing model name\n";
   else
-    print_model(argv[2], "");
+  {
+    for (unsigned int i=1; i < params.size(); i++)
+    {
+      std::string name = params[i];
+      std::string type;
+      gazebo::Pose pose;
+      unsigned int paramCount;
+
+      if (!simIface->GetPose3d(name, pose))
+        std::cerr << "Unable to get model[" << name << "] pose\n";
+      if (!simIface->GetModelType(name, type))
+        std::cerr << "Unable to get model[" << name << "] type\n";
+      if (!simIface->GetEntityParamCount(name, paramCount))
+        std::cerr << "Unable to get model[" << name << "] param count\n";
+
+      for (unsigned int i=0; i < paramCount; i++)
+      {
+        std::string paramKey;
+        std::string paramValue;
+
+        if (!simIface->GetEntityParamKey(name, i, paramKey))
+          std::cerr << "Unable to get model[" << name << "] param key\n";
+        if (!simIface->GetEntityParamValue(name, i, paramValue))
+          std::cerr << "Unable to get model[" << name << "] param value\n";
+
+        std::cout << paramKey << ": " << paramValue << "\n";
+      }
+      std::cout << "\n";
+    }
+  }
 }
 
 
////////////////////////////////////////////////////////////////////////////////
 // Remove a model from the world
-void kill(int argc, char **argv)
+void kill()
 {
-  if (argc < 3)
+  if (params.size() < 2)
     std::cerr << "Missing model name\n";
   else
   {
-    factoryIface->DeleteModel( argv[2] );
+    // Kill all the passed in models
+    for (unsigned int i=1; i < params.size(); i++)
+    {
+      factoryIface->DeleteModel( params[i] );
+
+      while (strcmp((const char*)factoryIface->data->deleteModel,"") != 0)
+        usleep(10000);
+    }
   }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// Spawn a new model into the world
+void spawn()
+{
+  //TODO
+  //PROCESS YAML PARAMETER!!!
+  if (params.size() < 2)
+    std::cerr << "Missing model filename\n";
+  else
+  {
+    FILE *file = fopen(params[1].c_str(),"r");
+    if (file)
+    {
+      std::ostringstream stream;
+      while (!feof(file))
+      {
+        char buffer[256];
+        fgets(buffer, 256, file);
+        if (feof(file))
+            break;
+        stream << buffer;
+      }
+      strcpy((char*)factoryIface->data->newModel, stream.str().c_str());
+    }
+    else
+      std::cerr << "Unable to open file[" << params[1] << "]\n";
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Print out help information
 void help()
 {
   std::cout << "gazebomodel is a command-line tool for printing out 
information about models in a gazebo world.\n";
@@ -100,9 +164,59 @@
 
   std::cout << "Commands:\n";
   std::cout << "\tgazebomodel list \t List all the models\n";
-  std::cout << "\tgazebomodel show \t Show info about a model\n";
+  std::cout << "\tgazebomodel show \t Show info about a model(s)\n";
+  std::cout << "\tgazebomodel kill \t Remove a model(s) from the world\n";
+  std::cout << "\tgazebomodel spawn \t Insert a model into the world\n";
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// Parse yaml parameters
+void parseYAML()
+{
+  std::map<std::string, std::string>::iterator iter;
+
+  // Create the yaml parser 
+  yaml_parser_initialize(&parser);
+
+  std::string input = params[params.size()-1];
+  yaml_parser_set_input_string(&parser, 
+      (const unsigned char *)input.c_str(), input.size());
+
+  bool done = false;
+  std::string name;
+  while (!done)
+  {
+    if (!yaml_parser_parse(&parser, &event))
+    {
+      std::cerr << "YAML error: Bad syntax for '" << input << "'\n";
+      break;
+    }
+
+    if (event.type == YAML_SCALAR_EVENT)
+    {
+      if (name.size() == 0)
+        name = (char*)(event.data.scalar.value);
+      else
+      {
+        yamlValues[name] = (char*)event.data.scalar.value;
+        name = "";
+      }
+    }
+
+    done = (event.type == YAML_STREAM_END_EVENT);
+    yaml_event_delete(&event);
+  }
+
+  yaml_parser_delete(&parser);
+
+  /*for (iter = yamlValues.begin(); iter != yamlValues.end(); iter++)
+  {
+    std::cout << "Key[" << iter->first << "] Value[" << iter->second << "]\n";
+  }*/
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Main
 int main(int argc, char **argv)
 {
 
@@ -112,6 +226,32 @@
     return 1;
   }
 
+  // Get parameters from command line
+  for (int i=1; i < argc; i++)
+  {
+    std::string p = argv[i];
+    boost::trim(p);
+    params.push_back( p );
+  }
+
+  // Get parameters from stdin 
+  if (!isatty(fileno(stdin)))
+  {
+    char str[1024];
+    while (!feof(stdin))
+    {
+      fgets(str, 1024, stdin);
+      if (feof(stdin))
+        break;
+      std::string p = str;
+      boost::trim(p);
+      params.push_back(p);
+    }
+  }
+
+  parseYAML();
+
+  /*
   client = new gazebo::Client();
   simIface = new gazebo::SimulationIface();
   factoryIface = new gazebo::FactoryIface();
@@ -149,13 +289,15 @@
     return -1;
   }
 
-  std::string cmd = argv[1];
-  if (cmd == "list")
-    list(argc, argv);
-  else if (cmd == "show")
-    show(argc, argv);
-  else if (cmd == "kill")
-    kill(argc, argv);
+  if (params[0] == "list")
+    list();
+  else if (params[0] == "show")
+    show();
+  else if (params[0] == "kill")
+    kill();
+  else if (params[0] == "spawn")
+    spawn();
   else
-    std::cerr << "Unknown command[" << cmd << "]\n";
+    std::cerr << "Unknown command[" << params[0] << "]\n";
+  */
 }


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

------------------------------------------------------------------------------
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to