posix: set the timeout when writing to the serial port
[deb_libcec.git] / src / lib / platform / linux / serialport.cpp
index 0bb4e2cf6c419ad0980fea55ecab2033664015f4..f0408574dad1670238a571ab0dcadfb8acedcff3 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
+ *
+ * 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       <license@pulse-eight.com>
+ *     http://www.pulse-eight.com/
+ *     http://www.pulse-eight.net/
  */
 
 #include <stdio.h>
 #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,7 +61,7 @@ CSerialPort::~CSerialPort()
   Close();
 }
 
-int8_t CSerialPort::Write(const cec_frame &data)
+int8_t CSerialPort::Write(CCECAdapterMessage *data)
 {
   fd_set port;
 
@@ -48,18 +74,35 @@ int8_t CSerialPort::Write(const cec_frame &data)
 
   int32_t byteswritten = 0;
 
-  while (byteswritten < (int32_t) data.size)
+  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.data + byteswritten, data.size - byteswritten);
+    returnv = write(m_fd, data->packet.data + byteswritten, data->size() - byteswritten);
     if (returnv == -1)
     {
       m_error = strerror(errno);
@@ -69,14 +112,14 @@ int8_t CSerialPort::Write(const cec_frame &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.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;
 }
@@ -142,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;
 }