00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "FadcReadoutFormat/FadcReadout.h"
00010
00011 #include "DaqReadoutFormat/ByteBuffer.h"
00012 #include "FadcReadoutFormat/FadcFoot.h"
00013 #include "FadcReadoutFormat/FadcHead.h"
00014 #include "FadcReadoutFormat/FadcData.h"
00015 #include "FadcReadoutFormat/FadcTraits.h"
00016
00017 using DybDaq::DaqBuffer;
00018 using DybDaq::DaqContainer;
00019 using DybDaq::DaqTraits;
00020 using DybDaq::FadcFoot;
00021 using DybDaq::FadcHead;
00022 using DybDaq::FadcData;
00023 using DybDaq::FadcReadout;
00024
00025 FadcReadout::FadcReadout(const unsigned int triggerNumber,
00026 const unsigned int triggerType,
00027 const bool noData,
00028 const FadcTraits& traits) :
00029 DaqContainer(),
00030 m_head(new FadcHead(triggerNumber,
00031 triggerType,
00032 noData,
00033 traits)),
00034 m_data(0),
00035 m_foot(0) {
00036 }
00037
00038 FadcReadout::FadcReadout(const ByteBuffer& byteBuffer,
00039 const unsigned int bufferSize) :
00040 DaqContainer(byteBuffer,
00041 bufferSize),
00042 m_head(0),
00043 m_data(0),
00044 m_foot(0) {
00045 byteBuffer.position(byteBuffer.position() + (bufferSize * kBytesInInt));
00046 }
00047
00048 FadcReadout::~FadcReadout() {
00049 if (0 != m_foot) {
00050 delete m_foot;
00051 }
00052 if (0 != m_data) {
00053 FadcDataPtrList::const_iterator data;
00054 for (data = m_data->begin();
00055 data != m_data->end();
00056 ++data) {
00057 delete const_cast<FadcData*>(*data);
00058 }
00059 delete m_data;
00060 }
00061 if (0 != m_head) {
00062 delete m_head;
00063 }
00064 }
00065
00066 const DaqTraits& FadcReadout::daqTraits() const {
00067 return head().fadcTraits();
00068 }
00069
00070 const FadcHead& FadcReadout::head() const {
00071 if (0 == m_head && hasByteBuffer()) {
00072 const ByteBuffer& buffer = byteBuffer();
00073 const unsigned int originalPosition = buffer.position();
00074 buffer.position(begin());
00075 m_head = new FadcHead(buffer);
00076 buffer.position(originalPosition);
00077 }
00078 return *m_head;
00079 }
00080
00081 const FadcReadout::FadcDataPtrList& FadcReadout::fadcData() const {
00082 if (0 == m_data) {
00083 m_data = new FadcDataPtrList();
00084 if (hasByteBuffer()) {
00085 const FadcTraits& traits = head().fadcTraits();
00086 const ByteBuffer& buffer = byteBuffer();
00087
00088 const unsigned int originalPosition = buffer.position();
00089 buffer.position(begin() + (traits.headSize() * kBytesInInt));
00090 const unsigned int finished = (containerSize() - (traits.headSize() + traits.footSize())) / traits.dataSize();
00091 for (unsigned int count = 0;
00092 count != finished;
00093 ++count) {
00094 FadcData* data = new FadcData(buffer,
00095 traits);
00096 m_data->push_back(data);
00097 }
00098 buffer.position(originalPosition);
00099 }
00100 }
00101 return *m_data;
00102 }
00103
00104 const FadcFoot& FadcReadout::foot() const {
00105 if (0 == m_foot) {
00106 if (hasByteBuffer()) {
00107 const FadcTraits& traits = head().fadcTraits();
00108 const ByteBuffer& buffer = byteBuffer();
00109
00110 const unsigned int originalPosition = buffer.position();
00111 buffer.position(begin() + ((containerSize() - traits.footSize()) * kBytesInInt));
00112 m_foot = new FadcFoot(buffer,
00113 head().fadcTraits());
00114 buffer.position(originalPosition);
00115 } else {
00116 m_foot = new FadcFoot(head());
00117 }
00118 }
00119 return *m_foot;
00120 }
00121
00122 unsigned int FadcReadout::gatherRom(DaqBuffer::OutputBufferList& outputBuffers) const {
00123 return gather(outputBuffers);
00124 }
00125
00126 unsigned int FadcReadout::inspectRom(DaqBuffer::Bytes& inspectors) const {
00127 return inspect(inspectors);
00128 }
00129
00130 unsigned int FadcReadout::romSize() const {
00131 return bufferSize();
00132 }
00133
00134 unsigned int FadcReadout::gatherComponents(OutputBufferList& outputBuffers) const {
00135 unsigned int result = head().gather(outputBuffers);
00136 const FadcDataPtrList& data = fadcData();
00137 FadcDataPtrList::const_iterator entry;
00138 for (entry = data.begin();
00139 entry != data.end();
00140 ++entry) {
00141 result += (*entry)->gather(outputBuffers);
00142 }
00143
00144 result += foot().gather(outputBuffers);
00145 return result;
00146 }
00147
00148 unsigned int FadcReadout::inspectComponents(DaqBuffer::Bytes& inspectors) const {
00149 unsigned int result = head().inspect(inspectors);
00150 const FadcDataPtrList& data = fadcData();
00151 FadcDataPtrList::const_iterator entry;
00152 for (entry = data.begin();
00153 entry != data.end();
00154 ++entry) {
00155 result += (*entry)->inspect(inspectors);
00156 }
00157
00158 result += foot().inspect(inspectors);
00159 return result;
00160 }
00161
00162 unsigned int FadcReadout::bufferSize() const {
00163 unsigned int result = head().bufferSize();
00164 const FadcDataPtrList& data = fadcData();
00165 FadcDataPtrList::const_iterator entry;
00166 for (entry = data.begin();
00167 entry != data.end();
00168 ++entry) {
00169 result += (*entry)->bufferSize();
00170 }
00171 result += foot().bufferSize();
00172 return result;
00173 }
00174
00175 void FadcReadout::expanded(const unsigned int size) {
00176 FadcFoot& footToUse = foot();
00177 footToUse.setDataLength(footToUse.dataLength() + (size * kBytesInInt));
00178 notifyExpandable(size);
00179 }
00180
00181 bool FadcReadout::setRomExpandable(DaqExpandable& expandable) {
00182 return setExpandable(expandable);
00183 }
00184
00185 const FadcData& FadcReadout::addData(const unsigned int channel,
00186 const unsigned int highDataByte,
00187 const unsigned int middleDataByte,
00188 const unsigned int lowDataByte) {
00189 const FadcTraits& traits = head().fadcTraits();
00190 FadcData* result = new FadcData(channel,
00191 highDataByte,
00192 middleDataByte,
00193 lowDataByte,
00194 traits);
00195 return add(result);
00196 }
00197
00198 const FadcData& FadcReadout::add(const FadcData* data) {
00199 if (0 == m_data) {
00200 m_data = new FadcDataPtrList();
00201 }
00202 m_data->push_back(data);
00203 expanded(data->bufferSize());
00204 return *data;
00205 }
00206
00207 FadcFoot& FadcReadout::foot() {
00208 if (0 == m_foot) {
00209 m_foot = new FadcFoot(head());
00210 }
00211 return *m_foot;
00212 }
00213