Update of /cvsroot/playerstage/code/player/server/drivers/mixed/irobot/roomba
In directory 
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15294/server/drivers/mixed/irobot/roomba

Modified Files:
        roomba_driver.cc 
Log Message:
applied patch [ 1820854 ] big Roomba patch

Index: roomba_driver.cc
===================================================================
RCS file: 
/cvsroot/playerstage/code/player/server/drivers/mixed/irobot/roomba/roomba_driver.cc,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** roomba_driver.cc    1 Nov 2007 22:16:20 -0000       1.17
--- roomba_driver.cc    23 Nov 2007 10:08:24 -0000      1.18
***************
*** 78,81 ****
--- 78,84 ----
    - Nonzero to keep the robot in "safe" mode (the robot will stop if
      the wheeldrop or cliff sensors are triggered), zero for "full" mode
+ - bumplock (integer)
+   - Default: 0
+   - If set to 1, the robot will stop whenever bumpers are closed
  
  @par Example
***************
*** 104,113 ****
  
  #include <unistd.h>
! 
  #include <libplayercore/playercore.h>
  
  #include "roomba_comms.h"
  
! #define CYCLE_TIME_US 200000
  
  class Roomba : public Driver
--- 107,120 ----
  
  #include <unistd.h>
! #include <stddef.h>
! #include <stdio.h>
! #include <string.h>
! #include <pthread.h>
! #include <time.h>
  #include <libplayercore/playercore.h>
  
  #include "roomba_comms.h"
  
! #define CYCLE_TIME_NS 200000000
  
  class Roomba : public Driver
***************
*** 134,137 ****
--- 141,147 ----
      bool safe;
  
+     bool bumplock;
+     bool bumplocked;
+ 
      player_devaddr_t position_addr;
      player_devaddr_t power_addr;
***************
*** 143,146 ****
--- 153,162 ----
      // The underlying roomba object
      roomba_comm_t* roomba_dev;
+ 
+     player_position2d_cmd_vel_t position_cmd;
+     player_position2d_geom_t pos_geom;
+     player_bumper_geom_t bump_geom;
+     player_ir_pose poses;
+     player_opaque_data_t opaque_data;
  };
  
***************
*** 165,169 ****
    memset(&this->ir_addr,0,sizeof(player_devaddr_t));
    memset(&this->opaque_addr,0,sizeof(player_devaddr_t));
!   //memset(&this->gripper_addr,0,sizeof(player_devaddr_t));
  
    // Do we create a position interface?
--- 181,185 ----
    memset(&this->ir_addr,0,sizeof(player_devaddr_t));
    memset(&this->opaque_addr,0,sizeof(player_devaddr_t));
!   memset(&this->gripper_addr,0,sizeof(player_devaddr_t));
  
    // Do we create a position interface?
***************
*** 236,239 ****
--- 252,257 ----
    this->serial_port = cf->ReadString(section, "port", "/dev/ttyS0");
    this->safe = cf->ReadInt(section, "safe", 1);
+   this->bumplock = cf->ReadInt(section, "bumplock", 0);
+   this->bumplocked = false;
    this->roomba_dev = NULL;
  }
***************
*** 252,256 ****
    }
  
!   /*printf("HERE\n");
    roomba_set_leds(this->roomba_dev, 1, 0, 1, 0, 2, 128, 255);
    */
--- 270,274 ----
    }
  
!   /*
    roomba_set_leds(this->roomba_dev, 1, 0, 1, 0, 2, 128, 255);
    */
