DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::sspmodules::EthernetDevice Class Reference

#include <EthernetDevice.hpp>

Inheritance diagram for dunedaq::sspmodules::EthernetDevice:
[legend]
Collaboration diagram for dunedaq::sspmodules::EthernetDevice:
[legend]

Public Member Functions

 EthernetDevice (unsigned long ipAddress)
 
virtual bool IsOpen ()
 
virtual void Close ()
 
virtual void DevicePurgeComm ()
 
virtual void DevicePurgeData ()
 
virtual void DeviceQueueStatus (unsigned int *numWords)
 
virtual void DeviceReceive (std::vector< unsigned int > &data, unsigned int size)
 
virtual void DeviceRead (unsigned int address, unsigned int *value)
 
virtual void DeviceReadMask (unsigned int address, unsigned int mask, unsigned int *value)
 
virtual void DeviceWrite (unsigned int address, unsigned int value)
 
virtual void DeviceWriteMask (unsigned int address, unsigned int mask, unsigned int value)
 
virtual void DeviceSet (unsigned int address, unsigned int mask)
 
virtual void DeviceClear (unsigned int address, unsigned int mask)
 
virtual void DeviceArrayRead (unsigned int address, unsigned int size, unsigned int *data)
 
virtual void DeviceArrayWrite (unsigned int address, unsigned int size, unsigned int *data)
 
void SendReceive (dunedaq::sspmodules::CtrlPacket &tx, dunedaq::sspmodules::CtrlPacket &rx, unsigned int txSize, unsigned int rxSizeExpected, unsigned int retryCount=0)
 
void SendEthernet (dunedaq::sspmodules::CtrlPacket &tx, unsigned int txSize)
 
void ReceiveEthernet (dunedaq::sspmodules::CtrlPacket &rx, unsigned int rxSizeExpected)
 
void DevicePurge (boost::asio::ip::tcp::socket &socket)
 
- Public Member Functions inherited from dunedaq::sspmodules::Device
virtual ~Device ()
 

Private Member Functions

virtual void Open (bool slowControlOnly)
 

Private Attributes

bool isOpen
 
boost::asio::ip::tcp::socket fCommSocket
 
boost::asio::ip::tcp::socket fDataSocket
 
boost::asio::ip::address fIP
 

Static Private Attributes

static boost::asio::io_service fIo_service
 

Friends

class DeviceManager
 

Additional Inherited Members

- Protected Attributes inherited from dunedaq::sspmodules::Device
bool fSlowControlOnly
 

Detailed Description

Definition at line 28 of file EthernetDevice.hpp.

Constructor & Destructor Documentation

◆ EthernetDevice()

dunedaq::sspmodules::EthernetDevice::EthernetDevice ( unsigned long ipAddress)
explicit

Definition at line 21 of file EthernetDevice.cxx.

22 :
23 isOpen(false)
26 , fIP(boost::asio::ip::address_v4(ipAddress))
27{}
boost::asio::ip::tcp::socket fCommSocket
static boost::asio::io_service fIo_service
boost::asio::ip::tcp::socket fDataSocket

Member Function Documentation

◆ Close()

void dunedaq::sspmodules::EthernetDevice::Close ( )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 62 of file EthernetDevice.cxx.

63{
64 isOpen = false;
65 // dune::DAQLogger::LogInfo("SSP_EthernetDevice")<<"Device closed"<<std::endl;
66}

◆ DeviceArrayRead()

void dunedaq::sspmodules::EthernetDevice::DeviceArrayRead ( unsigned int address,
unsigned int size,
unsigned int * data )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 196 of file EthernetDevice.cxx.

197{
198 unsigned int i = 0;
201 unsigned int txSize;
202 unsigned int rxSizeExpected;
203
207 tx.header.size = size;
209 txSize = sizeof(dunedaq::sspmodules::CtrlHeader);
210 rxSizeExpected = sizeof(dunedaq::sspmodules::CtrlHeader) + (sizeof(unsigned int) * size);
211
212 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
213 for (i = 0; i < rx.header.size; i++) {
214 data[i] = rx.data[i];
215 }
216}
void SendReceive(dunedaq::sspmodules::CtrlPacket &tx, dunedaq::sspmodules::CtrlPacket &rx, unsigned int txSize, unsigned int rxSizeExpected, unsigned int retryCount=0)
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size

