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)
51 OtsUDPHardware::~OtsUDPHardware(
void)
55 void OtsUDPHardware::write(
const std::string& sendBuffer)
56 throw(std::runtime_error)
83 if(TransceiverSocket::send(OtsUDPBoard_, sendBuffer, verbose_) < 0)
85 __SS__ <<
"Write failed." << std::endl;
86 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
87 throw std::runtime_error(ss.str());
90 catch(std::runtime_error &e)
96 __SS__ <<
"Unrecognized exception caught!" << std::endl;
97 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
98 throw std::runtime_error(ss.str());
102 void OtsUDPHardware::write(
const std::vector<std::string>& sendBuffer)
103 throw(std::runtime_error)
105 for(
const auto& it : sendBuffer)
136 void OtsUDPHardware::writeAndAcknowledge(
const std::string& buffer,
138 throw(std::runtime_error)
170 TransceiverSocket::send(OtsUDPBoard_, buffer, verbose_);
173 if(timeoutSeconds < 0)
175 if(TransceiverSocket::receive(acknowledgment_) < 0)
177 __SS__ <<
"writeAndAcknowledge failed. Default timeout period reached without response." << std::endl;
178 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
179 throw std::runtime_error(ss.str());
184 if(TransceiverSocket::receive(acknowledgment_,timeoutSeconds) < 0)
186 __SS__ <<
"writeAndAcknowledge failed. " << timeoutSeconds <<
187 " second timeout period reached without response." << std::endl;
188 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
189 throw std::runtime_error(ss.str());
211 if((acknowledgment_[0]>>4))
213 __SS__ <<
"Error in OTS protocol encountered! " << std::setfill(
'0') << std::setw(2) << std::hex <<
214 (((int16_t) acknowledgment_[0]) &0xff) <<
"-" << std::dec << __E__;
219 catch(std::runtime_error &e)
225 __SS__ <<
"Unrecognized exception caught!" << std::endl;
226 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
227 throw std::runtime_error(ss.str());
231 void OtsUDPHardware::writeAndAcknowledge(
const std::vector<std::string>& buffer,
233 throw(std::runtime_error)
235 for(
const auto& it : buffer)
260 writeAndAcknowledge(it);
266 void OtsUDPHardware::read(
const std::string& sendBuffer, std::string& receiveBuffer,
268 throw(std::runtime_error)
272 int clearedPackets = OtsUDPHardware::clearReadSocket();
274 __COUT__ <<
"Cleared receive socket buffer: " << clearedPackets <<
" packets cleared." << std::endl;
277 __COUT__ <<
"sending" << std::endl;
278 TransceiverSocket::send(OtsUDPBoard_, sendBuffer, verbose_);
279 __COUT__ <<
"receiving" << std::endl;
281 if(timeoutSeconds < 0)
283 if(TransceiverSocket::receive(receiveBuffer,5 ,0 ,verbose_) < 0)
285 __SS__ <<
"Read failed. Default timeout period reached without response." << std::endl;
286 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
287 throw std::runtime_error(ss.str());
292 if(TransceiverSocket::receive(receiveBuffer,timeoutSeconds,0 ,verbose_) < 0)
294 __SS__ <<
"Read failed. " << timeoutSeconds <<
295 " second timeout period reached without response." << std::endl;
296 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
297 throw std::runtime_error(ss.str());
302 __COUT__ <<
"RECEIVED MESSAGE: ";
303 for(uint32_t i=0; i<receiveBuffer.size(); i++)
304 std::cout << std::setfill(
'0') << std::setw(2) << std::hex << (((int16_t) receiveBuffer[i]) &0xff) <<
"-" << std::dec;
305 std::cout << std::endl;
315 if((receiveBuffer[0]>>5))
317 __SS__ <<
"Error in OTS protocol encountered! " << std::setfill(
'0') << std::setw(2) << std::hex <<
318 (((int16_t) receiveBuffer[0]) &0xff) <<
"-" << std::dec << __E__;
323 catch(std::runtime_error &e)
329 __SS__ <<
"Unrecognized exception caught!" << std::endl;
334 void OtsUDPHardware::read(
const std::vector<std::string>& sendBuffers,
335 std::vector<std::string>& receiveBuffers,
337 throw(std::runtime_error)
339 receiveBuffers.resize(sendBuffers.size());
340 auto receiveBufferIterator = receiveBuffers.begin();
341 for(
const auto& sendBuffer : sendBuffers)
342 read(sendBuffer, *(receiveBufferIterator++));
346 void OtsUDPHardware::read(
const std::string& sendBuffer,
347 uint64_t& receiveQuadWord,
349 throw(std::runtime_error)
351 std::string receiveBuffer;
352 read(sendBuffer,receiveBuffer);
355 if(receiveBuffer.length() != 10)
357 __SS__ <<
"Read uint64_t quad-word failed. Invalid size of received buffer: " <<
358 receiveBuffer.length() <<
" != " << 10 << std::endl;
359 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
360 throw std::runtime_error(ss.str());
368 receiveQuadWord = *((uint64_t *)&receiveBuffer[2]);
375 void OtsUDPHardware::read(
const std::string& sendBuffer,
376 std::vector<uint64_t>& receiveQuadWords,
378 throw(std::runtime_error)
380 receiveQuadWords.resize(0);
382 std::string receiveBuffer;
383 read(sendBuffer,receiveBuffer);
386 if((receiveBuffer.length()-2) % 8 != 0)
388 __SS__ <<
"Read vector of uint64_t quad-word failed. Invalid size of received buffer: (" <<
389 receiveBuffer.length() <<
" - 2) % 8 != 0" << std::endl;
390 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
391 throw std::runtime_error(ss.str());
394 for(
unsigned int i = 2; i < receiveBuffer.length(); i += 8)
396 receiveQuadWords.push_back(uint64_t());
400 receiveQuadWords[receiveQuadWords.size()-1] = *((uint64_t *)&receiveBuffer[i]);
405 void OtsUDPHardware::read(
const std::vector<std::string>& sendBuffers,
406 std::vector<std::vector<uint64_t> >& receiveQuadWordsVector,
408 throw(std::runtime_error)
410 receiveQuadWordsVector.resize(sendBuffers.size());
412 std::string receiveBuffer;
415 for(
unsigned int b = 0; b < sendBuffers.size(); ++b)
417 receiveQuadWordsVector[b].resize(0);
419 read(sendBuffers[b], receiveBuffer);
422 if((receiveBuffer.length()-2) % 8 != 0)
424 __SS__ <<
"Read vector of uint64_t quad-word failed. Invalid size of received buffer: (" <<
425 receiveBuffer.length() <<
" - 2) % 8 != 0" << std::endl;
426 __COUT_ERR__ <<
"\n" << ss.str() << std::endl;
427 throw std::runtime_error(ss.str());
431 for(
unsigned int i = 2; i < receiveBuffer.length(); i += 8)
433 receiveQuadWordsVector[b].push_back(uint64_t());
434 std::copy_n((
char *)&receiveBuffer[i],
sizeof(uint64_t),
435 &receiveQuadWordsVector[b][receiveQuadWordsVector[b].size()-1]);
447 int OtsUDPHardware::clearReadSocket()
449 std::string dummerReceiveBuffer;
455 while(TransceiverSocket::receive(dummerReceiveBuffer,