port.cpp

Go to the documentation of this file.
00001 //======================================================================
00002 // File:        port.cpp
00003 // Author:      Matthias Toussaint
00004 // Created:     Sat Nov 25 13:49:23 CET 2006
00005 // Project:     QtDMM
00006 // Description: Base class for multimter port
00007 //----------------------------------------------------------------------
00008 // This file  may  be used under  the terms of  the GNU  General Public
00009 // License  version 2.0 as published   by the Free Software  Foundation
00010 // and appearing  in the file LICENSE.GPL included  in the packaging of
00011 // this file.
00012 // 
00013 // This file is provided AS IS with  NO WARRANTY OF ANY KIND, INCLUDING 
00014 // THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
00015 // PURPOSE.
00016 //----------------------------------------------------------------------
00017 // Copyright 2006 Matthias Toussaint
00018 //======================================================================
00019 
00020 #include <port.h>
00021 #include <errno.h>
00022 
00023 Port::Port() :
00024   m_handle( -1 )
00025 {
00026 }
00027 
00028 Port::~Port()
00029 {
00030 }
00031   
00032 Port::Error Port::writeByte( int byte ) const
00033 {
00034   ssize_t retval;
00035   unsigned char cByte = byte;
00036   
00037   do
00038   {
00039     retval = ::write( m_handle, &cByte, 1 ); 
00040   }
00041   while (retval != -1 && retval != 1);
00042   
00043   if (retval < 0)
00044   {
00045     return errnoValue();
00046   }
00047   
00048   return Port::Ok;
00049 }
00050 
00051 Port::Error Port::readByte( int *byte ) const
00052 {
00053   ssize_t retval;
00054   unsigned char cByte;
00055   
00056   do
00057   {
00058     retval = ::read( m_handle, &cByte, 1 ); 
00059   }
00060   while (retval != -1 && retval != 1);
00061   
00062   if (retval < 0)
00063   {
00064     return errnoValue();
00065   }
00066   
00067   *byte = cByte;
00068   
00069   return Port::Ok;
00070 }
00071   
00072 Port::Error Port::writeString( const char *string, ssize_t len ) const
00073 {
00074   ssize_t retval;
00075   ssize_t remain = len;
00076   const char *data = string;
00077   
00078   do
00079   {
00080     retval = ::write( m_handle, data, remain ); 
00081     if (retval != -1) 
00082     {
00083       data += retval;
00084       remain -= retval;
00085     }
00086   }
00087   while (retval != -1 && remain);
00088   
00089   if (retval < 0)
00090   {
00091     return errnoValue();
00092   }
00093   
00094   return Port::Ok;
00095 }
00096 
00097 Port::Error Port::readString( char *string, ssize_t len ) const
00098 {
00099   ssize_t retval;
00100   ssize_t remain = len;
00101   char *data = string;
00102   
00103   do
00104   {
00105     retval = ::read( m_handle, data, remain ); 
00106     if (retval != -1) 
00107     {
00108       data += retval;
00109       remain -= retval;
00110     }
00111   }
00112   while (retval != -1 && remain);
00113 
00114   if (retval < 0)
00115   {
00116     return errnoValue();
00117   }
00118   
00119   return Port::Ok;
00120 }
00121 
00122 Port::Error Port::errnoValue() const
00123 {
00124   switch (errno)
00125   {
00126     case EAGAIN:
00127       return NoData;
00128     case EBADF:
00129       return BadFileDescriptor;
00130     case EFAULT:
00131       return BadAddress;
00132     case EINTR:
00133       return Interrupted;
00134     case EINVAL:
00135       return Invalid;
00136     case EIO:
00137       return IOError;
00138     case EISDIR:
00139       return IsDirectory;
00140   }
00141   
00142   return UnknownError;
00143 }
00144 
00145 const char *Port::errorString( Error err )
00146 {
00147   switch (err)
00148   {
00149     case Ok:
00150       return "Ok";
00151     case SyntaxError:
00152       return "Syntax error";
00153     case PermissionDenied:
00154       return "Permission denied";
00155     case NoSuchPort:
00156       return "No such device";
00157     case ConfigError:
00158       return "Configuration error";
00159     case OpenError:
00160       return "Open error";
00161     case WriteError:
00162       return "Write error";
00163     case ReadError:
00164       return "Read error";
00165     case UnknownBaudRate:
00166       return "Unknown baud rate";
00167     case UnknownNumberOfBits:
00168       return "Unknown number of bits";
00169     case UnknownParity:
00170       return "Unknown parity";
00171     case UnknownStopBits:
00172       return "Unknown stop bits";
00173     case NoData:
00174       return "No data available";
00175     case BadFileDescriptor:
00176       return "Bad file descriptor";
00177     case BadAddress:
00178       return "Bad address";
00179     case Interrupted:
00180       return "Interrupted";
00181     case Invalid:
00182       return "Invalid device";
00183     case IOError:
00184       return "I/O error";
00185     case IsDirectory:
00186       return "File is directory";
00187     case UnknownError:
00188       return "Unknown error code";
00189   }
00190   
00191   return "Unknown error code";
00192 }

Generated on Mon Jan 22 23:24:18 2007 for cdmm by  doxygen 1.4.6