3 #include "otsdaq-components/FEInterfaces/FEOtsUDPTemplateInterface.h"
4 #include "otsdaq/Macros/CoutMacros.h"
5 #include "otsdaq/Macros/InterfacePluginMacros.h"
6 #include "otsdaq/MessageFacility/MessageFacility.h"
11 FEOtsUDPTemplateInterface::FEOtsUDPTemplateInterface(
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>())
21 , FEVInterface(interfaceUID, theXDAQContextConfigTree, interfaceConfigurationPath)
22 ,
OtsUDPHardware(theXDAQContextConfigTree.getNode(interfaceConfigurationPath)
23 .getNode(
"InterfaceIPAddress")
24 .getValue<std::string>(),
25 theXDAQContextConfigTree.getNode(interfaceConfigurationPath)
26 .getNode(
"InterfacePort")
27 .getValue<unsigned int>())
29 .getNode(
"FirmwareVersion")
30 .getValue<unsigned int>())
34 FEVInterface::registerFEMacroFunction(
36 static_cast<FEVInterface::frontEndMacroFunction_t>(
37 &FEOtsUDPTemplateInterface::test),
38 std::vector<std::string>{},
39 std::vector<std::string>{
"outArg1"},
42 universalAddressSize_ = 8;
43 universalDataSize_ = 8;
50 FEVInterface::registerFEMacroFunction(
52 static_cast<FEVInterface::frontEndMacroFunction_t>(
53 &FEOtsUDPTemplateInterface::varTest2),
54 std::vector<std::string>{
"myOtherArg"},
55 std::vector<std::string>{
"myArg",
"outArg1"},
60 FEVInterface::registerFEMacroFunction(
62 static_cast<FEVInterface::frontEndMacroFunction_t>(
63 &FEOtsUDPTemplateInterface::varTest),
64 std::vector<std::string>{
"myOtherArg"},
65 std::vector<std::string>{
"myArg",
"outArg1"},
68 std::vector<frontEndMacroArg_t> argsIn;
69 __SET_ARG_IN__(
"myOtherArg", (
unsigned int)5);
71 std::vector<frontEndMacroArg_t> argsOut;
73 __FE_COUTV__(StringMacros::vectorToString(argsIn));
75 runSelfFrontEndMacro(
"varTest2", argsIn, argsOut);
77 __FE_COUTV__(StringMacros::vectorToString(argsOut));
78 __FE_COUTV__(FEVInterface::getFEMacroArgument(argsOut,
"outArg1"));
81 std::string a = FEVInterface::getFEMacroArgument(argsOut,
"myArg");
82 double b = getFEMacroArgumentValue<double>(argsOut,
"outArg1");
84 getFEMacroArgumentValue<unsigned short>(argsOut,
"outArg1");
94 FEOtsUDPTemplateInterface::~FEOtsUDPTemplateInterface(
void) {}
97 void FEOtsUDPTemplateInterface::configure(
void)
197 __FE_COUT__ <<
"configure" << __E__;
198 __FE_COUT__ <<
"Clearing receive socket buffer: " << OtsUDPHardware::clearReadSocket()
199 <<
" packets cleared." << __E__;
201 std::string sendBuffer;
202 std::string recvBuffer;
203 uint64_t readQuadWord;
206 <<
"Configuration Path Table: "
207 << theXDAQContextConfigTree_.getNode(theConfigurationPath_).getTableName() <<
"-v"
208 << theXDAQContextConfigTree_.getNode(theConfigurationPath_).getTableVersion()
211 __FE_COUT__ <<
"Interface name: "
212 << theXDAQContextConfigTree_.getNode(theConfigurationPath_) << __E__;
214 __FE_COUT__ <<
"Configured Firmware Version: "
215 << theXDAQContextConfigTree_.getNode(theConfigurationPath_)
216 .getNode(
"FirmwareVersion")
217 .getValue<
unsigned int>()
220 __FE_COUT__ <<
"Setting Destination IP: "
221 << theXDAQContextConfigTree_.getNode(theConfigurationPath_)
222 .getNode(
"StreamToIPAddress")
223 .getValue<std::string>()
225 __FE_COUT__ <<
"And Destination Port: "
226 << theXDAQContextConfigTree_.getNode(theConfigurationPath_)
227 .getNode(
"StreamToPort")
228 .getValue<
unsigned int>()
231 OtsUDPFirmwareCore::setDataDestination(
233 theXDAQContextConfigTree_.getNode(theConfigurationPath_)
234 .getNode(
"StreamToIPAddress")
235 .getValue<std::string>(),
236 theXDAQContextConfigTree_.getNode(theConfigurationPath_)
237 .getNode(
"StreamToPort")
238 .getValue<uint64_t>());
239 OtsUDPHardware::write(sendBuffer);
241 __FE_COUT__ <<
"Reading back burst dest MAC/IP/Port: " << __E__;
243 OtsUDPFirmwareCore::readDataDestinationMAC(sendBuffer);
244 OtsUDPHardware::read(sendBuffer, readQuadWord);
246 OtsUDPFirmwareCore::readDataDestinationIP(sendBuffer);
247 OtsUDPHardware::read(sendBuffer, readQuadWord);
249 OtsUDPFirmwareCore::readDataDestinationPort(sendBuffer);
250 OtsUDPHardware::read(sendBuffer, readQuadWord);
252 OtsUDPFirmwareCore::readControlDestinationPort(sendBuffer);
253 OtsUDPHardware::read(sendBuffer, readQuadWord);
256 FEVInterface::runSequenceOfCommands(
"LinkToConfigureSequence");
258 __FE_COUT__ <<
"Done with ots Template configuring." << __E__;
268 void FEOtsUDPTemplateInterface::halt(
void)
270 __FE_COUT__ <<
"\tHalt" << __E__;
275 void FEOtsUDPTemplateInterface::pause(
void)
277 __FE_COUT__ <<
"\tPause" << __E__;
282 void FEOtsUDPTemplateInterface::resume(
void)
284 __FE_COUT__ <<
"\tResume" << __E__;
289 void FEOtsUDPTemplateInterface::start(std::string)
291 __FE_COUT__ <<
"\tStart" << __E__;
310 FEVInterface::runSequenceOfCommands(
"LinkToStartSequence");
312 std::string sendBuffer;
313 OtsUDPFirmwareCore::startBurst(sendBuffer);
314 OtsUDPHardware::write(sendBuffer);
318 void FEOtsUDPTemplateInterface::stop(
void)
320 __FE_COUT__ <<
"\tStop" << __E__;
324 FEVInterface::runSequenceOfCommands(
"LinkToStopSequence");
326 std::string sendBuffer;
327 OtsUDPFirmwareCore::stopBurst(sendBuffer);
328 OtsUDPHardware::write(sendBuffer);
332 bool FEOtsUDPTemplateInterface::running(
void)
334 __FE_COUT__ <<
"\tRunning" << __E__;
340 while (WorkLoop::continueWorkLoop_)
406 void ots::FEOtsUDPTemplateInterface::universalRead(
char* address,
char* returnValue)
408 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
410 __FE_COUT__ <<
"Universal Read Address: 0x";
411 for (
unsigned int i = 0; i < universalAddressSize_; ++i)
412 printf(
"%2.2X", (
unsigned char)address[universalAddressSize_ - 1 - i]);
415 std::string readBuffer, sendBuffer;
416 OtsUDPFirmwareCore::readAdvanced(sendBuffer, address, 1 );
418 OtsUDPHardware::read(sendBuffer, readBuffer);
420 __FE_COUT__ <<
"Result SIZE: " << readBuffer.size() << __E__;
421 std::memcpy(returnValue, readBuffer.substr(2).c_str(), universalDataSize_);
423 __FE_COUT__ <<
"Universal Read Data: 0x";
424 for (
unsigned int i = 0; i < universalDataSize_; ++i)
425 printf(
"%2.2X", (
unsigned char)returnValue[universalDataSize_ - 1 - i]);
433 void ots::FEOtsUDPTemplateInterface::universalWrite(
char* address,
char* writeValue)
435 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
436 __FE_COUT__ <<
"data size " << universalDataSize_ << __E__;
437 __FE_COUT__ <<
"Universal Write Address: 0x";
438 for (
unsigned int i = 0; i < universalAddressSize_; ++i)
439 printf(
"%2.2X", (
unsigned char)address[universalAddressSize_ - 1 - i]);
441 __FE_COUT__ <<
"Universal Write Data: 0x";
442 for (
unsigned int i = 0; i < universalDataSize_; ++i)
443 printf(
"%2.2X", (
unsigned char)writeValue[universalDataSize_ - 1 - i]);
446 std::string sendBuffer;
447 OtsUDPFirmwareCore::writeAdvanced(sendBuffer, address, writeValue, 1 );
448 OtsUDPHardware::write(sendBuffer);
455 void FEOtsUDPTemplateInterface::varTest(__ARGS__)
457 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
458 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
459 for (
auto& argIn : argsIn)
460 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
464 char* address =
new char[universalAddressSize_] {
466 char* data =
new char[universalDataSize_] {
468 uint64_t macroAddress;
470 std::map<std::string , uint64_t >
474 macroAddress = 0x1002;
475 memcpy(address, ¯oAddress, 8);
476 universalRead(address, data);
477 memcpy(¯oArgs[
"myArg"], data, 8);
478 __SET_ARG_OUT__(
"myArg", macroArgs[
"myArg"]);
481 macroAddress = 0x1001;
482 memcpy(address, ¯oAddress, 8);
483 universalRead(address, data);
484 memcpy(¯oArgs[
"outArg1"], data, 8);
485 __SET_ARG_OUT__(
"outArg1", macroArgs[
"outArg1"]);
489 macroAddress = 0x1002;
490 memcpy(address, ¯oAddress, 8);
491 macroArgs[
"myOtherArg"] = __GET_ARG_IN__(
494 memcpy(data, ¯oArgs[
"myOtherArg"], 8);
495 universalWrite(address, data);
498 macroAddress = 0x1001;
502 memcpy(data, ¯oArgs[
"myArg"], 8);
503 universalWrite(address, data);
506 __FE_COUT__ <<
"Sleeping for... " << 4 <<
" milliseconds " << __E__;
513 for (
auto& argOut : argsOut)
514 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;
522 void FEOtsUDPTemplateInterface::varTest2(__ARGS__)
524 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
525 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
526 for (
auto& argIn : argsIn)
527 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
529 __SET_ARG_OUT__(
"myArg",
"hello2");
530 uint64_t macroData = __GET_ARG_IN__(
"myOtherArg", uint64_t);
532 __SET_ARG_OUT__(
"outArg1", macroData);
534 for (
auto& argOut : argsOut)
535 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;
543 void FEOtsUDPTemplateInterface::test(__ARGS__)
545 __CFG_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
546 __CFG_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
547 for (
auto& argIn : argsIn)
548 __CFG_COUT__ << argIn.first <<
": " << argIn.second << __E__;
552 char* address =
new char[universalAddressSize_] {
554 char* data =
new char[universalDataSize_] {
556 uint64_t macroAddress;
558 std::map<std::string , uint64_t >
563 memcpy(address, ¯oAddress, 8);
565 memcpy(data, ¯oData, 8);
566 universalWrite(address, data);
570 memcpy(address, ¯oAddress, 8);
571 universalRead(address, data);
572 memcpy(¯oArgs[
"outArg1"], data, 8);
573 __SET_ARG_OUT__(
"outArg1", macroArgs[
"outArg1"]);
580 for (
auto& argOut : argsOut)
581 __CFG_COUT__ << argOut.first <<
": " << argOut.second << __E__;