Bayonne2 / Common C++ 2 Framework
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
serial.h
Go to the documentation of this file.
1 // Copyright (C) 1999-2005 Open Source Telecom Corporation.
2 // Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 //
18 // As a special exception, you may use this file as part of a free software
19 // library without restriction. Specifically, if other files instantiate
20 // templates or use macros or inline functions from this file, or you compile
21 // this file and link it with other files to produce an executable, this
22 // file does not by itself cause the resulting executable to be covered by
23 // the GNU General Public License. This exception does not however
24 // invalidate any other reasons why the executable file might be covered by
25 // the GNU General Public License.
26 //
27 // This exception applies only to the code released under the name GNU
28 // Common C++. If you copy code from other releases into a copy of GNU
29 // Common C++, as the General Public License permits, the exception does
30 // not apply to the code that you add in this way. To avoid misleading
31 // anyone as to the status of such modified files, you must delete
32 // this exception notice from them.
33 //
34 // If you write modifications of your own for GNU Common C++, it is your choice
35 // whether to permit this exception to apply to your modifications.
36 // If you do not wish that, delete this exception notice.
37 //
38 
44 #ifndef CCXX_SERIAL_H_
45 #define CCXX_SERIAL_H_
46 
47 #ifndef CCXX_MISSING_H_
48 #include <cc++/missing.h>
49 #endif
50 
51 #ifndef CCXX_THREAD_H_
52 #include <cc++/thread.h>
53 #endif
54 
55 #ifndef CCXX_EXCEPTION_H_
56 #include <cc++/exception.h>
57 #endif
58 
59 #ifndef WIN32
60 typedef int HANDLE;
61 #define INVALID_HANDLE_VALUE (-1)
62 #endif
63 
64 #ifdef CCXX_NAMESPACES
65 namespace ost {
66 #endif
67 
99 {
100 public:
101  enum Error {
102  errSuccess = 0,
115  errExtended
116  };
117  typedef enum Error Error;
118 
119  enum Flow {
123  flowBoth
124  };
125  typedef enum Flow Flow;
126 
127  enum Parity {
130  parityEven
131  };
132  typedef enum Parity Parity;
133 
134  enum Pending {
137  pendingError
138  };
139  typedef enum Pending Pending;
140 
141 private:
143  char *errstr;
144 
145  struct {
146  bool thrown: 1;
147  bool linebuf: 1;
148  } flags;
149 
150  void * original;
151  void * current;
152 
156  void initSerial(void);
157 
158 protected:
159 
161 
162  int bufsize;
163 
169  void open(const char *fname);
170 
175  void close(void);
176 
184  virtual int aRead(char * Data, const int Length);
185 
192  virtual int aWrite(const char * Data, const int Length);
193 
201  Error error(Error error, char *errstr = NULL);
202 
209  inline void error(char *err)
210  {error(errExtended, err);};
211 
212 
219  inline void setError(bool enable)
220  {flags.thrown = !enable;};
221 
232  int setPacketInput(int size, unsigned char btimer = 0);
233 
243  int setLineInput(char newline = 13, char nl1 = 0);
244 
248  void restore(void);
249 
253  void flushInput(void);
254 
258  void flushOutput(void);
259 
263  void waitOutput(void);
264 
269  void endSerial(void);
270 
276  void initConfig(void);
277 
283  {initSerial();};
284 
291  Serial(const char *name);
292 
293 
294 public:
295 
302  virtual ~Serial();
303 
308  Serial &operator=(const Serial &from);
309 
316  Error setSpeed(unsigned long speed);
317 
324  Error setCharBits(int bits);
325 
332  Error setParity(Parity parity);
333 
340  Error setStopBits(int bits);
341 
348  Error setFlowControl(Flow flow);
349 
355  void toggleDTR(timeout_t millisec);
356 
360  void sendBreak(void);
361 
368  inline Error getErrorNumber(void)
369  {return errid;};
370 
377  inline char *getErrorString(void)
378  {return errstr;};
379 
387  inline int getBufferSize(void)
388  {return bufsize;};
389 
399  virtual bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF);
400 };
401 
423 class __EXPORT TTYStream : protected std::streambuf, public Serial, public std::iostream
424 {
425 private:
426  int doallocate();
427 
428  friend TTYStream& crlf(TTYStream&);
429  friend TTYStream& lfcr(TTYStream&);
430 
431 protected:
432  char *gbuf, *pbuf;
434 
439  TTYStream();
440 
445  void allocate(void);
446 
451  void endStream(void);
452 
459  int underflow(void);
460 
469  int uflow(void);
470 
478  int overflow(int ch);
479 
480 public:
487  TTYStream(const char *filename, timeout_t to = 0);
488 
492  virtual ~TTYStream();
493 
499  inline void setTimeout(timeout_t to)
500  {timeout = to;};
501 
509  void interactive(bool flag);
510 
517  int sync(void);
518 
530  bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF);
531 };
532 
543 {
544 public:
548  ttystream();
549 
557  ttystream(const char *name);
558 
564  void open(const char *name);
565 
569  void close(void);
570 
574  inline bool operator!()
575  {return (dev < 0);};
576 };
577 
588 class __EXPORT TTYSession : public Thread, public TTYStream
589 {
590 public:
598  TTYSession(const char *name, int pri = 0, int stack = 0);
599 
600  virtual ~TTYSession();
601 };
602 
603 #ifndef WIN32
604 
605 // Not support this right now.......
606 //
609 
631 class __EXPORT SerialPort: public Serial, public TimerPort
632 {
633 private:
634  SerialPort *next, *prev;
636 #ifdef USE_POLL
637  struct pollfd *ufd;
638 #endif
642 
643  friend class SerialService;
644 
645 protected:
652  SerialPort(SerialService *svc, const char *name);
653 
658  virtual ~SerialPort();
659 
664  void setDetectPending( bool );
665 
669  inline bool getDetectPending( void ) const
670  { return detect_pending; }
671 
676  void setDetectOutput( bool );
677 
681  inline bool getDetectOutput( void ) const
682  { return detect_output; }
683 
688  virtual void expired(void);
689 
695  virtual void pending(void);
696 
701  virtual void disconnect(void);
702 
712  inline int output(void *buf, int len)
713  {return aWrite((char *)buf, len);};
714 
718  virtual void output(void);
719 
729  inline int input(void *buf, int len)
730  {return aRead((char *)buf, len);};
731 public:
739  void setTimer(timeout_t timeout = 0);
740 
746  void incTimer(timeout_t timeout);
747 };
748 
771 class __EXPORT SerialService : public Thread, private Mutex
772 {
773 private:
774  fd_set connect;
775  int iosync[2];
776  int hiwater;
777  int count;
778  SerialPort *first, *last;
779 
785  void attach(SerialPort *port);
786 
792  void detach(SerialPort *port);
793 
797  void run(void);
798 
799  friend class SerialPort;
800 
801 protected:
808  virtual void onUpdate(unsigned char flag);
809 
814  virtual void onEvent(void);
815 
822  virtual void onCallback(SerialPort *port);
823 
824 public:
834  void update(unsigned char flag = 0xff);
835 
844  SerialService(int pri = 0, size_t stack = 0, const char *id = NULL);
845 
849  virtual ~SerialService();
850 
857  inline int getCount(void)
858  {return count;};
859 };
860 
861 #endif
862 
863 
864 
865 #ifdef COMMON_STD_EXCEPTION
866 class __EXPORT SerException : public IOException
867 {
868 public:
869  SerException(const String &str) : IOException(str) {};
870 };
871 #endif
872 
873 #ifdef CCXX_NAMESPACES
874 }
875 #endif
876 
877 #endif
878 
Flow
Definition: serial.h:119
fd_set connect
Definition: serial.h:774
Error errid
Definition: serial.h:142
int HANDLE
Definition: serial.h:60
SerialPort * last
Definition: serial.h:778
The TTYSession aggragates a TTYStream and a Common C++ Thread which is assumed to be the execution co...
Definition: serial.h:588
__EXPORT AppLog & error(AppLog &sl)
Manipulator for error level.
Definition: applog.h:541
bool operator!()
Test to see if stream is opened.
Definition: serial.h:574
bool detect_pending
Definition: serial.h:639
int getCount(void)
Get current reference count.
Definition: serial.h:857
char * errstr
Definition: serial.h:143
Serial()
This allows later ttystream class to open and close a serial device.
Definition: serial.h:282
substitute functions which may be missing in target platform libc.
#define TIMEOUT_INF
Definition: thread.h:115
The Mutex class is used to protect a section of code so that at any given time only a single thread c...
Definition: thread.h:186
int input(void *buf, int len)
Receive "input" for pending data from the serial port.
Definition: serial.h:729
This is a generic and portable string class.
Definition: string.h:77
int output(void *buf, int len)
Transmit "send" data to the serial port.
Definition: serial.h:712
GNU Common C++ exception model base classes.
unsigned long timeout_t
Definition: thread.h:74
TTY streams are used to represent serial connections that are fully "streamable" objects using C++ st...
Definition: serial.h:423
bool getDetectPending(void) const
Get the current state of the DetectPending flag.
Definition: serial.h:669
Synchronization and threading services.
The SerialService is a thead service object that is meant to service attached serial ports...
Definition: serial.h:771
bool detect_output
Definition: serial.h:640
char * pbuf
Definition: serial.h:432
Error getErrorNumber(void)
Often used by a "catch" to fetch the last error of a thrown serial.
Definition: serial.h:368
char * getErrorString(void)
Often used by a "catch" to fetch the user set error string of a thrown serial.
Definition: serial.h:377
HANDLE dev
Definition: serial.h:160
Parity
Definition: serial.h:127
void * original
Definition: serial.h:150
class __EXPORT SerialService
Definition: serial.h:608
int bufsize
Definition: serial.h:162
bool getDetectOutput(void) const
Get the current state of the DetectOutput flag.
Definition: serial.h:681
#define __EXPORT
Definition: audio2.h:51
timeout_t timeout
Definition: serial.h:433
int getBufferSize(void)
Get the "buffer" size for buffered operations.
Definition: serial.h:387
The Serial class is used as the base for all serial I/O services under APE.
Definition: serial.h:98
SerialPort * prev
Definition: serial.h:634
void error(char *err)
This service is used to thow application defined serial errors where the application specific error c...
Definition: serial.h:209
Every thread of execution in an application is created by instantiating an object of a class derived ...
Definition: thread.h:1093
int hiwater
Definition: serial.h:776
void setError(bool enable)
This method is used to turn the error handler on or off for "throwing" execptions by manipulating the...
Definition: serial.h:219
bool detect_disconnect
Definition: serial.h:641
Timer ports are used to provide synchronized timing events when managed under a "service thread" such...
Definition: thread.h:1759
Error
Definition: serial.h:101
A more natural C++ "ttystream" class for use by non-threaded applications.
Definition: serial.h:542
Pending
Definition: serial.h:134
void * current
Definition: serial.h:151
void setTimeout(timeout_t to)
Set the timeout control.
Definition: serial.h:499
The serial port is an internal class which is attached to and then serviced by a specified SerialServ...
Definition: serial.h:631
SerialService * service
Definition: serial.h:635
class __EXPORT SerialPort
Definition: serial.h:607