#ifndef __TMrbEsone_h__
#define __TMrbEsone_h__
#include "TSystem.h"
#include "TString.h"
#include "TArrayI.h"
#include "TArrayL.h"
#include "TServerSocket.h"
#include "TSocket.h"
#include "TMessage.h"
#include "TMrbNamedX.h"
#include "TMrbLofNamedX.h"
#include "TMrbEsoneCommon.h"
#include "TMrbEsoneCnaf.h"
#include "TMrbC2Lynx.h"
#define C_CBV 5
#define C_CC32 11
class TMrbEsone : public TObject {
public:
enum EMrbEsoneServer { kES_MBS = 0,
kES_MARABOU = 1
};
enum EMrbCamacController { kCC_CBV = C_CBV,
kCC_CC32 = C_CC32
};
enum { kBroadCastSetMask_N_CC32 = N(26) };
enum { kBroadCastExecCmd_N_CC32 = N(25) };
enum { kFastCamac_F = F(5) };
enum { kAutoRead_CC32 = BIT(12) };
enum { kLastError = -1 };
public:
TMrbEsone(Bool_t Offline = kFALSE) {
if (!this->Reset(Offline)) MakeZombie();
};
TMrbEsone(const Char_t * HostName, Bool_t Offline = kFALSE) {
if (this->Reset(Offline)) this->ConnectToHost(HostName);
else this->MakeZombie();
};
~TMrbEsone() {};
Bool_t StartServer(const Char_t * HostName);
Bool_t ClearDW(Int_t Crate);
Bool_t InitDW(Int_t Crate);
Bool_t SetDWInhibit(Int_t Crate, Bool_t Flag = kTRUE);
Bool_t DWIsInhibited(Int_t Crate);
UInt_t ConnectToHost(const Char_t * HostName, Bool_t Reconnect = kFALSE);
Bool_t ExecCnaf(const Char_t * Cnaf, Bool_t D16Flag = kFALSE);
Bool_t ExecCnaf(Int_t Crate, Int_t Station, Int_t Subaddr, Int_t Function, Bool_t D16Flag = kFALSE);
Bool_t ExecCnaf(const Char_t * Cnaf, Int_t & Data, Bool_t D16Flag = kFALSE);
Bool_t ExecCnaf(Int_t Crate, Int_t Station, Int_t Subaddr, Int_t Function, Int_t & Data, Bool_t D16Flag = kFALSE);
Bool_t ExecCnaf(TMrbEsoneCnaf & Cnaf, Bool_t D16Flag = kFALSE);
Int_t ExecCnafList(TObjArray & CnafList, Bool_t D16Flag = kFALSE);
Int_t AddressScan(const Char_t * Start, const Char_t * Stop, TArrayI & Data, TObjArray & Results, Bool_t D16Flag = kFALSE);
Int_t AddressScan(Int_t Crate, Int_t Start, Int_t Stop, Int_t Function, TArrayI & Data, TObjArray & Results, Bool_t D16Flag = kFALSE);
Int_t AddressScan(TMrbEsoneCnaf & Start, TMrbEsoneCnaf & Stop, TArrayI & Data, TObjArray & Results, Bool_t D16Flag = kFALSE);
Int_t BlockXfer(const Char_t * Cnaf, TArrayI & Data, Int_t Start = 0, Int_t NofWords = -1, Bool_t D16Flag = kFALSE, Bool_t QXfer = kFALSE);
Int_t BlockXfer(Int_t Crate, Int_t Station, Int_t Subaddr, Int_t Function, TArrayI & Data, Int_t Start = 0, Int_t NofWords = -1, Bool_t D16Flag = kFALSE, Bool_t QXfer = kFALSE);
Int_t BlockXfer(TMrbEsoneCnaf & Cnaf, TArrayI & Data, Int_t Start = 0, Int_t NofWords = -1, Bool_t D16Flag = kFALSE, Bool_t QXfer = kFALSE);
UInt_t GetStatus(Bool_t & XFlag, Bool_t & QFlag, Int_t & ErrorCode, TString & Error);
const Char_t * GetError(TString & Error);
TMrbNamedX * GetHost(UInt_t HostAddr);
TMrbNamedX * GetHost(const Char_t * HostName);
inline void SetOffline(Bool_t Offline = kTRUE) { fOffline = Offline; };
inline Bool_t IsOffline() { return(fOffline); };
inline void ClearStatus() { fStatus = 0; };
inline void SetX() { fStatus |= (UInt_t) kEsoneX; };
inline void SetQ() { fStatus |= (UInt_t) kEsoneQ; };
inline void SetXQ() { fStatus |= (UInt_t) (kEsoneQ|kEsoneX); };
inline void SetError() { fStatus |= (UInt_t) kEsoneError; };
inline Bool_t GetX() { return(IS_X(fStatus)); };
inline Bool_t GetQ() { return(IS_Q(fStatus)); };
inline Bool_t IsError() { return(IS_ERROR(fStatus)); };
inline TMrbNamedX * GetAction() { return(fAction); };
inline void SetAction(EMrbEsoneCamacAction Action) { fAction = fLofCamacActions.FindByIndex(Action); };
Bool_t HasBroadCast();
Bool_t HasBroadCast(Int_t & NsetMask, Int_t & NexecCmd);
Bool_t SetBroadCast(Int_t Crate, UInt_t BroadCast);
inline Bool_t ClearBroadCast(Int_t Crate) { return(this->SetBroadCast(Crate, 0)); };
Bool_t AddToBroadCast(Int_t Crate, Int_t Station);
Bool_t RemoveFromBroadCast(Int_t Crate, Int_t Station);
UInt_t GetBroadCast(Int_t Crate);
inline void UseBroadCast(Bool_t Flag) { fUseBroadCast = Flag; };
Bool_t HasFastCamac();
Bool_t SetAutoRead(Int_t Crate, Bool_t AutoRead = kTRUE);
Bool_t ReadDoubleWord(Int_t Crate, Bool_t ReadDW = kTRUE);
void Print(Option_t * Option) const { TObject::Print(Option); }
void Print(TMrbEsoneCnaf & Cnaf);
void Print(TObjArray & CnafList, Int_t From = 0, Int_t To = -1);
void PrintError(const Char_t * EsoneCall, const Char_t * Method);
void PrintStatus(const Char_t * Method);
Bool_t ReadFromFile(const Char_t * FileName) { return(kTRUE); };
inline const Char_t * GetServerName() { return(fServerType.GetName()); };
inline Int_t GetServerIndex() { return(fServerType.GetIndex()); };
inline Bool_t IsMarabouServer() { return(fServerType.GetIndex() == kES_MARABOU); };
inline Bool_t IsMbsServer() { return(fServerType.GetIndex() == kES_MBS); };
inline TSocket * GetSocket() { return(fSocket); };
inline const Char_t * GetControllerName() { return(fController.GetName()); };
inline Int_t GetControllerIndex() { return(fController.GetIndex()); };
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
inline void SetVerboseMode(Bool_t VerboseFlag = kTRUE) { fVerboseMode = VerboseFlag; };
inline Bool_t IsVerbose() { return(fVerboseMode); };
inline void Abort() { fAborted = kTRUE; };
inline Bool_t IsAborted() { return(fAborted); };
inline Bool_t IsConnected() { return(fHostAddr > 0); };
inline void SetSingleStep(Bool_t Flag = kTRUE) { fSingleStep = Flag; };
inline Bool_t IsSingleStep() { return(fSingleStep); };
public:
TMrbLofNamedX fLofCamacActions;
TMrbLofNamedX fLofCnafNames;
TMrbLofNamedX fLofCnafTypes;
TMrbLofNamedX fLofEsoneServers;
TMrbLofNamedX fLofControllers;
TMrbLofNamedX fLofCamacFunctions;
protected:
Bool_t StartMbsServer(const Char_t * HostName);
Bool_t StartMarabouServer(const Char_t * HostName);
Bool_t Reset(Bool_t Offline = kFALSE);
Bool_t CheckConnection(const Char_t * Method);
Bool_t CheckCrate(Int_t Crate, const Char_t * Method);
void PrintResults(const Char_t * Method, TMrbEsoneCnaf & Cnaf);
void PrintResults(const Char_t * Method, TObjArray & CnafList);
protected:
Bool_t EsoneCDREG(UInt_t & Handle, Int_t Crate, Int_t Station = 0, Int_t SubAddr = 0);
Bool_t EsoneCDREG(UInt_t & Handle, TMrbEsoneCnaf & Cnaf);
Bool_t EsoneCDCTRL();
Bool_t EsoneCCCC(Int_t Crate);
Bool_t EsoneCCOPEN(const Char_t * HostName, UInt_t & HostAddress);
Bool_t EsoneCCCI(Int_t Crate, Bool_t Inhibit = kTRUE);
Bool_t EsoneCTCI(Int_t Crate);
Bool_t EsoneCCCZ(Int_t Crate);
UInt_t EsoneCTSTAT();
Bool_t EsoneCXSA(TMrbEsoneCnaf & Cnaf, Bool_t D16Flag);
Int_t EsoneCXGA(TObjArray & CnafList, Bool_t D16Flag);
Int_t EsoneCXMAD(TMrbEsoneCnaf & Start, TMrbEsoneCnaf & Stop,
TArrayI & Data, TObjArray & Results, Bool_t D16Flag);
Int_t EsoneCXUBX(TMrbEsoneCnaf & Cnaf, TArrayI & Data, Int_t First, Int_t Last, Bool_t D16Flag, Bool_t QXfer);
Bool_t EsoneSpecial(EMrbEsoneCnafType Type, Int_t Crate, Int_t Station, Int_t Subaddr, Int_t Function, Int_t & Data, Bool_t D16Flag);
const Char_t * EsoneCERROR(TString & ErrMsg, Int_t ErrorCode, Bool_t DateFlag);
inline void SetCB(TArrayI & CB, Int_t Repeat = 0, Int_t Tally = 0, Int_t Lam = 0, Int_t DMA = 0) {
CB[0] = Repeat; CB[1] = Tally; CB[2] = Lam; CB[3] = DMA;
};
protected:
Bool_t fVerboseMode;
Bool_t fUseBroadCast;
Bool_t fOffline;
Bool_t fAborted;
Bool_t fSingleStep;
TMrbNamedX * fAction;
UInt_t fStatus;
TMrbNamedX fServerType;
TMrbNamedX fController;
TString fHost;
TString fHostInet;
Int_t fHostAddr;
TString fSetupPath;
TString fServerPath;
TString fServerProg;
TMrbC2Lynx * fLynxClient;
TSocket * fSocket;
Int_t fPort;
Int_t fNofCrates;
Int_t fCC32Base;
Int_t fBufferSize;
ClassDef(TMrbEsone, 1)
};
#endif