00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "CbltReadoutFormat/CbltBody.h"
00010
00011 #include "CbltReadoutFormat/CbltTraits.h"
00012 #include "DaqReadoutFormat/ByteBuffer.h"
00013 #include "DaqReadoutFormat/RomData.h"
00014 #include "FadcReadoutFormat/FadcReadout.h"
00015 #include "FeeReadoutFormat/FeeReadout.h"
00016 #include "LtbReadoutFormat/LtbReadout.h"
00017 #include "FecReadoutFormat/FecReadout.h"
00018 #include "RtmReadoutFormat/RtmReadout.h"
00019
00020 using DybDaq::ByteBuffer;
00021 using DybDaq::CbltBody;
00022 using DybDaq::CbltBuffer;
00023 using DybDaq::DaqBuffer;
00024 using DybDaq::FadcReadout;
00025 using DybDaq::FeeReadout;
00026 using DybDaq::LtbReadout;
00027 using DybDaq::FecReadout;
00028 using DybDaq::RtmReadout;
00029 using DybDaq::RomData;
00030
00031 CbltBody::CbltBody(const RomData* data,
00032 const unsigned int moduleType,
00033 DaqExpandable& expandable) :
00034 DaqContainer(expandable),
00035 m_data(data),
00036 m_moduleType(moduleType) {
00037 expandedByRomData(data);
00038 }
00039
00040 CbltBody::CbltBody(const ByteBuffer& byteBuffer,
00041 const unsigned int moduleType,
00042 const unsigned int bufferSize,
00043 const CbltTraits& traits) :
00044 DaqContainer(byteBuffer,
00045 traits,
00046 bufferSize),
00047 m_data(0),
00048 m_moduleType(moduleType) {
00049 byteBuffer.position(byteBuffer.position() + (bufferSize * kBytesInInt));
00050 }
00051
00052 CbltBody::~CbltBody() {
00053 if (0 != m_data) {
00054 delete m_data;
00055 }
00056 }
00057
00058 const RomData& CbltBody::data() const {
00059 if (0 == m_data && hasByteBuffer()) {
00060 const CbltTraits& traits = dynamic_cast<const CbltTraits&>(daqTraits());
00061 const ByteBuffer& buffer = byteBuffer();
00062
00063 const unsigned int originalPosition = buffer.position();
00064 buffer.position(begin());
00065 if (m_moduleType == traits.moduleType(CbltTraits::kFadcModule)) {
00066 m_data = new FadcReadout(buffer,
00067 containerSize());
00068 } else if (m_moduleType == traits.moduleType(CbltTraits::kFeeModule)) {
00069 m_data = new FeeReadout(buffer,
00070 containerSize());
00071 } else if (m_moduleType == traits.moduleType(CbltTraits::kLtbModule)) {
00072 m_data = new LtbReadout(buffer,
00073 containerSize());
00074 }
00075 else if ( m_moduleType == traits.moduleType(CbltTraits::kRpcRomModule)) {
00076 const unsigned int version = (traits.majorVersion() << 4) | traits.minorVersion();
00077 m_data = new FecReadout(buffer, containerSize(), version);
00078 }
00079 else if ( m_moduleType == traits.moduleType(CbltTraits::kRpcRtmModule)) {
00080 const unsigned int version = (traits.majorVersion() << 4) | traits.minorVersion();
00081 m_data = new RtmReadout(buffer, containerSize(), version);
00082 }
00083 buffer.position(originalPosition);
00084 }
00085 return *m_data;
00086 }
00087
00088 unsigned int CbltBody::bufferSize() const {
00089 return data().romSize();
00090 }
00091
00092 unsigned int CbltBody::gatherComponents(OutputBufferList& outputBuffers) const {
00093 return data().gatherRom(outputBuffers);
00094 }
00095
00096 unsigned int CbltBody::inspectComponents(DaqBuffer::Bytes& inspectors) const {
00097
00098 return data().inspectRom(inspectors);
00099 }
00100
00101 void CbltBody::expanded(const unsigned int size) {
00102 notifyExpandable(size);
00103 }