1 #include "otsdaq-components/DAQHardware/OtsUDPHardware.h"
4 #include "otsdaq-core/Macros/CoutMacros.h"
5 #include "otsdaq-core/MessageFacility/MessageFacility.h"
11 OtsUDPHardware::OtsUDPHardware(std::string boardIPAddress,
12 unsigned int boardPort,
17 , OtsUDPBoard_(boardIPAddress, boardPort)
31 OtsUDPHardware::OtsUDPHardware(std::string hostIPAddress,
32 unsigned int hostPort,
33 std::string OtsUDPHardwareIPAddress,
34 unsigned int OtsUDPHardwarePort,
37 : Socket(hostIPAddress, hostPort)
39 , OtsUDPBoard_(OtsUDPHardwareIPAddress, OtsUDPHardwarePort)
44 __COUT__ <<
"Socket for hardware is initialized at IP:Port "
45 << OtsUDPBoard_.getIPAddress() <<
":" << OtsUDPBoard_.getPort() << __E__;
56 OtsUDPHardware::~OtsUDPHardware(
void) {}
59 void OtsUDPHardware::write(
const std::string& sendBuffer)
throw(std::runtime_error)
try
85 if(TransceiverSocket::send(OtsUDPBoard_, sendBuffer, verbose_) < 0)
87 __SS__ <<
"Write failed to hardware at IP:Port " << OtsUDPBoard_.getIPAddress()
88 <<
":" << OtsUDPBoard_.getPort() << __E__;
92 catch(std::runtime_error& e)
98 __SS__ <<
"Unrecognized exception caught!" << std::endl;
103 void OtsUDPHardware::write(
const std::vector<std::string>& sendBuffer)
throw(
106 for(
const auto& it : sendBuffer)
136 void OtsUDPHardware::writeAndAcknowledge(
const std::string& buffer,
137 int timeoutSeconds)
throw(std::runtime_error)
try
167 TransceiverSocket::send(OtsUDPBoard_, buffer, verbose_);
170 if(timeoutSeconds < 0)
173 if(TransceiverSocket::receive(acknowledgment_, timeoutSeconds) < 0)
175 __SS__ <<
"writeAndAcknowledge failed from hardware at IP:Port "
176 << OtsUDPBoard_.getIPAddress() <<
":" << OtsUDPBoard_.getPort()
177 <<
". Timeout period of " << timeoutSeconds
178 <<
" seconds reached without response." << std::endl;
179 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
200 if((acknowledgment_[0] >> 4))
202 __SS__ <<
"Error in OTS protocol encountered! " << std::setfill(
'0')
203 << std::setw(2) << std::hex << (((int16_t)acknowledgment_[0]) & 0xff)
204 <<
"-" << std::dec << __E__;
208 catch(std::runtime_error& e)
214 __SS__ <<
"Unrecognized exception caught!" << std::endl;
215 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
220 void OtsUDPHardware::writeAndAcknowledge(
const std::vector<std::string>& buffer,
221 int timeoutSeconds)
throw(std::runtime_error)
223 for(
const auto& it : buffer)
248 writeAndAcknowledge(it);
254 void OtsUDPHardware::read(
const std::string& sendBuffer,
255 std::string& receiveBuffer,
256 int timeoutSeconds)
throw(std::runtime_error)
try
259 int clearedPackets = OtsUDPHardware::clearReadSocket();
261 __COUT__ <<
"Cleared receive socket buffer: " << clearedPackets
262 <<
" packets cleared." << std::endl;
265 __COUT__ <<
"Sending" << std::endl;
266 TransceiverSocket::send(OtsUDPBoard_, sendBuffer, verbose_);
268 if(timeoutSeconds < 0)
271 __COUT__ <<
"Receiving" << std::endl;
272 if(TransceiverSocket::receive(
273 receiveBuffer, timeoutSeconds, 0 , verbose_) < 0)
275 __SS__ <<
"Read failed from hardware at IP : Port " << OtsUDPBoard_.getIPAddress()
276 <<
" : " << OtsUDPBoard_.getPort() <<
". Timeout period of "
277 << timeoutSeconds <<
" seconds reached without response." << __E__;
295 if((receiveBuffer[0] >> 5))
297 __SS__ <<
"Error in OTS protocol encountered! " << std::setfill(
'0')
298 << std::setw(2) << std::hex << (((int16_t)receiveBuffer[0]) & 0xff) <<
"-"
299 << std::dec << __E__;
303 catch(std::runtime_error& e)
309 __SS__ <<
"Unrecognized exception caught!" << std::endl;
314 void OtsUDPHardware::read(
const std::vector<std::string>& sendBuffers,
315 std::vector<std::string>& receiveBuffers,
316 int timeoutSeconds)
throw(std::runtime_error)
318 receiveBuffers.resize(sendBuffers.size());
319 auto receiveBufferIterator = receiveBuffers.begin();
320 for(
const auto& sendBuffer : sendBuffers)
321 read(sendBuffer, *(receiveBufferIterator++));
325 void OtsUDPHardware::read(
const std::string& sendBuffer,
326 uint64_t& receiveQuadWord,
327 int timeoutSeconds)
throw(std::runtime_error)
329 std::string receiveBuffer;
330 read(sendBuffer, receiveBuffer);
333 if(receiveBuffer.length() != 10)
335 __SS__ <<
"Read uint64_t quad-word failed. Invalid size of received buffer: "
336 << receiveBuffer.length() <<
" != " << 10 << std::endl;
345 receiveQuadWord = *((uint64_t*)&receiveBuffer[2]);
352 void OtsUDPHardware::read(
const std::string& sendBuffer,
353 std::vector<uint64_t>& receiveQuadWords,
354 int timeoutSeconds)
throw(std::runtime_error)
356 receiveQuadWords.resize(0);
358 std::string receiveBuffer;
359 read(sendBuffer, receiveBuffer);
362 if((receiveBuffer.length() - 2) % 8 != 0)
364 __SS__ <<
"Read vector of uint64_t quad-word failed. Invalid size of received "
366 << receiveBuffer.length() <<
" - 2) % 8 != 0" << std::endl;
370 for(
unsigned int i = 2; i < receiveBuffer.length(); i += 8)
372 receiveQuadWords.push_back(uint64_t());
377 receiveQuadWords[receiveQuadWords.size() - 1] = *((uint64_t*)&receiveBuffer[i]);
382 void OtsUDPHardware::read(
const std::vector<std::string>& sendBuffers,
383 std::vector<std::vector<uint64_t> >& receiveQuadWordsVector,
384 int timeoutSeconds)
throw(std::runtime_error)
386 receiveQuadWordsVector.resize(
389 std::string receiveBuffer;
392 for(
unsigned int b = 0; b < sendBuffers.size(); ++b)
394 receiveQuadWordsVector[b].resize(0);
396 read(sendBuffers[b], receiveBuffer);
399 if((receiveBuffer.length() - 2) % 8 != 0)
401 __SS__ <<
"Read vector of uint64_t quad-word failed. Invalid size of "
403 << receiveBuffer.length() <<
" - 2) % 8 != 0" << std::endl;
408 for(
unsigned int i = 2; i < receiveBuffer.length(); i += 8)
410 receiveQuadWordsVector[b].push_back(uint64_t());
411 std::copy_n((
char*)&receiveBuffer[i],
413 &receiveQuadWordsVector[b][receiveQuadWordsVector[b].size() - 1]);
425 int OtsUDPHardware::clearReadSocket()
427 std::string dummerReceiveBuffer;
433 while(TransceiverSocket::receive(dummerReceiveBuffer,
442 __COUT__ <<
"I am crashing while trying to read the socket...strange!"