X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fwindows%2Fserialport.cpp;h=de2a9a394171f8c60367038cac90592953223afd;hb=06a1f7ce2bb14634f1ffd73d709b91238d05e5d6;hp=bfdc8d53d71917095b444a527f907c0ce8352fb9;hpb=b9187cc6999276ce37a5c9852655fd558ea76b8e;p=deb_libcec.git diff --git a/src/lib/platform/windows/serialport.cpp b/src/lib/platform/windows/serialport.cpp index bfdc8d5..de2a9a3 100644 --- a/src/lib/platform/windows/serialport.cpp +++ b/src/lib/platform/windows/serialport.cpp @@ -63,8 +63,9 @@ CSerialPort::~CSerialPort(void) Close(); } -bool CSerialPort::Open(string name, int baudrate, int databits, int stopbits, int parity) +bool CSerialPort::Open(string name, uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint8_t parity) { + CLockObject lock(&m_mutex); m_handle = CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (m_handle == INVALID_HANDLE_VALUE) { @@ -157,6 +158,7 @@ bool CSerialPort::SetTimeouts(bool bBlocking) void CSerialPort::Close(void) { + CLockObject lock(&m_mutex); if (m_bIsOpen) { CloseHandle(m_handle); @@ -164,44 +166,55 @@ void CSerialPort::Close(void) } } -int CSerialPort::Write(uint8_t* data, int len) +int8_t CSerialPort::Write(const cec_adapter_message &data) { + CLockObject lock(&m_mutex); DWORD iBytesWritten = 0; if (!m_bIsOpen) return -1; - if (!WriteFile(m_handle, data, len, &iBytesWritten, NULL)) + if (!WriteFile(m_handle, data.packet.data, data.size(), &iBytesWritten, NULL)) { m_error = "Error while writing to COM port"; FormatWindowsError(GetLastError(), m_error); return -1; } - return (int) iBytesWritten; + return (int8_t)iBytesWritten; } -int CSerialPort::Read(uint8_t* data, int len, int iTimeoutMs /* = -1 */) +int32_t CSerialPort::Read(uint8_t* data, uint32_t len, uint64_t iTimeoutMs /* = 0 */) { + CLockObject lock(&m_mutex); + int32_t iReturn(-1); DWORD iBytesRead = 0; if (m_handle == 0) { m_error = "Error while reading from COM port: invalid handle"; - return -1; + return iReturn; } if(!ReadFile(m_handle, data, len, &iBytesRead, NULL) != 0) { m_error = "unable to read from device"; FormatWindowsError(GetLastError(), m_error); - iBytesRead = -1; + iReturn = -1; + } + else + { + iReturn = (int32_t) iBytesRead; } - return (int) iBytesRead; + return iReturn; } -bool CSerialPort::SetBaudRate(int baudrate) +bool CSerialPort::SetBaudRate(uint32_t baudrate) { - m_iBaudrate = baudrate; + int32_t rate = IntToBaudrate(baudrate); + if (rate < 0) + m_iBaudrate = baudrate > 0 ? baudrate : 0; + else + m_iBaudrate = rate; DCB dcb; memset(&dcb,0,sizeof(dcb)); @@ -240,7 +253,8 @@ bool CSerialPort::SetBaudRate(int baudrate) return true; } -bool CSerialPort::IsOpen() const +bool CSerialPort::IsOpen() { + CLockObject lock(&m_mutex); return m_bIsOpen; }