////////////////////////////////////////////////////////////////////////////////////////// // Open a communication channel to the given serial port name. XsensResultValue Cmt1s::open( const char *portName, const uint32_t baudRate, uint32_t readBufSize, uint32_t writeBufSize) { MRPT_UNUSED_PARAM(readBufSize); MRPT_UNUSED_PARAM(writeBufSize); m_endTime = 0; CMT1LOG("L1: Open port %s at %d baud\n", portName, baudRate); if (m_isOpen) { CMT1LOG("L1: Port already open\n"); return (m_lastResult = XRV_ALREADYOPEN); } m_baudrate = baudRate; #ifdef _WIN32 char winPortName[32]; // Open port sprintf(winPortName, "\\\\.\\%s", portName); m_handle = CreateFileA(winPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (m_handle == INVALID_HANDLE_VALUE) { CMT1LOG("L1: Port cannot be opened\n"); return (m_lastResult = XRV_INPUTCANNOTBEOPENED); } // Once here, port is open m_isOpen = true; //Get the current state & then change it GetCommState(m_handle, &m_commState); // Get current state m_commState.BaudRate = baudRate; // Setup the baud rate m_commState.Parity = NOPARITY; // Setup the Parity m_commState.ByteSize = 8; // Setup the data bits m_commState.StopBits = TWOSTOPBITS; // Setup the stop bits m_commState.fDsrSensitivity = FALSE; // Setup the flow control m_commState.fOutxCtsFlow = FALSE; // NoFlowControl: m_commState.fOutxDsrFlow = FALSE; m_commState.fOutX = FALSE; m_commState.fInX = FALSE; if (!SetCommState(m_handle, (LPDCB)&m_commState)) {// Set new state // Bluetooth ports cannot always be opened with 2 stopbits // Now try to open port with 1 stopbit. m_commState.StopBits = ONESTOPBIT; if (!SetCommState(m_handle, (LPDCB)&m_commState)) { CloseHandle(m_handle); m_handle = INVALID_HANDLE_VALUE; m_isOpen = false; return (m_lastResult = XRV_INPUTCANNOTBEOPENED); } } m_port = atoi(&portName[3]); sprintf(m_portname, "%s", portName); setTimeout(m_timeout); // Other initialization functions EscapeCommFunction(m_handle, SETRTS); // Enable RTS (for Xbus Master use) // Set DTR (Calibration sensors need DTR to startup, won't hurt otherwise EscapeCommFunction(m_handle, SETDTR); SetupComm(m_handle,readBufSize,writeBufSize); // Set queue size // Remove any 'old' data in buffer //PurgeComm(m_handle, PURGE_TXCLEAR | PURGE_RXCLEAR); PurgeComm(m_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); #else // !_WIN32 // Open port m_handle = ::open(portName, O_RDWR | O_NOCTTY); // O_RDWR: Read+Write // O_NOCTTY: Raw input, no "controlling terminal" // O_NDELAY: Don't care about DCD signal if (m_handle < 0) { // Port not open return m_lastResult = XRV_INPUTCANNOTBEOPENED; } // Once here, port is open m_isOpen = true; /* Start configuring of port for non-canonical transfer mode */ // Get current options for the port tcgetattr(m_handle, &m_commState); // Set baudrate. cfsetispeed(&m_commState, baudRate); cfsetospeed(&m_commState, baudRate); // Enable the receiver and set local mode m_commState.c_cflag |= (CLOCAL | CREAD); // Set character size to data bits and set no parity Mask the characte size bits m_commState.c_cflag &= ~(CSIZE|PARENB); m_commState.c_cflag |= CS8; // Select 8 data bits m_commState.c_cflag |= CSTOPB; // send 2 stop bits // Disable hardware flow control m_commState.c_cflag &= ~CRTSCTS; m_commState.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); // Disable software flow control m_commState.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); // Set Raw output m_commState.c_oflag &= ~OPOST; // Timeout 0.001 sec for first byte, read minimum of 0 bytes m_commState.c_cc[VMIN] = 0; m_commState.c_cc[VTIME] = (m_timeout+99)/100; // 1 // Set the new options for the port tcsetattr(m_handle,TCSANOW, &m_commState); m_port = 0; sprintf(m_portname, "%s", portName); tcflush(m_handle, TCIOFLUSH); // setting RTS and DTR; RTS for Xbus Master, DTR for calibration sensors int cmbits; if (ioctl(m_handle, TIOCMGET, &cmbits) < 0) { return (m_lastResult = XRV_ERROR); } cmbits |= TIOCM_RTS|TIOCM_DTR; if (ioctl(m_handle, TIOCMSET, &cmbits) < 0) { return (m_lastResult = XRV_ERROR); } #endif // !_WIN32 CMT1LOG("L1: Port opened\n"); return (m_lastResult = XRV_OK); }
void PanelDOF::OnSlider1CmdScroll(wxScrollEvent& event) { MRPT_UNUSED_PARAM(event); }