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"
17
18#include <pybind11/pybind11.h>
19#include <pybind11/stl.h>
20
21#include <vector>
22
23namespace py = pybind11;
24
25namespace dunedaq {
26namespace timing {
27namespace python {
28
29void
30register_i2c(py::module& m)
31{
32 // .def("hardReset", (void ( mp7::CtrlNode::*) (double)) 0, mp7_CTRLNODE_hardReset_overloads())
33
34 // Wrap timing::I2CMasterNode
35 py::class_<timing::I2CMasterNode, uhal::Node>(m, "I2CMasterNode")
36 .def(py::init<const uhal::Node&>())
37 .def("get_i2c_clock_prescale", &timing::I2CMasterNode::get_i2c_clock_prescale)
38 .def("read_i2c",
40 py::arg("i2c_device_address"),
41 py::arg("i2c_reg_address"),
42 py::arg("atomic") = false
43 )
44 .def("write_i2c",
46 py::arg("i2c_device_address"),
47 py::arg("i2c_reg_address"),
48 py::arg("data"),
49 py::arg("send_stop") = true)
50 .def("read_i2cArray",
52 py::arg("i2c_device_address"),
53 py::arg("i2c_reg_address"),
54 py::arg("number_of_words"),
55 py::arg("atomic") = false
56 )
57 .def("write_i2cArray",
59 py::arg("i2c_device_address"),
60 py::arg("i2c_reg_address"),
61 py::arg("data"),
62 py::arg("send_stop") = true)
63 .def("read_i2cPrimitive", &timing::I2CMasterNode::read_i2cPrimitive)
64 .def("write_i2cPrimitive",
66 py::arg("i2c_device_address"),
67 py::arg("data"),
68 py::arg("send_stop") = true)
69 .def("get_slaves", &timing::I2CMasterNode::get_slaves)
70 .def("get_slave", &timing::I2CMasterNode::get_slave, py::return_value_policy::reference_internal)
71 .def("get_slave_address", &timing::I2CMasterNode::get_slave_address)
72 .def("ping", &timing::I2CMasterNode::ping)
73 .def("scan", &timing::I2CMasterNode::scan)
74 .def("reset", &timing::I2CMasterNode::reset);
75
76 // Wrap timing::I2CSlave
77 py::class_<timing::I2CSlave>(m, "I2CSlave")
78 .def("get_i2c_address", &timing::I2CSlave::get_i2c_address)
79 .def<uint8_t (timing::I2CSlave::*)(uint32_t) const>("read_i2c", // NOLINT(build/unsigned)
81 .def<uint8_t (timing::I2CSlave::*)(uint32_t, uint32_t) const>("read_i2c", // NOLINT(build/unsigned)
83 .def<uint8_t (timing::I2CSlave::*)(uint32_t) const>("read_i2c_atomic", // NOLINT(build/unsigned)
85 .def<uint8_t (timing::I2CSlave::*)(uint32_t, uint32_t) const>("read_i2c_atomic", // NOLINT(build/unsigned)
87 .def<void (timing::I2CSlave::*)(uint32_t, uint8_t, bool) const>("write_i2c", // NOLINT(build/unsigned)
89 py::arg("i2c_reg_address"),
90 py::arg("data"),
91 py::arg("send_stop") = true)
92 .def<void (timing::I2CSlave::*)(uint32_t, uint32_t, uint8_t, bool) const>("write_i2c", // NOLINT(build/unsigned)
94 py::arg("i2c_device_address"),
95 py::arg("i2c_reg_address"),
96 py::arg("data"),
97 py::arg("send_stop") = true)
98 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
99 "read_i2cArray",
101 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
102 "read_i2cArray",
104 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
105 "read_i2cArray_atomic",
107 .def<std::vector<uint8_t> (timing::I2CSlave::*)(uint32_t, uint32_t, uint32_t) const>( // NOLINT(build/unsigned)
108 "read_i2cArray_atomic",
110 .def<void (timing::I2CSlave::*)(uint32_t, std::vector<uint8_t>, bool) const>( // NOLINT(build/unsigned)
111 "write_i2cArray",
113 py::arg("i2c_reg_address"),
114 py::arg("data"),
115 py::arg("send_stop") = true)
116 .def<void (timing::I2CSlave::*)(uint32_t, uint32_t, std::vector<uint8_t>, bool) const>( // NOLINT(build/unsigned)
117 "write_i2cArray",
119 py::arg("i2c_device_address"),
120 py::arg("i2c_reg_address"),
121 py::arg("data"),
122 py::arg("send_stop") = true)
123 .def("read_i2cPrimitive", &timing::I2CSlave::read_i2cPrimitive)
124 .def("write_i2cPrimitive", &timing::I2CSlave::write_i2cPrimitive, py::arg("data"), py::arg("send_stop") = true)
125 .def("ping", &timing::I2CSlave::ping);
126
127 // Wrap SIChipSlave
128 py::class_<timing::SIChipSlave, timing::I2CSlave>(m, "SIChipSlave")
129 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
130 .def("read_page", &timing::SIChipSlave::read_page)
131 .def("switch_page", &timing::SIChipSlave::switch_page)
132 .def("read_device_version", &timing::SIChipSlave::read_device_version)
133 .def("read_clock_register", &timing::SIChipSlave::read_clock_register)
134 .def("write_clock_register", &timing::SIChipSlave::write_clock_register);
135
136 // Wrap SI534xSlave
137 py::class_<timing::SI534xSlave, timing::SIChipSlave>(m, "SI534xSlave")
138 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
139 .def("configure", &timing::SI534xSlave::configure)
140 .def("read_config_id", &timing::SI534xSlave::read_config_id)
141 // .def("registers", &timing::SI534xSlave::registers)
142 ;
143
144 // Wrap SI534xNode
145 py::class_<timing::SI534xNode, timing::SI534xSlave, timing::I2CMasterNode>(m, "SI534xNode")
146 .def(py::init<const uhal::Node&>());
147
148 // Wrap I2CExpanderSlave
149 py::class_<timing::I2CExpanderSlave, timing::I2CSlave>(m, "I2CExpanderSlave")
150 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
151 .def("set_io", &timing::I2CExpanderSlave::set_io)
152 .def("set_inversion", &timing::I2CExpanderSlave::set_inversion)
153 .def("set_outputs", &timing::I2CExpanderSlave::set_outputs)
154 .def("read_inputs", &timing::I2CExpanderSlave::read_inputs)
155 .def("debug", &timing::I2CExpanderSlave::debug);
156
157// // Wrap I2CExpanderNode
158// py::class_<timing::I2CExpanderNode, timing::I2CExpanderSlave, timing::I2CMasterNode>(m, "I2CExpanderNode")
159// .def(py::init<const uhal::Node&>());
160
161 // Wrap DACSlave
162 py::class_<timing::DACSlave, timing::I2CSlave>(m, "DACSlave")
163 .def(py::init<const timing::I2CMasterNode*, uint8_t>()) // NOLINT(build/unsigned)
164 .def("set_interal_ref", &timing::DACSlave::set_interal_ref)
165 .def("set_dac", &timing::DACSlave::set_dac);
166
167 // Wrap DACNode
168 py::class_<timing::DACNode, timing::DACSlave, timing::I2CMasterNode>(m, "DACNode").def(py::init<const uhal::Node&>());
169 // NOLINT(readability/fn_size)
170
171 py::class_<timing::LTC2945Node, timing::I2CSlave>(m, "LTC2945Node")
172 .def(py::init<const timing::I2CMasterNode*, uint8_t, double>()) // NOLINT(build/unsigned)
173 .def("read_v_in", &timing::LTC2945Node::read_v_in)
174 .def("read_delta_sense_v", &timing::LTC2945Node::read_delta_sense_v)
175 .def("read_power", &timing::LTC2945Node::read_power)
176 ;
177}
178
179} // namespace python
180} // namespace timing
181} // 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
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
bool ping(uint8_t i2c_device_address) 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
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:30
The DUNE-DAQ namespace.
Definition DataStore.hpp:57
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