◆ DeviceArrayWrite()

void dunedaq::sspmodules::EthernetDevice::DeviceArrayWrite ( unsigned int address,
unsigned int size,
unsigned int * data )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 219 of file EthernetDevice.cxx.

220{
221 unsigned int i = 0;
224 unsigned int txSize;
225 unsigned int rxSizeExpected;
226
227 tx.header.length = sizeof(dunedaq::sspmodules::CtrlHeader) + (sizeof(uint) * size);
230 tx.header.size = size;
232 txSize = sizeof(dunedaq::sspmodules::CtrlHeader) + (sizeof(unsigned int) * size);
233 rxSizeExpected = sizeof(dunedaq::sspmodules::CtrlHeader);
234
235 for (i = 0; i < size; i++) {
236 tx.data[i] = data[i];
237 }
238
239 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
240}
unsigned int data[max_control_data]
Definition SSPTypes.hpp:98

◆ DeviceClear()

void dunedaq::sspmodules::EthernetDevice::DeviceClear ( unsigned int address,
unsigned int mask )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 190 of file EthernetDevice.cxx.

191{
192 DeviceWriteMask(address, mask, 0x00000000);
193}
virtual void DeviceWriteMask(unsigned int address, unsigned int mask, unsigned int value)

◆ DevicePurge()

void dunedaq::sspmodules::EthernetDevice::DevicePurge ( boost::asio::ip::tcp::socket & socket)

Definition at line 298 of file EthernetDevice.cxx.

299{
300 bool done = false;
301 unsigned int bytesQueued = 0;
302 unsigned int sleepTime = 0;
303
304 // Keep getting data from channel until queue is empty
305 do {
306 bytesQueued = socket.available();
307
308 // Read data from device, up to 256 bytes
309 if (bytesQueued != 0) {
310 sleepTime = 0;
311 unsigned int bytesToGet = std::min((unsigned int)256, bytesQueued);
312 std::vector<char> junkBuf(bytesToGet);
313 socket.read_some(boost::asio::buffer(junkBuf, bytesToGet));
314 } else { // If queue is empty, wait a bit and check that it hasn't filled up again, then return
315 usleep(1000); // 1ms
316 sleepTime += 1000;
317 bytesQueued = socket.available();
318 if (bytesQueued == 0 && sleepTime > 1000000) {
319 done = 1;
320 }
321 }
322 } while (!done);
323}

◆ DevicePurgeComm()

void dunedaq::sspmodules::EthernetDevice::DevicePurgeComm ( void )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 69 of file EthernetDevice.cxx.

70{
72}
void DevicePurge(boost::asio::ip::tcp::socket &socket)

◆ DevicePurgeData()

void dunedaq::sspmodules::EthernetDevice::DevicePurgeData ( void )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 75 of file EthernetDevice.cxx.

76{
78}

◆ DeviceQueueStatus()

void dunedaq::sspmodules::EthernetDevice::DeviceQueueStatus ( unsigned int * numWords)
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 81 of file EthernetDevice.cxx.

82{
83 unsigned int numBytes = fDataSocket.available();
84 (*numWords) = numBytes / sizeof(unsigned int);
85}

◆ DeviceRead()

void dunedaq::sspmodules::EthernetDevice::DeviceRead ( unsigned int address,
unsigned int * value )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 102 of file EthernetDevice.cxx.

103{
106 unsigned int txSize;
107 unsigned int rxSizeExpected;
108
112 tx.header.size = 1;
114 txSize = sizeof(dunedaq::sspmodules::CtrlHeader);
115 rxSizeExpected = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(unsigned int);
116
117 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
118 *value = rx.data[0];
119}

◆ DeviceReadMask()

void dunedaq::sspmodules::EthernetDevice::DeviceReadMask ( unsigned int address,
unsigned int mask,
unsigned int * value )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 122 of file EthernetDevice.cxx.

