00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef SerialConnectionH
00038 #define SerialConnectionH
00039
00040
00041 #include <zeusbase/System/Interfaces/IInputStream.hpp>
00042 #include <zeusbase/System/Interfaces/IOutputStream.hpp>
00043 #include <zeusbase/System/ZObject.h>
00044
00045 #if defined(ENABLE_LINUX_BINDING)
00046 #include <termios.h>
00047 #endif
00048
00049
00050 BEGIN_NAMESPACE_Zeus
00051
00052
00056
00057 zeusbase_class TSerialConnection : public TZObject, public IInputStream, public IOutputStream
00058 {
00059 public:
00060
00063
00064 enum EBaudRate
00065 {
00066 etBR_0 = 0,
00067 etBR_50 = 50,
00068 etBR_75 = 75,
00069 etBR_110 = 110,
00070 etBR_134 = 134,
00071 etBR_150 = 500,
00072 etBR_200 = 200,
00073 etBR_300 = 300,
00074 etBR_600 = 600,
00075 etBR_1200 = 1200,
00076 etBR_1800 = 1800,
00077 etBR_2400 = 2400,
00078 etBR_4800 = 4800,
00079 etBR_9600 = 9600,
00080 etBR_14400 = 14400,
00081 etBR_19200 = 19200,
00082 etBR_38400 = 38400,
00083 etBR_56000 = 56000,
00084 etBR_57600 = 57600,
00085 etBR_76800 = 76800,
00086 etBR_115200 = 115200,
00087 etBR_128000 = 128000,
00088 etBR_256000 = 256000
00089 };
00090
00091
00094
00095 enum EParity
00096 {
00097 etNone = 0,
00098 etOdd = 1,
00099 etEven = 2,
00100 etMark = 3,
00101 etSpace = 4
00102 };
00103
00104
00107
00108 enum EStopBits
00109 {
00110 etOne = 0,
00111 etOneHalf = 1,
00112 etTwo = 2
00113 };
00114
00115 TSerialConnection(Uint uiPort);
00116
00117 virtual Retval connect();
00118 virtual Retval disconnect();
00119
00120
00121 Uint8 getByteSize() const;
00122 Uint getPort() const;
00123 EBaudRate getBaudrate() const;
00124 EParity getParity() const;
00125 EStopBits getStopBits() const;
00126
00127 bool isBlockable() const;
00128 bool isConnected() const;
00129 bool hasHardwareFlowControl() const;
00130 bool hasSoftwareFlowControl() const;
00131
00132 void setBlockable(bool bMode);
00133 void setByteSize(Uint8 ucValue);
00134 void setBaudrate(EBaudRate eValue);
00135 void setHardwareFlowControl(bool bValue);
00136 void setSoftwareFlowControl(bool bValue);
00137 void setParity(EParity eValue);
00138 void setStopBits(EStopBits eValue);
00139
00140
00141 virtual bool MQUALIFIER available() const { return isConnected(); }
00142 virtual bool MQUALIFIER isEndReached() const { return !isConnected(); }
00143 virtual Retval MQUALIFIER read(char* pBuffer, Int iBufferSize, Int& rValidSize) const;
00144 virtual Int MQUALIFIER readItem() const;
00145 virtual Int8 MQUALIFIER readInt8(BOOL_ERRORRETVAL(pError)) const;
00146 virtual Int16 MQUALIFIER readInt16(BOOL_ERRORRETVAL(pError)) const;
00147 virtual Int32 MQUALIFIER readInt32(BOOL_ERRORRETVAL(pError)) const;
00148 virtual Int64 MQUALIFIER readInt64(BOOL_ERRORRETVAL(pError)) const;
00149 virtual Uint8 MQUALIFIER readUint8(BOOL_ERRORRETVAL(pError)) const;
00150 virtual Uint16 MQUALIFIER readUint16(BOOL_ERRORRETVAL(pError)) const;
00151 virtual Uint32 MQUALIFIER readUint32(BOOL_ERRORRETVAL(pError)) const;
00152 virtual Uint64 MQUALIFIER readUint64(BOOL_ERRORRETVAL(pError)) const;
00153 virtual Float64 MQUALIFIER readFloat64(BOOL_ERRORRETVAL(pError)) const;
00154 virtual Float32 MQUALIFIER readFloat32(BOOL_ERRORRETVAL(pError)) const;
00155 virtual bool MQUALIFIER readBool(BOOL_ERRORRETVAL(pError)) const;
00156 virtual Retval MQUALIFIER readArray(IByteArray& rData) const;
00157 virtual Retval MQUALIFIER readString(IString& rstrData) const;
00158 virtual void MQUALIFIER close() { disconnect(); }
00159 virtual void MQUALIFIER reset();
00160 virtual bool MQUALIFIER skip(Int iBytes = 1);
00161
00162
00163 virtual Retval MQUALIFIER write(const char* pBuffer, Int iBufferSize);
00164 virtual Retval MQUALIFIER writeInt8(Int8 cData);
00165 virtual Retval MQUALIFIER writeInt16(Int16 sData);
00166 virtual Retval MQUALIFIER writeInt32(Int32 lData);
00167 virtual Retval MQUALIFIER writeInt64(const Int64& rldData);
00168 virtual Retval MQUALIFIER writeUint8(Uint8 ucData);
00169 virtual Retval MQUALIFIER writeUint16(Uint16 usData);
00170 virtual Retval MQUALIFIER writeUint32(Uint32 ulData);
00171 virtual Retval MQUALIFIER writeUint64(const Uint64& ruldData);
00172 virtual Retval MQUALIFIER writeFloat32(Float32 fData);
00173 virtual Retval MQUALIFIER writeFloat64(const Float64& rdData);
00174 virtual Retval MQUALIFIER writeBool(bool bData);
00175 virtual Retval MQUALIFIER writeArray(const IByteArray& rData);
00176 virtual Retval MQUALIFIER writeString(const IString& rData);
00177 virtual void MQUALIFIER flush() {}
00178
00179
00180 MEMORY_MANAGER_DECL
00181
00182 protected:
00183 virtual ~TSerialConnection();
00184
00185 private:
00187 Uint m_uiPort;
00189 bool m_bBlockable;
00191 EBaudRate m_eBaudRate;
00193 EParity m_eParity;
00195 EStopBits m_eStopBits;
00197 bool m_bEnableHWFlowControl;
00199 bool m_bEnableSWFlowControl;
00201 Uint8 m_ucByteSize;
00203 bool m_bUseDefaultSettings;
00204
00205 #if defined(ENABLE_WIN32_BINDING)
00207 HANDLE m_hConnection;
00208 #elif defined(ENABLE_LINUX_BINDING)
00210 int m_iConnection;
00212 struct termios m_OldTIO;
00213
00214 static EBaudRate getBaudrate_internal(struct termios& rOptions);
00215 static void setBaudrate_internal(struct termios& rOptions, EBaudRate eBaudRate);
00216 static void setByteSize_internal(struct termios& rOptions, Uint ucByteSize);
00217 static void setParity_internal(struct termios& rOptions, EParity eParity);
00218 static void setStopBits_internal(struct termios& rOptions, EStopBits eStopBits);
00219
00220 #endif
00221 };
00222
00223
00224
00227
00228 inline Uint8 TSerialConnection::getByteSize() const
00229 {
00230 return m_ucByteSize;
00231 }
00232
00233
00236
00237 inline Uint TSerialConnection::getPort() const
00238 {
00239 return m_uiPort;
00240 }
00241
00242
00245
00246 inline TSerialConnection::EBaudRate TSerialConnection::getBaudrate() const
00247 {
00248 return m_eBaudRate;
00249 }
00250
00251
00254
00255 inline TSerialConnection::EParity TSerialConnection::getParity() const
00256 {
00257 return m_eParity;
00258 }
00259
00260
00263
00264 inline TSerialConnection::EStopBits TSerialConnection::getStopBits() const
00265 {
00266 return m_eStopBits;
00267 }
00268
00269
00272
00273 inline bool TSerialConnection::hasHardwareFlowControl() const
00274 {
00275 return m_bEnableHWFlowControl;
00276 }
00277
00278
00281
00282 inline bool TSerialConnection::hasSoftwareFlowControl() const
00283 {
00284 return m_bEnableSWFlowControl;
00285 }
00286
00287
00292
00293 inline bool TSerialConnection::isBlockable() const
00294 {
00295 return m_bBlockable;
00296 }
00297
00298
00301
00302 inline bool TSerialConnection::isConnected() const
00303 {
00304 #if defined(ENABLE_WIN32_BINDING)
00305 return (m_hConnection != NULL);
00306 #elif defined(ENABLE_LINUX_BINDING)
00307 return (m_iConnection != -1);
00308 #endif
00309 }
00310
00311
00314
00315 inline void TSerialConnection::setByteSize(Uint8 ucValue)
00316 {
00317 m_ucByteSize = ucValue;
00318 m_bUseDefaultSettings = false;
00319 }
00320
00321
00324
00325 inline void TSerialConnection::setBaudrate(EBaudRate eValue)
00326 {
00327 m_eBaudRate = eValue;
00328 m_bUseDefaultSettings = false;
00329 }
00330
00331
00334
00335 inline void TSerialConnection::setHardwareFlowControl(bool bValue)
00336 {
00337 m_bEnableHWFlowControl = bValue;
00338 m_bUseDefaultSettings = false;
00339 }
00340
00341
00344
00345 inline void TSerialConnection::setSoftwareFlowControl(bool bValue)
00346 {
00347 m_bEnableSWFlowControl = bValue;
00348 m_bUseDefaultSettings = false;
00349 }
00350
00351
00354
00355 inline void TSerialConnection::setParity(EParity eValue)
00356 {
00357 m_eParity = eValue;
00358 m_bUseDefaultSettings = false;
00359 }
00360
00361
00364
00365 inline void TSerialConnection::setStopBits(EStopBits eValue)
00366 {
00367 m_eStopBits = eValue;
00368 m_bUseDefaultSettings = false;
00369 }
00370
00371
00374
00375 inline Uint8 MQUALIFIER TSerialConnection::readUint8(bool* pError) const
00376 {
00377 return static_cast<Uint8>(readInt8(pError));
00378 }
00379
00380
00383
00384 inline Uint16 MQUALIFIER TSerialConnection::readUint16(bool* pError) const
00385 {
00386 return static_cast<Uint16>(readInt16(pError));
00387 }
00388
00389
00392
00393 inline Uint32 MQUALIFIER TSerialConnection::readUint32(bool* pError) const
00394 {
00395 return static_cast<Uint32>(readInt32(pError));
00396 }
00397
00398
00401
00402 inline Uint64 MQUALIFIER TSerialConnection::readUint64(bool* pError) const
00403 {
00404 return static_cast<Uint64>(readInt64(pError));
00405 }
00406
00407
00410
00411 inline bool MQUALIFIER TSerialConnection::readBool(bool* pError) const
00412 {
00413 return (readInt8(pError) != 0 );
00414 }
00415
00416
00419
00420 inline Retval MQUALIFIER TSerialConnection::writeUint8(Uint8 ucData)
00421 {
00422 return writeInt8(static_cast<Int8>(ucData));
00423 }
00424
00425
00428
00429 inline Retval MQUALIFIER TSerialConnection::writeUint16(Uint16 usData)
00430 {
00431 return writeInt16(static_cast<Int16>(usData));
00432 }
00433
00434
00437
00438 inline Retval MQUALIFIER TSerialConnection::writeUint32(Uint32 ulData)
00439 {
00440 return writeInt32(static_cast<Int32>(ulData));
00441 }
00442
00443
00446
00447 inline Retval MQUALIFIER TSerialConnection::writeUint64(const Uint64& ruldData)
00448 {
00449 return writeInt64(static_cast<Int64>(ruldData));
00450 }
00451
00452
00455
00456 inline Retval MQUALIFIER TSerialConnection::writeBool(bool bData)
00457 {
00458 return writeInt8(static_cast<Int8>(bData));
00459 }
00460
00461 END_NAMESPACE_Zeus
00462
00463 #endif