1 #include "otsdaq-components/FEInterfaces/FEOtsUDPProducerTemplateInterface.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutMacros.h"
4 #include "otsdaq-core/Macros/InterfacePluginMacros.h"
11 FEOtsUDPProducerTemplateInterface::FEOtsUDPProducerTemplateInterface(
const std::string& interfaceUID,
12 const ConfigurationTree& theXDAQContextConfigTree,
const std::string& interfaceConfigurationPath)
14 theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"HostIPAddress").getValue<std::string>()
15 , theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"HostPort").getValue<unsigned int>())
17 , FEProducerVInterface (interfaceUID, theXDAQContextConfigTree, interfaceConfigurationPath)
19 ,
OtsUDPHardware (theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"InterfaceIPAddress").getValue<std::string>()
20 , theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"InterfacePort").getValue<unsigned int>())
21 ,
OtsUDPFirmwareDataGen(theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"FirmwareVersion").getValue<unsigned int>())
24 FEVInterface::registerFEMacroFunction(
"varTest2",
25 static_cast<FEVInterface::frontEndMacroFunction_t>(&FEOtsUDPProducerTemplateInterface::varTest2),
26 std::vector<std::string>{
"myOtherArg"},
27 std::vector<std::string>{
"myArg",
"outArg1"},
32 FEVInterface::registerFEMacroFunction(
"varTest",
33 static_cast<FEVInterface::frontEndMacroFunction_t>(&FEOtsUDPProducerTemplateInterface::varTest),
34 std::vector<std::string>{
"myOtherArg"},
35 std::vector<std::string>{
"myArg",
"outArg1"},
38 universalAddressSize_ = 8;
39 universalDataSize_ = 8;
43 FEOtsUDPProducerTemplateInterface::~FEOtsUDPProducerTemplateInterface(
void)
47 void FEOtsUDPProducerTemplateInterface::configure(
void)
140 __FE_COUT__ <<
"configure" << __E__;
141 __FE_COUT__ <<
"Clearing receive socket buffer: " << OtsUDPHardware::clearReadSocket() <<
" packets cleared." << __E__;
143 std::string sendBuffer;
144 std::string recvBuffer;
145 uint64_t readQuadWord;
147 __FE_COUT__ <<
"Configuration Path Table: " <<
148 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getConfigurationName() <<
150 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getConfigurationVersion() <<
153 __FE_COUT__ <<
"Interface name: " <<
154 theXDAQContextConfigTree_.getNode(theConfigurationPath_) << __E__;
156 __FE_COUT__ <<
"Configured Firmware Version: " <<
157 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"FirmwareVersion").getValue<
unsigned int>()
160 __FE_COUT__ <<
"Setting Destination IP: " <<
161 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToIPAddress").getValue<std::string>()
163 __FE_COUT__ <<
"And Destination Port: " <<
164 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToPort").getValue<
unsigned int>()
167 OtsUDPFirmwareCore::setDataDestination(sendBuffer,
168 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToIPAddress").getValue<std::string>(),
169 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToPort").getValue<uint64_t>()
171 OtsUDPHardware::write(sendBuffer);
173 __FE_COUT__ <<
"Reading back burst dest MAC/IP/Port: " << __E__;
175 OtsUDPFirmwareCore::readDataDestinationMAC(sendBuffer);
176 OtsUDPHardware::read(sendBuffer,readQuadWord);
178 OtsUDPFirmwareCore::readDataDestinationIP(sendBuffer);
179 OtsUDPHardware::read(sendBuffer,readQuadWord);
181 OtsUDPFirmwareCore::readDataDestinationPort(sendBuffer);
182 OtsUDPHardware::read(sendBuffer,readQuadWord);
186 OtsUDPFirmwareCore::readControlDestinationPort(sendBuffer);
187 OtsUDPHardware::read(sendBuffer,readQuadWord);
190 FEVInterface::runSequenceOfCommands(
"LinkToConfigureSequence");
192 __FE_COUT__ <<
"Done with ots Template configuring." << __E__;
202 void FEOtsUDPProducerTemplateInterface::halt(
void)
204 __FE_COUT__ <<
"\tHalt" << __E__;
209 void FEOtsUDPProducerTemplateInterface::pause(
void)
211 __FE_COUT__ <<
"\tPause" << __E__;
216 void FEOtsUDPProducerTemplateInterface::resume(
void)
218 __FE_COUT__ <<
"\tResume" << __E__;
223 void FEOtsUDPProducerTemplateInterface::start(std::string )
225 __FE_COUT__ <<
"\tStart" << __E__;
247 FEVInterface::runSequenceOfCommands(
"LinkToStartSequence");
249 std::string sendBuffer;
250 OtsUDPFirmwareCore::startBurst(sendBuffer);
251 OtsUDPHardware::write(sendBuffer);
255 void FEOtsUDPProducerTemplateInterface::stop(
void)
257 __FE_COUT__ <<
"\tStop" << __E__;
261 FEVInterface::runSequenceOfCommands(
"LinkToStopSequence");
263 std::string sendBuffer;
264 OtsUDPFirmwareCore::stopBurst(sendBuffer);
265 OtsUDPHardware::write(sendBuffer);
269 bool FEOtsUDPProducerTemplateInterface::running(
void)
271 __FE_COUT__ <<
"\tRunning" << __E__;
278 while(WorkLoop::continueWorkLoop_)
299 if(DataProducerBase::attachToEmptySubBuffer(
300 dataP_, headerP_) < 0)
302 __CFG_COUT__ <<
"There are no available buffers! Retrying...after waiting 10 milliseconds!" << std::endl;
310 unsigned long long value = 0xB57321;
311 std::string& buffer = *dataP_;
313 memcpy((
void *)&buffer[0] ,(
void *)&value , 8 );
316 __CFG_COUT__ <<
"Writing to buffer " << buffer.size() <<
" bytes!" << __E__;
317 __CFG_COUT__ <<
"Writing to buffer length " << buffer.length() <<
" bytes!" << __E__;
319 __CFG_COUT__ <<
"Buffer Data: " << BinaryStringMacros::binaryTo8ByteHexString(buffer) << __E__;
321 __CFG_COUTV__(DataProcessor::theCircularBuffer_);
323 __CFG_COUT__ << __E__;
329 __CFG_COUT__ << __E__;
332 DataProducerBase::setWrittenSubBuffer<std::string,std::map<std::string,std::string> >();
333 __CFG_COUT__ << __E__;
334 __CFG_COUTV__(DataProcessor::theCircularBuffer_);
341 unsigned long long value = 0xA54321;
344 memcpy((
void *)&buffer[0] ,(
void *)&value , 8 );
347 __FE_COUT__ <<
"Writing to buffer " << buffer.size() <<
" bytes!" << __E__;
348 __FE_COUT__ <<
"Writing to buffer length " << buffer.length() <<
" bytes!" << __E__;
350 __FE_COUT__ <<
"Buffer Data: " << BinaryStringMacros::binaryTo8ByteHexString(buffer) << __E__;
353 FEProducerVInterface::copyToNextBuffer(buffer);
404 void ots::FEOtsUDPProducerTemplateInterface::universalRead(
char *address,
char *returnValue)
406 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
408 __FE_COUT__ <<
"Request: ";
409 for(
unsigned int i=0;i<universalAddressSize_;++i)
410 printf(
"%2.2X",(
unsigned char)address[i]);
413 std::string readBuffer, sendBuffer;
414 OtsUDPFirmwareCore::readAdvanced(sendBuffer,address,1 );
416 OtsUDPHardware::read(sendBuffer, readBuffer);
418 __FE_COUT__ <<
"Result SIZE: " << readBuffer.size() << __E__;
419 std::memcpy(returnValue,readBuffer.substr(2).c_str(),universalDataSize_);
425 void ots::FEOtsUDPProducerTemplateInterface::universalWrite(
char* address,
char* writeValue)
427 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
428 __FE_COUT__ <<
"data size " << universalDataSize_ << __E__;
429 __FE_COUT__ <<
"Sending: ";
430 for(
unsigned int i=0;i<universalAddressSize_;++i)
431 printf(
"%2.2X",(
unsigned char)address[i]);
434 std::string sendBuffer;
435 OtsUDPFirmwareCore::writeAdvanced(sendBuffer,address,writeValue,1 );
436 OtsUDPHardware::write(sendBuffer);
446 void FEOtsUDPProducerTemplateInterface::varTest(__ARGS__)
448 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
449 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
450 for(
auto &argIn:argsIn)
451 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
455 char *address =
new char[universalAddressSize_]{0};
456 char *data =
new char[universalDataSize_]{0};
457 uint64_t macroAddress;
459 std::map<std::string ,uint64_t > macroArgs;
462 macroAddress = 0x1002; memcpy(address,¯oAddress,8);
463 universalRead(address,data); memcpy(¯oArgs[
"myArg"],data,8);
464 __SET_ARG_OUT__(
"myArg",macroArgs[
"myArg"]);
467 macroAddress = 0x1001; memcpy(address,¯oAddress,8);
468 universalRead(address,data); memcpy(¯oArgs[
"outArg1"],data,8);
469 __SET_ARG_OUT__(
"outArg1",macroArgs[
"outArg1"]);
472 macroAddress = 0x1002; memcpy(address,¯oAddress,8);
473 macroArgs[
"myOtherArg"] = __GET_ARG_IN__(
"myOtherArg", uint64_t);
474 memcpy(data,¯oArgs[
"myOtherArg"],8);
475 universalWrite(address,data);
478 macroAddress = 0x1001; memcpy(address,¯oAddress,8);
479 memcpy(data,¯oArgs[
"myArg"],8);
480 universalWrite(address,data);
483 __FE_COUT__ <<
"Sleeping for... " << 4 <<
" milliseconds " << __E__;
491 for(
auto &argOut:argsOut)
492 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;
501 void FEOtsUDPProducerTemplateInterface::varTest2(__ARGS__)
503 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
504 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
505 for(
auto &argIn:argsIn)
506 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
510 char *address =
new char[universalAddressSize_]{0};
511 char *data =
new char[universalDataSize_]{0};
512 uint64_t macroAddress;
514 std::map<std::string ,uint64_t > macroArgs;
517 macroAddress = 0x1002; memcpy(address,¯oAddress,8);
518 universalRead(address,data); memcpy(¯oArgs[
"myArg"],data,8);
519 __SET_ARG_OUT__(
"myArg",macroArgs[
"myArg"]);
522 macroAddress = 0x1001; memcpy(address,¯oAddress,8);
523 universalRead(address,data); memcpy(¯oArgs[
"outArg1"],data,8);
524 __SET_ARG_OUT__(
"outArg1",macroArgs[
"outArg1"]);
527 macroAddress = 0x1002; memcpy(address,¯oAddress,8);
528 macroArgs[
"myOtherArg"] = __GET_ARG_IN__(
"myOtherArg", uint64_t);
529 memcpy(data,¯oArgs[
"myOtherArg"],8);
530 universalWrite(address,data);
533 macroAddress = 0x1001; memcpy(address,¯oAddress,8);
534 memcpy(data,¯oArgs[
"myArg"],8);
535 universalWrite(address,data);
538 __FE_COUT__ <<
"Sleeping for... " << 4 <<
" milliseconds " << __E__;
546 for(
auto &argOut:argsOut)
547 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;