Go to the documentation of this file.00001 #include "ros/ros.h"
00002 #include "ssc32.hpp"
00003 
00004 namespace Servo
00005 {
00006     
00007     SSC32::SSC32(){
00008         nrOfPorts = 32;
00009         }
00010     
00011     
00012         SSC32::~SSC32() {}
00013 
00014     void SSC32::initSerial()
00015     {
00016         
00017         cfsetispeed(&port_settings, BAUDRATE);
00018         cfsetospeed(&port_settings, BAUDRATE);
00019         
00020         
00021         timeout.tv_sec = TIMEOUT_SEC;
00022 
00023         
00024         
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042     }
00043     
00044     bool SSC32::startSerial(std::string COM_PORT_)
00045     {
00046         const char *COM_PORT;
00047         COM_PORT = COM_PORT_.c_str();
00048         int flags;
00049         printf("COM_PORT =  %s \n",COM_PORT);
00050         
00051         fd = open(COM_PORT, O_RDWR | O_NONBLOCK, S_IRUSR | S_IWUSR);
00052         
00053         if(fd == -1)  
00054         {
00055             std::cout << "(SSC-32) Unable to open " << COM_PORT<< "\n" << std::endl;
00056             return false;
00057         }
00058 
00059         if (tcflush(fd, TCIFLUSH) < 0)
00060         {
00061                 close(fd);
00062                 fd = -1;
00063                 return false;
00064         }
00065         if (tcgetattr(fd, &port_settings) < 0)
00066         {
00067                 close(fd);
00068                 fd = -1;
00069                 return false;
00070         }
00071 
00072         cfmakeraw(&port_settings);
00073         cfsetispeed(&port_settings, BAUDRATE);
00074         cfsetospeed(&port_settings, BAUDRATE);
00075 
00076         if (tcsetattr(fd, TCSAFLUSH, &port_settings) < 0)
00077         {
00078                 perror("corobot_open():tcsetattr():");
00079                 close(fd);
00080                 fd = -1;
00081                 return false;
00082         }
00083 
00084             
00085             
00086         if ((flags = fcntl(fd, F_GETFL)) < 0)
00087         {
00088                 perror("corobot_comm_open():fcntl():");
00089                 close(fd);
00090                 fd = -1;
00091                 return false;
00092         }
00093         if (fcntl(fd, F_SETFL, flags ^ O_NONBLOCK) < 0)
00094         {
00095                 perror("corobot_comm_open():fcntl()");
00096                 close(fd);
00097                 fd = -1;
00098                 return false;
00099         }
00100         else
00101         {
00102             std::cout << "(SSC-32) Opened " << COM_PORT << "\n" << std::endl;
00103             return true;
00104         }
00105 
00106     }
00107     
00108     void SSC32::stopSerial()
00109     {   
00110         
00111         SendMessage(0,0,0);
00112         SendMessage(1,0,0);
00113         
00114         close(fd);
00115     }
00116 
00117     bool SSC32::SendMessage(int port, int position, int speed)
00118     {
00119         
00120         if(port >= nrOfPorts || port < 0)
00121         {
00122             std::cout << "(SSC-32) Port number not valid: " << port << std::endl;
00123             return false;
00124         }
00125         
00126         
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136         
00137         
00138         std::ostringstream temp, temp2, temp3; 
00139         temp << port; 
00140         Port = temp.str();
00141 
00142         temp2 << position; 
00143         Position = temp2.str();
00144 
00145         temp3 << speed; 
00146         Speed = temp3.str(); 
00147         
00148         
00149         if(speed == -1)
00150                 command= "#" + Port + " P" + Position + " \r";  
00151         else
00152                 command= "#" + Port + " P" + Position + " T" + Speed + " \r";  
00153         Output = command.c_str();
00154         
00155         
00156         int err = write(fd,Output,strlen(Output));
00157         std::cout << "(SSC32) " << command << "\n" << std::endl;
00158 
00159         if(err == -1)
00160                 ROS_ERROR("Error sending command to SSC32 controller");
00161         else if(err == 0)
00162                 ROS_WARN("The command was not send to the SSC32 controller");
00163         else if(err != ((int) strlen(Output)))
00164                 ROS_WARN("Only a part of the command was sent to the SSC32 controller, %d bits out of %d", err, (int) strlen(Output));
00165         else
00166                 ROS_DEBUG("Command sent successfully to the SSC32 Controller");
00167         return true;
00168     }
00169 
00170     bool SSC32::CheckIfFinished()
00171     {   
00172             char someData; 
00173             int err = write(fd,"Q \r",strlen("Q \r"));
00174             err = read(fd,&someData,1);
00175             if (char(someData) == '.') 
00176         {
00177             std::cout << "(SSC32) Servos have finished rotating " << "\n" << std::endl;
00178             return true;
00179         }
00180             return false;
00181     }
00182 }
00183