diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index eeac372f0..13e6abb3d 100755 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -12,6 +12,7 @@ pybind11_add_module(_slsdet src/duration.cpp src/DurationWrapper.cpp src/pedestal.cpp + src/bit.cpp ) target_link_libraries(_slsdet PUBLIC diff --git a/python/slsdet/__init__.py b/python/slsdet/__init__.py index 7cfbd17fb..0daaf66b9 100755 --- a/python/slsdet/__init__.py +++ b/python/slsdet/__init__.py @@ -27,6 +27,9 @@ from .defines import * IpAddr = _slsdet.IpAddr MacAddr = _slsdet.MacAddr +RegisterAddress = _slsdet.RegisterAddress +BitPosition = _slsdet.BitPosition +RegisterValue = _slsdet.RegisterValue scanParameters = _slsdet.scanParameters currentSrcParameters = _slsdet.currentSrcParameters DurationWrapper = _slsdet.DurationWrapper diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 1d62158cf..e44505c91 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -3,6 +3,7 @@ from ._slsdet import CppDetectorApi from ._slsdet import slsDetectorDefs from ._slsdet import IpAddr, MacAddr +from ._slsdet import RegisterAddress, RegisterValue, BitPosition runStatus = slsDetectorDefs.runStatus timingMode = slsDetectorDefs.timingMode diff --git a/python/slsdet/utils.py b/python/slsdet/utils.py index 9181298e5..50ffc1c54 100755 --- a/python/slsdet/utils.py +++ b/python/slsdet/utils.py @@ -141,6 +141,14 @@ def make_ip(arg): def make_mac(arg): return _make(arg, _slsdet.MacAddr) +def make_register_address(arg): + return _make(arg, _slsdet.RegisterAddress) + +def make_bit_position(arg): + return _make(arg, _slsdet.BitPosition) + +def make_register_value(arg): + return _make(arg, _slsdet.RegisterValue) def make_path(arg): return _make(arg, Path) diff --git a/python/src/bit.cpp b/python/src/bit.cpp new file mode 100644 index 000000000..c5521bda3 --- /dev/null +++ b/python/src/bit.cpp @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +/* +This file contains Python bindings for the RegisterAddr, BitPosition and RegisterValue +classes. +*/ +#include "py_headers.h" +#include "sls/bit_utils.h" + +namespace py = pybind11; + +using sls::RegisterAddress; +using sls::RegisterValue; +using sls::BitPosition; + +void init_bit(py::module &m) { + + py::class_(m, "RegisterAddress") + .def(py::init()) + .def(py::init()) + .def(py::init()) + .def(py::init()) + .def("__repr__", &RegisterAddress::str) + .def("str", &RegisterAddress::str); + .def("uint32", [](const RegisterAddress &v) { return static_cast(v); }) + .def(py::self == py::self) + .def(py::self != py::self) + + py::class_(m, "BitPosition") + .def(py::init()) + .def(py::init()) + .def("__repr__", &BitPosition::str) + .def("str", &BitPosition::str); + .def("address", &BitPosition::address) + .def("bitPosition", &BitPosition::bitPosition) + .def("setAddress", &BitPosition::setAddress) + .def("setBitPosition", &BitPosition::setBitPosition) + .def(py::self == py::self) + .def(py::self != py::self); + + py::class_(m, "RegisterValue") + .def(py::init<>()) + .def(py::init()) + .def(py::init()) + .def(py::init()) + .def("__repr__", &RegisterValue::str) + .def("str", &RegisterValue::str) + .def("uint32", [](const RegisterValue &v) { return static_cast(v); }) + .def(py::self == py::self) + .def(py::self != py::self) + .def("__ior__", [](RegisterValue &v, uint32_t rhs) -> RegisterValue& { + v |= rhs; + return v; + }, py::return_value_policy::reference_internal); +} diff --git a/python/src/detector_in.cpp b/python/src/detector_in.cpp index 09950af0d..b5445220c 100644 --- a/python/src/detector_in.cpp +++ b/python/src/detector_in.cpp @@ -8,6 +8,7 @@ #include "sls/bit_utils.h" #include "sls/sls_detector_defs.h" #include "sls/TimeHelper.h" +#include "sls/bit_utils.h" #include #include diff --git a/python/src/main.cpp b/python/src/main.cpp index 901c4900e..214f2b81c 100644 --- a/python/src/main.cpp +++ b/python/src/main.cpp @@ -20,6 +20,7 @@ void init_scan(py::module &); void init_source(py::module &); void init_duration(py::module &); void init_pedestal(py::module &); +void init_bit(py::module &); PYBIND11_MODULE(_slsdet, m) { m.doc() = R"pbdoc( @@ -40,6 +41,7 @@ PYBIND11_MODULE(_slsdet, m) { init_source(m); init_duration(m); init_pedestal(m); + init_bit(m); // init_experimental(m); py::module io = m.def_submodule("io", "Submodule for io");