ROOT logo
#ifndef __TMrbSerialComm_h__
#define __TMrbSerialComm_h__

//_________________________________________________[C++ CLASS DEFINITION FILE]
//////////////////////////////////////////////////////////////////////////////
// Name:           utils/inc/TMrbSerialComm.h
// Purpose:        Class defs to control a serial I/O line
// Description:    Class definitions to control I/O from/to a serial port.
//                 Inspired by a class c_SerialComm written by Mario Schubert
//                 O.S. 17.09.2013 Add control of DTR, RTS etc, add raw r/w
// Author:         R. Lutter, O.Schaile
// Revision:       $Id: TMrbSerialComm.h 17.09.2013$       
// Date:           
// Keywords:
//////////////////////////////////////////////////////////////////////////////

#include "Rtypes.h"

#include "TNamed.h"
#include "TString.h"

//______________________________________________________[C++ CLASS DEFINITION]
//////////////////////////////////////////////////////////////////////////////
// Name:           TMrbSerialComm
// Purpose:        Connect to RS232 line
// Description:    Opens a connection to RS232
// Keywords:
//////////////////////////////////////////////////////////////////////////////

class TMrbSerialComm : public TNamed {

	public:
		enum EMrbParity 	{	kMrbParityNone,
								kMrbParityOdd,
								kMrbParityEven
							};

 	public:
		TMrbSerialComm() {};
		TMrbSerialComm(const Char_t * Device);
		virtual ~TMrbSerialComm() { this->Close(); };

		void Setup(	Int_t BaudRate,
					Int_t NofDataBits = 8,
					EMrbParity Parity = kMrbParityNone,
					Int_t NofStopBits = 1,
					Bool_t UseRtsCts = kFALSE,
					Bool_t IgnoreCR = kTRUE);
		Bool_t Open();
		Bool_t Close();
		Int_t ReadData(TString & Data);
		Int_t WriteData(const Char_t * Data);
		Int_t WriteSingleBytes(const Char_t * Data, Double_t Delay = -1);
		Int_t WriteWithDelay(const Char_t * Data, Double_t Delay = -1);

		inline void UseRtsCts(Bool_t Flag) { fUseRtsCts = Flag; };
		inline void IgnoreCR(Bool_t Flag) { fIgnoreCR = Flag; };

		inline void SetBaudRate(Int_t BaudRate) { fBaudRate = BaudRate; };
		inline void SetBits(Int_t DataBits, Int_t StopBits) { fNofDataBits = DataBits; fNofStopBits = StopBits; };
		inline void SetParity(EMrbParity Parity) { fParity = Parity; };
		inline void SetDelay(Double_t Delay) { fDelay = Delay; };

		inline void SetLineTerm1(Char_t Term) { fLineTerm1 = Term; };
		inline void SetLineTerm2(Char_t Term) { fLineTerm2 = Term; };
		inline void SetPrefix(const Char_t * Prefix) { fPrefix = Prefix; };
		inline void SetPostfix(const Char_t * Postfix, Bool_t CrFlag = kTRUE) { fPostfix = Postfix; if (CrFlag) fPostfix += "\r"; };

		inline const Char_t * GetPort() const { return(this->GetTitle()); };

		inline Bool_t IsOpen() const { return(fFd != -1); };

		void Print(Option_t * Option) const { TObject::Print(Option); }
		virtual void Print() const;			// print settings

		inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
		
		Int_t ReadDataRaw(UChar_t * Data, Int_t nbytes);
		Int_t WriteDataRaw(const UChar_t * Data, Int_t nbytes);
		Bool_t GetDsr();
		Bool_t GetDtr();
		void SetDtr();
		void ResetDtr();
		Bool_t GetCts();
		Bool_t GetRts();
		void SetRts();
		void ResetRts();
		void SetRtsAndDtr();
		void ToggleDtr();
		Bool_t SetModemBaudRate(Int_t baudrate = 0);
		Bool_t SetRaw();
		Bool_t SetSpaceParity();

	protected:
		const Char_t * MakePrintable(TString & PrintString, const Char_t * String) const;

	protected:
		Int_t fFd;						// i/o channel id from open(2)
		void * fOldTIO; 				//! old settings will be saved here
		void * fNewTIO; 				//! new settings
		Int_t fBaudRate;				// baud rate
		Bool_t fUseRtsCts;				// kTRUE if RTS/CTS to be used
		Int_t fNofDataBits; 			// number of data bits
		Int_t fNofStopBits; 			// number of stop bits
		EMrbParity fParity; 			// parity settings
		Bool_t fIgnoreCR;				// kTRUE if <CR> to be ignored
		Double_t fDelay;				// delay [s]
		Char_t fLineTerm1;				// line termination
		Char_t fLineTerm2;				// ...
		TString fPrefix;				// send prefix
		TString fPostfix;				// send postfix
		Int_t fBytesReceived;			// total of bytes received
		Int_t fBytesTransmitted;		// ... transmitted

