#ifndef __TMrbCaen_V879_h__
#define __TMrbCaen_V879_h__
namespace std {} using namespace std;
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>
#include "Rtypes.h"
#include "TSystem.h"
#include "TObject.h"
#include "TMrbVMEModule.h"
class TMrbVMEChannel;
class TMrbSubevent;
class TMrbCaen_V879 : public TMrbVMEModule {
public:
enum { kSegSize = 0x10000 };
enum { kAddrMod = 0x39 };
enum EMrbOffsets { kOffsOutput = 0x0,
kOffsFirmWare = 0x1000,
kOffsGeoAddr = 0x1002,
kOffsBitSet1 = 0x1006,
kOffsBitClear1 = 0x1008,
kOffsStatus1 = 0x100E,
kOffsControl1 = 0x1010,
kOffsAddrHigh = 0x1012,
kOffsAddrLow = 0x1014,
kOffsEvtTrig = 0x1020,
kOffsStatus2 = 0x1022,
kOffsEvtCntLow = 0x1024,
kOffsEvtCntHigh = 0x1026,
kOffsIncrEvt = 0x1028,
kOffsIncrOffs = 0x102A,
kOffsBitSet2 = 0x1032,
kOffsBitClear2 = 0x1034,
kOffsCrateSel = 0x103C,
kOffsTestEvtWrite = 0x103E,
kOffsEvtCntReset = 0x1040,
kOffsRangeSlope = 0x1060,
kOffsRangeOffset = 0x1062,
kOffsThresh = 0x1080
};
enum EMrbRegisters { kRegFirmWare,
kRegGeoAddr,
kRegBitSet1,
kRegBitClear1,
kRegStatus1,
kRegControl1,
kRegAddrHigh,
kRegAddrLow,
kRegEvtTrig,
kRegStatus2,
kRegEvtCntLow,
kRegEvtCntHigh,
kRegIncrEvt,
kRegIncrReg,
kRegBitSet2,
kRegBitClear2,
kRegCrateSel,
kRegTestEvtWrite,
kRegEvtCntReset,
kRegThresh
};
enum { kBitSet1SelAddrIntern = BIT(4) };
enum { kBitControl1ProgResetModule = BIT(4) };
enum { kBitSet2Offline = BIT(1),
kBitSet2OverRangeDis = BIT(3),
kBitSet2LowThreshDis = BIT(4),
kBitSet2SlideEna = BIT(7),
kBitSet2AutoIncrEna = BIT(11),
kBitSet2EmptyProgEna = BIT(12),
kBitSet2AllTrigEna = BIT(14)
};
public:
TMrbCaen_V879() {};
TMrbCaen_V879(const Char_t * ModuleName, UInt_t BaseAddr, Bool_t IsTac = kFALSE);
~TMrbCaen_V879() {};
Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbModuleTag TagIndex);
Bool_t MakeReadoutCode(ofstream & RdoStrm, TMrbConfig::EMrbModuleTag TagIndex, TMrbVMEChannel * Channel, Int_t Value = 0);
virtual inline const Char_t * GetMnemonic() const { return("caen_v879"); };
inline void SetFFMode(Bool_t FFFlag = kTRUE) { fFFMode = FFFlag; };
inline Bool_t IsFFMode() const { return(fFFMode); };
virtual Bool_t CheckSubeventType(TMrbSubevent * Subevent) const;
inline Bool_t HasRandomReadout() const { return(kFALSE); };
inline void SetFineThresh(Bool_t FineFlag = kTRUE) { fFineThresh = FineFlag; };
inline Bool_t HasFineThresh() const { return(fFineThresh); };
inline void SetZeroSuppression(Bool_t ZsFlag = kTRUE) { fZeroSuppression = ZsFlag; };
inline Bool_t HasZeroSuppression() const { return(fZeroSuppression); };
inline void SetOverRangeCheck(Bool_t OrFlag = kTRUE) { fOverRangeCheck = OrFlag; };
inline Bool_t HasOverRangeCheck() const { return(fOverRangeCheck); };
Bool_t SetRange(Int_t Slope, Int_t Offs);
inline Int_t GetRangeSlope() { return(fRangeSlope); };
inline Int_t GetRangeOffset() { return(fRangeOffset); };
virtual inline Bool_t HasPrivateCode() const { return(kTRUE); };
virtual inline const Char_t * GetPrivateCodeFile() const { return("Module_Caen_Vxxx"); };
inline Bool_t IsTac() { return(fIsTac); };
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
protected:
void DefineRegisters();
protected:
Bool_t fIsTac;
Bool_t fFFMode;
Bool_t fFineThresh;
Bool_t fZeroSuppression;
Bool_t fOverRangeCheck;
Int_t fRangeSlope;
Int_t fRangeOffset;
ClassDef(TMrbCaen_V879, 1)
};
#endif