16 #       include <sys/ioctl.h>       19 #       include <sys/param.h>    20 #       include <sys/file.h>    27 #ifndef _CRT_SECURE_NO_DEPRECATE    28 #       define _CRT_SECURE_NO_DEPRECATE    30 #               pragma warning(disable:4996)    37 #       define FSEEK(x)         _fseeki64(m_handle, x, SEEK_SET)    38 #       define FSEEK_R(x)       _fseeki64(m_handle, x, SEEK_END)    39 #       define FTELL()          _ftelli64(m_handle)    41 #       define FSEEK(x)         fseeko(m_handle, x, SEEK_SET)    42 #       define FSEEK_R(x)       fseeko(m_handle, x, SEEK_END)    43 #       define FTELL()          ftello(m_handle)    49 #       define XDA1LOG_OBSOLETE         XSENSLOG    51 #       define XDA1LOG_OBSOLETE(...)    (void)0    71         memset(&m_commState, 0, 
sizeof(m_commState));
   114                 if (::GetCommTimeouts(
m_handle,&cto))
   116                         cto.ReadIntervalTimeout = MAXDWORD;
   117                         cto.ReadTotalTimeoutConstant = 0;
   118                         cto.ReadTotalTimeoutMultiplier = 0;
   119                         if (::SetCommTimeouts(
m_handle,&cto))
   166                         rv = EscapeCommFunction(
m_handle,SETDTR);
   168                         rv = EscapeCommFunction(
m_handle,CLRDTR);
   174                         rv = EscapeCommFunction(
m_handle,SETRTS);
   176                         rv = EscapeCommFunction(
m_handle,CLRRTS);
   190                         else status &= ~TIOCM_DTR;
   201                         else status &= ~TIOCM_RTS;
   223         if (!PurgeComm(
m_handle, PURGE_TXCLEAR | PURGE_RXCLEAR))
   253         return m_handle != INVALID_HANDLE_VALUE;
   274         JLDEBUG(gJournal, 
"port " << portInfo.portName().toStdString() << 
" at " << portInfo.baudrate() << 
" baud");
   278                 JLALERT(gJournal, 
"Port " << portInfo.portName().toStdString() << 
" is already open");
   285         char winPortName[256];
   288         sprintf(winPortName, 
"\\\\.\\%s", portInfo.portName().c_str());
   289         m_handle = CreateFileA(winPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL,
   290                                                                         OPEN_EXISTING, 0, NULL);
   291         if (
m_handle == INVALID_HANDLE_VALUE)
   293                 JLDEBUG(gJournal, 
"Port " << portInfo.portName().toStdString() << 
" cannot be opened");
   299         commState.DCBlength = 
sizeof(DCB);
   302         if (!GetCommState(
m_handle, &commState))        
   305         commState.BaudRate = (int) portInfo.baudrate();         
   306         commState.Parity = NOPARITY;                            
   307         commState.ByteSize = 8;                                 
   308         commState.StopBits = TWOSTOPBITS;                       
   309         commState.fDsrSensitivity = 
FALSE;              
   310         commState.fOutxCtsFlow = 
FALSE;                 
   311         commState.fOutxDsrFlow = 
FALSE;
   312         commState.fOutX = 
FALSE;
   313         commState.fInX = 
