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();
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();
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]);
154 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
155 const uint64_t& address,
158 uint8_t commandTypeOptions,
161 OtsUDPFirmwareCore::writeAdvanced(buffer,(
char *)&address,data,size,commandTypeOptions,clearBuffer);
165 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
166 const uint64_t& address,
167 const uint64_t& data,
168 uint8_t commandTypeOptions,
171 OtsUDPFirmwareCore::writeAdvanced(buffer,(
char *)&address,(
char *)&data,1 ,commandTypeOptions,clearBuffer);
175 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
176 const uint64_t& address,
177 const std::vector<uint64_t>& data,
178 uint8_t commandTypeOptions,
181 OtsUDPFirmwareCore::writeAdvanced(buffer,(
char *)&address,(
char *)&data[0],data.size() ,commandTypeOptions,clearBuffer);
185 std::string OtsUDPFirmwareCore::read
188 __COUT__ <<
"OTS pointer based read!! " << std::endl;
190 readAdvanced(buffer,address);
195 void OtsUDPFirmwareCore::read
196 (std::string& buffer,
char* address,
bool clearBuffer)
198 readAdvanced(buffer,address,1,0,clearBuffer);
202 void OtsUDPFirmwareCore::read
203 (std::string& buffer, uint64_t address,
bool clearBuffer)
205 readAdvanced(buffer,address,1,0,clearBuffer);
209 void OtsUDPFirmwareCore::read
210 (std::string& buffer, uint32_t address,
bool clearBuffer)
212 readAdvanced(buffer,address,1,0,clearBuffer);
217 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::readAdvanced(std::string& buffer,
220 uint8_t commandTypeOptions,
bool clearBuffer)
224 __SS__ <<
"Invalid OtsUDPFirmwareCore::readAdvanced size: " << size << std::endl;
225 __COUT_ERR__ <<
"\n" << ss.str();
229 if(buffer.size() + 2 + 8 > 2 + 8 + 8*182)
231 __SS__ <<
"Aborting. Buffer overflow attempt: " << buffer.size() <<
" + " <<
232 2 + 8 <<
" > " << 2 + 8 + 8*182 << std::endl;
233 __COUT_ERR__ <<
"\n" << ss.str();
240 unsigned int begin = buffer.length();
241 buffer.resize(buffer.length() + 2 + 8,
'\0');
243 buffer[begin + 0] = (uint8_t)0 | commandTypeOptions;
244 buffer[begin + 1] = size;
247 std::copy_n(address,
sizeof(uint64_t),&buffer[begin + 2]);
263 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::readAdvanced(std::string& buffer,
264 const uint64_t& address,
266 uint8_t commandTypeOptions,
bool clearBuffer)
268 OtsUDPFirmwareCore::readAdvanced(buffer,(
char *)&address,size,commandTypeOptions,clearBuffer);
273 void OtsUDPFirmwareCore::setDataDestination(std::string& buffer,
274 const std::string& ipAddress,
const uint16_t port,
bool clearBuffer)
279 OtsUDPFirmwareCore::write(buffer,
280 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_RESOLVE_MAC ,
287 sscanf(ipAddress.c_str(),
"%d.%d.%d.%d",
294 (((
char *)&ip)[i]) += ipArr[i]&0x0FF;
296 writeDataDestinationIP(buffer,ip,
false );
297 writeDataDestinationPort(buffer,port,
false);
304 void OtsUDPFirmwareCore::setControlDestination(std::string& buffer,
305 const std::string& ipAddress,
const uint16_t port)
308 OtsUDPFirmwareCore::writeAdvanced(buffer,
309 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_RESOLVE_MAC ,
313 __COUT__ <<
"ipAddress = " << ipAddress << std::endl;
316 sscanf(ipAddress.c_str(),
"%d.%d.%d.%d",
323 (((
char *)&ip)[i]) += ipArr[i]&0x0FF;
325 writeControlDestinationIP(buffer,ip);
326 writeControlDestinationPort(buffer,port);
331 uint32_t OtsUDPFirmwareCore::createRegisterFromValue
332 (std::string& readBuffer, std::string& receivedValue)
334 uint32_t retVal = *((uint32_t *)(&receivedValue[2]));
344 void OtsUDPFirmwareCore::writeDataDestinationIP(std::string& buffer,
const uint64_t value,
347 OtsUDPFirmwareCore::writeAdvanced(buffer,
348 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_IP ,
354 void OtsUDPFirmwareCore::writeDataDestinationMAC(std::string& buffer,
const uint64_t value,
357 OtsUDPFirmwareCore::writeAdvanced(buffer,
358 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_MAC ,
364 void OtsUDPFirmwareCore::writeDataDestinationPort(std::string& buffer,
const uint64_t value,
367 OtsUDPFirmwareCore::writeAdvanced(buffer,
368 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_PORT ,
374 void OtsUDPFirmwareCore::readDataDestinationIP(std::string& buffer)
376 OtsUDPFirmwareCore::readAdvanced(buffer,
377 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_IP );
381 void OtsUDPFirmwareCore::readDataDestinationMAC(std::string& buffer)
383 OtsUDPFirmwareCore::readAdvanced(buffer,
384 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_MAC );
388 void OtsUDPFirmwareCore::readDataDestinationPort(std::string& buffer)
390 OtsUDPFirmwareCore::readAdvanced(buffer,
391 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_PORT );
395 void OtsUDPFirmwareCore::writeControlDestinationIP(std::string& buffer,
const uint64_t value)
397 OtsUDPFirmwareCore::writeAdvanced(buffer,
398 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_IP ,
403 void OtsUDPFirmwareCore::writeControlDestinationMAC(std::string& buffer,
const uint64_t value)
405 OtsUDPFirmwareCore::writeAdvanced(buffer,
406 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_MAC ,
411 void OtsUDPFirmwareCore::writeControlDestinationPort(std::string& buffer,
const uint64_t value)
413 OtsUDPFirmwareCore::writeAdvanced(buffer,
414 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_PORT ,
419 void OtsUDPFirmwareCore::readControlDestinationIP(std::string& buffer)
421 OtsUDPFirmwareCore::readAdvanced(buffer,
422 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_IP );
426 void OtsUDPFirmwareCore::readControlDestinationMAC(std::string& buffer)
428 OtsUDPFirmwareCore::readAdvanced(buffer,
429 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_MAC );
433 void OtsUDPFirmwareCore::readControlDestinationPort(std::string& buffer)
435 OtsUDPFirmwareCore::readAdvanced(buffer,
436 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_PORT );
440 void OtsUDPFirmwareCore::readUDPFirmwareVersion(std::string& buffer)
442 OtsUDPFirmwareCore::readAdvanced(buffer,
443 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_VERSION );
447 void OtsUDPFirmwareCore::softEthernetReset(std::string& buffer)
449 OtsUDPFirmwareCore::writeAdvanced(buffer,
450 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET ,
455 void OtsUDPFirmwareCore::hardEthernetReset(std::string& buffer)
457 OtsUDPFirmwareCore::writeAdvanced(buffer,
458 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET ,
463 void OtsUDPFirmwareCore::clearEthernetReset(std::string& buffer)
465 OtsUDPFirmwareCore::writeAdvanced(buffer,
466 UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET ,
471 void OtsUDPFirmwareCore::startBurst(std::string& buffer)
473 __COUT__ << std::endl;
474 OtsUDPFirmwareCore::writeAdvanced(buffer,
475 UDP_CORE_BLOCK_ADDRESS | ADDR_BURST_MODE ,
480 void OtsUDPFirmwareCore::stopBurst(std::string& buffer)
482 __COUT__ << std::endl;
483 OtsUDPFirmwareCore::writeAdvanced(buffer,
484 UDP_CORE_BLOCK_ADDRESS | ADDR_BURST_MODE ,