My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
XMLDataFrameManager.h
Go to the documentation of this file.
1 #ifndef GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
2 #define GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
3 
12 // C header files from the array control code
13 
14 #include "gcp/control/code/unix/libunix_src/specific/specificregs.h"
15 
16 #include "Utilities/MuxXMLDatacard.h"
17 
18 #include "gcp/util/common/RegMapDataFrameManager.h"
19 
20 #include "gcp/util/common/Exception.h"
21 
22 #include <map>
23 #include <vector>
24 
25 namespace gcp {
26  namespace receiver {
27 
28  class DataFrame;
29 
32 
33  public:
34 
39 
43  XMLDataFrameManager(bool archivedOnly=false);
44 
45 
46  virtual void setTo(MuxReadout::MuxXMLFile *xml);
47 
51  virtual ~XMLDataFrameManager();
52 
56  void initialize(bool archivedOnly=false,
58 
62  void reinitialize();
63 
65  public:
66 
67  virtual void
68  set(unsigned int addr, int value, unsigned int boardNum) = 0;
69 
70  virtual void
71  set(unsigned int addr, double value, unsigned int boardNum) = 0;
72 
73  virtual void
74  set(std::string name, double value, unsigned int boardNum) {};
75 
76  virtual void
77  set(std::string name, std::vector<double> &values,
78  unsigned int boardNum) {};
79 
80  virtual void
81  set(std::string name, int value, unsigned int boardNum) = 0;
82 
83  virtual void
84  set(std::string name, std::vector<int> &values,
85  unsigned int boardNum) {};
86 
87  virtual void
88  set(std::string name, std::string value,
89  unsigned int boardNum) = 0;
90 
91  virtual void write() = 0;
92 
93  template <class valueType> class RegisterList {
94  public:
95 
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) {};
102 
103  private:
104 
105  bool addMapped(char* boardName, char* regName)
106  {
107  RegMapBlock* regBlock = NULL;
108  try {
109  regBlock = frame_->findReg(boardName, regName);
110  } catch (...) {
111  ReportError("Board" << boardName << " register "
112  << regName << " not found.");
113  }
114 
115  if(regBlock != NULL) {
116  registers_.push_back(regBlock);
117  unsigned int maxIndex;
118  if(index3Size_) {
119  maxIndex = index3Size_ * index2Size_ * index1Size_;
120  } else if (index2Size_) {
121  maxIndex = index2Size_ * index1Size_;
122  } else {
123  maxIndex = index1Size_;
124  }
125 
126  std::vector<valueType>* buffPtr =
127  new std::vector<valueType>(maxIndex);
128 
129  buffers_.push_back(buffPtr);
130 
131  return true;
132 
133  } else {
134  ReportError("Board " << boardName << " register "
135  << regName << " not found");
136  return false;
137  }
138  }
139 
140  public:
141 
142  void add(char* boardName, char* regName)
143  {
144  if(addMapped(boardName, regName)) {
145  minMappedAddress_++;
146  }
147  }
148 
149  void add(char* boardName, char* regName, unsigned int address)
150  {
151  if((addressToIndex_.find(address) != addressToIndex_.end())
152  || (address < minMappedAddress_)) {
153  ReportError("Duplicate register address " << regName
154  << " " << address);
155  return;
156  }
157 
158  addressToIndex_[address] = registers_.size();
159 
160  addMapped(boardName, regName);
161  }
162 
163  void add(char* boardName, char* regName, std::string xmlTag)
164  {
165  if(xmlTagToIndex_.find(xmlTag) != xmlTagToIndex_.end()) {
166  ReportError("Duplicate register tag " << regName
167  << " " << xmlTag);
168  return;
169  }
170 
171  xmlTagToIndex_[xmlTag] = registers_.size();
172  addMapped(boardName, regName);
173  }
174 
175  void setResolved(unsigned int registerNum, valueType value,
176  unsigned int index1=0, unsigned int index2=0,
177  unsigned int index3=0)
178  {
179  if(registerNum >= buffers_.size()) {
180  ReportError("Register number " << registerNum
181  << " out of range ");
182  return;
183  }
184 
185  unsigned int index;
186  if(index3Size_) {
187  index = index1*index2Size_*index3Size_ +
188  index2*index3Size_ + index3;
189  } else if(index2Size_) {
190  index = index1 * index2Size_ + index2;
191  } else {
192  index = index1;
193  }
194 
195  (*static_cast< std::vector<valueType>* >(buffers_[registerNum]))[index] = value;
196  };
197 
198  void set(unsigned int registerNum, valueType value,
199  unsigned int index1=0,
200  unsigned int index2=0,
201  unsigned int index3=0)
202  {
203  if(registerNum >= minMappedAddress_) {
204 
205  std::map<unsigned int, unsigned int>::iterator
206  indexIter = addressToIndex_.find(registerNum);
207 
208  if(indexIter == addressToIndex_.end()) {
209  // ReportError("Register number " << registerNum
210  // << " not defined");
211  return;
212  }
213  registerNum = indexIter->second;
214  }
215  setResolved(registerNum, value, index1, index2, index3);
216  }
217 
218  typedef std::map<std::string, unsigned int> StringIntMap;
219 
220  void set(std::string xmlTag, valueType value,
221  unsigned int index1=0, unsigned int index2=0,
222  unsigned int index3=0)
223  {
224  StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
225  if(tagIter != xmlTagToIndex_.end()) {
226  setResolved(tagIter->second, value, index1, index2, index3);
227  }
228  }
229 
230  void set(std::string xmlTag, std::vector<valueType> &values,
231  unsigned int index1=0, unsigned int index2=0)
232  {
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);
237  }
238  }
239  }
240 
241  void set(std::string xmlTag, std::vector<int> &values)
242  {
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);
247  }
248  }
249  }
250 
251  void write()
252  {
253  std::vector<void*>::iterator
254  bufIter = buffers_.begin();
255 
256  std::vector<RegMapBlock*>::iterator
257  regIter = registers_.begin();
258 
259  while(regIter != registers_.end()) {
260  frame_->writeRegNoLock(*regIter++, static_cast<valueType*>(&(*static_cast< std::vector<valueType>* >(*bufIter++))[0]));
261  }
262 
263  }
264 
265  private:
266 
267  RegMapDataFrameManager* frame_;
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_;
276  }; // RegisterList
277 
278  template<class dataType>
279  void add(RegisterList<dataType>* registers,
280  char* boardName, char* regName, std::string xmlTag,
281  std::string dataType) {
282 
283  registers->add(boardName, regName, xmlTag);
284  namedRegisters_.push_back(NamedRegister(xmlTag, dataType));
285  }
286 
288  public:
289 
290  NamedRegister(std::string name, std::string typeName) :
291  name_(name), typeName_(typeName) {};
292 
293  std::string name_;
294  std::string typeName_;
295  };
296 
297  std::vector<NamedRegister> namedRegisters_;
298 
299  }; // XMLRegisterMap
300 
301  protected:
302 
303  void getRegisters(MuxReadout::MuxXMLFile* xml,
304  std::vector<std::string>& containerNames,
305  std::string addressVectorName,
306  std::string valueVectorName,
307  XMLRegisterMap& lookup,
308  unsigned int boardNum);
309 
310  }; // XMLDataFrameManager
311 
312  } // End namespace receiver
313 }; // End namespace gcp
314 
315 
316 
317 
318 #endif // End #ifndef GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
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:64