otsdaq_components  v2_04_02
FSSRROCDefinitions.cc
1 /*
2  * FSSRROCDefinitions.cc
3  *
4  * Created on: Jun 12, 2013
5  * Author: Luigi Vigani
6  */
7 
8 #include "otsdaq-components/DetectorHardware/FSSRROCDefinitions.h"
9 #include "otsdaq/BitManipulator/BitManipulator.h"
10 //#include "otsdaq/MessageFacility/MessageFacility.h"
11 #include <cassert>
12 #include <cstdlib>
13 #include <iostream>
14 #include "otsdaq/Macros/CoutMacros.h"
15 
16 using namespace ots;
17 
18 //========================================================================================================================
19 FSSRROCDefinitions::FSSRROCDefinitions() { ; }
20 
21 //========================================================================================================================
22 FSSRROCDefinitions::~FSSRROCDefinitions(void) {}
23 
24 //========================================================================================================================
25 unsigned int FSSRROCDefinitions::getDACRegisterAddress(const std::string& registerName)
26 {
27  if(registerName == "PulserData")
28  return 1;
29  else if(registerName == "PulserControl")
30  return 2;
31  else if(registerName == "IntegratorVbn")
32  return 3;
33  else if(registerName == "ShaperVbp2")
34  return 4;
35  else if(registerName == "ShaperVbp1")
36  return 5;
37  else if(registerName == "BLRestorer")
38  return 6;
39  else if(registerName == "VTn")
40  return 7;
41  else if(registerName == "VTp0")
42  return 8;
43  else if(registerName == "VTp1")
44  return 9;
45  else if(registerName == "VTp2")
46  return 10;
47  else if(registerName == "VTp3")
48  return 11;
49  else if(registerName == "VTp4")
50  return 12;
51  else if(registerName == "VTp5")
52  return 13;
53  else if(registerName == "VTp6")
54  return 14;
55  else if(registerName == "VTp7")
56  return 15;
57  else if(registerName == "ActiveLines")
58  return 16;
59  else if(registerName == "SendData")
60  return 19;
61  else if(registerName == "RejectHits")
62  return 20;
63  else if(registerName == "DigContrReg")
64  return 27;
65  else if(registerName == "AqBCO")
66  return 30;
67  // Kill and Inject are GENERAL names that will be used for all ROCs
68  else if(registerName == "Kill")
69  return 17;
70  else if(registerName == "Inject")
71  return 18;
72  else
73  {
74  std::cout << __COUT_HDR_FL__ << " Register Name not recognized!" << std::endl;
75  assert(0);
76  }
77  return 0;
78 }
79 
80 //========================================================================================================================
81 uint64_t FSSRROCDefinitions::makeDACWriteHeader(int chipId,
82  const std::string& registerName)
83 {
84  return makeDACHeader(chipId, registerName, write);
85 }
86 
87 //========================================================================================================================
88 uint64_t FSSRROCDefinitions::makeDACSetHeader(int chipId, const std::string& registerName)
89 {
90  return makeDACHeader(chipId, registerName, set);
91 }
92 
93 //========================================================================================================================
94 uint64_t FSSRROCDefinitions::makeDACResetHeader(int chipId,
95  const std::string& registerName)
96 {
97  return makeDACHeader(chipId, registerName, reset);
98 }
99 
100 //========================================================================================================================
101 uint64_t FSSRROCDefinitions::makeDACReadHeader(int chipId,
102  const std::string& registerName)
103 {
104  return makeDACHeader(chipId, registerName, read);
105 }
106 
107 //========================================================================================================================
108 uint64_t FSSRROCDefinitions::makeDACHeader(int chipId,
109  const std::string& registerName,
110  unsigned int instruction)
111 {
112  /*Ryan
113  uint64_t command = 0;
114  //Insert Chip ID
115  BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5);
116  //Insert Register Address
117  BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5);
118  //Insert instruction
119  BitManipulator::insertBits(command,BitManipulator::reverseBits(instruction,0,3),10,3);
120 */
121  uint32_t command = 0x80000000;
122  uint32_t registerAddress = getDACRegisterAddress(registerName);
123  // Insert Chip ID
124  BitManipulator::insertBits(command, chipId, 0, 5);
125  // Insert Register Address
126  BitManipulator::insertBits(command, registerAddress, 5, 5);
127  // Insert instruction
128  BitManipulator::insertBits(command, instruction, 10, 3);
129 
130  // Insert mask
131  // BitManipulator::insertBits(command,0x1,16,8);
132  unsigned int length = 3;
133  if(registerAddress < 16 || registerAddress < 27 || registerAddress < 30)
134  length = 3;
135  else if(registerAddress == 17 || registerAddress == 18)
136  length = 4;
137  else if(registerAddress == 16)
138  length = 2;
139  else if(registerAddress == 19 || registerAddress == 20)
140  length = 1;
141  // Insert command length
142  BitManipulator::insertBits(command, length, 24, 7);
143 
144  return command;
145 }
146 
147 //========================================================================================================================
148 uint64_t FSSRROCDefinitions::makeDACWriteCommand(int chipId,
149  const std::string& registerName,
150  unsigned int valueToWrite)
151 {
152  std::cout << __COUT_HDR_FL__ << "Working on Register " << registerName
153  << " Address: " << getDACRegisterAddress(registerName)
154  << " Value: " << valueToWrite << std::endl;
155  uint64_t command = 0;
156  if(registerName != "SendData" && registerName != "RejectHits")
157  {
158  command = makeDACWriteHeader(chipId, registerName);
159  BitManipulator::insertBits(
160  command, BitManipulator::reverseBits(valueToWrite, 0, 8), 13, 8);
161  }
162  else if(valueToWrite == 1)
163  command = makeDACSetHeader(chipId, registerName);
164  else
165  command = makeDACResetHeader(chipId, registerName);
166  // BitManipulator::insertBits(command,0x0,13,8);It doesn't matter the value you put in
167  // if is set or reset!
168 
169  return command;
170 }
171 
172 //========================================================================================================================
173 uint64_t FSSRROCDefinitions::makeDACReadCommand(int chipId,
174  const std::string& registerName)
175 {
176  return makeDACHeader(chipId, registerName, read);
177 }
178 
179 //========================================================================================================================
180 std::string FSSRROCDefinitions::makeMaskWriteCommand(int chipId,
181  const std::string& registerName,
182  std::string valueToWrite)
183 {
184  std::string command = "0000000000000000000";
185 
186  /*Ryan's
187  //Insert Chip ID
188  //BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5);
189  BitManipulator::insertBits(command,chipId,0,5);
190  //Insert Register Address
191  //BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5);
192  BitManipulator::insertBits(command,getDACRegisterAddress(registerName),5,5);
193  //Insert instruction
194  //BitManipulator::insertBits(command,writeReversed,10,3);
195  BitManipulator::insertBits(command,write,10,3);
196 
197  UInt8 revField = (UInt8)0;
198  for (unsigned int c=0; c<valueToWrite.length(); c++)
199  {
200  if(registerName == "Inject")
201  revField = !(UInt8)valueToWrite.substr(c,1).data()[0];
202  else
203  revField = (UInt8)valueToWrite.substr(c,1).data()[0];
204  //revField = 0x40;
205  BitManipulator::insertBits(command,(uint64_t)revField,13+c,1);
206  }
207 
208  std::cout << __COUT_HDR_FL__ << " std::string made: " << std::endl;
209  for (int i=0; i<19; i++)
210  {
211  std::cout << __COUT_HDR_FL__ << std::hex << (uint64_t)command.substr(i,
212  1).data()[0] << "-" << std::dec << std::endl;
213  }
214  std::cout << __COUT_HDR_FL__ << "\n" << std::endl;
215 */
216  return command;
217 }
218 
219 //========================================================================================================================
220 uint64_t FSSRROCDefinitions::makeMaskReadCommand(int chipId,
221  const std::string& registerName)
222 {
223  return 0;
224 }
225 
226 //========================================================================================================================
227 uint64_t FSSRROCDefinitions::setSendData(int chipId)
228 {
229  return makeDACWriteCommand(chipId, "SendData", 1);
230 }
231 
232 //========================================================================================================================
233 uint64_t FSSRROCDefinitions::resetSendData(int chipId)
234 {
235  return makeDACWriteCommand(chipId, "SendData", 0);
236 }
237 
238 //========================================================================================================================
239 uint64_t FSSRROCDefinitions::setRejectHits(int chipId)
240 {
241  return makeDACWriteCommand(chipId, "RejectHits", 1);
242 }
243 
244 //========================================================================================================================
245 uint64_t FSSRROCDefinitions::resetRejectHits(int chipId)
246 {
247  return makeDACWriteCommand(chipId, "RejectHits", 0);
248 }