#ifndef __TMrbEsoneCnaf_h__
#define __TMrbEsoneCnaf_h__
#include "TSystem.h"
#include "TString.h"
#include "TArrayI.h"
#include "TArrayL.h"
#include "TMrbString.h"
#include "TMrbEsoneCommon.h"
class TMrbEsoneCnaf : public TObject {
public:
enum EMrbEsoneCnaf { kCnafBranch = BIT(0),
kCnafCrate = BIT(1),
kCnafStation = BIT(2),
kCnafAddr = BIT(3),
kCnafFunction = BIT(4),
kCnafData = BIT(5),
kCnafQ = BIT(6),
kCnafX = BIT(7)
};
enum { kEsoneCnafBits = kCnafCrate | kCnafStation | kCnafAddr | kCnafFunction | kCnafData };
public:
TMrbEsoneCnaf() { Reset(); };
~TMrbEsoneCnaf() {};
Bool_t Ascii2Int(const Char_t * Cnaf);
const Char_t * Int2Ascii(Bool_t DataFlag = kTRUE);
Bool_t Set(Int_t Crate, Int_t Station = -1, Int_t Subaddr = -1, Int_t Function = -1, Int_t Data = kEsoneNoData);
Bool_t SetC(Int_t Crate);
Bool_t SetN(Int_t Station);
Bool_t SetA(Int_t Addr);
Bool_t SetF(Int_t Function);
Bool_t SetData(Int_t Data, EMrbEsoneCnafType Type = kCnafTypeUndefined);
inline void ClearStatus() { fStatus = 0; };
Bool_t ClearData(EMrbEsoneCnafType Type = kCnafTypeUndefined);
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 Int_t GetC() { return(fCrate); };
inline Int_t GetN() { return(fStation); };
inline Int_t GetA() { return(fAddr); };
inline Int_t GetF() { return(fFunction); };
Int_t GetData(EMrbEsoneCnafType Type = kCnafTypeUndefined);
Bool_t GetData(Int_t & DataRead, Int_t & DataWrite);
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 EMrbEsoneCnafType GetType() { return(fType); };
inline EMrbEsoneCamacAction GetAction() { return(fAction); };
inline void SetAction(EMrbEsoneCamacAction Action) { fAction = Action; };
inline void Help() { gSystem->Exec(Form("mrbHelp %s", this->ClassName())); };
void Reset();
Bool_t CheckCnaf(UInt_t CnafBits = kEsoneCnafBits);
Bool_t CheckCnaf(UInt_t CnafBit, Int_t Data);
inline Bool_t IsWrite() { return(fType == kCnafTypeWrite); };
inline Bool_t IsRead() { return(fType == kCnafTypeRead); };
inline Bool_t IsControl() { return(fType == kCnafTypeControl); };
inline Bool_t IsReadStatus() { return(fType == kCnafTypeReadStatus); };
protected:
TMrbString fAscii;
Int_t fCrate;
Int_t fStation;
Int_t fAddr;
Int_t fFunction;
Int_t fDataRead;
Int_t fDataWrite;
UInt_t fStatus;
EMrbEsoneCamacAction fAction;
EMrbEsoneCnafType fType;
ClassDef(TMrbEsoneCnaf, 1)
};
#endif