00001
00002
00003
00004
00005
00006
00007
00008 #include "otsdaq-components/DetectorHardware/PSI46DigROCDefinitions.h"
00009 #include "otsdaq-core/BitManipulator/BitManipulator.h"
00010
00011 #include "otsdaq-core/Macros/CoutMacros.h"
00012 #include <cassert>
00013 #include <iostream>
00014 #include<cstdlib>
00015
00016 using namespace ots;
00017
00018
00019
00020 PSI46DigROCDefinitions::PSI46DigROCDefinitions()
00021 {
00022 }
00023
00024
00025 PSI46DigROCDefinitions::~PSI46DigROCDefinitions (void)
00026 {}
00027
00028
00029 unsigned int PSI46DigROCDefinitions::getDACRegisterAddress(const std::string& registerName)
00030 {
00031 if (registerName == "PulserData" ) return 1;
00032 else if (registerName == "PulserControl") return 2;
00033 else if (registerName == "IntegratorVbn") return 3;
00034 else if (registerName == "ShaperVbp2" ) return 4;
00035 else if (registerName == "ShaperVbp1" ) return 5;
00036 else if (registerName == "BLRestorer" ) return 6;
00037 else if (registerName == "VTn" ) return 7;
00038 else if (registerName == "VTp0" ) return 8;
00039 else if (registerName == "VTp1" ) return 9;
00040 else if (registerName == "VTp2" ) return 10;
00041 else if (registerName == "VTp3" ) return 11;
00042 else if (registerName == "VTp4" ) return 12;
00043 else if (registerName == "VTp5" ) return 13;
00044 else if (registerName == "VTp6" ) return 14;
00045 else if (registerName == "VTp7" ) return 15;
00046 else if (registerName == "ActiveLines" ) return 16;
00047 else if (registerName == "SendData" ) return 19;
00048 else if (registerName == "RejectHits" ) return 20;
00049 else if (registerName == "DigContrReg" ) return 27;
00050 else if (registerName == "AqBCO" ) return 30;
00051
00052 else if (registerName == "Kill" ) return 17;
00053 else if (registerName == "Inject" ) return 18;
00054 else
00055 {
00056 std::cout << __COUT_HDR_FL__ << " Register Name not recognized!" << std::endl;
00057 assert(0);
00058 }
00059 return 0;
00060 }
00061
00062
00063 uint64_t PSI46DigROCDefinitions::makeDACWriteHeader(int chipId, const std::string& registerName)
00064 {
00065 return makeDACHeader(chipId, registerName, write);
00066 }
00067
00068
00069 uint64_t PSI46DigROCDefinitions::makeDACSetHeader(int chipId, const std::string& registerName)
00070 {
00071 return makeDACHeader(chipId, registerName, set);
00072 }
00073
00074
00075 uint64_t PSI46DigROCDefinitions::makeDACResetHeader(int chipId, const std::string& registerName)
00076 {
00077 return makeDACHeader(chipId, registerName, reset);
00078 }
00079
00080
00081 uint64_t PSI46DigROCDefinitions::makeDACReadHeader(int chipId, const std::string& registerName)
00082 {
00083 return makeDACHeader(chipId, registerName, read);
00084 }
00085
00086
00087 uint64_t PSI46DigROCDefinitions::makeDACHeader(int chipId, const std::string& registerName, unsigned int instruction)
00088 {
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 uint32_t command = 0x80000000;
00099 uint32_t registerAddress = getDACRegisterAddress(registerName);
00100
00101 BitManipulator::insertBits(command,chipId,0,5);
00102
00103 BitManipulator::insertBits(command,registerAddress,5,5);
00104
00105 BitManipulator::insertBits(command,instruction,10,3);
00106
00107
00108
00109 unsigned int length = 3;
00110 if ( registerAddress < 16 || registerAddress < 27 || registerAddress < 30)
00111 length = 3;
00112 else if ( registerAddress == 17 || registerAddress == 18 )
00113 length = 4;
00114 else if ( registerAddress == 16 )
00115 length = 2;
00116 else if ( registerAddress == 19 || registerAddress == 20 )
00117 length = 1;
00118
00119 BitManipulator::insertBits(command,length,24,7);
00120
00121 return command;
00122 }
00123
00124
00125 uint64_t PSI46DigROCDefinitions::makeDACWriteCommand(int chipId, const std::string& registerName, unsigned int valueToWrite)
00126 {
00127 std::cout << __COUT_HDR_FL__ << "Working on Register " << registerName << " Address: " << getDACRegisterAddress(registerName) << " Value: " << valueToWrite << std::endl;
00128 uint64_t command = 0;
00129 if (registerName != "SendData" && registerName != "RejectHits")
00130 {
00131 command = makeDACWriteHeader(chipId, registerName);
00132 BitManipulator::insertBits(command,BitManipulator::reverseBits(valueToWrite,0,8),13,8);
00133 }
00134 else
00135 if (valueToWrite == 1)
00136 command = makeDACSetHeader(chipId, registerName);
00137 else
00138 command = makeDACResetHeader(chipId, registerName);
00139
00140
00141 return command;
00142 }
00143
00144
00145 uint64_t PSI46DigROCDefinitions::makeDACReadCommand(int chipId, const std::string& registerName)
00146 {
00147 return makeDACHeader(chipId, registerName, read);
00148 }
00149
00150
00151 std::string PSI46DigROCDefinitions::makeMaskWriteCommand (int chipId, const std::string& registerName, std::string valueToWrite)
00152 {
00153 std::string command = "0000000000000000000";
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 return command;
00187 }
00188
00189
00190 uint64_t PSI46DigROCDefinitions::makeMaskReadCommand (int chipId, const std::string& registerName)
00191 {
00192 return 0;
00193 }
00194
00195
00196 uint64_t PSI46DigROCDefinitions::setSendData(int chipId)
00197 {
00198 return makeDACWriteCommand(chipId, "SendData", 1);
00199 }
00200
00201
00202 uint64_t PSI46DigROCDefinitions::resetSendData(int chipId)
00203 {
00204 return makeDACWriteCommand(chipId, "SendData", 0);
00205 }
00206
00207
00208 uint64_t PSI46DigROCDefinitions::setRejectHits(int chipId)
00209 {
00210 return makeDACWriteCommand(chipId, "RejectHits", 1);
00211 }
00212
00213
00214 uint64_t PSI46DigROCDefinitions::resetRejectHits(int chipId)
00215 {
00216 return makeDACWriteCommand(chipId, "RejectHits", 0);
00217 }