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