FALSE;
   314         commState.fRtsControl = RTS_CONTROL_ENABLE;
   315         if (!SetCommState(
m_handle, (LPDCB)&commState)) 
   319                 commState.StopBits = ONESTOPBIT;
   320                 if (!SetCommState(
m_handle, (LPDCB)&commState))
   323         std::string tmp = portInfo.portName().toStdString();
   324         m_port = atoi(&tmp.c_str()[3]);
   331         if (!EscapeCommFunction(
m_handle, SETDTR))                      
   333         if (!SetupComm(
m_handle,readBufSize,writeBufSize))      
   338         if (!PurgeComm(
m_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))
   352         std::string pn = portInfo.portName().toStdString();
   365         if (flock(
m_handle, LOCK_EX | LOCK_NB))
   373         if (tcgetattr(
m_handle, &m_commState) != 0)
   377         if (cfsetispeed(&m_commState, portInfo.baudrate()) != 0)
   380         if (cfsetospeed(&m_commState, portInfo.baudrate()) != 0)
   384         m_commState.c_cflag |= (CLOCAL | CREAD);
   386         m_commState.c_cflag &= ~(CSIZE|PARENB);
   387         m_commState.c_cflag |= CS8;             
   388         m_commState.c_cflag |= CSTOPB;  
   390         m_commState.c_cflag &= ~CRTSCTS;
   391         m_commState.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
   393         m_commState.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
   395         m_commState.c_oflag &= ~OPOST;
   397         m_commState.c_cc[VMIN]     = 0;
   398         m_commState.c_cc[VTIME]    = (
m_timeout+99)/100;        
   401         if (tcsetattr(
m_handle,TCSANOW, &m_commState) != 0)
   404         termios checkCommState;
   405         if (tcgetattr(
m_handle, &checkCommState) != 0)
   408         if ((m_commState.c_cflag != checkCommState.c_cflag) ||
   409                 (m_commState.c_iflag != checkCommState.c_iflag) ||
   410                 (m_commState.c_oflag != checkCommState.c_oflag) ||
   411                 (m_commState.c_cc[VMIN] != checkCommState.c_cc[VMIN]) ||
   412                 (m_commState.c_cc[VTIME] != checkCommState.c_cc[VTIME]))
   414                 JLDEBUG(gJournal, 
"commstates do not match, which is OK for USB connected MkIV devices");
   424         if (ioctl(
m_handle, TIOCMGET, &cmbits) < 0)
   426                 JLDEBUG(gJournal, 
"TIOCMGET failed, which is OK for USB connected MkIV devices");
   429         cmbits |= TIOCM_RTS|TIOCM_DTR;
   431         if (ioctl(
m_handle, TIOCMSET, &cmbits) < 0)
   433                 JLDEBUG(gJournal, 
"TIOCMSET failed, which is OK for USB connected MkIV devices");
   437         JLDEBUG(gJournal, 
"Port " << portInfo.portName().toStdString() << 
" opened");
   445         FILE* pf = 
fopen(filename, 
"r");
   461                 strcpy(basename, filename);
   462                 basename[strlen(basename) - 4] = 0;     
   469                                 sprintf(filename2, 
"%s_n.log", basename);
   474                 strcpy(filename, filename2);
   496         JLTRACE(gJournal, 
"ReadFile result " << rres << 
", length " << 
length);
   500                 DWORD wErr = ::GetLastError();
   501                 JLALERT(gJournal, 
"ReadFile returned windows error " << wErr);
   502                 if (wErr >= ERROR_INVALID_FUNCTION && wErr <= ERROR_INVALID_HANDLE)
   519         timeout.tv_usec = (
m_timeout - (timeout.tv_sec * 1000)) * 1000;
   521         int res = select(FD_SETSIZE, &fd, NULL, &err, &timeout);
   526         } 
else if (
res == 0) {
   553 #ifdef LOG_RX_TX_FLUSH   573         JLDEBUG(gJournal, 
"Setting timeout to " << ms << 
" ms");
   578         COMMTIMEOUTS commTimeouts;
   580         if (!GetCommTimeouts(
m_handle,&commTimeouts))   
   586                 commTimeouts.ReadIntervalTimeout = 0;
   587                 commTimeouts.ReadTotalTimeoutConstant = 
m_timeout;      
   588                 commTimeouts.ReadTotalTimeoutMultiplier = 0;
   589                 commTimeouts.WriteTotalTimeoutConstant = 
m_timeout;
   590                 commTimeouts.WriteTotalTimeoutMultiplier = 0;
   595                 commTimeouts.ReadIntervalTimeout = MAXDWORD;
   596                 commTimeouts.ReadTotalTimeoutConstant = 0;
   597                 commTimeouts.ReadTotalTimeoutMultiplier = 0;
   598                 commTimeouts.WriteTotalTimeoutConstant = 0;
   599                 commTimeouts.WriteTotalTimeoutMultiplier = 0;
   602         if (!SetCommTimeouts(
m_handle, &commTimeouts))  
   606         m_commState.c_cc[VMIN]     = 0;
   607         m_commState.c_cc[VTIME]    = (
m_timeout+99)/100;                
   611                 tcsetattr(
m_handle,TCSANOW, &m_commState);
   669         if (WriteFile(
m_handle, 
data.data(), (DWORD) 
data.size(), &lwritten, NULL) == 0)
   698 #ifdef LOG_RX_TX_FLUSH Operation was performed successfully. 
 
