⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nav200.cc

📁 机器人仿真软件
💻 CC
📖 第 1 页 / 共 2 页
字号:
#include "nav200.h"Nav200::Nav200(){}Nav200::~Nav200(){}int Nav200::Initialise(const char * port, int rate){  bytesReceived = 0;  fd = -1;  // open the serial port  fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);  if ( fd<0 )  {    fprintf(stderr, "Could not open serial device %s\n",port);    return -1;  }  // save the current io settings  tcgetattr(fd, &oldtio);  // set up new settings  struct termios newtio;  memset(&newtio, 0,sizeof(newtio));  newtio.c_cflag = CS8 | CREAD | PARENB;  newtio.c_iflag = INPCK;  newtio.c_oflag = 0;  newtio.c_lflag = 0;  // activate new settings  tcflush(fd, TCIFLUSH);  if (cfsetispeed(&newtio, rate) < 0 || cfsetospeed(&newtio, rate) < 0)  {    fprintf(stderr,"Failed to set serial baud rate: %d\n", rate);    tcsetattr(fd, TCSANOW, &oldtio);    close(fd);    fd = -1;    return -1;  }  tcsetattr(fd, TCSANOW, &newtio);  tcflush(fd, TCIOFLUSH);  // clear the input buffer in case junk data is on the port  usleep(10000);  tcflush(fd, TCIFLUSH);  return 0;}int Nav200::Terminate(){  // restore old port settings  if (fd > 0)  {    tcsetattr(fd, TCSANOW, &oldtio);    close(fd);  }  return 0;}/****************** Standby mode*******************/bool Nav200::EnterStandby(){  WriteCommand('S','A',0,NULL);  if (ReadFromNav200() > 0)  {    if (packet.length==5 && packet.mode == 'S' && packet.function == 'A')      return true;  }  return false;}int Nav200::GetVersionNumber(){  WriteCommand('S','V',0,NULL);  if (ReadFromNav200() > 0)  {    if (packet.length==8 && packet.mode == 'S' && packet.function == 'V')    {      //printf("Version: %d.%d.%d\n",packet.data[0],packet.data[1],packet.data[2]);      return (*reinterpret_cast<int*> (packet.data))&0xFFFFFF;    }  }  return 0;}char* Nav200::GetVersionString(){  WriteCommand('S','T',0,NULL);  if(ReadFromNav200()>0)  {    if(packet.mode == 'S' && packet.function == 'T')    {      packet.data[packet.dataLength]='\0';      return(reinterpret_cast<char*>(packet.data));    }  }  return NULL;}short Nav200::GetDeviceSerial(){  WriteCommand('S','S',0,NULL);  if(ReadFromNav200()>0)  {    if(packet.length==7 && packet.mode == 'S' && packet.function == 'S')      return *reinterpret_cast<short*> (packet.data);  }  return 0;}bool Nav200::rotateDirection(uint8_t direction){  WriteCommand('S','U',1,&direction);  if(ReadFromNav200()>0)  {    if(packet.length==6 && packet.mode == 'S' && packet.function == 'U' /*&& *reinterpret_cast<uint8_t*> (packet.data) == direction*/)    {      return true;    }  }  return false;}bool Nav200::GetReflectorPosition(uint8_t layer, uint8_t number, PositionXY & reflector){  uint8_t data[2] = {layer,number};  WriteCommand('S','R',2,data);  if(ReadFromNav200()>0)  {    if(packet.length==15 && packet.mode == 'S' && packet.function == 'R' && packet.data[0]==layer && packet.data[1]==number)    {        reflector.x = *reinterpret_cast<int*> (packet.data+2);        reflector.y = *reinterpret_cast<int*> (packet.data+6);        return true;    }  }  return false;}bool Nav200::ChangeReflectorPosition(uint8_t layer, uint8_t number, int newX, int newY){  uint8_t command[10];  command[0] = layer;  command[1] = number;  *reinterpret_cast<int*> (&command[2]) = newX;  *reinterpret_cast<int*> (&command[6]) = newY;  WriteCommand('S','C',10,command);  if(ReadFromNav200()>0)  {    if(packet.length==15 && packet.mode == 'S' && packet.function == 'C' && packet.data[0]==layer && packet.data[1]==number && *reinterpret_cast<int*> (packet.data+2) == newX && *reinterpret_cast<int*> (packet.data+6) == newY)      return true;  }  return false;}bool Nav200::InsertReflectorPosition(uint8_t layer, uint8_t number, int X, int Y){  uint8_t command[10];  command[0] = layer;  command[1] = number;  *reinterpret_cast<int*> (&command[2]) = X;  *reinterpret_cast<int*> (&command[6]) = Y;  WriteCommand('S','I',10,command);  if(ReadFromNav200()>0)  {    if(packet.length==15 && packet.mode == 'S' && packet.function == 'I' && packet.data[0]==layer && packet.data[1]==number && *reinterpret_cast<int*> (packet.data+2) == X && *reinterpret_cast<int*> (packet.data+6) == Y)      return true;  }  return false;}bool Nav200::DeleteReflectorPosition(uint8_t layer, uint8_t number, PositionXY & reflector){  uint8_t data[2] = {layer,number};  WriteCommand('S','D',2,data);  if(ReadFromNav200()>0)  {    if(packet.length==15 && packet.mode == 'S' && packet.function == 'D' && packet.data[0]==layer && packet.data[1]==number)    {        reflector.x = *reinterpret_cast<int*> (packet.data+2);        reflector.y = *reinterpret_cast<int*> (packet.data+6);//         printf("deleted reflector is %d\n",reflector.x);        return true;    }  }  return false;}/********************************** Read and set reflector radii***********************************/int Nav200::GetReflectorRadius(uint8_t layer){//   ReflectorSize reflector;  WriteCommand('R','G',1,&layer);  if(ReadFromNav200()>0)  {    if(packet.length==7 && packet.mode == 'R' && packet.function == 'G' && packet.data[0] == layer)    {      return packet.data[1];    }  }  return -1;}bool Nav200::SetReflectorRadius(uint8_t layer, uint8_t radius){  uint8_t data[2] = {layer,radius};  WriteCommand('R','S',2,data);  if(ReadFromNav200()>0)  {    if(packet.length==7 && packet.mode == 'R' && packet.function == 'G' && packet.data[0] == layer && packet.data[1] == radius)      return true;  }  return false;}/****************** Mapping mode*******************/bool Nav200::EnterMapping(){  WriteCommand('M','A',0,NULL);  if(ReadFromNav200()>0)  {    if(packet.length==5 && packet.mode == 'M' && packet.function == 'A')      return true;  }  return false;}int Nav200::StartMapping(uint8_t layer, int X, int Y, short orientation, uint8_t radius){  uint8_t data[12];  data[0] = layer;  *reinterpret_cast<int*> (&data[1]) = X;  *reinterpret_cast<int*> (&data[5]) = Y;  *reinterpret_cast<short*> (&data[9]) = orientation;  data[11] = radius;  WriteCommand('M','S',12,data);  if(ReadFromNav200(100000000)>0)  {    if(packet.length==7 && packet.mode == 'M' && packet.function == 'S' && packet.data[0] == layer)      return packet.data[1];  }  return -1;}int Nav200::StartMappingMeasurement(uint8_t layer, uint8_t scans, int X, int Y, short orientation, uint8_t radius){  uint8_t data[13];  data[0] = layer;  data[1] = scans;  *reinterpret_cast<int*> (&data[2]) = X;  *reinterpret_cast<int*> (&data[6]) = Y;  *reinterpret_cast<short*> (&data[10]) = orientation;  data[12] = radius;  WriteCommand('M','M',13,data);  if(ReadFromNav200(100000000)>0)  {    if(packet.length==7 && packet.mode == 'M' && packet.function == 'S' && packet.data[0] == layer)      return packet.data[1];  }  return -1;}int Nav200::StartNegativeMappingMeasurement(uint8_t layer, uint8_t scans, int X, int Y, short orientation, uint8_t radius){  uint8_t data[13];  data[0] = layer;  data[1] = scans;  *reinterpret_cast<int*> (&data[2]) = X;  *reinterpret_cast<int*> (&data[6]) = Y;  *reinterpret_cast<short*> (&data[10]) = orientation;  data[12] = radius;  WriteCommand('M','N',13,data);  if(ReadFromNav200()>0)  {    if(packet.length==7 && packet.mode == 'M' && packet.function == 'S' && packet.data[0] == layer)      return packet.data[1];  }  return -1;}bool Nav200::MappingPosition(uint8_t layer, uint8_t number, PositionXY & reflector){  uint8_t data[2] = {layer,number};  WriteCommand('M','R',2,data);  if(ReadFromNav200()>0)  {    if(packet.length==15 && packet.mode == 'M' && packet.function == 'R' && packet.data[0] == layer && packet.data[1] == number)    {        reflector.x = *reinterpret_cast<int*> (packet.data+2);        reflector.y = *reinterpret_cast<int*> (packet.data+6);        return true;    }  }  return false;}/****************** Positioning mode*******************/bool Nav200::EnterPositioning(){  WriteCommand('P','A',0,NULL);  if(ReadFromNav200()>0)  {    if(packet.length==5 && packet.mode == 'P' && packet.function == 'A')      return true;  }  return false;}bool Nav200::EnterPositioningInput(uint8_t NumberOfMeasurements){  WriteCommand('P','N',1,&NumberOfMeasurements);  if(ReadFromNav200()>0)  {    if(packet.length==5 && packet.mode == 'P' && packet.function == 'A')      return true;  }  return false;}bool Nav200::GetPositionAuto(LaserPos & laserPosition){  WriteCommand('P','P',0,NULL);  if(ReadFromNav200()>0)  {    if(packet.length==17 && packet.mode == 'P' && packet.function == 'P')    {      laserPosition.pos.x = *reinterpret_cast<int*> (packet.data);      laserPosition.pos.y = *reinterpret_cast<int*> (packet.data+4);      laserPosition.orientation = *reinterpret_cast<short*> (packet.data+8);      laserPosition.quality = packet.data[10];      laserPosition.number = packet.data[11];      return true;    }  }  return false;}bool Nav200::GetPositionSpeed(short speedX, short speedY, LaserPos & laserPosition){  uint8_t data[4];  *reinterpret_cast<short*> (&data[0]) = speedX;  *reinterpret_cast<short*> (&data[2]) = speedY;  WriteCommand('P','v',4,data);  if(ReadFromNav200()>0)  {    if(packet.length==17 && packet.mode == 'P' && packet.function == 'P')    {      laserPosition.pos.x = *reinterpret_cast<int*> (packet.data);      laserPosition.pos.y = *reinterpret_cast<int*> (packet.data+4);      laserPosition.orientation = *reinterpret_cast<short*> (packet.data+8);      laserPosition.quality = packet.data[10];      laserPosition.number = packet.data[11];      return true;    }  }  return false;}bool Nav200::GetPositionSpeedVelocity(short speedX, short speedY, short velocity, LaserPos & laserPosition){  uint8_t data[6];  *reinterpret_cast<short*> (&data[0]) = speedX;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -