libserial  0.6.0rc1
SerialStreamBuf.h
Go to the documentation of this file.
1 /*
2  * Time-stamp: <02-Nov-2008 14:52:35 pagey>
3  *
4  * $Id: SerialStreamBuf.h,v 1.9 2005-10-17 00:19:12 crayzeewulf Exp $
5  *
6  *
7  */
8 #ifndef _SerialStreamBuf_h_
9 #define _SerialStreamBuf_h_
10 
11 #include <termios.h>
12 #include <unistd.h>
13 #include <iosfwd>
14 #include <streambuf>
15 #include <string>
16 #include <SerialPort.h>
17 
18 extern "C++" {
19  namespace LibSerial {
38  class SerialStreamBuf : public std::streambuf {
39  public:
43 
45 
62  enum BaudRateEnum {
81 #ifdef __linux__
82  BAUD_460800 = SerialPort::BAUD_460800,
83 #endif
86  } ;
87 
97  enum CharSizeEnum {
104  } ;
105 
114  enum ParityEnum {
120  } ;
121 
136  } ;
138 
139  /* ------------------------------------------------------------
140  * Public Static Members
141  * ------------------------------------------------------------
142  */
153  static const BaudRateEnum DEFAULT_BAUD ;
154 
163 
170  static const short DEFAULT_NO_OF_STOP_BITS ;
171 
178  static const ParityEnum DEFAULT_PARITY ;
179 
187 
196  static const short DEFAULT_VMIN ;
197 
206  static const short DEFAULT_VTIME ;
207 
209 
210 
217  SerialStreamBuf() ;
218 
222  ~SerialStreamBuf() ;
224 
233  bool is_open() const ;
234 
282  SerialStreamBuf* open( const std::string filename,
283  std::ios_base::openmode mode =
284  std::ios_base::in | std::ios_base::out ) ;
285 
307 
312  int SetParametersToDefault() ;
313 
319  const BaudRateEnum SetBaudRate(const BaudRateEnum baudRate ) ;
320 
326  const BaudRateEnum BaudRate() const ;
327 
333  const CharSizeEnum SetCharSize(const CharSizeEnum charSize) ;
334 
339  const CharSizeEnum CharSize() const ;
340 
348  short SetNumOfStopBits(short numOfStopBits) ;
349 
355  short NumOfStopBits() const ;
356 
362  const ParityEnum SetParity(const ParityEnum parityType) ;
363 
369  const ParityEnum Parity() const ;
370 
374  const FlowControlEnum SetFlowControl(const FlowControlEnum flowControlType) ;
375 
379  const FlowControlEnum FlowControl() const ;
380 
385  const short SetVMin( short vtime ) ;
386 
391  const short VMin() const;
392 
397  const short SetVTime( short vtime ) ;
398 
403  const short VTime() const;
404 
406 
410 
412 
413  /* ------------------------------------------------------------
414  * Friends
415  * ------------------------------------------------------------
416  */
417  protected:
418  /* ------------------------------------------------------------
419  * Protected Data Members
420  * ------------------------------------------------------------
421  */
426  static const char CTRL_Q = 0x11 ;
427 
432  static const char CTRL_S = 0x13 ;
433  /* ------------------------------------------------------------
434  * Protected Methods
435  * ------------------------------------------------------------
436  */
450  virtual std::streambuf* setbuf( char_type*,
451  std::streamsize ) ;
452 
459  virtual std::streamsize xsgetn( char_type* s,
460  std::streamsize n ) ;
461 
471  virtual std::streamsize showmanyc();
472 
480  virtual int_type underflow() ;
481 
490  virtual int_type uflow() ;
491 
498  virtual int_type pbackfail(int_type c = traits_type::eof()) ;
499 
506  virtual std::streamsize xsputn( const char_type* s,
507  std::streamsize n ) ;
508 
514  virtual int_type overflow(int_type c) ;
515 
516  private:
517  /* ------------------------------------------------------------
518  * Private Data Members
519  * ------------------------------------------------------------
520  */
521  //
522  // The copy constructor and the assignment operator are
523  // declared private but never defined. This allows the
524  // compiler to catch attempts to copy instances of this
525  // class.
526  //
527  SerialStreamBuf( const SerialStreamBuf& ) ;
529 
537 
542 
547  /* ------------------------------------------------------------
548  * Private Methods
549  * ------------------------------------------------------------
550  */
558  int InitializeSerialPort() ;
559  } ; // class SerialStreamBuf
560 
561  inline
563  mPutbackChar(0),
564  mPutbackAvailable(false),
565  mFileDescriptor(-1)
566  {
567  setbuf(0, 0) ;
568  return ;
569  }
570 
571  inline
573  {
574  if( this->is_open() )
575  {
576  this->close() ;
577  }
578  return ;
579  }
580 
581  inline
582  bool
584  {
585  return (-1 != mFileDescriptor) ;
586  }
587 
588  inline
589  std::streambuf*
590  SerialStreamBuf::setbuf(char_type *, std::streamsize)
591  {
592  return std::streambuf::setbuf(0, 0) ;
593  }
594 
595  inline
598  {
599  //
600  // Return a null pointer if the serial port is not currently open.
601  //
602  if( this->is_open() == false ) {
603  return 0 ;
604  }
605  //
606  // Otherwise, close the serial port and set the file descriptor
607  // to an invalid value.
608  //
609  if( -1 == ::close(mFileDescriptor) ) {
610  //
611  // If the close failed then return a null pointer.
612  //
613  return 0 ;
614  } else {
615  //
616  // Set the file descriptor to an invalid value, -1.
617  //
618  mFileDescriptor = -1 ;
619  //
620  // On success, return "this" as required by the C++ standard.
621  //
622  return this ;
623  }
624  }
625 
626  inline
627  std::streambuf::int_type
629  {
630  int_type next_ch = underflow() ;
631  mPutbackAvailable = false ;
632  return next_ch ;
633  }
634 
635  } // namespace LibSerial
636 } // extern "C++"
637 #endif // #ifndef _SerialStreamBuf_h_