00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _SerialStreamBuf_h_
00009 #define _SerialStreamBuf_h_
00010
00011 #include <termios.h>
00012 #include <unistd.h>
00013 #include <iosfwd>
00014 #include <streambuf>
00015 #include <string>
00016 #include <SerialPort.h>
00017
00018 extern "C++" {
00019 namespace LibSerial {
00038 class SerialStreamBuf : public std::streambuf {
00039 public:
00043
00045
00062 enum BaudRateEnum {
00063 BAUD_50 = SerialPort::BAUD_50,
00064 BAUD_75 = SerialPort::BAUD_75,
00065 BAUD_110 = SerialPort::BAUD_110,
00066 BAUD_134 = SerialPort::BAUD_134,
00067 BAUD_150 = SerialPort::BAUD_150,
00068 BAUD_200 = SerialPort::BAUD_200,
00069 BAUD_300 = SerialPort::BAUD_300,
00070 BAUD_600 = SerialPort::BAUD_600,
00071 BAUD_1200 = SerialPort::BAUD_1200,
00072 BAUD_1800 = SerialPort::BAUD_1800,
00073 BAUD_2400 = SerialPort::BAUD_2400,
00074 BAUD_4800 = SerialPort::BAUD_4800,
00075 BAUD_9600 = SerialPort::BAUD_9600,
00076 BAUD_19200 = SerialPort::BAUD_19200,
00077 BAUD_38400 = SerialPort::BAUD_38400,
00078 BAUD_57600 = SerialPort::BAUD_57600,
00079 BAUD_115200 = SerialPort::BAUD_115200,
00080 BAUD_230400 = SerialPort::BAUD_230400,
00081 #ifdef __linux__
00082 BAUD_460800 = SerialPort::BAUD_460800,
00083 #endif
00084 BAUD_DEFAULT = SerialPort::BAUD_DEFAULT,
00085 BAUD_INVALID
00086 } ;
00087
00097 enum CharSizeEnum {
00098 CHAR_SIZE_5 = SerialPort::CHAR_SIZE_5,
00099 CHAR_SIZE_6 = SerialPort::CHAR_SIZE_6,
00100 CHAR_SIZE_7 = SerialPort::CHAR_SIZE_7,
00101 CHAR_SIZE_8 = SerialPort::CHAR_SIZE_8,
00102 CHAR_SIZE_DEFAULT = SerialPort::CHAR_SIZE_DEFAULT,
00103 CHAR_SIZE_INVALID
00104 } ;
00105
00114 enum ParityEnum {
00115 PARITY_EVEN = SerialPort::PARITY_EVEN,
00116 PARITY_ODD = SerialPort::PARITY_ODD,
00117 PARITY_NONE = SerialPort::PARITY_NONE,
00118 PARITY_DEFAULT = SerialPort::PARITY_DEFAULT,
00119 PARITY_INVALID
00120 } ;
00121
00130 enum FlowControlEnum {
00131 FLOW_CONTROL_HARD = SerialPort::FLOW_CONTROL_HARD,
00132 FLOW_CONTROL_SOFT = SerialPort::FLOW_CONTROL_SOFT,
00133 FLOW_CONTROL_NONE = SerialPort::FLOW_CONTROL_NONE,
00134 FLOW_CONTROL_DEFAULT = SerialPort::FLOW_CONTROL_DEFAULT,
00135 FLOW_CONTROL_INVALID
00136 } ;
00138
00139
00140
00141
00142
00153 static const BaudRateEnum DEFAULT_BAUD ;
00154
00162 static const CharSizeEnum DEFAULT_CHAR_SIZE ;
00163
00170 static const short DEFAULT_NO_OF_STOP_BITS ;
00171
00178 static const ParityEnum DEFAULT_PARITY ;
00179
00186 static const FlowControlEnum DEFAULT_FLOW_CONTROL ;
00187
00196 static const short DEFAULT_VMIN ;
00197
00206 static const short DEFAULT_VTIME ;
00207
00209
00210
00217 SerialStreamBuf() ;
00218
00222 ~SerialStreamBuf() ;
00224
00233 bool is_open() const ;
00234
00282 SerialStreamBuf* open( const std::string filename,
00283 std::ios_base::openmode mode =
00284 std::ios_base::in | std::ios_base::out ) ;
00285
00306 SerialStreamBuf* close() ;
00307
00312 int SetParametersToDefault() ;
00313
00319 const BaudRateEnum SetBaudRate(const BaudRateEnum baudRate ) ;
00320
00326 const BaudRateEnum BaudRate() const ;
00327
00333 const CharSizeEnum SetCharSize(const CharSizeEnum charSize) ;
00334
00339 const CharSizeEnum CharSize() const ;
00340
00348 short SetNumOfStopBits(short numOfStopBits) ;
00349
00355 short NumOfStopBits() const ;
00356
00362 const ParityEnum SetParity(const ParityEnum parityType) ;
00363
00369 const ParityEnum Parity() const ;
00370
00374 const FlowControlEnum SetFlowControl(const FlowControlEnum flowControlType) ;
00375
00379 const FlowControlEnum FlowControl() const ;
00380
00385 const short SetVMin( short vtime ) ;
00386
00391 const short VMin() const;
00392
00397 const short SetVTime( short vtime ) ;
00398
00403 const short VTime() const;
00404
00406
00410
00412
00413
00414
00415
00416
00417 protected:
00418
00419
00420
00421
00426 static const char CTRL_Q = 0x11 ;
00427
00432 static const char CTRL_S = 0x13 ;
00433
00434
00435
00436
00450 virtual std::streambuf* setbuf( char_type*,
00451 std::streamsize ) ;
00452
00459 virtual std::streamsize xsgetn( char_type* s,
00460 std::streamsize n ) ;
00461
00471 virtual std::streamsize showmanyc();
00472
00480 virtual int_type underflow() ;
00481
00490 virtual int_type uflow() ;
00491
00498 virtual int_type pbackfail(int_type c = traits_type::eof()) ;
00499
00506 virtual std::streamsize xsputn( const char_type* s,
00507 std::streamsize n ) ;
00508
00514 virtual int_type overflow(int_type c) ;
00515
00516 private:
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 SerialStreamBuf( const SerialStreamBuf& ) ;
00528 SerialStreamBuf& operator=( const SerialStreamBuf& ) ;
00529
00536 char mPutbackChar ;
00537
00541 bool mPutbackAvailable ;
00542
00546 int mFileDescriptor ;
00547
00548
00549
00550
00558 int InitializeSerialPort() ;
00559 } ;
00560
00561 inline
00562 SerialStreamBuf::SerialStreamBuf() :
00563 mPutbackChar(0),
00564 mPutbackAvailable(false),
00565 mFileDescriptor(-1)
00566 {
00567 setbuf(0, 0) ;
00568 return ;
00569 }
00570
00571 inline
00572 SerialStreamBuf::~SerialStreamBuf()
00573 {
00574 if( this->is_open() )
00575 {
00576 this->close() ;
00577 }
00578 return ;
00579 }
00580
00581 inline
00582 bool
00583 SerialStreamBuf::is_open() const
00584 {
00585 return (-1 != mFileDescriptor) ;
00586 }
00587
00588 inline
00589 std::streambuf*
00590 SerialStreamBuf::setbuf(char_type *, std::streamsize)
00591 {
00592 return std::streambuf::setbuf(0, 0) ;
00593 }
00594
00595 inline
00596 SerialStreamBuf*
00597 SerialStreamBuf::close()
00598 {
00599
00600
00601
00602 if( this->is_open() == false ) {
00603 return 0 ;
00604 }
00605
00606
00607
00608
00609 if( -1 == ::close(mFileDescriptor) ) {
00610
00611
00612
00613 return 0 ;
00614 } else {
00615
00616
00617
00618 mFileDescriptor = -1 ;
00619
00620
00621
00622 return this ;
00623 }
00624 }
00625
00626 inline
00627 std::streambuf::int_type
00628 SerialStreamBuf::uflow()
00629 {
00630 int_type next_ch = underflow() ;
00631 mPutbackAvailable = false ;
00632 return next_ch ;
00633 }
00634
00635 }
00636 }
00637 #endif // #ifndef _SerialStreamBuf_h_