X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fwindows%2Fserialport.cpp;h=fe917255d5ad2e921b4ce628077ea42d57027c49;hb=5347b94bbd7455453754fd79b6aaa64aa368ce59;hp=c0cdd936af9e586991ac2e6b463ca2df1674abc8;hpb=21d8397898e90f5f90be4b0c7d42922289e8ea25;p=deb_libcec.git diff --git a/src/lib/platform/windows/serialport.cpp b/src/lib/platform/windows/serialport.cpp index c0cdd93..fe91725 100644 --- a/src/lib/platform/windows/serialport.cpp +++ b/src/lib/platform/windows/serialport.cpp @@ -48,11 +48,14 @@ void FormatWindowsError(int iErrorCode, CStdString &strMessage) } } -bool SetTimeouts(serial_socket_t socket, int* iError, bool bBlocking) +bool CSerialSocket::SetTimeouts(serial_socket_t socket, int* iError, DWORD iTimeout) { if (socket == INVALID_HANDLE_VALUE) return false; + if (iTimeout == m_iCurrentTimeout) + return true; + COMMTIMEOUTS cto; if (!GetCommTimeouts(socket, &cto)) { @@ -60,18 +63,9 @@ bool SetTimeouts(serial_socket_t socket, int* iError, bool bBlocking) return false; } - if (bBlocking) - { - cto.ReadIntervalTimeout = 0; - cto.ReadTotalTimeoutConstant = 0; - cto.ReadTotalTimeoutMultiplier = 0; - } - else - { - cto.ReadIntervalTimeout = MAXDWORD; - cto.ReadTotalTimeoutConstant = 0; - cto.ReadTotalTimeoutMultiplier = 0; - } + cto.ReadIntervalTimeout = 0; + cto.ReadTotalTimeoutConstant = iTimeout; + cto.ReadTotalTimeoutMultiplier = 0; if (!SetCommTimeouts(socket, &cto)) { @@ -79,6 +73,7 @@ bool SetTimeouts(serial_socket_t socket, int* iError, bool bBlocking) return false; } + m_iCurrentTimeout = iTimeout; return true; } @@ -103,7 +98,20 @@ ssize_t CSerialSocket::Write(void* data, size_t len) ssize_t CSerialSocket::Read(void* data, size_t len, uint64_t iTimeoutMs /* = 0 */) { - return IsOpen() ? SerialSocketRead(m_socket, &m_iError, data, len, iTimeoutMs) : -1; + if (IsOpen()) + { + DWORD iTimeout((DWORD)iTimeoutMs); + if (iTimeout != iTimeoutMs) + return -1; + + int iError(0); + if (!SetTimeouts(m_socket, &iError, iTimeout)) + return -1; + + return SerialSocketRead(m_socket, &m_iError, data, len, iTimeoutMs); + } + + return -1; } bool CSerialSocket::Open(uint64_t iTimeoutMs /* = 0 */) @@ -153,7 +161,7 @@ bool CSerialSocket::Open(uint64_t iTimeoutMs /* = 0 */) return false; } - if (!SetTimeouts(m_socket, &m_iError, false)) + if (!SetTimeouts(m_socket, &m_iError, MAXDWORD)) { m_strError = "unable to set timeouts"; FormatWindowsError(GetLastError(), m_strError);