	ClassDef(TMrbSerialComm, 1) 		// [Utils] I/O from/to serial port
};

#endif
 TMrbSerialComm.h:1
 TMrbSerialComm.h:2
 TMrbSerialComm.h:3
 TMrbSerialComm.h:4
 TMrbSerialComm.h:5
 TMrbSerialComm.h:6
 TMrbSerialComm.h:7
 TMrbSerialComm.h:8
 TMrbSerialComm.h:9
 TMrbSerialComm.h:10
 TMrbSerialComm.h:11
 TMrbSerialComm.h:12
 TMrbSerialComm.h:13
 TMrbSerialComm.h:14
 TMrbSerialComm.h:15
 TMrbSerialComm.h:16
 TMrbSerialComm.h:17
 TMrbSerialComm.h:18
 TMrbSerialComm.h:19
 TMrbSerialComm.h:20
 TMrbSerialComm.h:21
 TMrbSerialComm.h:22
 TMrbSerialComm.h:23
 TMrbSerialComm.h:24
 TMrbSerialComm.h:25
 TMrbSerialComm.h:26
 TMrbSerialComm.h:27
 TMrbSerialComm.h:28
 TMrbSerialComm.h:29
 TMrbSerialComm.h:30
 TMrbSerialComm.h:31
 TMrbSerialComm.h:32
 TMrbSerialComm.h:33
 TMrbSerialComm.h:34
 TMrbSerialComm.h:35
 TMrbSerialComm.h:36
 TMrbSerialComm.h:37
 TMrbSerialComm.h:38
 TMrbSerialComm.h:39
 TMrbSerialComm.h:40
 TMrbSerialComm.h:41
 TMrbSerialComm.h:42
 TMrbSerialComm.h:43
 TMrbSerialComm.h:44
 TMrbSerialComm.h:45
 TMrbSerialComm.h:46
 TMrbSerialComm.h:47
 TMrbSerialComm.h:48
 TMrbSerialComm.h:49
 TMrbSerialComm.h:50
 TMrbSerialComm.h:51
 TMrbSerialComm.h:52
 TMrbSerialComm.h:53
 TMrbSerialComm.h:54
 TMrbSerialComm.h:55
 TMrbSerialComm.h:56
 TMrbSerialComm.h:57
 TMrbSerialComm.h:58
 TMrbSerialComm.h:59
 TMrbSerialComm.h:60
 TMrbSerialComm.h:61
 TMrbSerialComm.h:62
 TMrbSerialComm.h:63
 TMrbSerialComm.h:64
 TMrbSerialComm.h:65
 TMrbSerialComm.h:66
 TMrbSerialComm.h:67
 TMrbSerialComm.h:68
 TMrbSerialComm.h:69
 TMrbSerialComm.h:70
 TMrbSerialComm.h:71
 TMrbSerialComm.h:72
 TMrbSerialComm.h:73
 TMrbSerialComm.h:74
 TMrbSerialComm.h:75
 TMrbSerialComm.h:76
 TMrbSerialComm.h:77
 TMrbSerialComm.h:78
 TMrbSerialComm.h:79
 TMrbSerialComm.h:80
 TMrbSerialComm.h:81
 TMrbSerialComm.h:82
 TMrbSerialComm.h:83
 TMrbSerialComm.h:84
 TMrbSerialComm.h:85
 TMrbSerialComm.h:86
 TMrbSerialComm.h:87
 TMrbSerialComm.h:88
 TMrbSerialComm.h:89
 TMrbSerialComm.h:90
 TMrbSerialComm.h:91
 TMrbSerialComm.h:92
 TMrbSerialComm.h:93
 TMrbSerialComm.h:94
 TMrbSerialComm.h:95
 TMrbSerialComm.h:96
 TMrbSerialComm.h:97
 TMrbSerialComm.h:98
 TMrbSerialComm.h:99
 TMrbSerialComm.h:100
 TMrbSerialComm.h:101
 TMrbSerialComm.h:102
 TMrbSerialComm.h:103
 TMrbSerialComm.h:104
 TMrbSerialComm.h:105
 TMrbSerialComm.h:106
 TMrbSerialComm.h:107
 TMrbSerialComm.h:108
 TMrbSerialComm.h:109
 TMrbSerialComm.h:110
 TMrbSerialComm.h:111
 TMrbSerialComm.h:112
 TMrbSerialComm.h:113
 TMrbSerialComm.h:114
 TMrbSerialComm.h:115
 TMrbSerialComm.h:116
 TMrbSerialComm.h:117
 TMrbSerialComm.h:118