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