From: Marc D. <ma...@us...> - 2005-02-14 22:53:29
|
Update of /cvsroot/pclasses/pclasses2/src/System In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3075/src/System Modified Files: SerialDevice.linux.cpp Log Message: added input control Index: SerialDevice.linux.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/System/SerialDevice.linux.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- SerialDevice.linux.cpp 14 Feb 2005 20:58:06 -0000 1.2 +++ SerialDevice.linux.cpp 14 Feb 2005 22:53:15 -0000 1.3 @@ -145,26 +145,28 @@ struct termios ios; if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { - throw IO::IOError(errno, "Could not set char size", P_SOURCEINFO); + throw IO::IOError(errno, "Could not set char size.", P_SOURCEINFO); } if( size == SerialDevice::CharSize8 ) { - ios.c_iflag &= ~ISTRIP; - } else { - ios.c_iflag |= ISTRIP; + ios.c_iflag &= ~ISTRIP; + } + else { + ios.c_iflag |= ISTRIP; } + ios.c_cflag &= ~CSIZE; ios.c_cflag |= size; if( ::tcsetattr(this->nosHandle(), TCSANOW, &ios) == -1) { - throw IO::IOError(errno, "Could not set char size", P_SOURCEINFO); + throw IO::IOError(errno, "Could not set char size.", P_SOURCEINFO); } } SerialDevice::CharSize SerialDevice::charSize() throw(IO::IOError) { struct termios ios; if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { - throw IO::IOError(errno, "Could not get char size", P_SOURCEINFO); + throw IO::IOError(errno, "Could not get char size.", P_SOURCEINFO); } int size = (ios.c_cflag & CSIZE); @@ -173,12 +175,155 @@ case CS6 : return CharSize6; case CS7 : return CharSize7; case CS8 : return CharSize8; - default: return DefaultCharSize; + default: throw IO::IOError(errno, "Could not get char size.", P_SOURCEINFO); } return CharSize7; } +void SerialDevice::setParity(Parity parity) throw(IO::IOError) { + struct termios ios; + if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { + throw IO::IOError(errno, "Could not set parity.", P_SOURCEINFO); + } + + switch( parity ) { + case SerialDevice::ParityEven: + ios.c_cflag |= PARENB ; + ios.c_cflag &= ~PARODD ; + break ; + case SerialDevice::ParityOdd: + ios.c_cflag |= PARENB ; + ios.c_cflag |= PARODD ; + break ; + case SerialDevice::ParityNone: + ios.c_cflag &= ~PARENB ; + break ; + default: + throw IO::IOError(errno, "Could not set parity", P_SOURCEINFO); + } + + if( ::tcsetattr(this->nosHandle(), TCSANOW, &ios) == -1 ) { + throw IO::IOError(errno, "Could not set parity", P_SOURCEINFO); + } +} + +SerialDevice::Parity SerialDevice::parity() throw(IO::IOError) { + struct termios ios; + if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { + throw IO::IOError(errno, "Could not get parity", P_SOURCEINFO); + } + + if( ios.c_cflag & PARENB ) { + if( ios.c_cflag & PARODD ) { + return SerialDevice::ParityOdd ; + } + else { + return SerialDevice::ParityEven ; + } + } + else { + return SerialDevice::ParityNone; + } +} + +void SerialDevice::setFlowControl(FlowControl fcontrol) throw(IO::IOError) { + struct termios ios; + if (::tcgetattr(this->nosHandle(), &ios) == -1) { + throw IO::IOError(errno, "Could not set flow control", P_SOURCEINFO); + } + + if ( SerialDevice::FlowControlHard == fcontrol ) { + ios.c_iflag &= ~(IXON|IXOFF); + ios.c_cflag |= CRTSCTS; + ios.c_cc[VSTART] = _POSIX_VDISABLE; + ios.c_cc[VSTOP] = _POSIX_VDISABLE; + } + else { + ios.c_iflag |= IXON|IXOFF; + ios.c_cflag &= ~CRTSCTS; + ios.c_cc[VSTART] = CTRL_Q ; + ios.c_cc[VSTOP] = CTRL_S ; + } + + if (::tcsetattr(this->nosHandle(), TCSANOW, &ios) == -1) { + throw IO::IOError(errno, "Could not set flow control", P_SOURCEINFO); + } +} + +SerialDevice::FlowControl SerialDevice::flowControl() throw(IO::IOError) { + struct termios ios ; + if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { + throw IO::IOError(errno, "Could not get flow control", P_SOURCEINFO); + } + + if( (ios.c_iflag & IXON) && + (ios.c_iflag & IXOFF) && + (CTRL_Q == ios.c_cc[VSTART]) && + (CTRL_S == ios.c_cc[VSTOP]) ) { + return SerialDevice::FlowControlSoft; + } + else {//if ( !((ios.c_iflag & IXON) || (ios.c_iflag & IXOFF)) ) { + return SerialDevice::FlowControlHard; + } +} + +SerialDevice::InputFlags SerialDevice::inputFlags() throw(IO::IOError) { + InputFlags flags; + + struct termios ios; + if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { + throw IO::IOError(errno, "Could not get input mode", P_SOURCEINFO); + } + + if(ios.c_iflag & IGNBRK) flags = static_cast<InputFlags>(flags | IgnoreBreak); + if(ios.c_iflag & IGNPAR) flags = static_cast<InputFlags>(flags | IgnoreParityError); + if(ios.c_iflag & BRKINT) flags = static_cast<InputFlags>(flags | BreakInt); + if(ios.c_iflag & PARMRK) flags = static_cast<InputFlags>(flags | ParityMark); + if(ios.c_iflag & INPCK) flags = static_cast<InputFlags>(flags | EnableParityCheck); + if(ios.c_iflag & ISTRIP) flags = static_cast<InputFlags>(flags | StripBit8); + if(ios.c_iflag & INLCR) flags = static_cast<InputFlags>(flags | NlToCr); + if(ios.c_iflag & IGNCR) flags = static_cast<InputFlags>(flags | IgnoreCr); + if(ios.c_iflag & ICRNL) flags = static_cast<InputFlags>(flags | CrToNl); + if(ios.c_iflag & IUCLC) flags = static_cast<InputFlags>(flags | MapUpperToLower); + if(ios.c_iflag & IXON) flags = static_cast<InputFlags>(flags | EnableXON); + if(ios.c_iflag & IXOFF) flags = static_cast<InputFlags>(flags | EnableXOFF); + if(ios.c_iflag & IXANY) flags = static_cast<InputFlags>(flags | EnableAny); + if(ios.c_iflag & IMAXBEL) flags = static_cast<InputFlags>(flags | SignalFullQueque); + + return flags; +} + +void SerialDevice::setInputFlags(InputFlags flags) throw(IO::IOError) { + int iflags = 0; + + if(flags & IgnoreBreak) iflags |= IGNBRK; + if(flags & IgnoreParityError) iflags |= IGNPAR; + if(flags & BreakInt) iflags |= BRKINT; + if(flags & ParityMark) iflags |= PARMRK; + if(flags & EnableParityCheck) iflags |= INPCK; + if(flags & StripBit8) iflags |= ISTRIP; + if(flags & NlToCr) iflags |= INLCR; + if(flags & IgnoreCr) iflags |= IGNCR; + if(flags & CrToNl) iflags |= ICRNL; + if(flags & MapUpperToLower) iflags |= IUCLC; + if(flags & EnableXON) iflags |= IXON; + if(flags & EnableXOFF) iflags |= IXOFF; + if(flags & EnableAny) iflags |= IXANY; + if(flags & SignalFullQueque) iflags |= IMAXBEL; + + struct termios ios ; + if( ::tcgetattr(this->nosHandle(), &ios) == -1 ) { + throw IO::IOError(errno, "Could not set input flags", P_SOURCEINFO); + } + + ios.c_iflag = flags; + + if( ::tcsetattr(this->nosHandle(), TCSANOW, &ios) == -1) { + throw IO::IOError(errno, "Could not set input flags", P_SOURCEINFO); + } +} + void SerialDevice::put(const UInt8& byte) throw(IO::IOError) { this->write((const char*)(&byte), 1); } |