16 std::chrono::milliseconds timeout)
17 : m_timeout(timeout) {
26 auto ret = inet_pton(AF_INET, ipaddr, &(
m_target.sin_addr));
33 throw FailedPing(
ERS_HERE, ipaddr, port );
48 static const uint64_t good_value = 0xdeadbeef;
49 return ret[0] == good_value ;
55 size_t retry )
const {
62 catch (
const CommandTimeout & e ) {
78 std::function<
bool()> can_retry )
const {
85 catch (
const CommandTimeout & e ) {
92 }
while (can_retry());
100 TLOG() <<
"Board: " <<
m_ip <<
", sending command " << cmd;
101 std::vector<uint64_t> bytes;
102 for (
char ch : cmd) {
103 bytes.push_back(
static_cast<uint64_t
>(
ch));
105 bytes.push_back(0x0d);
110 for (
size_t i = 0; i < (bytes.size() + 49) / 50; ++i) {
111 std::vector<uint64_t> part(bytes.begin() + i*50,
112 bytes.begin() + std::min((i+1)*50, bytes.size()));
116 TLOG() <<
"Board: " <<
m_ip <<
", Command sent, waiting for result";
120 std::string * writing_pointer =
nullptr;
122 auto start_time = std::chrono::high_resolution_clock::now();
127 for (
size_t i = 0; i < data_block.size(); ++i) {
128 if (data_block[i] == 255) {
130 }
else if (data_block[i] == 1) {
132 writing_pointer = & res.
command;
133 }
else if (data_block[i] == 2) {
135 writing_pointer = & res.
result;
136 }
else if (data_block[i] == 3) {
138 writing_pointer =
nullptr;
139 }
else if (isprint(
static_cast<int>(data_block[i]))) {
141 char c =
static_cast<char>(data_block[i]);
142 if ( writing_pointer ) {
143 *writing_pointer +=
static_cast<char>(data_block[i]);
146 TLOG() <<
"Failed adding charachter " << c;
150 auto now = std::chrono::high_resolution_clock::now();
155 TLOG() <<
"Details of timeout";
156 for (
size_t i = 0; i < data_block.size(); ++i ) {
157 TLOG() << i <<
"\t" << std::hex << data_block[i] << std::dec;
160 auto delay_us = std::chrono::duration_cast<std::chrono::microseconds>(delay);
161 throw CommandTimeout(
ERS_HERE, cmd, delay_us.count());
164 std::this_thread::sleep_for(std::chrono::milliseconds(1));
173 uint64_t addr, uint8_t
size)
const {
180 memcpy(cmd + 2, &addr,
sizeof(uint64_t));
186 struct timeval timeout;
187 timeout.tv_sec =
m_timeout.count() / 1000 ;
188 timeout.tv_usec = (
m_timeout.count() % 1000) * 1000 ;
189 fd_set readfds, masterfds;
194 memcpy(&readfds, &masterfds,
sizeof(fd_set));
196 auto start_time = std::chrono::high_resolution_clock::now();
202 std::vector<uint64_t> ret_value;
205 uint8_t buffer[2 + (8 *
size)];
206 socklen_t addrlen =
sizeof(
m_target);
211 uint8_t fmt[4 +
size];
216 for (
int i = 0; i <
size; i++) {
220 for (
int i = 0; i <
size; i++) {
222 memcpy(&value, buffer + 2 + (8 * i),
sizeof(uint64_t));
223 ret_value.push_back(value);
229 auto end_time = std::chrono::high_resolution_clock::now();
230 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time -
start_time);
232 throw SocketTimeout(
ERS_HERE, duration.count() );
243 uint8_t cmd[10 + (8 * data.size())];
245 cmd[1] = data.size();
246 memcpy(cmd + 2, &addr,
sizeof(uint64_t));
247 for (
size_t i = 0; i < data.size(); i++) {
248 memcpy(cmd + 10 + (8 * i), &(data[i]),
sizeof(uint64_t));
std::mutex m_access_mutex
bool validate_connection() const
void write(uint8_t command_id, uint64_t addr, std::vector< uint64_t > &&data) const
std::vector< uint64_t > read_buffer(uint64_t addr, uint8_t size) const
std::vector< uint64_t > read(uint8_t command_id, uint64_t addr, uint8_t size) const
void write_buffer(uint64_t addr, std::vector< uint64_t > &&data) const
command_result send_command_retry(std::string cmd, size_t retry=std::numeric_limits< size_t >::max()) const
std::mutex m_command_mutex
DaphneV2Interface(const char *ipaddr, int port, std::chrono::milliseconds timeout=std::chrono::milliseconds(500))
std::vector< uint64_t > read_register(uint64_t addr, uint8_t size) const
command_result send_command(std::string cmd) const
command_result send_command_interruptible(std::string cmd, std::function< bool()> can_retry) const
std::chrono::milliseconds m_timeout
Base class for any user define issue.
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
Cannot add TPSet with start_time
Invalid std::string ip FailedSocketInteraction
PDS Frame with unphysical timestamp detected with ch
void warning(const Issue &issue)