My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
XMLBoardDataFrameManager.h
Go to the documentation of this file.
1 #ifndef GCP_RECEIVER_XMLBOARDDATAFRAMEMANAGER_H
2 #define GCP_RECEIVER_XMLBOARDDATAFRAMEMANAGER_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/BoardDataFrameManager.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 
38  XMLBoardDataFrameManager(std::string regmap, std::string board,
39  bool archivedOnly=false);
40 
41 
42  virtual void setTo(MuxReadout::MuxXMLFile *xml);
43 
47  virtual ~XMLBoardDataFrameManager();
48 
50  public:
51 
52  virtual void
53  set(unsigned int addr, int value, unsigned int boardNum) = 0;
54 
55  virtual void
56  set(unsigned int addr, double value, unsigned int boardNum) = 0;
57 
58  virtual void
59  set(std::string name, double value, unsigned int boardNum) {};
60 
61  virtual void
62  set(std::string name, std::vector<double> &values,
63  unsigned int boardNum) {};
64 
65  virtual void
66  set(std::string name, int value, unsigned int boardNum) = 0;
67 
68  virtual void
69  set(std::string name, std::vector<int> &values,
70  unsigned int boardNum) {};
71 
72  virtual void
73  set(std::string name, std::string value,
74  unsigned int boardNum) = 0;
75 
76  virtual void write() = 0;
77 
78  template <class valueType> class RegisterList {
79  public:
80 
82  unsigned int index1Size=0,
83  unsigned int index2Size=0,
84  unsigned int index3Size=0) :
85  frame_(frame), minMappedAddress_(0), index1Size_(index1Size),
86  index2Size_(index2Size), index3Size_(index3Size) {};
87 
88  private:
89 
90  bool addMapped(char* regName)
91  {
92  RegMapBlock* regBlock = NULL;
93  try {
94  regBlock = frame_->getReg(regName);
95  } catch (...) {
96  ReportError("Register "
97  << regName << " not found.");
98  }
99 
100  if(regBlock != NULL) {
101  registers_.push_back(regBlock);
102  unsigned int maxIndex;
103  if(index3Size_) {
104  maxIndex = index3Size_ * index2Size_ * index1Size_;
105  } else if (index2Size_) {
106  maxIndex = index2Size_ * index1Size_;
107  } else {
108  maxIndex = index1Size_;
109  }
110 
111  std::vector<valueType>* buffPtr =
112  new std::vector<valueType>(maxIndex);
113 
114  buffers_.push_back(buffPtr);
115 
116  return true;
117 
118  } else {
119  ReportError(" register "
120  << regName << " not found");
121  return false;
122  }
123  }
124 
125  public:
126 
127  void add(char* regName)
128  {
129  if(addMapped(regName)) {
130  minMappedAddress_++;
131  }
132  }
133 
134  void add(char* regName, unsigned int address)
135  {
136  if((addressToIndex_.find(address) != addressToIndex_.end())
137  || (address < minMappedAddress_)) {
138  ReportError("Duplicate register address " << regName
139  << " " << address);
140  return;
141  }
142 
143  addressToIndex_[address] = registers_.size();
144 
145  addMapped(regName);
146  }
147 
148  void add(char* regName, std::string xmlTag)
149  {
150  if(xmlTagToIndex_.find(xmlTag) != xmlTagToIndex_.end()) {
151  ReportError("Duplicate register tag " << regName
152  << " " << xmlTag);
153  return;
154  }
155 
156  xmlTagToIndex_[xmlTag] = registers_.size();
157  addMapped(regName);
158  }
159 
160  void setResolved(unsigned int registerNum, valueType value,
161  unsigned int index1=0, unsigned int index2=0,
162  unsigned int index3=0)
163  {
164  if(registerNum >= buffers_.size()) {
165  ReportError("Register number " << registerNum
166  << " out of range ");
167  return;
168  }
169 
170  unsigned int index;
171  if(index3Size_) {
172  index = index1*index2Size_*index3Size_ +
173  index2*index3Size_ + index3;
174  } else if(index2Size_) {
175  index = index1 * index2Size_ + index2;
176  } else {
177  index = index1;
178  }
179 
180  (*static_cast< std::vector<valueType>* >(buffers_[registerNum]))[index] = value;
181  };
182 
183  void set(unsigned int registerNum, valueType value,
184  unsigned int index1=0,
185  unsigned int index2=0,
186  unsigned int index3=0)
187  {
188  if(registerNum >= minMappedAddress_) {
189 
190  std::map<unsigned int, unsigned int>::iterator
191  indexIter = addressToIndex_.find(registerNum);
192 
193  if(indexIter == addressToIndex_.end()) {
194  // ReportError("Register number " << registerNum
195  // << " not defined");
196  return;
197  }
198  registerNum = indexIter->second;
199  }
200  setResolved(registerNum, value, index1, index2, index3);
201  }
202 
203  typedef std::map<std::string, unsigned int> StringIntMap;
204 
205  void set(std::string xmlTag, valueType value,
206  unsigned int index1=0, unsigned int index2=0,
207  unsigned int index3=0)
208  {
209  StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
210  if(tagIter != xmlTagToIndex_.end()) {
211  setResolved(tagIter->second, value, index1, index2, index3);
212  }
213  }
214 
215  void set(std::string xmlTag, std::vector<valueType> &values,
216  unsigned int index1=0, unsigned int index2=0)
217  {
218  StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
219  if(tagIter != xmlTagToIndex_.end()) {
220  for(int index = 0; index < values.size(); index++) {
221  setResolved(tagIter->second, values[index], index);
222  }
223  }
224  }
225 
226  void set(std::string xmlTag, std::vector<int> &values)
227  {
228  StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
229  if(tagIter != xmlTagToIndex_.end()) {
230  for(int index = 0; index < values.size(); index++) {
231  setResolved(tagIter->second, (valueType)values[index], index);
232  }
233  }
234  }
235 
236  void write()
237  {
238  std::vector<void*>::iterator
239  bufIter = buffers_.begin();
240 
241  std::vector<RegMapBlock*>::iterator
242  regIter = registers_.begin();
243 
244  while(regIter != registers_.end()) {
245  try {
246  frame_->writeBoardReg(*regIter++, static_cast<valueType*>(&(*static_cast< std::vector<valueType>* >(*bufIter++))[0]));
247  } catch(gcp::util::Exception& err) {
248  COUT(err.what());
249  }
250  }
251 
252  }
253 
254  private:
255 
256  BoardDataFrameManager* frame_;
257  unsigned int minMappedAddress_;
258  std::map<unsigned int, unsigned int>addressToIndex_;
259  StringIntMap xmlTagToIndex_;
260  std::vector<RegMapBlock*>registers_;
261  std::vector< void* >buffers_;
262  unsigned int index1Size_;
263  unsigned int index2Size_;
264  unsigned int index3Size_;
265  }; // RegisterList
266 
267  template<class dataType>
268  void add(RegisterList<dataType>* registers,
269  char* regName, std::string xmlTag,
270  std::string dataType) {
271 
272  registers->add(regName, xmlTag);
273  namedRegisters_.push_back(NamedRegister(xmlTag, dataType));
274  }
275 
277  public:
278 
279  NamedRegister(std::string name, std::string typeName) :
280  name_(name), typeName_(typeName) {};
281 
282  std::string name_;
283  std::string typeName_;
284  };
285 
286  std::vector<NamedRegister> namedRegisters_;
287 
288  }; // XMLRegisterMap
289 
290  protected:
291 
292  void getRegisters(MuxReadout::MuxXMLFile* xml,
293  std::vector<std::string>& containerNames,
294  std::string addressVectorName,
295  std::string valueVectorName,
296  XMLRegisterMap& lookup,
297  unsigned int boardNum);
298 
299  }; // XMLBoardDataFrameManager
300 
301  } // End namespace receiver
302 }; // End namespace gcp
303 
304 
305 
306 
307 #endif // End #ifndef GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
Definition: BoardDataFrameManager.h:31
Definition: XMLBoardDataFrameManager.h:30
BoardDataFrameManager(std::string regmap, std::string board, bool archivedOnly=false)
Definition: BoardDataFrameManager.cc:14
Definition: XMLBoardDataFrameManager.h:49
virtual void setTo(MuxReadout::MuxXMLFile *xml)
Definition: XMLBoardDataFrameManager.cc:34
virtual ~XMLBoardDataFrameManager()
Definition: XMLBoardDataFrameManager.cc:39
void getRegisters(MuxReadout::MuxXMLFile *xml, std::vector< std::string > &containerNames, std::string addressVectorName, std::string valueVectorName, XMLRegisterMap &lookup, unsigned int boardNum)
Definition: XMLBoardDataFrameManager.cc:46
DataFrame * frame()
Definition: DataFrameManager.cc:384
XMLBoardDataFrameManager(std::string regmap, std::string board, bool archivedOnly=false)
Definition: XMLBoardDataFrameManager.cc:25
Definition: Exception.h:30