1 #ifndef GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
2 #define GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
14 #include "gcp/control/code/unix/libunix_src/specific/specificregs.h"
16 #include "Utilities/MuxXMLDatacard.h"
18 #include "gcp/util/common/RegMapDataFrameManager.h"
20 #include "gcp/util/common/Exception.h"
46 virtual void setTo(MuxReadout::MuxXMLFile *xml);
68 set(
unsigned int addr,
int value,
unsigned int boardNum) = 0;
71 set(
unsigned int addr,
double value,
unsigned int boardNum) = 0;
74 set(std::string name,
double value,
unsigned int boardNum) {};
77 set(std::string name, std::vector<double> &values,
78 unsigned int boardNum) {};
81 set(std::string name,
int value,
unsigned int boardNum) = 0;
84 set(std::string name, std::vector<int> &values,
85 unsigned int boardNum) {};
88 set(std::string name, std::string value,
89 unsigned int boardNum) = 0;
91 virtual void write() = 0;
97 unsigned int index1Size=0,
98 unsigned int index2Size=0,
99 unsigned int index3Size=0) :
100 frame_(frame), minMappedAddress_(0), index1Size_(index1Size),
101 index2Size_(index2Size), index3Size_(index3Size) {};
105 bool addMapped(
char* boardName,
char* regName)
107 RegMapBlock* regBlock = NULL;
109 regBlock = frame_->findReg(boardName, regName);
111 ReportError(
"Board" << boardName <<
" register "
112 << regName <<
" not found.");
115 if(regBlock != NULL) {
116 registers_.push_back(regBlock);
117 unsigned int maxIndex;
119 maxIndex = index3Size_ * index2Size_ * index1Size_;
120 }
else if (index2Size_) {
121 maxIndex = index2Size_ * index1Size_;
123 maxIndex = index1Size_;
126 std::vector<valueType>* buffPtr =
127 new std::vector<valueType>(maxIndex);
129 buffers_.push_back(buffPtr);
134 ReportError(
"Board " << boardName <<
" register "
135 << regName <<
" not found");
142 void add(
char* boardName,
char* regName)
144 if(addMapped(boardName, regName)) {
149 void add(
char* boardName,
char* regName,
unsigned int address)
151 if((addressToIndex_.find(address) != addressToIndex_.end())
152 || (address < minMappedAddress_)) {
153 ReportError(
"Duplicate register address " << regName
158 addressToIndex_[address] = registers_.size();
160 addMapped(boardName, regName);
163 void add(
char* boardName,
char* regName, std::string xmlTag)
165 if(xmlTagToIndex_.find(xmlTag) != xmlTagToIndex_.end()) {
166 ReportError(
"Duplicate register tag " << regName
171 xmlTagToIndex_[xmlTag] = registers_.size();
172 addMapped(boardName, regName);
175 void setResolved(
unsigned int registerNum, valueType value,
176 unsigned int index1=0,
unsigned int index2=0,
177 unsigned int index3=0)
179 if(registerNum >= buffers_.size()) {
180 ReportError(
"Register number " << registerNum
181 <<
" out of range ");
187 index = index1*index2Size_*index3Size_ +
188 index2*index3Size_ + index3;
189 }
else if(index2Size_) {
190 index = index1 * index2Size_ + index2;
195 (*
static_cast< std::vector<valueType>*
>(buffers_[registerNum]))[index] = value;
198 void set(
unsigned int registerNum, valueType value,
199 unsigned int index1=0,
200 unsigned int index2=0,
201 unsigned int index3=0)
203 if(registerNum >= minMappedAddress_) {
205 std::map<unsigned int, unsigned int>::iterator
206 indexIter = addressToIndex_.find(registerNum);
208 if(indexIter == addressToIndex_.end()) {
213 registerNum = indexIter->second;
215 setResolved(registerNum, value, index1, index2, index3);
218 typedef std::map<std::string, unsigned int> StringIntMap;
220 void set(std::string xmlTag, valueType value,
221 unsigned int index1=0,
unsigned int index2=0,
222 unsigned int index3=0)
224 StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
225 if(tagIter != xmlTagToIndex_.end()) {
226 setResolved(tagIter->second, value, index1, index2, index3);
230 void set(std::string xmlTag, std::vector<valueType> &values,
231 unsigned int index1=0,
unsigned int index2=0)
233 StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
234 if(tagIter != xmlTagToIndex_.end()) {
235 for(
int index = 0; index < values.size(); index++) {
236 setResolved(tagIter->second, values[index], index);
241 void set(std::string xmlTag, std::vector<int> &values)
243 StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
244 if(tagIter != xmlTagToIndex_.end()) {
245 for(
int index = 0; index < values.size(); index++) {
246 setResolved(tagIter->second, (valueType)values[index], index);
253 std::vector<void*>::iterator
254 bufIter = buffers_.begin();
256 std::vector<RegMapBlock*>::iterator
257 regIter = registers_.begin();
259 while(regIter != registers_.end()) {
260 frame_->writeRegNoLock(*regIter++, static_cast<valueType*>(&(*
static_cast< std::vector<valueType>*
>(*bufIter++))[0]));
268 unsigned int minMappedAddress_;
269 std::map<unsigned int, unsigned int>addressToIndex_;
270 StringIntMap xmlTagToIndex_;
271 std::vector<RegMapBlock*>registers_;
272 std::vector< void* >buffers_;
273 unsigned int index1Size_;
274 unsigned int index2Size_;
275 unsigned int index3Size_;
278 template<
class dataType>
280 char* boardName,
char* regName, std::string xmlTag,
281 std::string dataType) {
283 registers->add(boardName, regName, xmlTag);
291 name_(name), typeName_(typeName) {};
294 std::string typeName_;
297 std::vector<NamedRegister> namedRegisters_;
304 std::vector<std::string>& containerNames,
305 std::string addressVectorName,
306 std::string valueVectorName,
308 unsigned int boardNum);
318 #endif // End #ifndef GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
Definition: XMLDataFrameManager.h:287
virtual void setTo(MuxReadout::MuxXMLFile *xml)
Definition: XMLDataFrameManager.cc:56
void initialize(bool archivedOnly=false, gcp::util::DataFrame *frame=0)
Definition: XMLDataFrameManager.cc:27
void reinitialize()
Definition: XMLDataFrameManager.cc:66
Definition: DataFrame.h:27
XMLDataFrameManager(XMLDataFrameManager &fm)
Definition: XMLDataFrameManager.cc:38
DataFrame * frame()
Definition: DataFrameManager.cc:384
void getRegisters(MuxReadout::MuxXMLFile *xml, std::vector< std::string > &containerNames, std::string addressVectorName, std::string valueVectorName, XMLRegisterMap &lookup, unsigned int boardNum)
Definition: XMLDataFrameManager.cc:82
Definition: XMLDataFrameManager.h:30
RegMapDataFrameManager(std::string regmap, bool archivedOnly=false)
Definition: RegMapDataFrameManager.h:26
virtual ~XMLDataFrameManager()
Definition: XMLDataFrameManager.cc:61
Definition: XMLDataFrameManager.h:93
Definition: XMLDataFrameManager.h:64