1 
2 #ifndef _QEXTSERIALBASE_H_
3 #define _QEXTSERIALBASE_H_
4 
5 #include <QIODevice>
6 #include <QFile>
7 
8 #ifdef QT_THREAD_SUPPORT
9 #include <QThread>
10 #include <QMutex>
11 #endif
12 
13 /*if all warning messages are turned off, flag portability warnings to be turned off as well*/
14 #ifdef _TTY_NOWARN_
15 #define _TTY_NOWARN_PORT_
16 #endif
17 
18 /*macros for thread support*/
19 #ifdef QT_THREAD_SUPPORT
20 #define LOCK_MUTEX() mutex->lock()
21 #define UNLOCK_MUTEX() mutex->unlock()
22 #else
23 #define LOCK_MUTEX()
24 #define UNLOCK_MUTEX()
25 #endif
26 
27 /*macros for warning messages*/
28 #ifdef _TTY_NOWARN_PORT_
29 #define TTY_PORTABILITY_WARNING(s)
30 #else
31 #define TTY_PORTABILITY_WARNING(s) qWarning(s)
32 #endif
33 #ifdef _TTY_NOWARN_
34 #define TTY_WARNING(s)
35 #else
36 #define TTY_WARNING(s) qWarning(s)
37 #endif
38 
39 
40 /*line status constants*/
41 #define LS_CTS  0x01
42 #define LS_DSR  0x02
43 #define LS_DCD  0x04
44 #define LS_RI   0x08
45 #define LS_RTS  0x10
46 #define LS_DTR  0x20
47 #define LS_ST   0x40
48 #define LS_SR   0x80
49 
50 /*error constants*/
51 #define E_NO_ERROR                   0
52 #define E_INVALID_FD                 1
53 #define E_NO_MEMORY                  2
54 #define E_CAUGHT_NON_BLOCKED_SIGNAL  3
55 #define E_PORT_TIMEOUT               4
56 #define E_INVALID_DEVICE             5
57 #define E_BREAK_CONDITION            6
58 #define E_FRAMING_ERROR              7
59 #define E_IO_ERROR                   8
60 #define E_BUFFER_OVERRUN             9
61 #define E_RECEIVE_OVERFLOW          10
62 #define E_RECEIVE_PARITY_ERROR      11
63 #define E_TRANSMIT_OVERFLOW         12
64 #define E_READ_FAILED               13
65 #define E_WRITE_FAILED              14
66 
67 /*enums for port settings*/
68 enum NamingConvention {
69     WIN_NAMES,
70     IRIX_NAMES,
71     HPUX_NAMES,
72     SUN_NAMES,
73     DIGITAL_NAMES,
74     FREEBSD_NAMES,
75     LINUX_NAMES
76 };
77 
78 enum BaudRateType {
79     BAUD50,                //POSIX ONLY
80     BAUD75,                //POSIX ONLY
81     BAUD110,
82     BAUD134,               //POSIX ONLY
83     BAUD150,               //POSIX ONLY
84     BAUD200,               //POSIX ONLY
85     BAUD300,
86     BAUD600,
87     BAUD1200,
88     BAUD1800,              //POSIX ONLY
89     BAUD2400,
90     BAUD4800,
91     BAUD9600,
92     BAUD14400,             //WINDOWS ONLY
93     BAUD19200,
94     BAUD38400,
95     BAUD56000,             //WINDOWS ONLY
96     BAUD57600,
97     BAUD76800,             //POSIX ONLY
98     BAUD115200,
99     BAUD128000,            //WINDOWS ONLY
100     BAUD256000             //WINDOWS ONLY
101 };
102 
103 enum DataBitsType {
104     DATA_5,
105     DATA_6,
106     DATA_7,
107     DATA_8
108 };
109 
110 enum ParityType {
111     PAR_NONE,
112     PAR_ODD,
113     PAR_EVEN,
114     PAR_MARK,               //WINDOWS ONLY
115     PAR_SPACE
116 };
117 
118 enum StopBitsType {
119     STOP_1,
120     STOP_1_5,               //WINDOWS ONLY
121     STOP_2
122 };
123 
124 enum FlowType {
125     FLOW_OFF,
126     FLOW_HARDWARE,
127     FLOW_XONXOFF
128 };
129 
130 /*structure to contain port settings*/
131 struct PortSettings {
132     BaudRateType BaudRate;
133     DataBitsType DataBits;
134     ParityType Parity;
135     StopBitsType StopBits;
136     FlowType FlowControl;
137     ulong Timeout_Sec;
138     ulong Timeout_Millisec;
139 };
140 
141 class QextSerialBase : public QIODevice {
142 public:
143     QextSerialBase();
144     QextSerialBase(const QString & name);
145     virtual ~QextSerialBase();
146     virtual void construct();
147     virtual void setPortName(const QString & name);
148     virtual QString portName() const;
149 
150     virtual void setBaudRate(BaudRateType)=0;
151     virtual BaudRateType baudRate() const;
152     virtual void setDataBits(DataBitsType)=0;
153     virtual DataBitsType dataBits() const;
154     virtual void setParity(ParityType)=0;
155     virtual ParityType parity() const;
156     virtual void setStopBits(StopBitsType)=0;
157     virtual StopBitsType stopBits() const;
158     virtual void setFlowControl(FlowType)=0;
159     virtual FlowType flowControl() const;
160     virtual void setTimeout(ulong, ulong)=0;
161 
162     virtual bool open(OpenMode mode=0)=0;
163     virtual bool isSequential() const;
164     virtual void close()=0;
165     virtual void flush()=0;
166 
167     virtual qint64 size() const=0;
168     virtual qint64 bytesAvailable() =0;
169     virtual bool atEnd() const;
170 
171     virtual void ungetChar(char c)=0;
172     virtual qint64 readLine(char * data, qint64 maxSize);
173 
174     virtual ulong lastError() const;
175     virtual void translateError(ulong error)=0;
176 
177     virtual void setDtr(bool set=true)=0;
178     virtual void setRts(bool set=true)=0;
179     virtual ulong lineStatus()=0;
180 
181 protected:
182     QString port;
183     PortSettings Settings;
184     ulong lastErr;
185 
186 #ifdef QT_THREAD_SUPPORT
187     static QMutex* mutex;
188     static ulong refCount;
189 #endif
190 
191     virtual qint64 readData(char * data, qint64 maxSize)=0;
192     virtual qint64 writeData(const char * data, qint64 maxSize)=0;
193 
194 };
195 
196 #endif
197