00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00033
00034 #ifndef GROOVX_RUTZ_SERIALPORT_CC_UTC20050626084020_DEFINED
00035 #define GROOVX_RUTZ_SERIALPORT_CC_UTC20050626084020_DEFINED
00036
00037 #include "rutz/serialport.h"
00038
00039 #ifdef HAVE_EXT_STDIO_FILEBUF_H
00040 #include <ext/stdio_filebuf.h>
00041 #else
00042 #include "rutz/stdiobuf.h"
00043 #endif
00044
00045 #include <cstdio>
00046 #include <fcntl.h>
00047 #include <istream>
00048 #include <termios.h>
00049 #include <unistd.h>
00050
00051 #include "rutz/trace.h"
00052 #include "rutz/debug.h"
00053 GVX_DBG_REGISTER
00054
00055 rutz::serial_port::serial_port(const char* serial_device) :
00056 m_filedes(::open(serial_device, O_RDONLY|O_NOCTTY|O_NONBLOCK)),
00057 m_filebuf(0),
00058 m_stream(0),
00059 m_exit_status(0)
00060 {
00061 GVX_TRACE("rutz::serial_port::serial_port");
00062 if (m_filedes != -1)
00063 {
00064 struct termios ti;
00065
00066 if ( tcgetattr( filedes(), &ti ) == -1 )
00067 { close(); return; }
00068
00069
00070
00071
00072 ti.c_iflag = IGNBRK | IGNPAR;
00073
00074
00075
00076 ti.c_oflag = 0x0;
00077
00078
00079
00080
00081
00082
00083 ti.c_cflag = CS8 | CLOCAL | B9600 | CREAD;
00084
00085
00086
00087 ti.c_lflag = 0;
00088
00089
00090 ti.c_cc[VTIME] = 0;
00091 ti.c_cc[VMIN] = 1;
00092
00093 if ( tcsetattr( filedes(), TCSANOW, &ti) == -1 )
00094 { close(); return; }
00095
00096 #ifdef HAVE_EXT_STDIO_FILEBUF_H
00097 typedef __gnu_cxx::stdio_filebuf<char> filebuf_t;
00098 m_filebuf = new filebuf_t(fdopen(m_filedes, "r"), std::ios::in);
00099 #else
00100 m_filebuf = new rutz::stdiobuf(m_filedes, std::ios::in, true);
00101 #endif
00102 m_stream = new std::iostream(m_filebuf);
00103 }
00104 }
00105
00106 int rutz::serial_port::get()
00107 {
00108 if ( is_closed() ) return -1;
00109
00110 m_stream->clear();
00111 m_stream->sync();
00112 return m_stream->get();
00113 }
00114
00115 int rutz::serial_port::close()
00116 {
00117 GVX_TRACE("rutz::serial_port::close");
00118 if ( !is_closed() )
00119 {
00120 delete m_stream;
00121 m_stream = 0;
00122
00123 delete m_filebuf;
00124 m_filebuf = 0;
00125
00126 m_exit_status = ::close(m_filedes);
00127 }
00128 return m_exit_status;
00129 }
00130
00131 static const char __attribute__((used)) vcid_groovx_rutz_serialport_cc_utc20050626084020[] = "$Id: serialport.cc 10065 2007-04-12 05:54:56Z rjpeters $ $HeadURL: file:
00132 #endif // !GROOVX_RUTZ_SERIALPORT_CC_UTC20050626084020_DEFINED