00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "DaqReadoutFormat/DaqBuffer.h"
00010
00011 #include "DaqReadoutFormat/BitsDefinition.h"
00012 #include "DaqReadoutFormat/BitsInspector.h"
00013 #include "DaqReadoutFormat/ByteBuffer.h"
00014 #include "DaqReadoutFormat/ByteInspector.h"
00015 #include "DaqReadoutFormat/DaqTraits.h"
00016
00017 using DybDaq::ByteBuffer;
00018 using DybDaq::ByteInspector;
00019 using DybDaq::DaqTraits;
00020 using DybDaq::DaqBuffer;
00021
00022 const unsigned int DaqBuffer::kBytesInInt = 4;
00023 const unsigned int DaqBuffer::kUndefinedFormatComponent = 0xffffffff;
00024
00025
00026 DaqBuffer::DaqBuffer(const DaqBuffer& buffer) :
00027 m_byteBuffer(&(buffer.byteBuffer())),
00028 m_buffer(buffer.byteBuffer().grab()),
00029 m_traits(&(buffer.daqTraits())) {
00030
00031 }
00032
00033 DaqBuffer::DaqBuffer(char* buffer,
00034 const DaqTraits& traits,
00035 const unsigned int size) :
00036 m_byteBuffer(0),
00037 m_buffer(buffer),
00038 m_traits(&traits) {
00039 const unsigned int finished = size * kBytesInInt;
00040 for (unsigned int element = 0;
00041 finished != element;
00042 ++element) {
00043 buffer[element] = 0;
00044 }
00045 }
00046
00047 DaqBuffer::DaqBuffer(const ByteBuffer& byteBuffer,
00048 const DaqTraits& traits) :
00049 m_byteBuffer(&byteBuffer),
00050 m_buffer(byteBuffer.grab()),
00051 m_traits(&traits) {
00052 }
00053
00054 DaqBuffer::~DaqBuffer() {
00055 if (0 == m_byteBuffer) {
00056 delete [] m_buffer;
00057 } else {
00058 m_byteBuffer->release();
00059 }
00060 }
00061
00062 bool DaqBuffer::hasDaqTraits() const {
00063 return 0 != &daqTraits();
00064 }
00065
00066 const DaqTraits& DaqBuffer::daqTraits() const {
00067 return *m_traits;
00068 }
00069
00070 const char* DaqBuffer::buffer() const {
00071 return m_buffer;
00072 }
00073
00074 bool DaqBuffer::hasByteBuffer() const {
00075 return 0 != m_byteBuffer;
00076 }
00077
00078 const ByteBuffer& DaqBuffer::byteBuffer() const {
00079 return *m_byteBuffer;
00080 }
00081
00082 bool DaqBuffer::readBool(const unsigned int field) const {
00083 unsigned int fourBytes = readUnsignedInt(field);
00084 return 0 != fourBytes;
00085 }
00086
00087 int DaqBuffer::readInt(const unsigned int field) const {
00088 unsigned int fourBytes = readUnsignedInt(field);
00089 return *(int*)(&fourBytes);
00090 }
00091
00092 unsigned char DaqBuffer::readUnsignedChar(const unsigned int field) const {
00093 unsigned int fourBytes = readUnsignedInt(field);
00094 return *(unsigned char*)(&fourBytes);
00095 }
00096
00097 unsigned int DaqBuffer::readUnsignedInt(const unsigned int field) const {
00098 const DaqTraits& traits = daqTraits();
00099 unsigned int index = traits.index(field);
00100 if (index == traits.illegalField()) {
00101 return 0;
00102 }
00103 const unsigned int fourBytes = *(((unsigned int*)m_buffer) + index);
00104 return (fourBytes >> traits.shift(field)) & traits.mask(field);
00105 }
00106
00107 unsigned int DaqBuffer::gather(OutputBufferList& outputBuffers) const {
00108 const unsigned int result = bufferSize() * kBytesInInt;
00109 outputBuffers.push_back(OutputBuffer(m_buffer,
00110 result));
00111 return result;
00112 }
00113
00114 unsigned int DaqBuffer::inspect(DaqBuffer::Bytes& inspectors) const {
00115 const unsigned int component = formatComponent();
00116 unsigned int cursor = 0;
00117 const unsigned int size = bufferSize();
00118 if (kUndefinedFormatComponent == component) {
00119 if (0 != size) {
00120 inspectors.push_back(new ByteInspector(*(((unsigned int*)m_buffer) + cursor),
00121 0));
00122 }
00123 } else {
00124 cursor = fillInspectors(inspectors,
00125 component,
00126 cursor);
00127 }
00128 while ((size - cursor) > 1) {
00129 ++cursor;
00130 inspectors.push_back(new ByteInspector(*(((unsigned int*)m_buffer) + cursor),
00131 0));
00132 }
00133 return cursor + 1;
00134 }
00135
00136 unsigned int DaqBuffer::fillInspectors(DaqBuffer::Bytes& inspectors,
00137 unsigned int component,
00138 unsigned int cursor) const {
00139 const DybDaq::DaqTraits::Definitions& definitions = daqTraits().bitsDefinitions(component);
00140 ByteInspector::Bits* bitsInByte = 0;
00141 const DybDaq::DaqTraits::Definitions::const_iterator finished = definitions.end();
00142 for (DybDaq::DaqTraits::Definitions::const_iterator definition = definitions.begin();
00143 finished != definition;
00144 ++definition) {
00145 const DybDaq::BitsDefinition& bits = *definition;
00146 if (0 == bitsInByte || (bits.offset() != cursor)) {
00147 if (0 == bitsInByte && (cursor != bits.offset())) {
00148 inspectors.push_back(new ByteInspector(*(((unsigned int*)m_buffer) + cursor),
00149 0));
00150 }
00151 while (((bits.offset() - cursor) > 1)) {
00152 ++cursor;
00153 inspectors.push_back(new ByteInspector(*(((unsigned int*)m_buffer) + cursor),
00154 0));
00155 }
00156 bitsInByte = new ByteInspector::Bits();
00157 cursor = bits.offset();
00158 inspectors.push_back(new ByteInspector(*(((unsigned int*)m_buffer) + bits.offset()),
00159 bitsInByte));
00160 }
00161 DybDaq::BitsInspector* bitInfo = new BitsInspector(readUnsignedInt(bits.field()),
00162 bits);
00163 bitsInByte->push_back(bitInfo);
00164 }
00165 return cursor;
00166 }
00167
00168 char* DaqBuffer::buffer() {
00169 return const_cast<char*>(m_buffer);
00170 }
00171
00172 void DaqBuffer::writeField(const bool value,
00173 const unsigned int field) {
00174 const DaqTraits& traits = daqTraits();
00175 unsigned int index = traits.index(field);
00176 if (index == traits.illegalField()) {
00177 return;
00178 }
00179 const unsigned int mask = traits.mask(field);
00180 const unsigned int cleared = (*(((unsigned int*)m_buffer) + index)) & (~mask);
00181 if (value) {
00182 *(((unsigned int*)m_buffer) + index) = cleared | mask;
00183 }
00184 }
00185
00186 void DaqBuffer::writeField(const int value,
00187 const unsigned int field) {
00188 const DaqTraits& traits = daqTraits();
00189 unsigned int index = traits.index(field);
00190 if (index == traits.illegalField()) {
00191 return;
00192 }
00193 const unsigned int shift = traits.shift(field);
00194 const unsigned int mask = traits.mask(field) << shift;
00195 unsigned int* location = (((unsigned int*)m_buffer) + index);
00196 const unsigned int cleared = (*location) & (~mask);
00197 *location = cleared | ((value << shift) & mask);
00198 }
00199
00200 void DaqBuffer::writeField(const unsigned int value,
00201 const unsigned int field) {
00202 const DaqTraits& traits = daqTraits();
00203 unsigned int index = traits.index(field);
00204 if (index == traits.illegalField()) {
00205 return;
00206 }
00207 const unsigned int shift = traits.shift(field);
00208 const unsigned int mask = traits.mask(field) << shift;
00209 unsigned int* location = (((unsigned int*)m_buffer) + index);
00210 const unsigned int cleared = (*location) & (~mask);
00211 *location = cleared | ((value << shift) & mask);
00212 }
00213
00214 unsigned int DaqBuffer::formatComponent() const {
00215 return kUndefinedFormatComponent;
00216 }