$treeview $search $mathjax $extrastylesheet
otsdaq_components
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 /* 00002 * FSSRROCDefinitions.cc 00003 * 00004 * Created on: Jun 12, 2013 00005 * Author: Luigi Vigani 00006 */ 00007 00008 #include "otsdaq-components/DetectorHardware/FSSRROCDefinitions.h" 00009 #include "otsdaq-core/BitManipulator/BitManipulator.h" 00010 //#include "otsdaq-core/MessageFacility/MessageFacility.h" 00011 #include <cassert> 00012 #include <cstdlib> 00013 #include <iostream> 00014 #include "otsdaq-core/Macros/CoutMacros.h" 00015 00016 using namespace ots; 00017 00018 //======================================================================================================================== 00019 FSSRROCDefinitions::FSSRROCDefinitions() { ; } 00020 00021 //======================================================================================================================== 00022 FSSRROCDefinitions::~FSSRROCDefinitions(void) {} 00023 00024 //======================================================================================================================== 00025 unsigned int FSSRROCDefinitions::getDACRegisterAddress(const std::string& registerName) 00026 { 00027 if(registerName == "PulserData") 00028 return 1; 00029 else if(registerName == "PulserControl") 00030 return 2; 00031 else if(registerName == "IntegratorVbn") 00032 return 3; 00033 else if(registerName == "ShaperVbp2") 00034 return 4; 00035 else if(registerName == "ShaperVbp1") 00036 return 5; 00037 else if(registerName == "BLRestorer") 00038 return 6; 00039 else if(registerName == "VTn") 00040 return 7; 00041 else if(registerName == "VTp0") 00042 return 8; 00043 else if(registerName == "VTp1") 00044 return 9; 00045 else if(registerName == "VTp2") 00046 return 10; 00047 else if(registerName == "VTp3") 00048 return 11; 00049 else if(registerName == "VTp4") 00050 return 12; 00051 else if(registerName == "VTp5") 00052 return 13; 00053 else if(registerName == "VTp6") 00054 return 14; 00055 else if(registerName == "VTp7") 00056 return 15; 00057 else if(registerName == "ActiveLines") 00058 return 16; 00059 else if(registerName == "SendData") 00060 return 19; 00061 else if(registerName == "RejectHits") 00062 return 20; 00063 else if(registerName == "DigContrReg") 00064 return 27; 00065 else if(registerName == "AqBCO") 00066 return 30; 00067 // Kill and Inject are GENERAL names that will be used for all ROCs 00068 else if(registerName == "Kill") 00069 return 17; 00070 else if(registerName == "Inject") 00071 return 18; 00072 else 00073 { 00074 std::cout << __COUT_HDR_FL__ << " Register Name not recognized!" << std::endl; 00075 assert(0); 00076 } 00077 return 0; 00078 } 00079 00080 //======================================================================================================================== 00081 uint64_t FSSRROCDefinitions::makeDACWriteHeader(int chipId, 00082 const std::string& registerName) 00083 { 00084 return makeDACHeader(chipId, registerName, write); 00085 } 00086 00087 //======================================================================================================================== 00088 uint64_t FSSRROCDefinitions::makeDACSetHeader(int chipId, const std::string& registerName) 00089 { 00090 return makeDACHeader(chipId, registerName, set); 00091 } 00092 00093 //======================================================================================================================== 00094 uint64_t FSSRROCDefinitions::makeDACResetHeader(int chipId, 00095 const std::string& registerName) 00096 { 00097 return makeDACHeader(chipId, registerName, reset); 00098 } 00099 00100 //======================================================================================================================== 00101 uint64_t FSSRROCDefinitions::makeDACReadHeader(int chipId, 00102 const std::string& registerName) 00103 { 00104 return makeDACHeader(chipId, registerName, read); 00105 } 00106 00107 //======================================================================================================================== 00108 uint64_t FSSRROCDefinitions::makeDACHeader(int chipId, 00109 const std::string& registerName, 00110 unsigned int instruction) 00111 { 00112 /*Ryan 00113 uint64_t command = 0; 00114 //Insert Chip ID 00115 BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5); 00116 //Insert Register Address 00117 BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5); 00118 //Insert instruction 00119 BitManipulator::insertBits(command,BitManipulator::reverseBits(instruction,0,3),10,3); 00120 */ 00121 uint32_t command = 0x80000000; 00122 uint32_t registerAddress = getDACRegisterAddress(registerName); 00123 // Insert Chip ID 00124 BitManipulator::insertBits(command, chipId, 0, 5); 00125 // Insert Register Address 00126 BitManipulator::insertBits(command, registerAddress, 5, 5); 00127 // Insert instruction 00128 BitManipulator::insertBits(command, instruction, 10, 3); 00129 00130 // Insert mask 00131 // BitManipulator::insertBits(command,0x1,16,8); 00132 unsigned int length = 3; 00133 if(registerAddress < 16 || registerAddress < 27 || registerAddress < 30) 00134 length = 3; 00135 else if(registerAddress == 17 || registerAddress == 18) 00136 length = 4; 00137 else if(registerAddress == 16) 00138 length = 2; 00139 else if(registerAddress == 19 || registerAddress == 20) 00140 length = 1; 00141 // Insert command length 00142 BitManipulator::insertBits(command, length, 24, 7); 00143 00144 return command; 00145 } 00146 00147 //======================================================================================================================== 00148 uint64_t FSSRROCDefinitions::makeDACWriteCommand(int chipId, 00149 const std::string& registerName, 00150 unsigned int valueToWrite) 00151 { 00152 std::cout << __COUT_HDR_FL__ << "Working on Register " << registerName 00153 << " Address: " << getDACRegisterAddress(registerName) 00154 << " Value: " << valueToWrite << std::endl; 00155 uint64_t command = 0; 00156 if(registerName != "SendData" && registerName != "RejectHits") 00157 { 00158 command = makeDACWriteHeader(chipId, registerName); 00159 BitManipulator::insertBits( 00160 command, BitManipulator::reverseBits(valueToWrite, 0, 8), 13, 8); 00161 } 00162 else if(valueToWrite == 1) 00163 command = makeDACSetHeader(chipId, registerName); 00164 else 00165 command = makeDACResetHeader(chipId, registerName); 00166 // BitManipulator::insertBits(command,0x0,13,8);It doesn't matter the value you put in 00167 // if is set or reset! 00168 00169 return command; 00170 } 00171 00172 //======================================================================================================================== 00173 uint64_t FSSRROCDefinitions::makeDACReadCommand(int chipId, 00174 const std::string& registerName) 00175 { 00176 return makeDACHeader(chipId, registerName, read); 00177 } 00178 00179 //======================================================================================================================== 00180 std::string FSSRROCDefinitions::makeMaskWriteCommand(int chipId, 00181 const std::string& registerName, 00182 std::string valueToWrite) 00183 { 00184 std::string command = "0000000000000000000"; 00185 00186 /*Ryan's 00187 //Insert Chip ID 00188 //BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5); 00189 BitManipulator::insertBits(command,chipId,0,5); 00190 //Insert Register Address 00191 //BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5); 00192 BitManipulator::insertBits(command,getDACRegisterAddress(registerName),5,5); 00193 //Insert instruction 00194 //BitManipulator::insertBits(command,writeReversed,10,3); 00195 BitManipulator::insertBits(command,write,10,3); 00196 00197 UInt8 revField = (UInt8)0; 00198 for (unsigned int c=0; c<valueToWrite.length(); c++) 00199 { 00200 if(registerName == "Inject") 00201 revField = !(UInt8)valueToWrite.substr(c,1).data()[0]; 00202 else 00203 revField = (UInt8)valueToWrite.substr(c,1).data()[0]; 00204 //revField = 0x40; 00205 BitManipulator::insertBits(command,(uint64_t)revField,13+c,1); 00206 } 00207 00208 std::cout << __COUT_HDR_FL__ << " std::string made: " << std::endl; 00209 for (int i=0; i<19; i++) 00210 { 00211 std::cout << __COUT_HDR_FL__ << std::hex << (uint64_t)command.substr(i, 00212 1).data()[0] << "-" << std::dec << std::endl; 00213 } 00214 std::cout << __COUT_HDR_FL__ << "\n" << std::endl; 00215 */ 00216 return command; 00217 } 00218 00219 //======================================================================================================================== 00220 uint64_t FSSRROCDefinitions::makeMaskReadCommand(int chipId, 00221 const std::string& registerName) 00222 { 00223 return 0; 00224 } 00225 00226 //======================================================================================================================== 00227 uint64_t FSSRROCDefinitions::setSendData(int chipId) 00228 { 00229 return makeDACWriteCommand(chipId, "SendData", 1); 00230 } 00231 00232 //======================================================================================================================== 00233 uint64_t FSSRROCDefinitions::resetSendData(int chipId) 00234 { 00235 return makeDACWriteCommand(chipId, "SendData", 0); 00236 } 00237 00238 //======================================================================================================================== 00239 uint64_t FSSRROCDefinitions::setRejectHits(int chipId) 00240 { 00241 return makeDACWriteCommand(chipId, "RejectHits", 1); 00242 } 00243 00244 //======================================================================================================================== 00245 uint64_t FSSRROCDefinitions::resetRejectHits(int chipId) 00246 { 00247 return makeDACWriteCommand(chipId, "RejectHits", 0); 00248 }