00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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 }