123{
126 unsigned int txSize;
127 unsigned int rxSizeExpected;
128
129 tx.header.length = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(uint);
132 tx.header.size = 1;
134 tx.data[0] = mask;
135 txSize = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(unsigned int);
136 rxSizeExpected = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(unsigned int);
137
138 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
139 *value = rx.data[0];
140}

◆ DeviceReceive()

void dunedaq::sspmodules::EthernetDevice::DeviceReceive ( std::vector< unsigned int > & data,
unsigned int size )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 88 of file EthernetDevice.cxx.

89{
90 data.resize(size);
91 unsigned int dataReturned = fDataSocket.read_some(boost::asio::buffer(data));
92 if (dataReturned < size * sizeof(unsigned int)) {
93 data.resize(dataReturned / sizeof(unsigned int));
94 }
95}

◆ DeviceSet()

void dunedaq::sspmodules::EthernetDevice::DeviceSet ( unsigned int address,
unsigned int mask )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 184 of file EthernetDevice.cxx.

185{
186 DeviceWriteMask(address, mask, 0xFFFFFFFF);
187}

◆ DeviceWrite()

void dunedaq::sspmodules::EthernetDevice::DeviceWrite ( unsigned int address,
unsigned int value )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 143 of file EthernetDevice.cxx.

144{
147 unsigned int txSize;
148 unsigned int rxSizeExpected;
149
150 tx.header.length = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(uint);
153 tx.header.size = 1;
155 tx.data[0] = value;
156 txSize = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(unsigned int);
157 rxSizeExpected = sizeof(dunedaq::sspmodules::CtrlHeader);
158
159 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
160}

◆ DeviceWriteMask()

void dunedaq::sspmodules::EthernetDevice::DeviceWriteMask ( unsigned int address,
unsigned int mask,
unsigned int value )
virtual

Implements dunedaq::sspmodules::Device.

Definition at line 163 of file EthernetDevice.cxx.

164{
167 unsigned int txSize;
168 unsigned int rxSizeExpected;
169
170 tx.header.length = sizeof(dunedaq::sspmodules::CtrlHeader) + (sizeof(uint) * 2);
173 tx.header.size = 1;
175 tx.data[0] = mask;
176 tx.data[1] = value;
177 txSize = sizeof(dunedaq::sspmodules::CtrlHeader) + (sizeof(unsigned int) * 2);
178 rxSizeExpected = sizeof(dunedaq::sspmodules::CtrlHeader) + sizeof(unsigned int);
179
180 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
181}

◆ IsOpen()

virtual bool dunedaq::sspmodules::EthernetDevice::IsOpen ( )
inlinevirtual

Implements dunedaq::sspmodules::Device.

Definition at line 37 of file EthernetDevice.hpp.

37 {
38 return isOpen;
39 }

◆ Open()

void dunedaq::sspmodules::EthernetDevice::Open ( bool slowControlOnly)
privatevirtual

Implements dunedaq::sspmodules::Device.

Definition at line 30 of file EthernetDevice.cxx.

31{
32
33 fSlowControlOnly = slowControlOnly;
34
35 // dune::DAQLogger::LogInfo("SSP_EthernetDevice")<<"Looking for SSP Ethernet device at "<<fIP.to_string()<<std::endl;
36 boost::asio::ip::tcp::resolver resolver(fIo_service);
37 boost::asio::ip::tcp::resolver::query commQuery(fIP.to_string(), slowControlOnly ? "55002" : "55001");
38 boost::asio::ip::tcp::resolver::iterator commEndpointIterator = resolver.resolve(commQuery);
39 boost::asio::connect(fCommSocket, commEndpointIterator);
40
41 if (slowControlOnly) {
42 // dune::DAQLogger::LogInfo("SSP_EthernetDevice")<<"Connected to SSP Ethernet device at
43 // "<<fIP.to_string()<<std::endl;
44 return;
45 }
46
47 boost::asio::ip::tcp::resolver::query dataQuery(fIP.to_string(), "55010");
48 boost::asio::ip::tcp::resolver::iterator dataEndpointIterator = resolver.resolve(dataQuery);
49
50 boost::asio::connect(fDataSocket, dataEndpointIterator);
51
52 // Set limited receive buffer size to avoid taxing switch
53 // JTH: Remove this since it was causing event read errors. Could try again
54 // with a different value if there are more issues which point to switch problems.
55 // boost::asio::socket_base::receive_buffer_size option(16384);
56 // fDataSocket.set_option(option);
57
58 // dune::DAQLogger::LogInfo("SSP_EthernetDevice")<<"Connected to SSP Ethernet device at "<<fIP.to_string()<<std::endl;
59}

