X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Flinux%2Fserialport.cpp;h=f0408574dad1670238a571ab0dcadfb8acedcff3;hb=56035c8658776a144f63cdfd35ae32d93aacc987;hp=e6bfafab44a611397e445f090ffe5669ae21ff3d;hpb=b9187cc6999276ce37a5c9852655fd558ea76b8e;p=deb_libcec.git diff --git a/src/lib/platform/linux/serialport.cpp b/src/lib/platform/linux/serialport.cpp index e6bfafa..f040857 100644 --- a/src/lib/platform/linux/serialport.cpp +++ b/src/lib/platform/linux/serialport.cpp @@ -1,19 +1,33 @@ /* - * boblight - * Copyright (C) Bob 2009 - * - * boblight is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or + * This file is part of the libCEC(R) library. + * + * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is an original work, containing original code. + * + * libCEC(R) is a trademark of Pulse-Eight Limited. + * + * This program is dual-licensed; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * - * boblight is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * + * Alternatively, you can license this library under a commercial license, + * please contact Pulse-Eight Licensing for more information. + * + * For more information contact: + * Pulse-Eight Licensing + * http://www.pulse-eight.com/ + * http://www.pulse-eight.net/ */ #include @@ -22,12 +36,24 @@ #include "../baudrate.h" #include "../timeutils.h" +#if defined(__APPLE__) +#ifndef XCASE +#define XCASE 0 +#endif +#ifndef OLCUC +#define OLCUC 0 +#endif +#ifndef IUCLC +#define IUCLC 0 +#endif +#endif using namespace std; using namespace CEC; CSerialPort::CSerialPort() { m_fd = -1; + m_tostdout = false; } CSerialPort::~CSerialPort() @@ -35,30 +61,48 @@ CSerialPort::~CSerialPort() Close(); } -int CSerialPort::Write(uint8_t* data, int len) +int8_t CSerialPort::Write(CCECAdapterMessage *data) { fd_set port; - + + CLockObject lock(&m_mutex); if (m_fd == -1) { m_error = "port closed"; return -1; } - int byteswritten = 0; + 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 < len) + 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 + byteswritten, len - byteswritten); + returnv = write(m_fd, data->packet.data + byteswritten, data->size() - byteswritten); if (returnv == -1) { m_error = strerror(errno); @@ -68,40 +112,41 @@ int CSerialPort::Write(uint8_t* data, int len) } //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]); + if (m_tostdout) + { + printf("%s write:", m_name.c_str()); + for (int i = 0; i < byteswritten; i++) + printf(" %02x", data->at(i)); -// printf("\n"); -// } + printf("\n"); + } return byteswritten; } -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*/) { fd_set port; struct timeval timeout, *tv; - int64_t now, target; - int bytesread = 0; + int64_t now(0), target(0); + int32_t bytesread = 0; + CLockObject lock(&m_mutex); if (m_fd == -1) { m_error = "port closed"; return -1; } - if (iTimeoutMs >= 0) + if (iTimeoutMs > 0) { now = GetTimeMs(); target = now + (int64_t) iTimeoutMs; } - while (bytesread < len && (iTimeoutMs < 0 || target > now)) + while (bytesread < (int32_t) len && (iTimeoutMs == 0 || target > now)) { - if (iTimeoutMs < 0) + if (iTimeoutMs == 0) { tv = NULL; } @@ -114,7 +159,7 @@ int CSerialPort::Read(uint8_t* data, int len, int iTimeoutMs /*= -1*/) FD_ZERO(&port); FD_SET(m_fd, &port); - int returnv = select(m_fd + 1, &port, NULL, NULL, tv); + int32_t returnv = select(m_fd + 1, &port, NULL, NULL, tv); if (returnv == -1) { @@ -140,24 +185,25 @@ int CSerialPort::Read(uint8_t* data, int len, int iTimeoutMs /*= -1*/) } //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; } //setting all this stuff up is a pain in the ass -bool CSerialPort::Open(string name, int baudrate, int databits/* = 8*/, int stopbits/* = 1*/, int parity/* = PAR_NONE*/) +bool CSerialPort::Open(string name, uint32_t baudrate, uint8_t databits /* = 8 */, uint8_t stopbits /* = 1 */, uint8_t parity /* = PAR_NONE */) { m_name = name; m_error = strerror(errno); - + CLockObject lock(&m_mutex); + if (databits < 5 || databits > 8) { m_error = "Databits has to be between 5 and 8"; @@ -244,6 +290,7 @@ bool CSerialPort::Open(string name, int baudrate, int databits/* = 8*/, int stop void CSerialPort::Close() { + CLockObject lock(&m_mutex); if (m_fd != -1) { close(m_fd); @@ -253,7 +300,7 @@ void CSerialPort::Close() } } -bool CSerialPort::SetBaudRate(int baudrate) +bool CSerialPort::SetBaudRate(uint32_t baudrate) { int rate = IntToBaudrate(baudrate); if (rate == -1) @@ -286,7 +333,8 @@ bool CSerialPort::SetBaudRate(int baudrate) return true; } -bool CSerialPort::IsOpen() const +bool CSerialPort::IsOpen() { + CLockObject lock(&m_mutex); return m_fd != -1; }