#ifndef __TMrbCPTM_h__
#define __TMrbCPTM_h__
#include "TROOT.h"
#include "TNamed.h"
#include "TEnv.h"
#include "TArrayS.h"
#include "TMrbLofNamedX.h"
#include "TMrbEsone.h"
class TMrbCPTMEvent : public TObject {
public:
TMrbCPTMEvent() { this->Reset(); };
~TMrbCPTMEvent() {};
void Reset();
inline Long64_t GetTimeStamp() { return(fTimeStamp); };
inline Int_t GetTimeAux() { return(fTimeAux); };
Long64_t GetTimeStampAdjusted();
inline void SetTimeStamp(Long64_t * TsAddr) { fTimeStamp = *TsAddr; };
void SetTimeStamp(Int_t LowWord, Int_t MiddleWord, Int_t HighWord);
inline void SetTimeAux(Int_t TimeAux) { fTimeAux = TimeAux; };
inline UInt_t GetCounterT1() { return(fCounterT1); };
inline void SetCounterT1(UInt_t Counts) { fCounterT1 = Counts; };
inline UInt_t GetCounterT2() { return(fCounterT2); };
inline void SetCounterT2(UInt_t Counts) { fCounterT2 = Counts; };
inline UInt_t GetPattern() { return(fPattern); };
inline void SetPattern(UInt_t Pattern) { fPattern = Pattern; };
const Char_t * Pattern2Ascii(TString & PatStr);
void Print(Option_t * option) const { TObject::Print(option); };
void Print(ostream & Out = cout);
protected:
Long64_t fTimeStamp;
Long64_t fTimeStampAdjusted;
Int_t fTimeAux;
UInt_t fCounterT1;
UInt_t fCounterT2;
UInt_t fPattern;
ClassDef(TMrbCPTMEvent, 1)
};
class TMrbCPTM : public TNamed {
public:
enum { kMrbCptmMaxCodeSize = 128 * 1024 };
enum { kMrbCptmMultOffset = 100 };
enum { kMrbCptmMultThresh = 50 };
enum { kMrbCptmMilliVoltsPerMult = 200 };
enum { kMrbCptmMaxMult = 17 };
enum { kMrbCptmDacNoMult = 1 };
public:
TMrbCPTM(const Char_t * ModuleName = "CPTM") : TNamed(ModuleName, "Clock & Programmable Trigger Module") {};
TMrbCPTM( const Char_t * ModuleName,
const Char_t * HostName, Int_t Crate, Int_t Station);
TMrbCPTM( const Char_t * ModuleName,
const Char_t * HostName, const Char_t * CamacAddr);
~TMrbCPTM() {};
Bool_t SetGeDGG(Int_t Delay, Int_t Width);
Bool_t SetAuxDGG(Int_t Delay, Int_t Width);
Bool_t SetGeDelay(Int_t Delay);
Bool_t SetGeWidth(Int_t Width);
Bool_t SetAuxDelay(Int_t Delay);
Bool_t SetAuxWidth(Int_t Width);
Int_t GetGeDelay();
Int_t GetGeWidth();
Int_t GetAuxDelay();
Int_t GetAuxWidth();
Bool_t SetMask(Int_t Mask);
Bool_t SetMask(const Char_t * Mask);
Int_t GetMask();
Bool_t SetTimeWindowAux(Int_t Window);
Int_t GetTimeWindowAux();
Bool_t SetDac(Int_t DacNo, Int_t DacValue);
Int_t GetDac(Int_t DacNo);
inline Bool_t ClearDac(Int_t DacNo) { return(this->SetDac(DacNo, 0)); };
Bool_t SetMultiplicity(Int_t Mult);
Int_t GetMultiplicity();
Bool_t ResetRead();
Bool_t ResetWrite();
Bool_t ResetMemory();
Bool_t ResetDacs();
Bool_t ResetLAM();
Bool_t Reset();
Bool_t EnableSynch(Bool_t Reset = kFALSE);
Bool_t DownloadAlteraCode(const Char_t * CodeFile = "cptm.rbf");
Int_t GetReadAddr();
Int_t GetWriteAddr();
Int_t GetWordCount();
Int_t CheckWordCount(const Char_t * Method = "CheckWordCount");
Bool_t SaveSettings(const Char_t * SaveFile = "cptm.par");
Bool_t RestoreSettings(const Char_t * RestoreFile = "cptm.par");
void Print(Option_t * option) const { TObject::Print(option); };
void Print(ostream & Out = cout);
Bool_t PrintBuffer(ostream & Out = cout);
Bool_t Connect();
inline Bool_t IsConnected() { return(fCamac.IsConnected()); };
Bool_t CheckConnect(const Char_t * Method = "CheckConnect");
Bool_t SetCamacHost(const Char_t * HostName);
Bool_t SetCrate(Int_t Crate);
Bool_t SetStation(Int_t Station);
inline const Char_t * GetCamacHost() { return(fCamacHost); };
inline Int_t GetCrate() { return(fCrate); };
inline Int_t GetStation() { return(fStation); };
inline TMrbEsone * Camac() { return(&fCamac); };
Bool_t CheckValue(Int_t Value, Int_t MaxValue, const Char_t * ArgName = "Arg", const Char_t * Method = "CheckValue");
Int_t ReadNext();
Bool_t ReadEvent(TMrbCPTMEvent & Event);
protected:
Bool_t ReadAllDacs(TArrayI & DacBits);
Bool_t WriteAllDacs(TArrayI & DacBits);
const Char_t * ConvertMask(TString & Mask, Int_t MaskValue, Bool_t TextOnly = kFALSE);
protected:
TString fCamacHost;
Int_t fCrate;
Int_t fStation;
TMrbEsone fCamac;
ClassDef(TMrbCPTM, 1)
};
#endif