$treeview $search $mathjax $extrastylesheet
otsdaq_components
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "otsdaq-components/DAQHardware/PurdueFirmwareCore.h" 00002 #include <arpa/inet.h> 00003 #include <netinet/in.h> 00004 #include <sys/socket.h> 00005 #include <cstdlib> 00006 #include <iostream> 00007 #include "otsdaq-components/DAQHardware/FirmwareBaseDefinitions.h" 00008 #include "otsdaq-core/BitManipulator/BitManipulator.h" 00009 #include "otsdaq-core/Macros/CoutMacros.h" 00010 #include "otsdaq-core/MessageFacility/MessageFacility.h" 00011 00012 using namespace ots; 00013 00014 //======================================================================================================================== 00015 PurdueFirmwareCore::PurdueFirmwareCore(unsigned int version) 00016 : FrontEndFirmwareBase(version) 00017 { 00018 } 00019 00020 //======================================================================================================================== 00021 PurdueFirmwareCore::~PurdueFirmwareCore(void) {} 00022 00023 //======================================================================================================================== 00024 void PurdueFirmwareCore::init(void) {} 00025 00026 //======================================================================================================================== 00027 void PurdueFirmwareCore::setDataDestination(std::string& buffer, 00028 const std::string& ipAddress, 00029 const uint16_t port, 00030 bool clearBuffer) 00031 { 00032 // do nothing 00033 00034 if(clearBuffer) 00035 buffer.resize(0); 00036 } 00037 00038 //======================================================================================================================== 00039 std::string PurdueFirmwareCore::read(char* address) 00040 { 00041 std::string buffer; 00042 read(buffer, *(uint32_t*)address); 00043 return buffer; 00044 } 00045 00046 //======================================================================================================================== 00047 std::string PurdueFirmwareCore::write(char* address, char* data) 00048 { 00049 std::string buffer; 00050 write(buffer, *(uint32_t*)address, *(uint32_t*)data); 00051 return buffer; 00052 } 00053 00054 //======================================================================================================================== 00055 void PurdueFirmwareCore::write(std::string& buffer, 00056 uint32_t address, 00057 uint32_t data, 00058 bool clearBuffer) 00059 { 00060 if(clearBuffer) 00061 buffer.resize(0); 00062 00063 // std::cout << __COUT_HDR_FL__ << "Making buffer" << std::endl; 00064 unsigned int begin = buffer.length(); 00065 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer); 00066 buffer.resize(buffer.length() + 12, '\0'); 00067 if(begin != 0) 00068 begin -= 1; 00069 buffer[begin + 0] = numberOfBufferedCommands + 1; 00070 buffer[begin + 1] = WRITE; 00071 buffer[begin + 2] = 0; 00072 buffer[begin + 3] = 8; 00073 buffer[begin + 4] = (address >> 24) & 0xff; 00074 buffer[begin + 5] = (address >> 16) & 0xff; 00075 buffer[begin + 6] = (address >> 8) & 0xff; 00076 buffer[begin + 7] = address & 0xff; 00077 buffer[begin + 8] = (data >> 24) & 0xff; 00078 buffer[begin + 9] = (data >> 16) & 0xff; 00079 buffer[begin + 10] = (data >> 8) & 0xff; 00080 buffer[begin + 11] = data & 0xff; 00081 if(begin == 0) 00082 buffer += '\0'; 00083 // return (unsigned int) buffer[begin] + 1; 00084 } 00085 00086 //======================================================================================================================== 00087 void PurdueFirmwareCore::waitSet(std::string& buffer, 00088 uint32_t address, 00089 uint32_t data, 00090 uint32_t timeout, 00091 bool clearBuffer) 00092 { 00093 if(clearBuffer) 00094 buffer.resize(0); 00095 00096 unsigned int begin = buffer.length(); 00097 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer); 00098 buffer.resize(buffer.length() + 16, '\0'); 00099 if(begin != 0) 00100 begin -= 1; 00101 buffer[begin + 0] = numberOfBufferedCommands + 1; 00102 buffer[begin + 1] = WAITSET; 00103 buffer[begin + 2] = 0; 00104 buffer[begin + 3] = 12; 00105 buffer[begin + 4] = (address >> 24) & 0xff; 00106 buffer[begin + 5] = (address >> 16) & 0xff; 00107 buffer[begin + 6] = (address >> 8) & 0xff; 00108 buffer[begin + 7] = address & 0xff; 00109 buffer[begin + 8] = (data >> 24) & 0xff; 00110 buffer[begin + 9] = (data >> 16) & 0xff; 00111 buffer[begin + 10] = (data >> 8) & 0xff; 00112 buffer[begin + 11] = data & 0xff; 00113 buffer[begin + 12] = (timeout >> 24) & 0xff; 00114 buffer[begin + 13] = (timeout >> 16) & 0xff; 00115 buffer[begin + 14] = (timeout >> 8) & 0xff; 00116 buffer[begin + 15] = timeout & 0xff; 00117 if(begin == 0) 00118 buffer += '\0'; 00119 // return (unsigned int) buffer[begin] + 1; 00120 } 00121 00122 //======================================================================================================================== 00123 void PurdueFirmwareCore::waitClear(std::string& buffer, 00124 uint32_t address, 00125 uint32_t data, 00126 uint32_t timeout, 00127 bool clearBuffer) 00128 { 00129 if(clearBuffer) 00130 buffer.resize(0); 00131 00132 unsigned int begin = buffer.length(); 00133 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer); 00134 buffer.resize(buffer.length() + 16, '\0'); 00135 if(begin != 0) 00136 begin -= 1; 00137 buffer[begin + 0] = numberOfBufferedCommands + 1; 00138 buffer[begin + 1] = WAITCLR; 00139 buffer[begin + 2] = 0; 00140 buffer[begin + 3] = 12; 00141 buffer[begin + 4] = (address >> 24) & 0xff; 00142 buffer[begin + 5] = (address >> 16) & 0xff; 00143 buffer[begin + 6] = (address >> 8) & 0xff; 00144 buffer[begin + 7] = address & 0xff; 00145 buffer[begin + 8] = (data >> 24) & 0xff; 00146 buffer[begin + 9] = (data >> 16) & 0xff; 00147 buffer[begin + 10] = (data >> 8) & 0xff; 00148 buffer[begin + 11] = data & 0xff; 00149 buffer[begin + 12] = (timeout >> 24) & 0xff; 00150 buffer[begin + 13] = (timeout >> 16) & 0xff; 00151 buffer[begin + 14] = (timeout >> 8) & 0xff; 00152 buffer[begin + 15] = timeout & 0xff; 00153 if(begin == 0) 00154 buffer += '\0'; 00155 // return (unsigned int) buffer[begin] + 1; 00156 } 00157 00158 //======================================================================================================================== 00159 void PurdueFirmwareCore::read(std::string& buffer, uint32_t address, bool clearBuffer) 00160 { 00161 if(clearBuffer) 00162 buffer.resize(0); 00163 00164 unsigned int begin = buffer.length(); 00165 unsigned int numberOfBufferedCommands = getNumberOfBufferedCommands(buffer); 00166 buffer.resize(buffer.length() + 8, '\0'); 00167 if(begin != 0) 00168 begin -= 1; 00169 buffer[begin + 0] = numberOfBufferedCommands + 1; 00170 buffer[begin + 1] = READ; 00171 buffer[begin + 2] = 0; 00172 buffer[begin + 3] = 4; 00173 buffer[begin + 4] = (address >> 24) & 0xff; 00174 buffer[begin + 5] = (address >> 16) & 0xff; 00175 buffer[begin + 6] = (address >> 8) & 0xff; 00176 buffer[begin + 7] = address & 0xff; 00177 if(begin == 0) 00178 buffer += '\0'; 00179 // return (unsigned int) buffer[begin] + 1; 00180 } 00181 00182 //======================================================================================================================== 00183 unsigned int PurdueFirmwareCore::getNumberOfBufferedCommands(std::string& buffer) 00184 { 00185 if(buffer.length() == 0) 00186 return 0; 00187 unsigned int bufferPosition = 0; 00188 unsigned int commandNumber = 0; 00189 while(bufferPosition < buffer.length() - 1) 00190 { 00191 bufferPosition += (unsigned int)buffer[bufferPosition + 3] + 4; 00192 ++commandNumber; 00193 } 00194 return commandNumber; 00195 } 00196 00197 //======================================================================================================================== 00198 std::string PurdueFirmwareCore::compareSendAndReceive(const std::string& sentBuffer, 00199 std::string& acknowledgment) 00200 { 00201 std::string reSendBuffer; 00202 unsigned int skipBuffer = 0; 00203 unsigned int skipAcknow = 0; 00204 unsigned int remainBufferCommands; 00205 unsigned int remainAcknowCommands; 00206 00207 std::cout << __COUT_HDR_FL__ << "Comparing sent buffer and received acknowledgment!!!" 00208 << std::endl; 00209 00210 std::cout << __COUT_HDR_FL__ << "Buffer size (send): " << sentBuffer.size() 00211 << std::endl; 00212 std::cout << __COUT_HDR_FL__ 00213 << "Acknowledgment size (receive): " << acknowledgment.size() << std::endl; 00214 00215 while(skipBuffer < sentBuffer.size()) 00216 { 00217 for(int position = 0; position < 4; position++) 00218 { 00219 if(position + skipBuffer >= 00220 sentBuffer.size()) // make sure the number NEVER goes above the limit 00221 { 00222 reSendBuffer.clear(); 00223 std::cout << __COUT_HDR_FL__ << "Done... Works!!!" << std::endl; 00224 return reSendBuffer; 00225 } 00226 00227 if(position == 0) 00228 { 00229 if(sentBuffer[position + skipBuffer] != 00230 acknowledgment[position + skipAcknow]) 00231 { 00232 std::cout << __COUT_HDR_FL__ << "ERROR - Sent " 00233 << position + skipBuffer << "th: " << std::hex 00234 << (unsigned int)sentBuffer[position + skipBuffer] 00235 << std::dec << " different from Received " 00236 << position + skipAcknow << "th:" << std::hex 00237 << (unsigned int)acknowledgment[position + skipAcknow] 00238 << std::dec; 00239 std::cout << __COUT_HDR_FL__ << "Position: " << position << std::endl; 00240 reSendBuffer.clear(); 00241 for(unsigned int i = skipBuffer; 00242 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); 00243 i++) 00244 { 00245 reSendBuffer += sentBuffer[i]; 00246 } 00247 return reSendBuffer; 00248 } 00249 } 00250 00251 if(position == 1) 00252 { 00253 if((sentBuffer[position + skipBuffer]) != 00254 (acknowledgment[position + skipAcknow] & 0xf)) 00255 { 00256 std::cout << __COUT_HDR_FL__ << "ERROR - Sent " 00257 << position + skipBuffer << "th: " << std::hex 00258 << (unsigned int)sentBuffer[position + skipBuffer] 00259 << std::dec << " different from Received " 00260 << position + skipAcknow << "th:" << std::hex 00261 << (unsigned int)acknowledgment[position + skipAcknow] 00262 << std::dec; 00263 std::cout << __COUT_HDR_FL__ << "Position: " << position << std::endl; 00264 reSendBuffer.clear(); 00265 for(unsigned int i = skipBuffer; 00266 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); 00267 i++) 00268 { 00269 reSendBuffer += sentBuffer[i]; 00270 } 00271 return reSendBuffer; 00272 } 00273 } 00274 00275 if(position == 2) 00276 { 00277 if((sentBuffer[position + skipBuffer] != 0) || 00278 (acknowledgment[position + skipAcknow] != 0)) 00279 { 00280 std::cout << __COUT_HDR_FL__ << "ERROR - Sent " 00281 << position + skipBuffer << "th: " << std::hex 00282 << (unsigned int)sentBuffer[position + skipBuffer] 00283 << std::dec << " different from Received " 00284 << position + skipAcknow << "th:" << std::hex 00285 << (unsigned int)acknowledgment[position + skipAcknow] 00286 << std::dec << std::endl; 00287 std::cout << __COUT_HDR_FL__ << "Position: " << position << std::endl; 00288 reSendBuffer.clear(); 00289 for(unsigned int i = skipBuffer; 00290 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); 00291 i++) 00292 { 00293 reSendBuffer += sentBuffer[i]; 00294 } 00295 return reSendBuffer; 00296 } 00297 } 00298 00299 if(position == 3) 00300 { 00301 remainBufferCommands = 00302 sentBuffer[position + 00303 skipBuffer]; // 4th bit tells us how many bits are left 00304 remainAcknowCommands = acknowledgment[position + skipAcknow]; 00305 00306 if(((remainBufferCommands == 12) && (remainAcknowCommands == 4)) || 00307 ((remainBufferCommands == 8) && (remainAcknowCommands == 0))) 00308 { 00309 skipBuffer += 00310 (4 + remainBufferCommands); // go to the beginning of next buffer 00311 skipAcknow += (4 + remainAcknowCommands); 00312 } 00313 else 00314 { 00315 std::cout << __COUT_HDR_FL__ << "ERROR - Sent " 00316 << position + skipBuffer << "th: " << std::hex 00317 << (unsigned int)sentBuffer[position + skipBuffer] 00318 << std::dec << " not compatible with Received " 00319 << position + skipAcknow << "th:" << std::hex 00320 << (unsigned int)acknowledgment[position + skipAcknow] 00321 << std::dec << std::endl; 00322 std::cout << __COUT_HDR_FL__ << "Position: " << position << std::endl; 00323 reSendBuffer.clear(); 00324 for(unsigned int i = skipBuffer; 00325 i < (skipBuffer + 4 + sentBuffer[skipBuffer + 3]); 00326 i++) 00327 { 00328 reSendBuffer += sentBuffer[i]; 00329 } 00330 return reSendBuffer; 00331 } 00332 } 00333 } 00334 } 00335 00336 reSendBuffer.clear(); 00337 std::cout << __COUT_HDR_FL__ << "Done... Works!!!" << std::endl; 00338 return reSendBuffer; 00339 } 00340 00341 //======================================================================================================================== 00342 uint32_t PurdueFirmwareCore::createRegisterFromValue(std::string& readBuffer, 00343 std::string& receivedValue) 00344 { 00345 for(int position = 0; position < 8; position++) 00346 { 00347 if(position == 0 || position == 4 || position == 5 || position == 6 || 00348 position == 7) 00349 { 00350 if(readBuffer[position] != receivedValue[position]) 00351 { 00352 std::cout << __COUT_HDR_FL__ << "ERROR - SentBuffer position " << position 00353 << " value: " << std::hex << (unsigned int)readBuffer[position] 00354 << std::dec << " different from ReceivedBuffer position " 00355 << position << " value: " << std::hex 00356 << (unsigned int)receivedValue[position] << std::dec 00357 << std::endl; 00358 return 0; 00359 } 00360 } 00361 00362 if(position == 1) 00363 { 00364 if((readBuffer[position] != (receivedValue[position] & 0xf))) 00365 { 00366 std::cout << __COUT_HDR_FL__ << "ERROR - SentBuffer position " << position 00367 << " value: " << std::hex << (unsigned int)readBuffer[position] 00368 << std::dec << " different from ReceivedBuffer position " 00369 << position << " value: " << std::hex 00370 << (unsigned int)receivedValue[position] << std::dec 00371 << std::endl; 00372 return 0; 00373 } 00374 } 00375 00376 if(position == 2) 00377 { 00378 if((readBuffer[position] != 0) || (receivedValue[position] != 0)) 00379 { 00380 std::cout << __COUT_HDR_FL__ << "ERROR - SentBuffer position " << position 00381 << " value: " << std::hex << (unsigned int)readBuffer[position] 00382 << std::dec << " different from ReceivedBuffer position " 00383 << position << " value: " << std::hex 00384 << (unsigned int)receivedValue[position] << std::dec 00385 << std::endl; 00386 return 0; 00387 } 00388 } 00389 00390 if(position == 3) 00391 { 00392 if((readBuffer[position] != 4) || (receivedValue[position] != 8)) 00393 { 00394 std::cout << __COUT_HDR_FL__ << "ERROR - SentBuffer position " << position 00395 << " value: " << std::hex << (unsigned int)readBuffer[position] 00396 << std::dec << " different from ReceivedBuffer position " 00397 << position << " value: " << std::hex 00398 << (unsigned int)receivedValue[position] << std::dec 00399 << std::endl; 00400 return 0; 00401 } 00402 } 00403 } 00404 00405 uint32_t registerValue; 00406 00407 registerValue = 00408 ((unsigned int)receivedValue[8] << 24) + ((unsigned int)receivedValue[9] << 16) + 00409 ((unsigned int)receivedValue[10] << 8) + (unsigned int)receivedValue[11]; 00410 00411 std::cout << __COUT_HDR_FL__ << "No problem encountered! Register value created!!! " 00412 << std::endl; 00413 00414 return registerValue; 00415 }