1 #ifndef GCP_RECEIVER_XMLBOARDDATAFRAMEMANAGER_H
2 #define GCP_RECEIVER_XMLBOARDDATAFRAMEMANAGER_H
14 #include "gcp/control/code/unix/libunix_src/specific/specificregs.h"
16 #include "Utilities/MuxXMLDatacard.h"
18 #include "gcp/util/common/BoardDataFrameManager.h"
20 #include "gcp/util/common/Exception.h"
39 bool archivedOnly=
false);
42 virtual void setTo(MuxReadout::MuxXMLFile *xml);
53 set(
unsigned int addr,
int value,
unsigned int boardNum) = 0;
56 set(
unsigned int addr,
double value,
unsigned int boardNum) = 0;
59 set(std::string name,
double value,
unsigned int boardNum) {};
62 set(std::string name, std::vector<double> &values,
63 unsigned int boardNum) {};
66 set(std::string name,
int value,
unsigned int boardNum) = 0;
69 set(std::string name, std::vector<int> &values,
70 unsigned int boardNum) {};
73 set(std::string name, std::string value,
74 unsigned int boardNum) = 0;
76 virtual void write() = 0;
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) {};
90 bool addMapped(
char* regName)
92 RegMapBlock* regBlock = NULL;
94 regBlock = frame_->getReg(regName);
96 ReportError(
"Register "
97 << regName <<
" not found.");
100 if(regBlock != NULL) {
101 registers_.push_back(regBlock);
102 unsigned int maxIndex;
104 maxIndex = index3Size_ * index2Size_ * index1Size_;
105 }
else if (index2Size_) {
106 maxIndex = index2Size_ * index1Size_;
108 maxIndex = index1Size_;
111 std::vector<valueType>* buffPtr =
112 new std::vector<valueType>(maxIndex);
114 buffers_.push_back(buffPtr);
119 ReportError(
" register "
120 << regName <<
" not found");
127 void add(
char* regName)
129 if(addMapped(regName)) {
134 void add(
char* regName,
unsigned int address)
136 if((addressToIndex_.find(address) != addressToIndex_.end())
137 || (address < minMappedAddress_)) {
138 ReportError(
"Duplicate register address " << regName
143 addressToIndex_[address] = registers_.size();
148 void add(
char* regName, std::string xmlTag)
150 if(xmlTagToIndex_.find(xmlTag) != xmlTagToIndex_.end()) {
151 ReportError(
"Duplicate register tag " << regName
156 xmlTagToIndex_[xmlTag] = registers_.size();
160 void setResolved(
unsigned int registerNum, valueType value,
161 unsigned int index1=0,
unsigned int index2=0,
162 unsigned int index3=0)
164 if(registerNum >= buffers_.size()) {
165 ReportError(
"Register number " << registerNum
166 <<
" out of range ");
172 index = index1*index2Size_*index3Size_ +
173 index2*index3Size_ + index3;
174 }
else if(index2Size_) {
175 index = index1 * index2Size_ + index2;
180 (*
static_cast< std::vector<valueType>*
>(buffers_[registerNum]))[index] = value;
183 void set(
unsigned int registerNum, valueType value,
184 unsigned int index1=0,
185 unsigned int index2=0,
186 unsigned int index3=0)
188 if(registerNum >= minMappedAddress_) {
190 std::map<unsigned int, unsigned int>::iterator
191 indexIter = addressToIndex_.find(registerNum);
193 if(indexIter == addressToIndex_.end()) {
198 registerNum = indexIter->second;
200 setResolved(registerNum, value, index1, index2, index3);
203 typedef std::map<std::string, unsigned int> StringIntMap;
205 void set(std::string xmlTag, valueType value,
206 unsigned int index1=0,
unsigned int index2=0,
207 unsigned int index3=0)
209 StringIntMap::iterator tagIter = xmlTagToIndex_.find(xmlTag);
210 if(tagIter != xmlTagToIndex_.end()) {
211 setResolved(tagIter->second, value, index1, index2, index3);
215 void set(std::string xmlTag, std::vector<valueType> &values,
216 unsigned int index1=0,
unsigned int index2=0)
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);
226 void set(std::string xmlTag, std::vector<int> &values)
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);
238 std::vector<void*>::iterator
239 bufIter = buffers_.begin();
241 std::vector<RegMapBlock*>::iterator
242 regIter = registers_.begin();
244 while(regIter != registers_.end()) {
246 frame_->writeBoardReg(*regIter++, static_cast<valueType*>(&(*
static_cast< std::vector<valueType>*
>(*bufIter++))[0]));
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_;
267 template<
class dataType>
269 char* regName, std::string xmlTag,
270 std::string dataType) {
272 registers->add(regName, xmlTag);
280 name_(name), typeName_(typeName) {};
283 std::string typeName_;
286 std::vector<NamedRegister> namedRegisters_;
293 std::vector<std::string>& containerNames,
294 std::string addressVectorName,
295 std::string valueVectorName,
297 unsigned int boardNum);
307 #endif // End #ifndef GCP_RECEIVER_XMLDATAFRAMEMANAGER_H
Definition: BoardDataFrameManager.h:31
Definition: XMLBoardDataFrameManager.h:30
Definition: XMLBoardDataFrameManager.h:276
BoardDataFrameManager(std::string regmap, std::string board, bool archivedOnly=false)
Definition: BoardDataFrameManager.cc:14
Definition: XMLBoardDataFrameManager.h:49
Definition: XMLBoardDataFrameManager.h:78
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