DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
i2c.cpp
Go to the documentation of this file.
1
10#include "timing/I2CSlave.hpp"
12// #include "timing/MiniPODMasterNode.hpp"
13#include "timing/DACNode.hpp"
15#include "timing/SI534xNode.hpp"
18
19#include <pybind11/pybind11.h>
20#include <pybind11/stl.h>
21
22#include <vector>
23
24namespace py = pybind11;
25
26namespace dunedaq {
27namespace timing {
28namespace python {
29
30void
31register_i2c(py::module& m)
32{
33 // .def("hardReset", (void ( mp7::CtrlNode::*) (double)) 0, mp7_CTRLNODE_hardReset_overloads())
34
35 // Wrap timing::I2CMasterNode
36 py::class_<timing::I2CMasterNode, uhal::Node>(m, "I2CMasterNode")
37 .def(py::init<const uhal::Node&>())
38 .def("get_i2c_clock_prescale", &timing::I2CMasterNode::get_i2c_clock_prescale)
39 .def("read_i2c",
41 py::arg("i2c_device_address"),
42 py::arg("i2c_reg_address"),
43 py::arg("atomic") = false
44 )
45 .def("write_i2c",
47 py::arg("i2c_device_address"),
48 py::arg("i2c_reg_address"),
49 py::arg("data"),
50 py::arg("send_stop") = true)
51 .def("read_i2cArray",
53 py::arg("i2c_device_address"),
54 py::arg("i2c_reg_address"),
55 py::arg("number_of_words"),
56 py::arg("atomic") = false
57 )
58 .def("write_i2cArray",
60 py::arg("i2c_device_address"),
61 py::arg("i2c_reg_address"),
62 py::arg("data"),
63 py::arg("send_stop") = true)
64 .def("read_i2cPrimitive", &timing::I2CMasterNode::read_i2cPrimitive)
65 .def("write_i2cPrimitive",
67 py::arg("i2c_device_address"),
68 py::arg("data"),
69 py::arg("send_stop") = true)
70 .def("get_slaves", &timing::I2CMasterNode::get_slaves)
71 .def("get_slave", &timing::I2CMasterNode::get_slave, py::return_value_policy::reference_internal)
72 .def("get_slave_address", &timing::I2CMasterNode::get_slave_address)
73 .def("ping", &timing::I2CMasterNode::ping)
74 .def("scan", &timing::I2CMasterNode::scan)
75 .def("reset", &timing::I2CMasterNode::reset);
76
77 // Wrap timing::I2CSlave
78 py::class_<timing::I2CSlave>(m, "I2CSlave")
79 .def("get_i2c_address", &timing::I2CSlave::get_i2c_address)
80 .def<uint8_t (timing::I2CSlave::*)(uint32_t) const>("read_i2c", // NOLINT(build/unsigned)
82 .def<uint8_t (timing::I2CSlave::*)(uint32_t, uint32_t) const>("read_i2c", // NOLINT(build/unsigned)
84 .def<uint8_t (timing::I2CSlave::*)(uint32_t) const>("read_i2c_atomic", // NOLINT(build/unsigned)
86 .def<uint8_t (timing::I2CSlave::*)(uint32_t, uint32_t) const>("read_i2c_atomic", // NOLINT(build/unsigned)
88 .def<void (timing::I2CSlave::*)(uint32_t, uint8_t, bool) const>("write_i2c", // NOLINT(build/unsigned)
90 py::arg("i2c_reg_address"),
91 py::arg("data"),
92 py::arg("send_stop") = true)
93 .def<void (timing::I2CSlave::*)(uint32_t, uint32_t, uint8_t, bool) const>("write_i2c", // NOLINT(build/unsigned)
95 py::arg("i2c_device_address"),
96 py::arg("i2c_reg_address"),
97 py::arg("data"),
98 py::arg("send_stop") = true)
99 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
100 "read_i2cArray",
102 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
103 "read_i2cArray",
105 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
106 "read_i2cArray_atomic",
108 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
109 "read_i2cArray_atomic",
111 .def<void (timing::I2CSlave::*)(uint32_t, std::vector<uint8_t>, bool) const>( // NOLINT(build/unsigned)
112 "write_i2cArray",
114 py::arg("i2c_reg_address"),
115 py::arg("data"),
116 py::arg("send_stop") = true)
117 .def<void (timing::I2CSlave::*)(uint32_t, uint32_t, std::vector<uint8_t>, bool) const>( // NOLINT(build/unsigned)
118 "write_i2cArray",
120 py::arg("i2c_device_address"),
121 py::arg("i2c_reg_address"),
122 py::arg("data"),
123 py::arg("send_stop") = true)
124 .def("read_i2cPrimitive", &timing::I2CSlave::read_i2cPrimitive)
125 .def("write_i2cPrimitive", &timing::I2CSlave::write_i2cPrimitive, py::arg("data"), py::arg("send_stop") = true)
126 .def("ping", &timing::I2CSlave::ping);
127
128 // Wrap SIChipSlave
129 py::class_<timing::SIChipSlave, timing::I2CSlave>(m, "SIChipSlave")
130 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
131 .def("read_page", &timing::SIChipSlave::read_page)
132 .def("switch_page", &timing::SIChipSlave::switch_page)
133 .def("read_device_version", &timing::SIChipSlave::read_device_version)
134 .def("read_clock_register", &timing::SIChipSlave::read_clock_register)
135 .def("write_clock_register", &timing::SIChipSlave::write_clock_register);
136
137 // Wrap SI534xSlave
138 py::class_<timing::SI534xSlave, timing::SIChipSlave>(m, "SI534xSlave")
139 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
140 .def("configure", &timing::SI534xSlave::configure)
141 .def("read_config_id", &timing::SI534xSlave::read_config_id)
142 .def("get_status", &timing::SI534xSlave::get_status, py::arg("print_out"))
143 // .def("registers", &timing::SI534xSlave::registers)
144 ;
145
146 // Wrap SI534xNode
147 py::class_<timing::SI534xNode, timing::SI534xSlave, timing::I2CMasterNode>(m, "SI534xNode")
148 .def(py::init<const uhal::Node&>());
149
150 // Wrap I2CExpanderSlave
151 py::class_<timing::I2CExpanderSlave, timing::I2CSlave>(m, "I2CExpanderSlave")
152 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
153 .def("set_io", &timing::I2CExpanderSlave::set_io)
154 .def("set_inversion", &timing::I2CExpanderSlave::set_inversion)
155 .def("set_outputs", &timing::I2CExpanderSlave::set_outputs)
156 .def("read_inputs", &timing::I2CExpanderSlave::read_inputs)
157 .def("read_outputs_config", &timing::I2CExpanderSlave::read_outputs_config)
158 .def("debug", &timing::I2CExpanderSlave::debug);
159
160// // Wrap I2CExpanderNode
161// py::class_<timing::I2CExpanderNode, timing::I2CExpanderSlave, timing::I2CMasterNode>(m, "I2CExpanderNode")
162// .def(py::init<const uhal::Node&>());
163
164 // Wrap DACSlave
165 py::class_<timing::DACSlave, timing::I2CSlave>(m, "DACSlave")
166 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
167 .def("set_interal_ref", &timing::DACSlave::set_interal_ref)
168 .def("set_dac", &timing::DACSlave::set_dac);
169
170 // Wrap DACNode
171 py::class_<timing::DACNode, timing::DACSlave, timing::I2CMasterNode>(m, "DACNode").def(py::init<const uhal::Node&>());
172 // NOLINT(readability/fn_size)
173
174 py::class_<timing::LTC2945Node, timing::I2CSlave>(m, "LTC2945Node")
175 .def(py::init<const timing::I2CMasterNode*, uint8_t, double>()) // NOLINT(build/unsigned)
176 .def("read_v_in", &timing::LTC2945Node::read_v_in)
177 .def("read_delta_sense_v", &timing::LTC2945Node::read_delta_sense_v)
178 .def("read_power", &timing::LTC2945Node::read_power)
179 ;
180
181 // Wrap I2C9546SwitchNode
182 py::class_<timing::I2C9546SwitchSlave, timing::I2CSlave>(m, "I2C9546SwitchSlave")
183 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
184 .def("enable_channel", &timing::I2C9546SwitchSlave::enable_channel)
185 .def("disable_channel", &timing::I2C9546SwitchSlave::disable_channel)
186 .def("read_channels_states", &timing::I2C9546SwitchSlave::read_channels_states)
187 .def("set_channels_states", &timing::I2C9546SwitchSlave::set_channels_states);
188}
189
190} // namespace python
191} // namespace timing
192} // namespace dunedaq
void set_interal_ref(bool internal_ref) const
Use DAC internal reference.
Definition DACNode.cpp:25
void set_dac(uint8_t channel, uint32_t code) const
Configure DAC channel.
Definition DACNode.cpp:33
virtual uint16_t get_i2c_clock_prescale() const
virtual void write_i2c(uint8_t i2c_device_address, uint32_t i2c_reg_address, uint8_t data, bool send_stop=true) const
std::vector< uint8_t > scan() const
virtual void write_i2cPrimitive(uint8_t i2c_device_address, const std::vector< uint8_t > &data, bool send_stop=true) const
virtual uint8_t read_i2c(uint8_t i2c_device_address, uint32_t i2c_reg_address, bool atomic=false) const
commodity functions
bool ping(uint8_t i2c_device_address, bool throw_excp=false) const
virtual uint8_t get_slave_address(const std::string &name) const
virtual std::vector< uint8_t > read_i2cPrimitive(uint8_t i2c_device_address, uint32_t number_of_bytes) const
virtual std::vector< std::string > get_slaves() const
virtual void write_i2cArray(uint8_t i2c_device_address, uint32_t i2c_reg_address, std::vector< uint8_t > data, bool send_stop=true) const
virtual const I2CSlave & get_slave(const std::string &name) const
virtual std::vector< uint8_t > read_i2cArray(uint8_t i2c_device_address, uint32_t i2c_reg_address, uint32_t number_of_words, bool atomic=false) const
uint8_t get_i2c_address() const
Definition I2CSlave.hpp:47
void write_i2cArray(uint32_t i2c_device_address, uint32_t i2c_reg_address, std::vector< uint8_t > data, bool send_stop=true) const
Definition I2CSlave.cpp:133
uint8_t read_i2c(uint32_t i2c_device_address, uint32_t i2c_reg_address) const
comodity functions
Definition I2CSlave.cpp:46
uint8_t read_i2c_atomic(uint32_t i2c_device_address, uint32_t i2c_reg_address) const
Definition I2CSlave.cpp:62
std::vector< uint8_t > read_i2cPrimitive(uint32_t number_of_bytes) const
Definition I2CSlave.cpp:155
std::vector< uint8_t > read_i2cArray(uint32_t i2c_device_address, uint32_t i2c_reg_address, uint32_t number_of_words) const
Definition I2CSlave.cpp:97
void write_i2cPrimitive(const std::vector< uint8_t > &data, bool send_stop=true) const
Definition I2CSlave.cpp:163
bool ping(bool throw_excp=false) const
Definition I2CSlave.cpp:171
void write_i2c(uint32_t i2c_device_address, uint32_t i2c_reg_address, uint8_t data, bool send_stop=true) const
Definition I2CSlave.cpp:78
std::vector< uint8_t > read_i2cArray_atomic(uint32_t i2c_reg_address, uint32_t number_of_words) const
Definition I2CSlave.cpp:125
double read_power() const
Read power [W].
double read_v_in() const
Read V in [V].
double read_delta_sense_v() const
Read delta sense voltage [V].
void switch_page(uint8_t page) const
{ function_description }
void write_clock_register(uint16_t address, uint8_t data) const
Writes a clock register.
uint8_t read_page() const
Reads the current page.
uint8_t read_clock_register(uint16_t address) const
Reads a clock register.
uint32_t read_device_version() const
Reads a device version.
void register_i2c(py::module &m)
Definition i2c.cpp:31
The DUNE-DAQ namespace.
Unknown serialization type<< t,((char) t)) template< typename T > inline std::string datatype_to_string() { return "Unknown";} namespace serialization { template< typename T > struct is_serializable :std::false_type {};enum SerializationType { kMsgPack };inline SerializationType from_string(const std::string s) { if(s=="msgpack") return kMsgPack;throw UnknownSerializationTypeString(ERS_HERE, s);} constexpr uint8_t serialization_type_byte(SerializationType stype) { switch(stype) { case kMsgPack:return 'M';default:throw UnknownSerializationTypeEnum(ERS_HERE);} } constexpr SerializationType DEFAULT_SERIALIZATION_TYPE=kMsgPack;template< class T > std::vector< uint8_t > serialize(const T &obj, SerializationType stype=DEFAULT_SERIALIZATION_TYPE) { switch(stype) { case kMsgPack:{ msgpack::sbuffer buf;msgpack::pack(buf, obj);std::vector< uint8_t > ret(buf.size()+1);ret[0]=serialization_type_byte(stype);std::copy(buf.data(), buf.data()+buf.size(), ret.begin()+1);return ret;} default:throw UnknownSerializationTypeEnum(ERS_HERE);} } template< class T, typename CharType=unsigned char > T deserialize(const std::vector< CharType > &v) { switch(v[0]) { case serialization_type_byte(kMsgPack):{ try { msgpack::object_handle oh=msgpack::unpack(const_cast< char * >(reinterpret_cast< const char * >(v.data()+1)), v.size() - 1,[](msgpack::type::object_type, std::size_t, void *) -> bool