| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

DaqBuffer.cc

Go to the documentation of this file.
00001 /*
00002  *  DaqBuffer.cc
00003  *  DaqReadutFormat
00004  *
00005  *  Created by Simon Patton on 7/20/10.
00006  *  Copyright 2010 DayaBay Collaboration. All rights reserved.
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     // Currently assumes a ByteBuffer based DaqBuffer is being copied.
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 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:07:43 2011 for DaqReadoutFormat by doxygen 1.4.7