***************
*** 278,286 ****
  Roomba::Main()
  {
!   for(;;)
    {
       this->ProcessMessages();
  
!      if(roomba_get_sensors(this->roomba_dev, -1) < 0)
       {
         PLAYER_ERROR("failed to get sensor data from roomba");
--- 296,306 ----
  Roomba::Main()
  {
!   for (;;)
    {
+      pthread_testcancel();
+ 
       this->ProcessMessages();
  
!      if (roomba_get_sensors(this->roomba_dev, -1) < 0)
       {
         PLAYER_ERROR("failed to get sensor data from roomba");
***************
*** 288,291 ****
--- 308,320 ----
         return;
       }
+      if ((this->bumplock) && ((this->roomba_dev->bumper_left) || 
(this->roomba_dev->bumper_right)))
+      {
+         this->bumplocked = true;
+       if (roomba_set_speeds(this->roomba_dev, 0.0, 0.0) < 0)
+         {
+           PLAYER_ERROR("failed to stop roomba");
+         }
+      }
+      else this->bumplocked = false;
  
       ////////////////////////////
***************
*** 397,401 ****
       delete [] cpdata.data;
  
!      usleep(CYCLE_TIME_US);
    }
  }
--- 426,433 ----
       delete [] cpdata.data;
  
!      struct timespec ts;
!      ts.tv_sec = 0;
!      ts.tv_nsec = CYCLE_TIME_NS;
!      nanosleep(&ts, NULL);
    }
  }
***************
*** 412,417 ****
    {
      // get and send the latest motor command
!     player_position2d_cmd_vel_t position_cmd;
!     position_cmd = *(player_position2d_cmd_vel_t*)data;
      PLAYER_MSG2(2,"sending motor commands %f:%f", 
                  position_cmd.vel.px,
--- 444,458 ----
    {
      // get and send the latest motor command
!     if (!data)
!     {
!       PLAYER_ERROR("NULL position command");
!       return -1;
!     }
!     memcpy(&position_cmd, data, sizeof position_cmd);
!     if (this->bumplocked)
!     {
!       if (position_cmd.vel.px > 0.0) position_cmd.vel.px = 0.0;
!       position_cmd.vel.pa = 0.0;
!     }
      PLAYER_MSG2(2,"sending motor commands %f:%f", 
                  position_cmd.vel.px,
***************
*** 438,452 ****
    {
      /* Return the robot geometry. */
!     player_position2d_geom_t geom={{0}};
      // Assume that it turns about its geometric center, so zeros are fine
  
!     geom.size.sl = ROOMBA_DIAMETER;
!     geom.size.sw = ROOMBA_DIAMETER;
  
      this->Publish(this->position_addr, resp_queue,
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_POSITION2D_REQ_GET_GEOM,
!                   (void*)&geom, sizeof(geom), NULL);
!     return(0);
    }
    else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
--- 479,493 ----
    {
      /* Return the robot geometry. */
!     memset(&pos_geom, 0, sizeof pos_geom);
      // Assume that it turns about its geometric center, so zeros are fine
  
!     pos_geom.size.sl = ROOMBA_DIAMETER;
!     pos_geom.size.sw = ROOMBA_DIAMETER;
  
      this->Publish(this->position_addr, resp_queue,
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_POSITION2D_REQ_GET_GEOM,
!                   (void*)&pos_geom, sizeof pos_geom, NULL);
!     return 0;
    }
    else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
***************
*** 454,481 ****
                                  this->bumper_addr))
    {
!     player_bumper_geom_t geom;
  
!     geom.bumper_def_count = 2;
!     geom.bumper_def = new player_bumper_define_t[geom.bumper_def_count];
  
!     geom.bumper_def[0].pose.px = 0.0;
!     geom.bumper_def[0].pose.py = 0.0;
!     geom.bumper_def[0].pose.pyaw = 0.0;
!     geom.bumper_def[0].length = 0.0;
!     geom.bumper_def[0].radius = ROOMBA_DIAMETER/2.0;
  
!     geom.bumper_def[1].pose.px = 0.0;
!     geom.bumper_def[1].pose.py = 0.0;
!     geom.bumper_def[1].pose.pyaw = 0.0;
!     geom.bumper_def[1].length = 0.0;
!     geom.bumper_def[1].radius = ROOMBA_DIAMETER/2.0;
  
      this->Publish(this->bumper_addr, resp_queue,
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_BUMPER_REQ_GET_GEOM,
!                   (void*)&geom);
!     delete [] geom.bumper_def;
  
!     return(0);
    }
    else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
--- 495,528 ----
                                  this->bumper_addr))
    {
!     memset(&bump_geom, 0, sizeof bump_geom);
  
!     bump_geom.bumper_def_count = 2;
!     bump_geom.bumper_def = new 
player_bumper_define_t[bump_geom.bumper_def_count];
!     if (!(bump_geom.bumper_def))
!     {
!       PLAYER_ERROR("Out of memory");
!       return -1;
!     }
  
!     bump_geom.bumper_def[0].pose.px = 0.12;
!     bump_geom.bumper_def[0].pose.py = 0.12;
!     bump_geom.bumper_def[0].pose.pyaw = 45.0;
!     bump_geom.bumper_def[0].length = 0.33;
!     bump_geom.bumper_def[0].radius = ROOMBA_DIAMETER / 2.0;
  
!     bump_geom.bumper_def[1].pose.px = 0.12;
!     bump_geom.bumper_def[1].pose.py = -0.12;
!     bump_geom.bumper_def[1].pose.pyaw = -45.0;
!     bump_geom.bumper_def[1].length = 0.33;
!     bump_geom.bumper_def[1].radius = ROOMBA_DIAMETER / 2.0;
  
      this->Publish(this->bumper_addr, resp_queue,
                    PLAYER_MSGTYPE_RESP_ACK,
                    PLAYER_BUMPER_REQ_GET_GEOM,
!                   (void*)&bump_geom);
!     delete []bump_geom.bumper_def;
!     bump_geom.bumper_def = NULL;
  
!     return 0;
    }
    else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
***************
*** 483,490 ****
                                      this->ir_addr))
    {
!     player_ir_pose poses;
  
      poses.poses_count = 11;
      poses.poses = new player_pose3d_t[poses.poses_count];
  
      // TODO: Fill in proper values
--- 530,542 ----
                                      this->ir_addr))
    {
!     memset(&poses, 0, sizeof poses);
  
      poses.poses_count = 11;
      poses.poses = new player_pose3d_t[poses.poses_count];
+     if (!(poses.poses))
+     {
+       PLAYER_ERROR("Out of memory");
+       return -1;
+     }
  
      // TODO: Fill in proper values
***************
*** 500,505 ****
                    PLAYER_IR_REQ_POSE,
                    (void*)&poses);
!     delete [] poses.poses;
!     return(0);
    }
    else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_CMD,
--- 552,558 ----
                    PLAYER_IR_REQ_POSE,
                    (void*)&poses);
!     delete []poses.poses;
!     poses.poses = NULL;
!     return 0;
    }
    else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_CMD,
***************
*** 507,518 ****
                                      this->opaque_addr))
    {
!     printf("Opaque\n");
!     player_opaque_data_t opaque_data;
! 
!     printf("1\n");
!     opaque_data = *(player_opaque_data_t*)data;
! 
!     printf("2\n");
!     printf("Opaque Command\n");
  
      // Play Command
--- 560,569 ----
                                      this->opaque_addr))
    {
!     if (!data)
!     {
!       PLAYER_ERROR("NULL opaque data");
!       return -1;
!     }
!     memcpy(&opaque_data, data, sizeof opaque_data);
  
      // Play Command
***************
*** 583,587 ****
    else
    {
!     return(-1);
    }
  }
--- 634,638 ----
    else
    {
!     return -1;
    }
  }


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to