1 #include "otsdaq-components/FEInterfaces/FEOtsUDPTemplateInterface.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutMacros.h"
4 #include "otsdaq-core/Macros/InterfacePluginMacros.h"
11 FEOtsUDPTemplateInterface::FEOtsUDPTemplateInterface(
const std::string& interfaceUID,
const ConfigurationTree& theXDAQContextConfigTree,
const std::string& interfaceConfigurationPath)
13 theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"HostIPAddress").getValue<std::string>()
14 , theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"HostPort").getValue<unsigned int>())
15 , FEVInterface (interfaceUID, theXDAQContextConfigTree, interfaceConfigurationPath)
16 ,
OtsUDPHardware (theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"InterfaceIPAddress").getValue<std::string>()
17 , theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"InterfacePort").getValue<unsigned int>())
18 ,
OtsUDPFirmwareDataGen(theXDAQContextConfigTree.getNode(interfaceConfigurationPath).getNode(
"FirmwareVersion").getValue<unsigned int>())
22 universalAddressSize_ = 8;
23 universalDataSize_ = 8;
29 FEVInterface::registerFEMacroFunction(
"varTest2",
30 static_cast<FEVInterface::frontEndMacroFunction_t>(&FEOtsUDPTemplateInterface::varTest2),
31 std::vector<std::string>{
"myOtherArg"},
32 std::vector<std::string>{
"myArg",
"outArg1"},
37 FEVInterface::registerFEMacroFunction(
"varTest",
38 static_cast<FEVInterface::frontEndMacroFunction_t>(&FEOtsUDPTemplateInterface::varTest),
39 std::vector<std::string>{
"myOtherArg"},
40 std::vector<std::string>{
"myArg",
"outArg1"},
43 std::vector<frontEndMacroArg_t> argsIn;
44 __SET_ARG_IN__(
"myOtherArg",(
unsigned int)5);
46 std::vector<frontEndMacroArg_t> argsOut;
48 __FE_COUTV__(StringMacros::vectorToString(argsIn));
50 runSelfFrontEndMacro(
"varTest2",
53 __FE_COUTV__(StringMacros::vectorToString(argsOut));
54 __FE_COUTV__(FEVInterface::getFEMacroArgument(
58 std::string a = FEVInterface::getFEMacroArgument(
60 double b = getFEMacroArgumentValue<double>(
62 unsigned short c = getFEMacroArgumentValue<unsigned short>(
73 FEOtsUDPTemplateInterface::~FEOtsUDPTemplateInterface(
void)
77 void FEOtsUDPTemplateInterface::configure(
void)
170 __FE_COUT__ <<
"configure" << __E__;
171 __FE_COUT__ <<
"Clearing receive socket buffer: " << OtsUDPHardware::clearReadSocket() <<
" packets cleared." << __E__;
173 std::string sendBuffer;
174 std::string recvBuffer;
175 uint64_t readQuadWord;
177 __FE_COUT__ <<
"Configuration Path Table: " <<
178 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getConfigurationName() <<
180 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getConfigurationVersion() <<
183 __FE_COUT__ <<
"Interface name: " <<
184 theXDAQContextConfigTree_.getNode(theConfigurationPath_) << __E__;
186 __FE_COUT__ <<
"Configured Firmware Version: " <<
187 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"FirmwareVersion").getValue<
unsigned int>()
190 __FE_COUT__ <<
"Setting Destination IP: " <<
191 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToIPAddress").getValue<std::string>()
193 __FE_COUT__ <<
"And Destination Port: " <<
194 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToPort").getValue<
unsigned int>()
197 OtsUDPFirmwareCore::setDataDestination(sendBuffer,
198 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToIPAddress").getValue<std::string>(),
199 theXDAQContextConfigTree_.getNode(theConfigurationPath_).getNode(
"StreamToPort").getValue<uint64_t>()
201 OtsUDPHardware::write(sendBuffer);
203 __FE_COUT__ <<
"Reading back burst dest MAC/IP/Port: " << __E__;
205 OtsUDPFirmwareCore::readDataDestinationMAC(sendBuffer);
206 OtsUDPHardware::read(sendBuffer,readQuadWord);
208 OtsUDPFirmwareCore::readDataDestinationIP(sendBuffer);
209 OtsUDPHardware::read(sendBuffer,readQuadWord);
211 OtsUDPFirmwareCore::readDataDestinationPort(sendBuffer);
212 OtsUDPHardware::read(sendBuffer,readQuadWord);
216 OtsUDPFirmwareCore::readControlDestinationPort(sendBuffer);
217 OtsUDPHardware::read(sendBuffer,readQuadWord);
220 FEVInterface::runSequenceOfCommands(
"LinkToConfigureSequence");
222 __FE_COUT__ <<
"Done with ots Template configuring." << __E__;
232 void FEOtsUDPTemplateInterface::halt(
void)
234 __FE_COUT__ <<
"\tHalt" << __E__;
239 void FEOtsUDPTemplateInterface::pause(
void)
241 __FE_COUT__ <<
"\tPause" << __E__;
246 void FEOtsUDPTemplateInterface::resume(
void)
248 __FE_COUT__ <<
"\tResume" << __E__;
253 void FEOtsUDPTemplateInterface::start(std::string )
255 __FE_COUT__ <<
"\tStart" << __E__;
277 FEVInterface::runSequenceOfCommands(
"LinkToStartSequence");
279 std::string sendBuffer;
280 OtsUDPFirmwareCore::startBurst(sendBuffer);
281 OtsUDPHardware::write(sendBuffer);
285 void FEOtsUDPTemplateInterface::stop(
void)
287 __FE_COUT__ <<
"\tStop" << __E__;
291 FEVInterface::runSequenceOfCommands(
"LinkToStopSequence");
293 std::string sendBuffer;
294 OtsUDPFirmwareCore::stopBurst(sendBuffer);
295 OtsUDPHardware::write(sendBuffer);
299 bool FEOtsUDPTemplateInterface::running(
void)
301 __FE_COUT__ <<
"\tRunning" << __E__;
308 while(WorkLoop::continueWorkLoop_)
373 void ots::FEOtsUDPTemplateInterface::universalRead(
char *address,
char *returnValue)
375 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
377 __FE_COUT__ <<
"Universal Read Address: ";
378 for(
unsigned int i=0;i<universalAddressSize_;++i)
379 printf(
"%2.2X",(
unsigned char)address[i]);
382 std::string readBuffer, sendBuffer;
383 OtsUDPFirmwareCore::readAdvanced(sendBuffer,address,1 );
385 OtsUDPHardware::read(sendBuffer, readBuffer);
387 __FE_COUT__ <<
"Result SIZE: " << readBuffer.size() << __E__;
388 std::memcpy(returnValue,readBuffer.substr(2).c_str(),universalDataSize_);
390 __FE_COUT__ <<
"Universal Read Data: ";
391 for(
unsigned int i=0;i<universalDataSize_;++i)
392 printf(
"%2.2X",(
unsigned char)returnValue[i]);
400 void ots::FEOtsUDPTemplateInterface::universalWrite(
char* address,
char* writeValue)
402 __FE_COUT__ <<
"address size " << universalAddressSize_ << __E__;
403 __FE_COUT__ <<
"data size " << universalDataSize_ << __E__;
404 __FE_COUT__ <<
"Universal Write Address: ";
405 for(
unsigned int i=0;i<universalAddressSize_;++i)
406 printf(
"%2.2X",(
unsigned char)address[i]);
408 __FE_COUT__ <<
"Universal Write Data: ";
409 for(
unsigned int i=0;i<universalDataSize_;++i)
410 printf(
"%2.2X",(
unsigned char)writeValue[i]);
413 std::string sendBuffer;
414 OtsUDPFirmwareCore::writeAdvanced(sendBuffer,address,writeValue,1 );
415 OtsUDPHardware::write(sendBuffer);
425 void FEOtsUDPTemplateInterface::varTest(__ARGS__)
427 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
428 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
429 for(
auto &argIn:argsIn)
430 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
434 char *address =
new char[universalAddressSize_]{0};
435 char *data =
new char[universalDataSize_]{0};
436 uint64_t macroAddress;
438 std::map<std::string ,uint64_t > macroArgs;
441 macroAddress = 0x1002; memcpy(address,¯oAddress,8);
442 universalRead(address,data); memcpy(¯oArgs[
"myArg"],data,8);
443 __SET_ARG_OUT__(
"myArg",macroArgs[
"myArg"]);
446 macroAddress = 0x1001; memcpy(address,¯oAddress,8);
447 universalRead(address,data); memcpy(¯oArgs[
"outArg1"],data,8);
448 __SET_ARG_OUT__(
"outArg1",macroArgs[
"outArg1"]);
451 macroAddress = 0x1002; memcpy(address,¯oAddress,8);
452 macroArgs[
"myOtherArg"] = __GET_ARG_IN__(
"myOtherArg", uint64_t);
453 memcpy(data,¯oArgs[
"myOtherArg"],8);
454 universalWrite(address,data);
457 macroAddress = 0x1001; memcpy(address,¯oAddress,8);
458 memcpy(data,¯oArgs[
"myArg"],8);
459 universalWrite(address,data);
462 __FE_COUT__ <<
"Sleeping for... " << 4 <<
" milliseconds " << __E__;
470 for(
auto &argOut:argsOut)
471 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;
480 void FEOtsUDPTemplateInterface::varTest2(__ARGS__)
482 __FE_COUT__ <<
"# of input args = " << argsIn.size() << __E__;
483 __FE_COUT__ <<
"# of output args = " << argsOut.size() << __E__;
484 for(
auto &argIn:argsIn)
485 __FE_COUT__ << argIn.first <<
": " << argIn.second << __E__;
487 __SET_ARG_OUT__(
"myArg",
"hello2");
488 uint64_t macroData = __GET_ARG_IN__(
"myOtherArg", uint64_t);
490 __SET_ARG_OUT__(
"outArg1",macroData);
492 for(
auto &argOut:argsOut)
493 __FE_COUT__ << argOut.first <<
": " << argOut.second << __E__;