1 #include "OtsUDPFirmwareCore.h"
3 #include "otsdaq-core/MessageFacility/MessageFacility.h"
4 #include "otsdaq-core/Macros/CoutMacros.h"
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
24 #define UDP_CORE_BLOCK_ADDRESS ((uint64_t)(0x1) << 32)
25 #define ADDR_SELF_UPPER_IP (uint64_t)(0x0) //24
26 #define ADDR_SELF_LOWER_IP (uint64_t)(0x1) //8
27 #define ADDR_SELF_MAC (uint64_t)(0x2) //40
29 #define ADDR_CTRL_DEST_IP (uint64_t)(0x3) //32
30 #define ADDR_CTRL_DEST_MAC (uint64_t)(0x4) //48
31 #define ADDR_CTRL_DEST_PORT (uint64_t)(0x5) //16
33 #define ADDR_DATA_DEST_IP (uint64_t)(0x6) //32
34 #define ADDR_DATA_DEST_MAC (uint64_t)(0x7) //48
35 #define ADDR_DATA_DEST_PORT (uint64_t)(0x8) //16
37 #define ADDR_BURST_MODE (uint64_t)(0x9) //1
38 #define ADDR_CTRL_RESOLVE_MAC (uint64_t)(0xA) //1
39 #define ADDR_DATA_RESOLVE_MAC (uint64_t)(0xB) //1
40 #define ADDR_SELF_VERSION (uint64_t)(0x64) //16 (read only)
41 #define ADDR_SELF_RESET (uint64_t)(0xFFFFFFFF) //1 (write only)
47 const uint8_t OtsUDPFirmwareCore::FIFO_ADDRESS_CMD_TYPE = (1 << 3);
50 OtsUDPFirmwareCore::OtsUDPFirmwareCore(
unsigned int version)
55 OtsUDPFirmwareCore::~OtsUDPFirmwareCore(
void)
59 void OtsUDPFirmwareCore::init(
void)
63 std::string OtsUDPFirmwareCore::write(
64 char* address,
char* data)
67 writeAdvanced(buffer,address,data);
72 void OtsUDPFirmwareCore::write(
73 std::string& buffer,
char* address,
char* data,
bool clearBuffer)
75 writeAdvanced(buffer,address,data,1,0,clearBuffer);
79 void OtsUDPFirmwareCore::write(
85 writeAdvanced(buffer,address,data,0,clearBuffer);
89 void OtsUDPFirmwareCore::write(
95 writeAdvanced(buffer,address,data,0,clearBuffer);
101 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
105 uint8_t commandTypeOptions,
110 __SS__ <<
"Invalid OtsUDPFirmwareCore::writeAdvanced size: " << size << std::endl;
111 __COUT_ERR__ <<
"\n" << ss.str();
112 throw std::runtime_error(ss.str());
115 if(buffer.size() + 2 + 8 + 8*size > 2 + 8 + 8*182)
117 __SS__ <<
"Aborting. Buffer overflow attempt: " << buffer.size() <<
" + " <<
118 2 + 8 + 8*size <<
" > " << 2 + 8 + 8*182 << std::endl;
119 __COUT_ERR__ <<
"\n" << ss.str();
120 throw std::runtime_error(ss.str());
126 unsigned int begin = buffer.length();
127 buffer.resize(buffer.length() + 2 + 8 + 8*size,
'\0');
129 buffer[begin + 0] = 1 | commandTypeOptions;
130 buffer[begin + 1] = size;
132 std::copy_n(address,
sizeof(uint64_t),&buffer[begin + 2]);
133 for(uint8_t i=0;i<size;++i)
134 std::copy_n((
char *)&data[8*i],
sizeof(uint64_t),&buffer[begin + 2 + 8 + 8*i]);
137 __SS__ <<
"\tAdded OtsUDPFirmwareCore::writeAdvanced to Buffer:-";
138 for(uint32_t i=begin; i<buffer.size(); i++)
140 if(i==begin+2) ss <<
":::";
141 else if(i==begin+10) ss <<
":::";
142 ss << std::setfill(
'0') << std::setw(2) << std::hex << (((int16_t) buffer[i]) &0xFF) <<
"-" << std::dec;
144 ss <<
" added " << (buffer.size() - begin) <<
" to " << buffer.size();
146 __COUT__ <<
"\n" << ss.str();
152 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
153 const uint64_t& address,
156 uint8_t commandTypeOptions,
159 OtsUDPFirmwareCore::writeAdvanced(buffer,(
char *)&address,data,size,commandTypeOptions,clearBuffer);
163 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
164 const uint64_t& address,
165 const uint64_t& data,
166 uint8_t commandTypeOptions,
169 OtsUDPFirmwareCore::writeAdvanced(buffer,(
char *)&address,(
char *)&data,1 ,commandTypeOptions,clearBuffer);
173 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
174 const uint64_t& address,
175 const std::vector<uint64_t>& data,
176 uint8_t commandTypeOptions,
179 OtsUDPFirmwareCore::writeAdvanced(buffer,(
char *)&address,(
char *)&data[0],data.size() ,commandTypeOptions,clearBuffer);
183 std::string OtsUDPFirmwareCore::read
186 __COUT__ <<
"OTS pointer based read!! " << std::endl;
188 readAdvanced(buffer,address);
193 void OtsUDPFirmwareCore::read
194 (std::string& buffer,
char* address,
bool clearBuffer)
196 readAdvanced(buffer,address,1,0,clearBuffer);
200 void OtsUDPFirmwareCore::read
201 (std::string& buffer, uint64_t address,
bool clearBuffer)
203 readAdvanced(buffer,address,1,0,clearBuffer);
207 void OtsUDPFirmwareCore::read
208 (std::string& buffer, uint32_t address,
bool clearBuffer)
210 readAdvanced(buffer,address,1,0,clearBuffer);
215 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::readAdvanced(std::string& buffer,
218 uint8_t commandTypeOptions,
bool clearBuffer)
222 __SS__ <<
"Invalid OtsUDPFirmwareCore::readAdvanced size: " << size << std::endl;
223 __COUT_ERR__ <<
"\n" << ss.str();
224 throw std::runtime_error(ss.str());
227 if(buffer.size() + 2 + 8 > 2 + 8 + 8*182)
229 __SS__ <<
"Aborting. Buffer overflow attempt: " << buffer.size() <<
" + " <<
230 2 + 8 <<
" > " << 2 + 8 + 8*182 << std::endl;
231 __COUT_ERR__ <<
"\n" << ss.str();
232 throw std::runtime_error(ss.str());
238 unsigned int begin = buffer.length();
239 buffer.resize(buffer.length() + 2 + 8,
'\0');
241 buffer[begin + 0] = (uint8_t)0 | commandTypeOptions;
242 buffer[begin + 1] = size;
245 std::copy_n(address,
sizeof(uint64_t),&buffer[begin + 2]);
248 __SS__ <<
"\tAdded OtsUDPFirmwareCore::readAdvanced to Buffer:-";
249 for(uint32_t i=begin; i<buffer.size(); i++)
251 if(i==begin+2) ss <<
":::";
252 else if(i==begin+10) ss <<
":::";
253 ss << std::setfill(
'0') << std::setw(2) << std::hex << (((int16_t) buffer[i]) &0xFF) <<
"-" << std::dec;
256 __COUT__ <<
"\n" << ss.str();
261 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::readAdvanced(std::string& buffer,
262 const uint64_t& address,
264 uint8_t commandTypeOptions,
bool clearBuffer)
266 OtsUDPFirmwareCore::readAdvanced(buffer,(
char *)&address,size,commandTypeOptions,clearBuffer);
271 void OtsUDPFirmwareCore::setDataDestination(std::string& buffer,
272 const std::string& ipAddress,
const uint16_t port,
bool clearBuffer)
275 __COUT__ <<
"dynamic mac address: " << std::hex <<
276 uint64_t(UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_RESOLVE_MAC) << std::endl;
277 OtsUDPFirmwareCore::write(buffer,
278 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_RESOLVE_MAC ,
282 __COUT__ <<
"ipAddress = " << ipAddress << std::endl;
285 sscanf(ipAddress.c_str(),
"%d.%d.%d.%d",
292 (((
char *)&ip)[i]) += ipArr[i]&0x0FF;
294 writeDataDestinationIP(buffer,ip,
false );
295 writeDataDestinationPort(buffer,port,
false);
302 void OtsUDPFirmwareCore::setControlDestination(std::string& buffer,
303 const std::string& ipAddress,
const uint16_t port)
306 OtsUDPFirmwareCore::writeAdvanced(buffer,
307 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_RESOLVE_MAC ,
311 __COUT__ <<
"ipAddress = " << ipAddress << std::endl;
314 sscanf(ipAddress.c_str(),
"%d.%d.%d.%d",
321 (((
char *)&ip)[i]) += ipArr[i]&0x0FF;
323 writeControlDestinationIP(buffer,ip);
324 writeControlDestinationPort(buffer,port);
329 uint32_t OtsUDPFirmwareCore::createRegisterFromValue
330 (std::string& readBuffer, std::string& receivedValue)
332 uint32_t retVal = *((uint32_t *)(&receivedValue[2]));
336 __COUT__ <<
"Register value: 0x" << std::hex << retVal << std::dec << std::endl;
342 void OtsUDPFirmwareCore::writeDataDestinationIP(std::string& buffer,
const uint64_t value,
345 OtsUDPFirmwareCore::writeAdvanced(buffer,
346 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_IP ,
352 void OtsUDPFirmwareCore::writeDataDestinationMAC(std::string& buffer,
const uint64_t value,
355 OtsUDPFirmwareCore::writeAdvanced(buffer,
356 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_MAC ,
362 void OtsUDPFirmwareCore::writeDataDestinationPort(std::string& buffer,
const uint64_t value,
365 OtsUDPFirmwareCore::writeAdvanced(buffer,
366 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_PORT ,
372 void OtsUDPFirmwareCore::readDataDestinationIP(std::string& buffer)
374 OtsUDPFirmwareCore::readAdvanced(buffer,
375 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_IP );
379 void OtsUDPFirmwareCore::readDataDestinationMAC(std::string& buffer)
381 OtsUDPFirmwareCore::readAdvanced(buffer,
382 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_MAC );
386 void OtsUDPFirmwareCore::readDataDestinationPort(std::string& buffer)
388 OtsUDPFirmwareCore::readAdvanced(buffer,
389 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_PORT );
393 void OtsUDPFirmwareCore::writeControlDestinationIP(std::string& buffer,
const uint64_t value)
395 OtsUDPFirmwareCore::writeAdvanced(buffer,
396 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_IP ,
401 void OtsUDPFirmwareCore::writeControlDestinationMAC(std::string& buffer,
const uint64_t value)
403 OtsUDPFirmwareCore::writeAdvanced(buffer,
404 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_MAC ,
409 void OtsUDPFirmwareCore::writeControlDestinationPort(std::string& buffer,
const uint64_t value)
411 OtsUDPFirmwareCore::writeAdvanced(buffer,
412 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_PORT ,
417 void OtsUDPFirmwareCore::readControlDestinationIP(std::string& buffer)
419 OtsUDPFirmwareCore::readAdvanced(buffer,
420 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_IP );
424 void OtsUDPFirmwareCore::readControlDestinationMAC(std::string& buffer)
426 OtsUDPFirmwareCore::readAdvanced(buffer,
427 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_MAC );
431 void OtsUDPFirmwareCore::readControlDestinationPort(std::string& buffer)
433 OtsUDPFirmwareCore::readAdvanced(buffer,
434 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_PORT );
438 void OtsUDPFirmwareCore::readUDPFirmwareVersion(std::string& buffer)
440 OtsUDPFirmwareCore::readAdvanced(buffer,
441 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_VERSION );
445 void OtsUDPFirmwareCore::ethernetReset(std::string& buffer)
447 OtsUDPFirmwareCore::writeAdvanced(buffer,
448 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET ,
452 void OtsUDPFirmwareCore::ethernetUnreset(std::string& buffer)
454 OtsUDPFirmwareCore::writeAdvanced(buffer,
455 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET ,
460 void OtsUDPFirmwareCore::startBurst(std::string& buffer)
462 __COUT__ << std::endl;
463 OtsUDPFirmwareCore::writeAdvanced(buffer,
464 UDP_CORE_BLOCK_ADDRESS | ADDR_BURST_MODE ,
469 void OtsUDPFirmwareCore::stopBurst(std::string& buffer)
471 __COUT__ << std::endl;
472 OtsUDPFirmwareCore::writeAdvanced(buffer,
473 UDP_CORE_BLOCK_ADDRESS | ADDR_BURST_MODE ,