Go to the documentation of this file.
37 #include <mrpt/config.h>
41 #include <sys/ioctl.h>
50 #elif defined(HAVE_MALLOC_MALLOC_H)
51 #include <malloc/malloc.h>
55 #include <sys/param.h>
64 #define PATH_MAX CMT_MAX_FILENAME_LENGTH
71 #ifndef _CRT_SECURE_NO_DEPRECATE
72 #define _CRT_SECURE_NO_DEPRECATE
74 #pragma warning(disable : 4996)
80 #define FSEEK(x) _fseeki64(m_handle, x, SEEK_SET)
81 #define FSEEK_R(x) _fseeki64(m_handle, x, SEEK_END)
82 #define FTELL() _ftelli64(m_handle)
84 #define FSEEK(x) fseek(m_handle, x, SEEK_SET)
85 #define FSEEK_R(x) fseek(m_handle, x, SEEK_END)
86 #define FTELL() ftell(m_handle)
89 #define FSEEK(x) fseeko(m_handle, x, SEEK_SET)
90 #define FSEEK_R(x) fseeko(m_handle, x, SEEK_END)
91 #define FTELL() ftello(m_handle)
98 int _wcsnicmp(
const wchar_t* s1,
const wchar_t* s2,
int count)
100 for (
int i = 0; i <
count; ++i, ++s1, ++s2)
106 else if (*s2 == L
'\0')
116 #if defined(_DEBUG) || defined(_LOG_ALWAYS)
117 #if !defined(_LOG_TO_DBVIEW)
118 #ifdef _LOG_TO_STDOUT
119 #else // !dbview && !stdout
120 FILE* debug_log_fp =
nullptr;
123 FILE* debug_qlog_fp =
nullptr;
129 void CMTLOG(
const char* str, ...)
131 #ifdef _LOG_TO_STDOUT
136 #ifdef _LOG_TO_DBVIEW
143 OutputDebugString(buf);
145 if (debug_log_valid == 0)
147 debug_log_fp =
fopen(
"debug_log_cmt.log",
"w");
148 if (debug_log_fp !=
nullptr)
151 debug_log_valid = -1;
153 if (debug_log_valid == 1)
159 int32_t sz = vsprintf_s(buf, str, ptr);
162 fprintf(debug_log_fp,
"%5u.%03u %s", nw / 1000, nw % 1000, buf);
164 fflush(debug_log_fp);
173 #define CMT1LOG CMTLOG
208 if (rx_log !=
nullptr)
fclose(rx_log);
209 if (tx_log !=
nullptr)
fclose(tx_log);
223 cto.ReadIntervalTimeout = MAXDWORD;
224 cto.ReadTotalTimeoutConstant = 0;
225 cto.ReadTotalTimeoutMultiplier = 0;
254 rv = EscapeCommFunction(
m_handle, SETDTR);
256 rv = EscapeCommFunction(
m_handle, CLRDTR);
262 rv = EscapeCommFunction(
m_handle, SETRTS);
264 rv = EscapeCommFunction(
m_handle, CLRRTS);
312 PurgeComm(
m_handle, PURGE_TXCLEAR | PURGE_RXCLEAR);
330 CMT1LOG(
"L1: Open port %s at %d baud\n", portName, baudRate);
334 CMT1LOG(
"L1: Port already open\n");
340 char winPortName[32];
343 sprintf(winPortName,
"\\\\.\\%s", portName);
345 winPortName, GENERIC_READ | GENERIC_WRITE, 0,
nullptr, OPEN_EXISTING, 0,
347 if (
m_handle == INVALID_HANDLE_VALUE)
349 CMT1LOG(
"L1: Port cannot be opened\n");
381 m_port = atoi(&portName[3]);
387 EscapeCommFunction(
m_handle, SETRTS);
389 EscapeCommFunction(
m_handle, SETDTR);
390 SetupComm(
m_handle, readBufSize, writeBufSize);
396 PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
430 m_commState.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
433 ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
450 if (ioctl(
m_handle, TIOCMGET, &cmbits) < 0)
455 cmbits |= TIOCM_RTS | TIOCM_DTR;
457 if (ioctl(
m_handle, TIOCMSET, &cmbits) < 0)
474 char comFileName[32];
477 sprintf(comFileName,
"COM%u", portNumber);
479 return Cmt1s::open(comFileName, baudRate, readBufSize, writeBufSize);
502 #ifdef _LOG_CALLBACKS
504 "C1: onBytesReceived(%d,(%d,%d),%p)\n",
515 CMT1LOG(
"L1: readData, ReadFile returned error %u\n", ::GetLastError());
525 if (rx_log ==
nullptr)
529 rx_log =
fopen(fname,
"wb");
536 (
length[0] ?
"L1: readData returned success, read %u of %u bytes, "
538 :
"L1: readData returned success, read %u bytes\n"),
563 CMT1LOG(
"L1: Setting timeout to %u ms\n", ms);
568 COMMTIMEOUTS commTimeouts;
570 GetCommTimeouts(
m_handle, &commTimeouts);
575 commTimeouts.ReadIntervalTimeout = 0;
576 commTimeouts.ReadTotalTimeoutConstant =
m_timeout;
577 commTimeouts.ReadTotalTimeoutMultiplier = 0;
578 commTimeouts.WriteTotalTimeoutConstant =
m_timeout;
579 commTimeouts.WriteTotalTimeoutMultiplier = 0;
584 commTimeouts.ReadIntervalTimeout = MAXDWORD;
585 commTimeouts.ReadTotalTimeoutConstant = 0;
586 commTimeouts.ReadTotalTimeoutMultiplier = 0;
587 commTimeouts.WriteTotalTimeoutConstant = 0;
588 commTimeouts.WriteTotalTimeoutMultiplier = 0;
591 SetCommTimeouts(
m_handle, &commTimeouts);
623 "L1: waitForData result: read %u of %u bytes\n",
length[0],
maxLength);
637 if (written ==
nullptr) written = &bytes;
647 if (tx_log ==
nullptr)
651 tx_log =
fopen(fname,
"wb");
653 fwrite(
data, 1, *written, tx_log);
809 if (realpath(filename,
m_filename) ==
nullptr)
837 m_handle = _wfopen(filename, L
"w+b");
888 while (remaining > 0)
890 if (remaining >= 512)
916 if (rv != 0) eno = errno;
946 const char* needle = (
const char*)needleV;
961 while (readBytes > 0)
966 while (bufferPos < readBytes && needlePos < needleLength)
968 if (
buffer[bufferPos] == needle[needlePos])
977 else if (
buffer[bufferPos] == needle[0])
985 if (needlePos < needleLength)
1061 size_t read1, read2;
1064 char* buffer1 = (
char*)malloc(bsize);
1065 char* buffer2 = (
char*)malloc(bsize);
1072 read1 = fread(buffer1, 1, bsize,
m_handle);
1074 read1 = fread(buffer1, 1, (
size_t)remaining,
m_handle);
1079 while (remaining > 0)
1089 read1 = fread(buffer1, 1, bsize,
m_handle);
1091 read1 = fread(buffer1, 1, (
size_t)remaining,
m_handle);
1098 wPos += fwrite(buffer2, 1, read2,
m_handle);
1103 wPos += fwrite(buffer1, 1, read1,
m_handle);
1117 const char* filename,
const bool create,
const bool readOnly)
1148 if (realpath(filename,
m_filename) ==
nullptr)
1170 const wchar_t* filename,
const bool create,
const bool readOnly)
1179 m_handle = _wfopen(filename, L
"rb");
1181 m_handle = _wfopen(filename, L
"r+b");
1185 m_handle = _wfopen(filename, L
"w+b");
1188 m_handle = _wfopen(filename, L
"rb");
1250 char*
data = (
char*)dataV;
XsensResultValue open(const char *filename, const bool create, const bool readOnly)
Open a file.
int void fclose(FILE *f)
An OS-independent version of fclose.
int32_t m_onBytesReceivedInstance
Custom, user supplied parameter for the OnBytesReceived callback function, passed as the first argume...
XsensResultValue close(void)
Close the file.
int int vsprintf(char *buf, size_t bufSize, const char *format, va_list args) noexcept
An OS-independent version of vsprintf (Notice the bufSize param, which may be ignored in some compile...
void * m_onBytesReceivedParam
Custom, user supplied parameter for the OnBytesReceived callback function, passed as the last argumen...
XsensResultValue waitForData(const uint32_t maxLength, uint8_t *data, uint32_t *length=nullptr)
Wait for data to arrive or a timeout to occur.
@ XRV_OUTPUTCANNOTBEOPENED
uint32_t m_baudrate
The baudrate that was last set to be used by the port.
uint32_t getTimeOfDay(tm *date_, time_t *secs_)
A platform-independent clock.
@ XRV_OK
Operation was performed successfully.
XsensResultValue getName(char *filename) const
Retrieve the filename that was last successfully opened.
XsensResultValue writeData(const uint32_t length, const uint8_t *data, uint32_t *written)
Write the data to the serial port.
XsensResultValue create(const char *filename)
Open an empty file.
XsensResultValue setCallbackFunction(CmtCallbackSelector tp, int32_t instance, CmtCallbackFunction func, void *param)
Set the callback function for when bytes have been received.
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.
@ XRV_INPUTCANNOTBEOPENED
CmtFilePos m_fileSize
Contains the size of the file.
XsensResultValue insertData(const CmtFilePos start, const uint32_t length, const void *data)
Insert the given data into the file. The function writes the given data to the file at the current wr...
CmtFilePos m_writePos
The last write position in the file.
void gotoRead(void)
Change from writing to reading mode.
XsensResultValue setWritePos(const CmtFilePos pos=-1)
Set the new absolute write position.
XsensResultValue find(const void *needle, const uint32_t needleLength, CmtFilePos &pos)
Find a string of bytes in the file.
HANDLE m_handle
The serial port handle.
GLuint GLsizei GLsizei * length
FILE * m_handle
The file handle.
bool m_isOpen
Indicates if the port is open or not.
XsensResultValue setReadPos(const CmtFilePos pos)
Set the new absolute read position.
Cmt1f()
Default constructor, initializes all members to their default values.
int sprintf(char *buf, size_t bufSize, const char *format,...) noexcept MRPT_printf_format_check(3
An OS-independent version of sprintf (Notice the bufSize param, which may be ignored in some compiler...
XsensResultValue m_lastResult
The last result of an operation.
XsensResultValue closeAndDelete(void)
Close the file and delete it.
uint8_t m_port
The opened COM port nr.
XsensResultValue(__cdecl * CmtCallbackFunction)(int32_t, CmtCallbackSelector, void *, void *)
GLsizei GLsizei GLenum GLenum const GLvoid * data
bool m_reading
Indicates whether the last operation was a read or write operation. This value is used to check wheth...
GLuint GLuint GLsizei count
#define CMT_MAX_FILENAME_LENGTH
wchar_t m_filename_w[CMT_MAX_FILENAME_LENGTH]
Contains the name of the file that was last successfully opened using unicode.
DCB m_commState
Stored settings about the serial port.
XsensResultValue flushData(void)
Flush all data to be transmitted / received.
XsensResultValue deleteData(const CmtFilePos start, const uint32_t length)
Delete the given data from the file. The function erases the given data from the file at the given wr...
uint32_t m_endTime
The time at which an operation will end in ms, used by several functions.
Cmt1s()
Default constructor, initializes all members to their default values.
char * strcpy(char *dest, size_t destSize, const char *source) noexcept
An OS-independent version of strcpy.
XsensResultValue appendData(const uint32_t length, const void *data)
Write data to the end of the file.
#define CMT1_DEFAULT_TIMEOUT
The default timeout value for blocking CMT1s operations in ms.
CmtFilePos m_readPos
The last read position in the file.
void gotoWrite(void)
Change from reading to writing mode.
@ CMT_CALLBACK_ONBYTESRECEIVED
Callback function, called when bytes have been read from a port.
int fprintf(FILE *fil, const char *format,...) noexcept MRPT_printf_format_check(2
An OS-independent version of fprintf.
XsensResultValue readData(const uint32_t maxLength, void *data, uint32_t *length)
Read data from the file and put it into the data buffer.
bool m_readOnly
Indicates if the file was opened in read-only mode.
uint8_t m_data[CMT_MAXMSGLEN]
bool m_unicode
Indicates if we're using the unicode filename or the regular filename.
XsensResultValue setTimeout(const uint32_t ms=CMT1_DEFAULT_TIMEOUT)
Set the default timeout value to use in blocking operations.
FILE * fopen(const char *fileName, const char *mode) noexcept
An OS-independent version of fopen.
~Cmt1s()
Destructor, de-initializes, frees memory allocated for buffers, etc.
char m_filename[CMT_MAX_FILENAME_LENGTH]
Contains the name of the file that was last successfully opened.
XsensResultValue flushData(void)
Flush all data to be written. This function writes any remaining data immediately and does not return...
bool m_isOpen
Indicates if the file is open or not.
XsensResultValue writeData(const uint32_t length, const void *data)
Write data to the file.
XsensResultValue escape(const CmtControlLine mask, const CmtControlLine state)
Manipulate the Serial control lines.
XsensResultValue
Xsens return values.
CmtCallbackFunction m_onBytesReceived
The bytes received function.
XsensResultValue close(void)
Close the serial communication port.
XsensResultValue open(const char *portName, const uint32_t baudRate=CMT_DEFAULT_BAUD_RATE, uint32_t readBufSize=CMT_DEFAULT_READ_BUFFER_SIZE, uint32_t writeBufSize=CMT_DEFAULT_WRITE_BUFFER_SIZE)
Open a communcation channel to the given serial port name.
The namespace of all Xsens software since 2006.
unsigned __int32 uint32_t
XsensResultValue m_lastResult
The last result of an operation.
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
An OS and compiler independent version of "memcpy".
XsensResultValue readData(const uint32_t maxLength, uint8_t *data, uint32_t *length=nullptr)
Read data from the serial port and put it into the data buffer.
Page generated by Doxygen 1.8.17 for MRPT 1.9.9 Git: ad3a9d8ae Tue May 1 23:10:22 2018 -0700 at miƩ 12 jul 2023 10:03:34 CEST | |