00001 /* 00002 * DaqTraits.cc 00003 * DaqReadoutFormat 00004 * 00005 * Created by Simon Patton on 7/21/10. 00006 * Copyright 2010 DayaBay Collaboration. All rights reserved. 00007 * 00008 */ 00009 00010 #include "DaqReadoutFormat/DaqTraits.h" 00011 00012 #include "DaqReadoutFormat/BitsDefinition.h" 00013 00014 using DybDaq::BitsDefinition; 00015 using DybDaq::DaqTraits; 00016 using std::string; 00017 00018 DaqTraits::DaqTraits() { 00019 } 00020 00021 DaqTraits::~DaqTraits() { 00022 } 00023 00024 unsigned int DaqTraits::readUnsignedInt(const char*& buffer, 00025 const DaqTraits& traits, 00026 unsigned int field) { 00027 unsigned int index = traits.index(field); 00028 if (index == traits.illegalField()) { 00029 return 0; 00030 } 00031 unsigned int fourBytes = *(((unsigned int*)buffer) + index); 00032 return (fourBytes >> traits.shift(field)) & traits.mask(field); 00033 } 00034 00035 unsigned int DaqTraits::marker(unsigned int marker) const { 00036 if (marker >= markersEnd()) { 00037 return illegalMarker(); 00038 } 00039 return markers()[marker]; 00040 } 00041 00042 unsigned int DaqTraits::index(unsigned int field) const { 00043 if (field >= fieldsEnd()) { 00044 return illegalField(); 00045 } 00046 return indices()[field]; 00047 } 00048 00049 unsigned int DaqTraits::shift(unsigned int field) const { 00050 if (field >= fieldsEnd()) { 00051 return 0; 00052 } 00053 return shifts()[field]; 00054 } 00055 00056 unsigned int DaqTraits::mask(unsigned int field) const { 00057 if (field >= fieldsEnd()) { 00058 return 0; 00059 } 00060 return masks()[field]; 00061 } 00062 00063 const char* DaqTraits::boolAsString(bool value) const { 00064 if (value) { 00065 return "yes"; 00066 } 00067 return "no"; 00068 } 00069 00070 DaqTraits::Definitions* DaqTraits::definitions(unsigned int /* component */) const { 00071 return 0; 00072 } 00073 00074 void DaqTraits::setDefinitions(DaqTraits::Definitions* /* definitions */, 00075 unsigned int /* component */) { 00076 } 00077 00078 const unsigned int* DaqTraits::componentFields(unsigned int /* component */) const { 00079 return 0; 00080 } 00081 00082 const unsigned int DaqTraits::componentFieldsEnd(unsigned int /* component */) const { 00083 return 0; 00084 } 00085 00086 const string* DaqTraits::descriptions() const { 00087 return 0; 00088 } 00089 00090 const DaqTraits::Definitions& DaqTraits::bitsDefinitions(unsigned int component) const { 00091 DaqTraits::Definitions* componentDefinitions = definitions(component); 00092 if (0 == componentDefinitions) { 00093 componentDefinitions = new DaqTraits::Definitions(); 00094 const unsigned int* fieldIndices = componentFields(component); 00095 const unsigned int finished = componentFieldsEnd(component); 00096 for (unsigned int index = 0; 00097 finished != index; 00098 ++index) { 00099 const unsigned int field = fieldIndices[index]; 00100 unsigned int shift = shifts()[field]; 00101 const unsigned int mask = masks()[field]; 00102 unsigned int count = 0; 00103 unsigned int bit = 1; 00104 if (0 != mask) { 00105 if (0 == (bit & mask)) { 00106 // Assumes it is binary 00107 while (32 > count && (0 == (bit & mask)) ) { 00108 bit <<= 1; 00109 ++count; 00110 } 00111 shift = count - 1; 00112 count = 1; 00113 } else { 00114 while (32 > count && (0 != (bit & mask)) ) { 00115 bit <<= 1; 00116 ++count; 00117 } 00118 } 00119 } 00120 componentDefinitions->push_back(BitsDefinition(field, 00121 indices()[field], 00122 shift, 00123 count, 00124 descriptions()[field])); 00125 } 00126 const_cast<DaqTraits*>(this)->setDefinitions(componentDefinitions, 00127 component); 00128 } 00129 return *componentDefinitions; 00130 }