1 #include "otsdaq-components/DAQHardware/OtsUDPHardware.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutMacros.h"
12 OtsUDPHardware::OtsUDPHardware (std::string boardIPAddress,
unsigned int boardPort,
13 unsigned int version,
bool verbose)
16 , OtsUDPBoard_ (boardIPAddress, boardPort)
31 OtsUDPHardware::OtsUDPHardware (std::string hostIPAddress,
unsigned int hostPort,
32 std::string OtsUDPHardwareIPAddress,
unsigned int OtsUDPHardwarePort,
33 unsigned int version,
bool verbose)
34 : Socket (hostIPAddress, hostPort)
36 , OtsUDPBoard_ (OtsUDPHardwareIPAddress, OtsUDPHardwarePort)
41 __COUT__ <<
"Socket for hardware is initialized at IP:Port " <<
42 OtsUDPBoard_.getIPAddress() <<
":" << OtsUDPBoard_.getPort() << __E__;
53 OtsUDPHardware::~OtsUDPHardware(
void)
57 void OtsUDPHardware::write(
const std::string& sendBuffer)
58 throw(std::runtime_error)
85 if(TransceiverSocket::send(OtsUDPBoard_, sendBuffer, verbose_) < 0)
87 __SS__ <<
"Write failed to hardware at IP:Port " <<
88 OtsUDPBoard_.getIPAddress() <<
":" << 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)
104 throw(std::runtime_error)
106 for(
const auto& it : sendBuffer)
137 void OtsUDPHardware::writeAndAcknowledge(
const std::string& buffer,
139 throw(std::runtime_error)
171 TransceiverSocket::send(OtsUDPBoard_, buffer, verbose_);
174 if(timeoutSeconds < 0)
177 if(TransceiverSocket::receive(acknowledgment_,timeoutSeconds) < 0)
179 __SS__ <<
"writeAndAcknowledge failed from hardware at IP:Port " <<
180 OtsUDPBoard_.getIPAddress() <<
":" << OtsUDPBoard_.getPort() <<
181 ". Timeout period of " << timeoutSeconds <<
" seconds reached without response." << std::endl;
182 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
204 if((acknowledgment_[0]>>4))
206 __SS__ <<
"Error in OTS protocol encountered! " << std::setfill(
'0') << std::setw(2) << std::hex <<
207 (((int16_t) acknowledgment_[0]) &0xff) <<
"-" << std::dec << __E__;
212 catch(std::runtime_error &e)
218 __SS__ <<
"Unrecognized exception caught!" << std::endl;
219 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
224 void OtsUDPHardware::writeAndAcknowledge(
const std::vector<std::string>& buffer,
226 throw(std::runtime_error)
228 for(
const auto& it : buffer)
253 writeAndAcknowledge(it);
259 void OtsUDPHardware::read(
const std::string& sendBuffer, std::string& receiveBuffer,
int timeoutSeconds)
260 throw(std::runtime_error)
264 int clearedPackets = OtsUDPHardware::clearReadSocket();
266 __COUT__ <<
"Cleared receive socket buffer: " << clearedPackets <<
" packets cleared." << std::endl;
269 __COUT__ <<
"Sending" << std::endl;
270 TransceiverSocket::send(OtsUDPBoard_, sendBuffer, verbose_);
272 if(timeoutSeconds < 0)
275 __COUT__ <<
"Receiving" << std::endl;
276 if(TransceiverSocket::receive(receiveBuffer,timeoutSeconds,0 ,verbose_) < 0)
278 __SS__ <<
"Read failed from hardware at IP : Port " <<
279 OtsUDPBoard_.getIPAddress() <<
" : " << OtsUDPBoard_.getPort() <<
280 ". Timeout period of " << timeoutSeconds <<
" seconds reached without response." << __E__;
297 if((receiveBuffer[0]>>5))
299 __SS__ <<
"Error in OTS protocol encountered! " << std::setfill(
'0') << std::setw(2) << std::hex <<
300 (((int16_t) receiveBuffer[0]) &0xff) <<
"-" << std::dec << __E__;
305 catch(std::runtime_error &e)
311 __SS__ <<
"Unrecognized exception caught!" << std::endl;
316 void OtsUDPHardware::read(
const std::vector<std::string>& sendBuffers,
317 std::vector<std::string>& receiveBuffers,
319 throw(std::runtime_error)
321 receiveBuffers.resize(sendBuffers.size());
322 auto receiveBufferIterator = receiveBuffers.begin();
323 for(
const auto& sendBuffer : sendBuffers)
324 read(sendBuffer, *(receiveBufferIterator++));
328 void OtsUDPHardware::read(
const std::string& sendBuffer,
329 uint64_t& receiveQuadWord,
331 throw(std::runtime_error)
333 std::string receiveBuffer;
334 read(sendBuffer,receiveBuffer);
337 if(receiveBuffer.length() != 10)
339 __SS__ <<
"Read uint64_t quad-word failed. Invalid size of received buffer: " <<
340 receiveBuffer.length() <<
" != " << 10 << std::endl;
349 receiveQuadWord = *((uint64_t *)&receiveBuffer[2]);
356 void OtsUDPHardware::read(
const std::string& sendBuffer,
357 std::vector<uint64_t>& receiveQuadWords,
359 throw(std::runtime_error)
361 receiveQuadWords.resize(0);
363 std::string receiveBuffer;
364 read(sendBuffer,receiveBuffer);
367 if((receiveBuffer.length()-2) % 8 != 0)
369 __SS__ <<
"Read vector of uint64_t quad-word failed. Invalid size of received buffer: (" <<
370 receiveBuffer.length() <<
" - 2) % 8 != 0" << std::endl;
374 for(
unsigned int i = 2; i < receiveBuffer.length(); i += 8)
376 receiveQuadWords.push_back(uint64_t());
380 receiveQuadWords[receiveQuadWords.size()-1] = *((uint64_t *)&receiveBuffer[i]);
385 void OtsUDPHardware::read(
const std::vector<std::string>& sendBuffers,
386 std::vector<std::vector<uint64_t> >& receiveQuadWordsVector,
388 throw(std::runtime_error)
390 receiveQuadWordsVector.resize(sendBuffers.size());
392 std::string receiveBuffer;
395 for(
unsigned int b = 0; b < sendBuffers.size(); ++b)
397 receiveQuadWordsVector[b].resize(0);
399 read(sendBuffers[b], receiveBuffer);
402 if((receiveBuffer.length()-2) % 8 != 0)
404 __SS__ <<
"Read vector of uint64_t quad-word failed. Invalid size of received buffer: (" <<
405 receiveBuffer.length() <<
" - 2) % 8 != 0" << std::endl;
410 for(
unsigned int i = 2; i < receiveBuffer.length(); i += 8)
412 receiveQuadWordsVector[b].push_back(uint64_t());
413 std::copy_n((
char *)&receiveBuffer[i],
sizeof(uint64_t),
414 &receiveQuadWordsVector[b][receiveQuadWordsVector[b].size()-1]);
426 int OtsUDPHardware::clearReadSocket()
428 std::string dummerReceiveBuffer;
434 while(TransceiverSocket::receive(dummerReceiveBuffer,
443 __COUT__ <<
"I am crashing while trying to read the socket...strange!" << std::endl;