You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
4.3 KiB
175 lines
4.3 KiB
/*
|
|
* VisualServoing is a tutorial program for introducing students to
|
|
* robotics.
|
|
*
|
|
* Copyright 2009, 2010 Kevin Quigley <kevin.quigley@gmail.com> and
|
|
* Marsette Vona <vona@ccs.neu.edu>
|
|
*
|
|
* VisualServoing is free software: you can redistribute it andor modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* VisualServoing is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* as the file COPYING along with VisualServoing. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "SSC32Controller.hpp"
|
|
|
|
#include <iostream>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <strings.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
|
|
SSC32Controller::SSC32Controller(const std::string& port_name, BAUD baud) {
|
|
|
|
std::cerr << "opening port \"" << port_name << "\""<< std::endl;
|
|
port = open(port_name.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
|
|
|
|
if (port < 0) {
|
|
|
|
perror(port_name.c_str());
|
|
// exit(port);
|
|
|
|
} else {
|
|
|
|
std::cerr << "opened port \"" << port_name << "\""<< std::endl;
|
|
|
|
tcgetattr(port, &oldtio); // save current serial port settings
|
|
|
|
memset(&newtio, 0x00, sizeof(newtio));
|
|
|
|
// set baud rate
|
|
cfsetispeed(&newtio, baud); // input
|
|
cfsetospeed(&newtio, baud); // output
|
|
|
|
// CRTSCTS/CNEW_RTSCTS: output hardware flow control
|
|
// set to NONE
|
|
#if defined(CRTSCTS)
|
|
newtio.c_cflag &= ~CRTSCTS;
|
|
#elif defined(CNEW_RTCTS)
|
|
newtio.c_cflag &= ~CNEW_RTSCTS;
|
|
#endif
|
|
|
|
// CLOCAL : local connection, no modem contol
|
|
// CREAD : enable receiving characters
|
|
newtio.c_cflag |= CLOCAL | CREAD;
|
|
|
|
// set parity 8N1
|
|
newtio.c_cflag &= ~CSIZE; // data mask
|
|
newtio.c_cflag |= CS8; // 8
|
|
newtio.c_cflag &= ~PARENB; // N
|
|
newtio.c_cflag &= ~CSTOPB; // 1
|
|
|
|
// use raw data, no processing or signals
|
|
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
|
|
newtio.c_oflag &= ~OPOST;
|
|
|
|
newtio.c_iflag |= ICRNL; // map CR to NL
|
|
|
|
|
|
newtio.c_oflag = 0; // raw output
|
|
|
|
tcflush(port, TCIOFLUSH); // clear all data on line
|
|
tcsetattr(port, TCSANOW, &newtio); // set up port
|
|
}
|
|
}
|
|
|
|
SSC32Controller::~SSC32Controller(void) {
|
|
if (port >= 0) {
|
|
std::cout << "closing port" << std::endl;
|
|
sleep(1);
|
|
tcsetattr(port, TCSANOW, &oldtio); // reset port to old settings
|
|
if (close(port) < 0) {
|
|
perror("error closing port");
|
|
}
|
|
port = -1;
|
|
}
|
|
}
|
|
|
|
void SSC32Controller::release(unsigned int servo) {
|
|
write(Command::release(servo));
|
|
}
|
|
|
|
void SSC32Controller::release(std::list<unsigned int> servos) {
|
|
write(Command::release(servos));
|
|
}
|
|
|
|
void SSC32Controller::releaseAll(void) {
|
|
write(Command::releaseAll(NUM_SERVOS));
|
|
}
|
|
|
|
void SSC32Controller::move(const Command& cmd) {
|
|
write(cmd);
|
|
}
|
|
|
|
void SSC32Controller::movePWM(unsigned int servo,
|
|
unsigned int pwm, unsigned int speed,
|
|
unsigned int time) {
|
|
cmd.reset();
|
|
cmd.addMove(servo, pwm, speed);
|
|
cmd.minTime(time);
|
|
write(cmd);
|
|
}
|
|
|
|
void SSC32Controller::movePWM(std::list<SPS> servos, unsigned int time) {
|
|
cmd.reset();
|
|
for (std::list<SPS>::const_iterator c = servos.begin();
|
|
c != servos.end();
|
|
c++ ) {
|
|
cmd.addMove(c->servo, c->position, c->speed);
|
|
}
|
|
cmd.minTime(time);
|
|
write(cmd);
|
|
}
|
|
|
|
/*
|
|
bool SSC32Controller::isMoveCompleted(void) {
|
|
|
|
//write(Command::queryMove());
|
|
|
|
//TBD read
|
|
|
|
return true;
|
|
}
|
|
*/
|
|
|
|
|
|
/*
|
|
unsigned int SSC32Controller::getPosition(unsigned int servo) {
|
|
cmd.reset();
|
|
|
|
//cmd.queryPosition(servo);
|
|
|
|
//write(cmd);
|
|
|
|
//TBD read
|
|
|
|
return 0;
|
|
}
|
|
*/
|
|
|
|
void SSC32Controller::write(const std::string cmd) {
|
|
printf("sending command: %s\n", cmd.c_str());
|
|
if (port >= 0) {
|
|
int n = ::write(port, cmd.c_str(), cmd.length());
|
|
if (n < 0) {
|
|
perror("error writing command");
|
|
return;
|
|
}
|
|
char CR = '\r';
|
|
if (::write(port, &CR, sizeof(CR)) != sizeof(CR))
|
|
perror("error writing command terminator");
|
|
else
|
|
printf("ok\n");
|
|
}
|
|
}
|