8#ifndef SSPMODULES_SRC_ANLBOARD_ETHERNETDEVICE_CXX_
9#define SSPMODULES_SRC_ANLBOARD_ETHERNETDEVICE_CXX_
24 , fCommSocket(fIo_service)
25 , fDataSocket(fIo_service)
26 , fIP(
boost::asio::ip::address_v4(ipAddress))
33 fSlowControlOnly = slowControlOnly;
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);
41 if (slowControlOnly) {
47 boost::asio::ip::tcp::resolver::query dataQuery(fIP.to_string(),
"55010");
48 boost::asio::ip::tcp::resolver::iterator dataEndpointIterator = resolver.resolve(dataQuery);
50 boost::asio::connect(fDataSocket, dataEndpointIterator);
71 DevicePurge(fCommSocket);
77 DevicePurge(fDataSocket);
83 unsigned int numBytes = fDataSocket.available();
84 (*numWords) = numBytes /
sizeof(
unsigned int);
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));
107 unsigned int rxSizeExpected;
117 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
127 unsigned int rxSizeExpected;
138 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
148 unsigned int rxSizeExpected;
159 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
168 unsigned int rxSizeExpected;
180 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
186 DeviceWriteMask(
address, mask, 0xFFFFFFFF);
192 DeviceWriteMask(
address, mask, 0x00000000);
202 unsigned int rxSizeExpected;
212 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
213 for (i = 0; i < rx.header.size; i++) {
214 data[i] = rx.data[i];
225 unsigned int rxSizeExpected;
235 for (i = 0; i <
size; i++) {
236 tx.
data[i] = data[i];
239 SendReceive(tx, rx, txSize, rxSizeExpected, 3);
250 unsigned int rxSizeExpected,
251 unsigned int retryCount)
253 unsigned int timesTried = 0;
254 bool success =
false;
258 SendEthernet(tx, txSize);
261 ReceiveEthernet(rx, rxSizeExpected);
265 if (timesTried < retryCount) {
282 unsigned int txSizeWritten = fCommSocket.write_some(boost::asio::buffer(
static_cast<void*
>(&tx), txSize));
283 if (txSizeWritten != txSize) {
291 unsigned int rxSizeReturned = fCommSocket.read_some(boost::asio::buffer(
static_cast<void*
>(&rx), rxSizeExpected));
292 if (rxSizeReturned != rxSizeExpected) {
301 unsigned int bytesQueued = 0;
302 unsigned int sleepTime = 0;
306 bytesQueued = socket.available();
309 if (bytesQueued != 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));
317 bytesQueued = socket.available();
318 if (bytesQueued == 0 && sleepTime > 1000000) {
virtual void DeviceQueueStatus(unsigned int *numWords)
void SendEthernet(dunedaq::sspmodules::CtrlPacket &tx, unsigned int txSize)
virtual void DeviceReadMask(unsigned int address, unsigned int mask, unsigned int *value)
virtual void DeviceArrayRead(unsigned int address, unsigned int size, unsigned int *data)
virtual void DeviceSet(unsigned int address, unsigned int mask)
virtual void DeviceWriteMask(unsigned int address, unsigned int mask, unsigned int value)
EthernetDevice(unsigned long ipAddress)
virtual void DevicePurgeComm()
void DevicePurge(boost::asio::ip::tcp::socket &socket)
static boost::asio::io_service fIo_service
virtual void DeviceWrite(unsigned int address, unsigned int value)
virtual void Open(bool slowControlOnly)
virtual void DeviceRead(unsigned int address, unsigned int *value)
virtual void DeviceClear(unsigned int address, unsigned int mask)
virtual void DevicePurgeData()
virtual void DeviceArrayWrite(unsigned int address, unsigned int size, unsigned int *data)
void ReceiveEthernet(dunedaq::sspmodules::CtrlPacket &rx, unsigned int rxSizeExpected)
void SendReceive(dunedaq::sspmodules::CtrlPacket &tx, dunedaq::sspmodules::CtrlPacket &rx, unsigned int txSize, unsigned int rxSizeExpected, unsigned int retryCount=0)
virtual void DeviceReceive(std::vector< unsigned int > &data, unsigned int size)
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
unsigned int data[max_control_data]