DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
DaphneV2Interface.hpp
Go to the documentation of this file.
1
11
12#ifndef DAPHNEMODULES_SRC_DAPHNEV2INTERFACE_HPP_
13#define DAPHNEMODULES_SRC_DAPHNEV2INTERFACE_HPP_
14
15#include <arpa/inet.h>
16#include <cstring>
17#include <functional>
18#include <memory>
19#include <mutex>
20#include <netinet/in.h>
21#include <sys/socket.h>
22#include <unistd.h>
23#include <vector>
24
25#include "logging/Logging.hpp" // NOTE: if ISSUES ARE DECLARED BEFORE include logging/Logging.hpp, TLOG_DEBUG<<issue wont work.
26#include <ers/ers.hpp>
27
29
30namespace dunedaq {
31
32ERS_DECLARE_ISSUE(daphnemodules, SocketCreationError, "Failed to create a socket", ERS_EMPTY)
33
35 FailedPing,
36 "Failed to ping daphne board at " << ip << ':' << port,
37 ((std::string)ip)((int)port))
38
39ERS_DECLARE_ISSUE(daphnemodules, FailedSocketInteraction, "Failed to call " << command, ((std::string)command))
40
42 CommandTimeout,
43 "Command " << command << " timed out after " << timeout_us << " microseconds",
44 ((std::string)command)((unsigned int)timeout_us))
45
47 SocketTimeout,
48 "Socket timed out after " << timeout_us << " microseconds",
49 ((unsigned int)timeout_us))
50
51} // dunedaq namespace
52
54
56{
57 std::string command;
58 std::string result;
59};
60
62{
63
64public:
65 DaphneV2Interface(const char* ipaddr, int port, std::chrono::milliseconds timeout = std::chrono::milliseconds(500));
66
68 {
69 if (m_connection_id > 0)
70 close();
71 }
72
77
78 std::vector<uint64_t> read_register(uint64_t addr, uint8_t size) const { return read(0x00, addr, size); }
79 void write_register(uint64_t addr, std::vector<uint64_t>&& data) const { write(0x01, addr, std::move(data)); }
80
81 std::vector<uint64_t> read_buffer(uint64_t addr, uint8_t size) const { return read(0x08, addr, size); }
82 void write_buffer(uint64_t addr, std::vector<uint64_t>&& data) const { write(0x09, addr, std::move(data)); }
83
84 bool validate_connection() const;
85
86 command_result send_command(std::string cmd) const;
87
88 // this will throw if it fails
89 command_result send_command_retry(std::string cmd, size_t retry = std::numeric_limits<size_t>::max()) const;
90
91 // this will try until success but it won't thrwo if can retry become false
92 command_result send_command_interruptible(std::string cmd, std::function<bool()> can_retry) const;
93
94protected:
95 void close();
96
97 void write(uint8_t command_id, uint64_t addr, std::vector<uint64_t>&& data) const;
98 std::vector<uint64_t> read(uint8_t command_id, uint64_t addr, uint8_t size) const;
99
100private:
101 std::string m_ip;
103 sockaddr_in m_target;
104 std::chrono::milliseconds m_timeout{ 5 };
105 mutable std::mutex m_access_mutex;
106 mutable std::mutex m_command_mutex;
107};
108
109} // namespce dunedaq::daphnemodules
110
111#endif // DAPHNEMODULES_SRC_DAPHNEV2INTERFACE_HPP_
#define ERS_EMPTY
void write_register(uint64_t addr, std::vector< uint64_t > &&data) const
DaphneV2Interface(DaphneV2Interface &&)=delete
void write(uint8_t command_id, uint64_t addr, std::vector< uint64_t > &&data) const
DaphneV2Interface & operator=(DaphneV2Interface &&)=delete
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
DaphneV2Interface(const DaphneV2Interface &)=delete
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
DaphneV2Interface & operator=(const DaphneV2Interface &)=delete
The DUNE-DAQ namespace.
ERS_DECLARE_ISSUE(cibmodules, CIBCommunicationError, " CIB Hardware Communication Error: "<< descriptor,((std::string) descriptor)) ERS_DECLARE_ISSUE(cibmodules
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size