XsIoHandle m_handle
The serial port handle, also indicates if the port is open or not. 
 
FILE BASE_IMPEXP * fopen(const char *fileName, const char *mode) MRPT_NO_THROWS
An OS-independent version of fopen. 
 
uint16_t getPortNumber(void) const
Retrieve the port number that was last successfully opened. 
 
#define XS_MAX_FILENAME_LENGTH
 
unsigned __int16 uint16_t
 
uint16_t m_port
The opened COM port nr. 
 
int BASE_IMPEXP void BASE_IMPEXP fclose(FILE *f)
An OS-independent version of fclose. 
 
bool isOpen(void) const
Return whether the communication port is open or not. 
 
pin 4: Data Terminal Ready 
 
struct XsByteArray XsByteArray
 
The specified i/o device can not be opened. 
 
XsControlLine
Serial control lines. 
 
size_t XsSize
XsSize must be unsigned number! 
 
char BASE_IMPEXP * strcpy(char *dest, size_t destSize, const char *source) MRPT_NO_THROWS
An OS-independent version of strcpy. 
 
XSTYPES_DLL_API uint32_t XsTime_getTimeOfDay(struct tm *date_, time_t *secs_)
 
XsResultValue readData(XsSize maxLength, XsByteArray &data)
Read data from the serial port and put it into the data buffer. 
 
XsBaudRate getBaudrate(void) const
Return the baudrate that is currently being used by the port. 
 
XsResultValue
Xsens result values. 
 
XsBaudRate m_baudrate
The baudrate that was last set to be used by the port. 
 
char m_portname[32]
The name of the open serial port. 
 
XsResultValue escape(XsControlLine mask, XsControlLine state)
Manipulate the Serial control lines. 
 
No serial port opened for reading/writing. 
 
XsResultValue closeLive(void)
Close the serial communication port. 
 
void cancelIo(void) const
Cancel any pending io requests. 
 
XsResultValue open(const XsPortInfo &portInfo, uint32_t readBufSize=XS_DEFAULT_READ_BUFFER_SIZE, uint32_t writeBufSize=XS_DEFAULT_WRITE_BUFFER_SIZE)
Open a communication channel to the given port info. 
 
XsResultValue m_lastResult
The last result of an operation. 
 
virtual ~SerialInterface()
Destructor, de-initializes, frees memory allocated for buffers, etc. 
 
GLsizei const GLchar ** string
 
void makeFilenameUnique(char *filename)
Helper function for making filename of log file unique. 
 
XsResultValue getLastResult(void) const
Return the error code of the last operation. 
 
XsIoHandle getHandle(void) const
Return the handle of the port. 
 
XsResultValue flushData(void)
Flush all data in the buffers to and from the device. 
 
XsResultValue setTimeout(uint32_t ms)
Set the default timeout value to use in blocking operations. 
 
GLuint GLsizei GLsizei * length
 
uint32_t getTimeout(void) const
Return the current timeout value. 
 
uint32_t m_endTime
The time at which an operation will end in ms, used by several functions. 
 
int BASE_IMPEXP sprintf(char *buf, size_t bufSize, const char *format,...) MRPT_NO_THROWS MRPT_printf_format_check(3
An OS-independent version of sprintf (Notice the bufSize param, which may be ignored in some compiler...
 
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
 
A generic error occurred. 
 
void getPortName(XsString &portname) const
Retrieve the port name that was last successfully opened. 
 
XsResultValue waitForData(XsSize maxLength, XsByteArray &data)
Wait for data to arrive or a timeout to occur. 
 
XsResultValue close(void)
Close the serial communication port. 
 
unsigned __int32 uint32_t
 
XsResultValue writeData(const XsByteArray &data, XsSize *written=0)
Write the data contained in data to the device. 
 
XsBaudRate
Communication speed. 
 
GLsizei GLsizei GLenum GLenum const GLvoid * data
 
SerialInterface()
Default constructor, initializes all members to their default values. 
 
An I/O device is already opened with this object. 
 
bool doesFileExist(char *filename)
Helper function for making filename of log file unique. 
 
No file or serial port opened for reading/writing.