X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Flinux%2Fserialport.cpp;h=f0408574dad1670238a571ab0dcadfb8acedcff3;hb=0e54ee2e232fa018c158f3a6e5eaaae18bf1d05f;hp=3a274fec12f35f88e9f1ec3e07b439a324fa3aa7;hpb=f7febb0e8d28a15658f3b53477cc5051e50be9a1;p=deb_libcec.git diff --git a/src/lib/platform/linux/serialport.cpp b/src/lib/platform/linux/serialport.cpp index 3a274fe..f040857 100644 --- a/src/lib/platform/linux/serialport.cpp +++ b/src/lib/platform/linux/serialport.cpp @@ -53,6 +53,7 @@ using namespace CEC; CSerialPort::CSerialPort() { m_fd = -1; + m_tostdout = false; } CSerialPort::~CSerialPort() @@ -73,16 +74,33 @@ int8_t CSerialPort::Write(CCECAdapterMessage *data) int32_t byteswritten = 0; + struct timeval timeout, *tv; + if (data->transmit_timeout <= 0) + { + tv = NULL; + } + else + { + timeout.tv_sec = (long int)data->transmit_timeout / (long int)1000.; + timeout.tv_usec = (long int)data->transmit_timeout % (long int)1000.; + tv = &timeout; + } + while (byteswritten < (int32_t) data->size()) { FD_ZERO(&port); FD_SET(m_fd, &port); - int returnv = select(m_fd + 1, NULL, &port, NULL, NULL); - if (returnv == -1) + int returnv = select(m_fd + 1, NULL, &port, NULL, tv); + if (returnv < 0) { m_error = strerror(errno); return -1; } + else if (returnv == 0) + { + m_error = "timeout"; + return -1; + } returnv = write(m_fd, data->packet.data + byteswritten, data->size() - byteswritten); if (returnv == -1) @@ -94,14 +112,14 @@ int8_t CSerialPort::Write(CCECAdapterMessage *data) } //print what's written to stdout for debugging -// if (m_tostdout) -// { -// printf("%s write:", m_name.c_str()); -// for (int i = 0; i < byteswritten; i++) -// printf(" %02x", (unsigned int)data[i]); -// -// printf("\n"); -// } + if (m_tostdout) + { + printf("%s write:", m_name.c_str()); + for (int i = 0; i < byteswritten; i++) + printf(" %02x", data->at(i)); + + printf("\n"); + } return byteswritten; } @@ -167,14 +185,14 @@ int32_t CSerialPort::Read(uint8_t* data, uint32_t len, uint64_t iTimeoutMs /*= 0 } //print what's read to stdout for debugging -// if (m_tostdout && bytesread > 0) -// { -// printf("%s read:", m_name.c_str()); -// for (int i = 0; i < bytesread; i++) -// printf(" %02x", (unsigned int)data[i]); -// -// printf("\n"); -// } + if (m_tostdout && bytesread > 0) + { + printf("%s read:", m_name.c_str()); + for (int i = 0; i < bytesread; i++) + printf(" %02x", data[i]); + + printf("\n"); + } return bytesread; }