3 #include "otsdaq-components/FEInterfaces/FEOtsUDPProducerTemplateInterface.h"
4 #include "otsdaq/Macros/CoutMacros.h"
5 #include "otsdaq/Macros/InterfacePluginMacros.h"
6 #include "otsdaq/MessageFacility/MessageFacility.h"
11 FEOtsUDPProducerTemplateInterface::FEOtsUDPProducerTemplateInterface(
12 const std::string& interfaceUID,
13 const ConfigurationTree& theXDAQContextConfigTree,
14 const std::string& interfaceConfigurationPath)
15 : Socket(theXDAQContextConfigTree.getNode(interfaceConfigurationPath)
16 .getNode(
"HostIPAddress")
17 .getValue<std::string>(),
18 theXDAQContextConfigTree.getNode(interfaceConfigurationPath)
20 .getValue<unsigned int>())
22 , FEProducerVInterface(
23 interfaceUID, theXDAQContextConfigTree, interfaceConfigurationPath)
25 ,
OtsUDPHardware(theXDAQContextConfigTree.getNode(interfaceConfigurationPath)
26 .getNode(
"InterfaceIPAddress")
27 .getValue<std::string>(),
28 theXDAQContextConfigTree.getNode(interfaceConfigurationPath)
29 .getNode(
"InterfacePort")
30 .getValue<unsigned int>())
32 .getNode(
"FirmwareVersion")
33 .getValue<unsigned int>())
37 FEVInterface::registerFEMacroFunction(
39 static_cast<FEVInterface::frontEndMacroFunction_t>(
40 &FEOtsUDPProducerTemplateInterface::varTest2),
41 std::vector<std::string>{
"myOtherArg"},
42 std::vector<std::string>{
"myArg",
"outArg1"},
47 FEVInterface::registerFEMacroFunction(
49 static_cast<FEVInterface::frontEndMacroFunction_t>(
50 &FEOtsUDPProducerTemplateInterface::varTest),
51 std::vector<std::string>{
"myOtherArg"},
52 std::vector<std::string>{
"myArg",
"outArg1"},
55 universalAddressSize_ = 8;
56 universalDataSize_ = 8;
60 FEOtsUDPProducerTemplateInterface::~FEOtsUDPProducerTemplateInterface(
void) {}
63 void FEOtsUDPProducerTemplateInterface::configure(
void)
157 __FE_COUT__ <<
"configure" << __E__;
158 __FE_COUT__ <<
"Clearing receive socket buffer: " << OtsUDPHardware::clearReadSocket()
159 <<
" packets cleared." << __E__;
161 std::string sendBuffer;
162 std::string recvBuffer;
163 uint64_t readQuadWord;
166 <<
"Configuration Path Table: "
167 << theXDAQContextConfigTree_.getNode(theConfigurationPath_).getTableName() <<
"-v"
168 << theXDAQContextConfigTree_.getNode(theConfigurationPath_).getTableVersion()
171 __FE_COUT__ <<
"Interface name: "
172 << theXDAQContextConfigTree_.getNode(theConfigurationPath_) << __E__;
174 __FE_COUT__ <<
"Configured Firmware Version: "
175 << theXDAQContextConfigTree_.getNode(theConfigurationPath_)
176 .getNode(
"FirmwareVersion")
177 .getValue<
unsigned int>()
180 __FE_COUT__ <<
"Setting Destination IP: "
181 << theXDAQContextConfigTree_.getNode(theConfigurationPath_)
182 .getNode(
"StreamToIPAddress")
183 .getValue<std::string>()
185 __FE_COUT__ <<
"And Destination Port: "
186 << theXDAQContextConfigTree_.getNode(theConfigurationPath_)
187 .getNode(
"StreamToPort")
188 .getValue<
unsigned int>()
191 OtsUDPFirmwareCore::setDataDestination(
193 theXDAQContextConfigTree_.getNode(theConfigurationPath_)
194 .getNode(
"StreamToIPAddress")
195 .getValue<std::string>(),
196 theXDAQContextConfigTree_.getNode(theConfigurationPath_)
197 .getNode(
"StreamToPort")
198 .getValue<uint64_t>());
199 OtsUDPHardware::write(sendBuffer);
201 __FE_COUT__ <<
"Reading back burst dest MAC/IP/Port: " << __E__;
203 OtsUDPFirmwareCore::readDataDestinationMAC(sendBuffer);
204 OtsUDPHardware::read(sendBuffer, readQuadWord);
206 OtsUDPFirmwareCore::readDataDestinationIP(sendBuffer);
207 OtsUDPHardware::read(sendBuffer, readQuadWord);
209 OtsUDPFirmwareCore::readDataDestinationPort(sendBuffer);
210 OtsUDPHardware::read(sendBuffer, readQuadWord);
212 OtsUDPFirmwareCore::readControlDestinationPort(sendBuffer);
213 OtsUDPHardware::read(sendBuffer, readQuadWord);
216 FEVInterface::runSequenceOfCommands(
"LinkToConfigureSequence");
218 __FE_COUT__ <<
"Done with ots Template configuring." << __E__;
229 void FEOtsUDPProducerTemplateInterface::halt(
void)
231 __FE_COUT__ <<
"\tHalt" << __E__;
236 void FEOtsUDPProducerTemplateInterface::pause(
void)
238 __FE_COUT__ <<
"\tPause" << __E__;
243 void FEOtsUDPProducerTemplateInterface::resume(
void)
245 __FE_COUT__ <<
"\tResume" << __E__;
250 void FEOtsUDPProducerTemplateInterface::start(std::string)
252 __FE_COUT__ <<
"\tStart" << __E__;
271 FEVInterface::runSequenceOfCommands(
"LinkToStartSequence");
273 std::string sendBuffer;
274 OtsUDPFirmwareCore::startBurst(sendBuffer);
275 OtsUDPHardware::write(sendBuffer);
279 void FEOtsUDPProducerTemplateInterface::stop(
void)
281 __FE_COUT__ <<
"\tStop" << __E__;
285 FEVInterface::runSequenceOfCommands(
"LinkToStopSequence");
287 std::string sendBuffer;
288 OtsUDPFirmwareCore::stopBurst(sendBuffer);
289 OtsUDPHardware::write(sendBuffer);
293 bool FEOtsUDPProducerTemplateInterface::running(
void)
295 __FE_COUT__ <<
"\tRunning" << __E__;
301 while (WorkLoop::continueWorkLoop_)
320 if (DataProducerBase::attachToEmptySubBuffer(dataP_, headerP_) < 0)
322 __CFG_COUT__ <<
"There are no available buffers! Retrying...after "
323 "waiting 10 milliseconds!"
332 unsigned long long value = 0xB57321;
333 std::string& buffer = *dataP_;
338 (
void*)&buffer[0] , (
void*)&value , 8 );
341 __CFG_COUT__ <<
"Writing to buffer " << buffer.size() <<
" bytes!"
343 __CFG_COUT__ <<
"Writing to buffer length " << buffer.length()
344 <<
" bytes!" << __E__;
346 __CFG_COUT__ <<
"Buffer Data: "
347 << BinaryStringMacros::binaryNumberToHexString(buffer)
350 __CFG_COUTV__(DataProcessor::theCircularBuffer_);
352 __CFG_COUT__ << __E__;
354 __CFG_COUT__ << __E__;
356 DataProducerBase::setWrittenSubBuffer<
358 std::map<std::string, std::string> >();
359 __CFG_COUT__ << __E__;
360 __CFG_COUTV__(DataProcessor::theCircularBuffer_);
365 unsigned long long value = 0xA54321;
370 memcpy((
void*)&buffer[0] , (
void*)&value , 8 );
373 __FE_COUT__ <<
"Writing to buffer " << buffer.size() <<
" bytes!" << __E__;
374 __FE_COUT__ <<
"Writing to buffer length " << buffer.length() <<
" bytes!"
377 __FE_COUT__ <<
"Buffer Data: "
378 << BinaryStringMacros::binaryNumberToHexString(buffer) << __E__;
380 FEProducerVInterface::copyToNextBuffer(buffer);
430 void ots::FEOtsUDPProducerTemplateInterface::universalRead(
char* address,
433 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
435 __FE_COUT__ <<
"Request: ";
436 for (
unsigned int i = 0; i < universalAddressSize_; ++i)
437 printf(
"%2.2X", (
unsigned char)address[i]);
440 std::string readBuffer, sendBuffer;
441 OtsUDPFirmwareCore::readAdvanced(sendBuffer, address, 1 );
443 OtsUDPHardware::read(sendBuffer, readBuffer);
445 __FE_COUT__ <<
"Result SIZE: " << readBuffer.size() << __E__;
446 std::memcpy(returnValue, readBuffer.substr(2).c_str(), universalDataSize_);
452 void ots::FEOtsUDPProducerTemplateInterface::universalWrite(
char* address,
455 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
456 __FE_COUT__ <<
"data size " << universalDataSize_ << __E__;
457 __FE_COUT__ <<
"Sending: ";
458 for (
unsigned int i = 0; i < universalAddressSize_; ++i)
459 printf(
"%2.2X", (
unsigned char)address[i]);
462 std::string sendBuffer;
463 OtsUDPFirmwareCore::writeAdvanced(sendBuffer, address, writeValue, 1 );
464 OtsUDPHardware::write(sendBuffer);
471 void FEOtsUDPProducerTemplateInterface::varTest(__ARGS__)
473 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
474 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
475 for (
auto& argIn : argsIn)
476 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
480 char* address =
new char[universalAddressSize_] {
482 char* data =
new char[universalDataSize_] {
484 uint64_t macroAddress;
486 std::map<std::string , uint64_t >
490 macroAddress = 0x1002;
491 memcpy(address, ¯oAddress, 8);
492 universalRead(address, data);
493 memcpy(¯oArgs[
"myArg"], data, 8);
494 __SET_ARG_OUT__(
"myArg", macroArgs[
"myArg"]);
497 macroAddress = 0x1001;
498 memcpy(address, ¯oAddress, 8);
499 universalRead(address, data);
500 memcpy(¯oArgs[
"outArg1"], data, 8);
501 __SET_ARG_OUT__(
"outArg1", macroArgs[
"outArg1"]);
505 macroAddress = 0x1002;
506 memcpy(address, ¯oAddress, 8);
507 macroArgs[
"myOtherArg"] = __GET_ARG_IN__(
510 memcpy(data, ¯oArgs[
"myOtherArg"], 8);
511 universalWrite(address, data);
514 macroAddress = 0x1001;
518 memcpy(data, ¯oArgs[
"myArg"], 8);
519 universalWrite(address, data);
522 __FE_COUT__ <<
"Sleeping for... " << 4 <<
" milliseconds " << __E__;
529 for (
auto& argOut : argsOut)
530 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;
538 void FEOtsUDPProducerTemplateInterface::varTest2(__ARGS__)
540 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
541 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
542 for (
auto& argIn : argsIn)
543 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
547 char* address =
new char[universalAddressSize_] {
549 char* data =
new char[universalDataSize_] {
551 uint64_t macroAddress;
553 std::map<std::string , uint64_t >
557 macroAddress = 0x1002;
558 memcpy(address, ¯oAddress, 8);
559 universalRead(address, data);
560 memcpy(¯oArgs[
"myArg"], data, 8);
561 __SET_ARG_OUT__(
"myArg", macroArgs[
"myArg"]);
564 macroAddress = 0x1001;
565 memcpy(address, ¯oAddress, 8);
566 universalRead(address, data);
567 memcpy(¯oArgs[
"outArg1"], data, 8);
568 __SET_ARG_OUT__(
"outArg1", macroArgs[
"outArg1"]);
572 macroAddress = 0x1002;
573 memcpy(address, ¯oAddress, 8);
574 macroArgs[
"myOtherArg"] = __GET_ARG_IN__(
577 memcpy(data, ¯oArgs[
"myOtherArg"], 8);
578 universalWrite(address, data);
581 macroAddress = 0x1001;
585 memcpy(data, ¯oArgs[
"myArg"], 8);
586 universalWrite(address, data);
589 __FE_COUT__ <<
"Sleeping for... " << 4 <<
" milliseconds " << __E__;
596 for (
auto& argOut : argsOut)
597 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;