/* -*- mode: c++ -*- */
#ifndef __RCB_8047_CORBO__
#define __RCB_8047_CORBO_
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iosfwd>
#include <daq/VMEmanager.h>
template<class T>
class Reg
{
protected:
VMEmanager *vme;
unsigned long addr;
T v;
virtual void write() = 0;
virtual T read() = 0;
public:
typedef T type;
Reg(unsigned long ad = 0, bool doRead = true) : addr(ad)
{
vme = VMEmanager::VME();
SetAddress(ad, doRead);
}
virtual ~Reg()
{}
virtual Reg &Set(T x)
{
if (addr)
{
v = x;
write();
}
return *this;
}
virtual T Get()
{
if (addr)
v = read();
return v;
}
T operator()()
{
return Get();
}
unsigned long GetAddress()
{
return addr;
}
void SetAddress(unsigned long ad, bool doRead = true)
{
addr = ad;
if (addr && doRead)
Get();
}
};
class CharReg : public Reg<unsigned char>
{
protected:
void write();
type read();
public:
CharReg(unsigned long ad = 0, bool doRead = true)
: Reg<unsigned char>(ad, doRead)
{}
};
class ShortReg : public Reg<unsigned short>
{
protected:
void write();
type read();
public:
ShortReg(unsigned long ad = 0, bool doRead = true)
: Reg<unsigned short>(ad, doRead)
{}
};
class LongReg : public Reg<unsigned long>
{
protected:
void write();
type read();
public:
LongReg(unsigned long ad = 0) : Reg<unsigned long>(ad)
{}
};
class EvtReg : public LongReg
{
private:
unsigned long ival;
public:
EvtReg(unsigned long ad = 0) : LongReg(ad)
{
ival = LongReg::Get();
}
unsigned long Get()
{
return LongReg::Get() - ival;
}
Reg<unsigned long> &Set(unsigned long x)
{
LongReg::Set(x);
ival = LongReg::Get();
return *this;
}
};
class CSR : public ShortReg
{
public:
CSR(unsigned long ad = 0) : ShortReg(ad)
{ }
CSR &ChnEna(unsigned int x);
CSR &BusyMode(unsigned int x);
CSR &InpSel(unsigned int x);
CSR &BusyOut(unsigned int x);
CSR &CntSel(unsigned int x);
CSR &FastClr(unsigned int x);
CSR &PushEna(unsigned int x);
unsigned int ChnEna();
unsigned int BusyMode();
unsigned int InpSel();
unsigned int BusyOut();
unsigned int CntSel();
unsigned int FastClr();
unsigned int PushEna();
unsigned int InpState();
unsigned int LclBusy ();
unsigned int DifBusy();
unsigned int IntPend();
};
//---------------------------------------------------------------------
// Structure for the BIMCR register
//---------------------------------------------------------------------
class BIMCR : public CharReg
{
public:
BIMCR(unsigned long ad = 0) : CharReg(ad)
{}
BIMCR &IRQ(unsigned int x) ;
BIMCR &IRAC(unsigned int x) ;
BIMCR &IRE(unsigned int x) ;
BIMCR &XIN(unsigned int x) ;
BIMCR &FAC(unsigned int x) ;
BIMCR &F(unsigned int x) ;
unsigned int IRQ() ;
unsigned int IRAC();
unsigned int IRE() ;
unsigned int XIN() ;
unsigned int FAC() ;
unsigned int F () ;
};
class ROcntl
{
private:
unsigned long addr;
public:
CSR _csr[4];
EvtReg _evt[4];
ShortReg _dtim[4];
BIMCR _evcr[4];
CharReg _evvr[4];
BIMCR _tmcr[4];
CharReg _tmvr[4];
ShortReg _tst[4];
ShortReg _clr[4];
public:
ROcntl(unsigned long ad = 0) : addr(ad)
{
SetAddress(ad);
}
void SetAddress(unsigned long x);
unsigned long GetAddress()
{
return addr;
}
CSR &csr(int i)
{
return _csr[i];
}
LongReg &evtnum(int i)
{
return _evt[i];
}
ShortReg &dtim(int i)
{
return _dtim[i];
}
BIMCR &evcr(int i)
{
return _evcr[i];
}
CharReg &evvr(int i)
{
return _evvr[i];
}
BIMCR &tmcr(int i)
{
return _tmcr[i];
}
CharReg &tmvr(int i)
{
return _tmvr[i];
}
ShortReg &test(int i)
{
return _tst[i];
}
ShortReg &clr(int i)
{
return _clr[i];
}
void Dump();
};
#endif