◆ ReceiveEthernet()

void dunedaq::sspmodules::EthernetDevice::ReceiveEthernet ( dunedaq::sspmodules::CtrlPacket & rx,
unsigned int rxSizeExpected )

Definition at line 289 of file EthernetDevice.cxx.

290{
291 unsigned int rxSizeReturned = fCommSocket.read_some(boost::asio::buffer(static_cast<void*>(&rx), rxSizeExpected));
292 if (rxSizeReturned != rxSizeExpected) {
293 throw(ETCPError(""));
294 }
295}

◆ SendEthernet()

void dunedaq::sspmodules::EthernetDevice::SendEthernet ( dunedaq::sspmodules::CtrlPacket & tx,
unsigned int txSize )

Definition at line 280 of file EthernetDevice.cxx.

281{
282 unsigned int txSizeWritten = fCommSocket.write_some(boost::asio::buffer(static_cast<void*>(&tx), txSize));
283 if (txSizeWritten != txSize) {
284 throw(ETCPError(""));
285 }
286}

◆ SendReceive()

void dunedaq::sspmodules::EthernetDevice::SendReceive ( dunedaq::sspmodules::CtrlPacket & tx,
dunedaq::sspmodules::CtrlPacket & rx,
unsigned int txSize,
unsigned int rxSizeExpected,
unsigned int retryCount = 0 )

Definition at line 247 of file EthernetDevice.cxx.

252{
253 unsigned int timesTried = 0;
254 bool success = false;
255
256 while (!success) {
257 try {
258 SendEthernet(tx, txSize);
259 // Insert small delay between send and receive on Linux
260 usleep(100);
261 ReceiveEthernet(rx, rxSizeExpected);
262 usleep(2000);
263 success = true;
264 } catch (ETCPError&) {
265 if (timesTried < retryCount) {
267 ++timesTried;
268 // dune::DAQLogger::LogWarning("SSP_EthernetDevice")<<"Send/receive failed "<<timesTried<<" times on Ethernet
269 // link, retrying..."<<std::endl;
270 } else {
271 // dune::DAQLogger::LogError("SSP_EthernetDevice")<<"Send/receive failed on Ethernet link, giving
272 // up."<<std::endl;
273 throw;
274 }
275 }
276 }
277}
void SendEthernet(dunedaq::sspmodules::CtrlPacket &tx, unsigned int txSize)
void ReceiveEthernet(dunedaq::sspmodules::CtrlPacket &rx, unsigned int rxSizeExpected)

Friends And Related Symbol Documentation

◆ DeviceManager

friend class DeviceManager
friend

Definition at line 79 of file EthernetDevice.hpp.

Member Data Documentation

◆ fCommSocket

boost::asio::ip::tcp::socket dunedaq::sspmodules::EthernetDevice::fCommSocket
private

Definition at line 85 of file EthernetDevice.hpp.

◆ fDataSocket

boost::asio::ip::tcp::socket dunedaq::sspmodules::EthernetDevice::fDataSocket
private

Definition at line 86 of file EthernetDevice.hpp.

◆ fIo_service

boost::asio::io_service dunedaq::sspmodules::EthernetDevice::fIo_service
staticprivate

Definition at line 83 of file EthernetDevice.hpp.

◆ fIP

boost::asio::ip::address dunedaq::sspmodules::EthernetDevice::fIP
private

Definition at line 88 of file EthernetDevice.hpp.

◆ isOpen

bool dunedaq::sspmodules::EthernetDevice::isOpen
private

Definition at line 81 of file EthernetDevice.hpp.


The documentation for this class was generated from the following files: