From 300a296c208fa69804848bbc5b46ac7d128be434 Mon Sep 17 00:00:00 2001 From: Alice Date: Wed, 10 Dec 2025 16:21:00 +0100 Subject: [PATCH 1/3] updated release notes --- RELEASE.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RELEASE.txt b/RELEASE.txt index b56b0dacf..dd2dbabec 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -1,7 +1,7 @@ SLS Detector Package Major Release x.x.x released on xx.xx.202x =============================================================== -This document describes the differences between vx.x.x and vx.0.2 +This document describes the differences between vx.x.x and v10.0.0 @@ -35,6 +35,8 @@ instead of the one included in our repo. Experimental support for building the detector client (including python bindings) on macOS +``rx_dbitlist`` keeps the order of the passed bit list + 2 On-board Detector Server Compatibility ========================================== From f150eed74b85b0273167ad2e86070e3be0b17c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Fri, 12 Dec 2025 08:35:31 +0100 Subject: [PATCH 2/3] Using define reg/bit from python (#1344) * define_bit, define_addr in python. * setBit/clearBit takes int or addr --- docs/CMakeLists.txt | 3 +- python/slsdet/detector.py | 103 +++++++++++++++++++++++++++++++ python/slsdet/registers.py | 15 +++++ python/tests/test_utils.py | 73 ---------------------- slsDetectorSoftware/src/Caller.h | 2 +- 5 files changed, 121 insertions(+), 75 deletions(-) diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 41055eee9..62e11f673 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -11,7 +11,8 @@ add_executable(gendoc src/gendoc.cpp) # This is a bit hacky, but better than exposing stuff? target_include_directories(gendoc PRIVATE ${PROJECT_SOURCE_DIR}/slsDetectorSoftware/src) target_link_libraries(gendoc PRIVATE - slsDetectorShared + slsDetectorStatic + ) set_target_properties(gendoc PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 786e6af3f..e947a642a 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -1814,6 +1814,109 @@ class Detector(CppDetectorApi): [Eiger] Address is +0x100 for only left, +0x200 for only right. """ return self._register + + def define_reg(self, name, addr): + """ + [Ctb] Define a name for a register to be used later with reg. + + Example + -------- + + d.define_reg('myreg',addr=0x6) + """ + addr = RegisterAddress(addr) + self.setRegisterDefinition(name, addr) + + + def define_bit(self, name, addr, bit): + """ + [Ctb] Define a name for a bit in a register to be used later with setBit/clearBit/getBit + + Example + -------- + + d.define_bit('mybit',addr=0x6, bit=7) + """ + addr = RegisterAddress(addr) + bit = BitAddress(addr, bit) + self.setBitDefinition(name, bit) + + def setBit(self, bit_or_addr, number=None): + """ + Set a bit in a register + [Ctb] Can use a named bit address + + Example + -------- + d.setBit(0x5, 3) + + #Ctb + d.setBit('mybit') + + myreg = RegisterAddress(0x5) + mybit = BitAddress(myreg, 5) + d.setBit(mybit) + """ + #Old usage passing two ints + if isinstance(bit_or_addr, int): + return super().setBit(bit_or_addr, number) + + #New usage with str or BitAddress + if isinstance(bit_or_addr, str): + bit_or_addr = self.getBitDefinition(bit_or_addr) + return super().setBit(bit_or_addr) + + def clearBit(self, bit_or_addr, number=None): + """ + Clear a bit in a register + [Ctb] Can use a named bit address + + Example + -------- + d.clearBit(0x5, 3) + + #Ctb + d.clearBit('mybit') + + myreg = RegisterAddress(0x5) + mybit = BitAddress(myreg, 5) + d.clearBit(mybit) + """ + #Old usage passing two ints + if isinstance(bit_or_addr, int): + return super().clearBit(bit_or_addr, number) + + #New usage with str or BitAddress + if isinstance(bit_or_addr, str): + bit_or_addr = self.getBitDefinition(bit_or_addr) + return super().clearBit(bit_or_addr) + + @element + def getBit(self, bit_or_addr, number=None): + """ + Get a bit from a register + [Ctb] Can use a named bit address + + Example + -------- + d.getBit(0x5, 3) + + #Ctb + d.getBit('mybit') + + myreg = RegisterAddress(0x5) + mybit = BitAddress(myreg, 5) + d.getBit(mybit) + """ + #Old usage passing two ints + if isinstance(bit_or_addr, int): + return super().getBit(bit_or_addr, number) + + #New usage with str or BitAddress + if isinstance(bit_or_addr, str): + bit_or_addr = self.getBitDefinition(bit_or_addr) + return super().getBit(bit_or_addr) + @property def slowadc(self): diff --git a/python/slsdet/registers.py b/python/slsdet/registers.py index 4c80585e9..835205c47 100755 --- a/python/slsdet/registers.py +++ b/python/slsdet/registers.py @@ -1,13 +1,28 @@ # SPDX-License-Identifier: LGPL-3.0-or-other # Copyright (C) 2021 Contributors to the SLS Detector Package + +from ._slsdet import RegisterValue, RegisterAddress +from .utils import element + class Register: def __init__(self, detector): self._detector = detector + @element def __getitem__(self, key): + if isinstance(key, str): + key = self._detector.getRegisterDefinition(key) return self._detector.readRegister(key) def __setitem__(self, key, value): + if isinstance(key, str): + key = self._detector.getRegisterDefinition(key) + elif isinstance(key, int): + key = RegisterAddress(key) + + if isinstance(value, int): + value = RegisterValue(value) + self._detector.writeRegister(key, value, False) class Adc_register: diff --git a/python/tests/test_utils.py b/python/tests/test_utils.py index 21231b9f8..719379235 100755 --- a/python/tests/test_utils.py +++ b/python/tests/test_utils.py @@ -198,79 +198,6 @@ def test_make_mac_from_tuple(): assert make_mac(arg) == (MacAddr("84:a9:aa:24:32:88"), MacAddr("84:a9:3e:24:32:aa")) -def test_make_reg_addr_from_dict(): - arg = {0: 0, 1: 0x305} - res = make_register_address(arg) - assert res == {0: RegisterAddress(0x0), 1: RegisterAddress(0x305)} - assert res[0].str() == "0x0" - assert res[1].str() == "0x305" - - -def test_make_reg_addr_from_str(): - reg_addr = "0x305" - assert make_register_address(reg_addr).str() == reg_addr - - -def test_make_reg_addr_from_list(): - arg = [0x305, "0x1fff1fff", 0xc34a] - assert make_register_address(arg) == [RegisterAddress(a) for a in arg] - - -def test_make_reg_addr_from_tuple(): - arg = ("0x340") - assert make_register_address(arg) == (RegisterAddress(arg)) - - -def test_make_reg_val_from_dict(): - arg = {0: 0, 1: 0x305} - res = make_register_value(arg) - assert res == {0: RegisterValue(0x0), 1: RegisterValue(0x305)} - assert res[0].str() == "0x0" - assert res[1].str() == "0x305" - - -def test_make_reg_val_from_str(): - reg_val = "0x305" - assert make_register_value(reg_val).str() == reg_val - - -def test_make_reg_val_from_list(): - arg = [0x305, "0x1fff1fff", 0xc34a] - assert make_register_value(arg) == [RegisterValue(a) for a in arg] - - -def test_make_reg_val_from_tuple(): - arg = ("0x340") - assert make_register_value(arg) == (RegisterValue(arg)) - - -def test_make_bit_pos_from_dict(): - arg = { - 0: (RegisterAddress(0), 2), - 1: (RegisterAddress(0x305), 23) - } - res = make_bit_position(arg) - assert res == { - 0: BitAddress(RegisterAddress("0x0"), 2), - 1: BitAddress(RegisterAddress("0x305"), 23) - } - assert res[0].str() == "[0x0, 2]" - assert res[1].str() == "[0x305, 23]" - - -def test_make_bit_pos_from_list(): - arg = [ - (RegisterAddress(0), 2), - (RegisterAddress(0x305), 23) - ] - expected = [BitAddress(*a) for a in arg] - assert make_bit_position(arg) == expected - - -def test_make_bit_pos_from_tuple(): - arg = (RegisterAddress(0x305), 23) - expected = BitAddress(*arg) - assert make_bit_position(arg) == expected def test_make_path_from_str(): diff --git a/slsDetectorSoftware/src/Caller.h b/slsDetectorSoftware/src/Caller.h index bd25b1799..92c02335b 100644 --- a/slsDetectorSoftware/src/Caller.h +++ b/slsDetectorSoftware/src/Caller.h @@ -3,7 +3,7 @@ #include "CmdParser.h" #include "HelpDacs.h" #include "sls/Detector.h" - +#include "sls/bit_utils.h" #include #include #include From c34eec033ab5a72a74f355b70a4baec0353d9ef2 Mon Sep 17 00:00:00 2001 From: froejdh_e Date: Fri, 12 Dec 2025 09:47:45 +0100 Subject: [PATCH 3/3] added example using bits --- sample/CMakeLists.txt | 10 +++++++- sample/using_logger.cpp | 14 ++++++++--- sample/using_registers.cpp | 49 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 sample/using_registers.cpp diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index 732bd31cd..e1238106d 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -4,12 +4,20 @@ add_executable(using_logger using_logger.cpp) target_link_libraries(using_logger slsSupportShared ) - set_target_properties(using_logger PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) +add_executable(using_registers using_registers.cpp) +target_link_libraries(using_registers + slsDetectorShared +) +set_target_properties(using_registers PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) + + # add_executable(result useResult.cpp) # target_link_libraries(result # slsDetectorShared diff --git a/sample/using_logger.cpp b/sample/using_logger.cpp index 7557d5c83..0019ca327 100644 --- a/sample/using_logger.cpp +++ b/sample/using_logger.cpp @@ -3,15 +3,23 @@ #include "sls/logger.h" #include #include + +using sls::logINFO; +using sls::logINFORED; +using sls::logINFOBLUE; +using sls::logINFOGREEN; +using sls::logERROR; +using sls::logWARNING; + + int main() { //compare old and new std::cout << "Compare output between old and new:\n"; LOG(logINFO) << "Some info message"; LOG(logERROR) << "This is an error"; - LOG(logWARNING) << "While this is only a warning"; prefix="/afs/psi.ch/project/sls_det_software/dhanya_softwareDevelopment/mySoft/slsDetectorPackage/" - p=${file#"$prefix"} - + LOG(logWARNING) << "While this is only a warning"; + //Logging level can be configure at runtime std::cout << "\n\n"; std::cout << "The default macro controlled level is: " diff --git a/sample/using_registers.cpp b/sample/using_registers.cpp new file mode 100644 index 000000000..e3a2f44ff --- /dev/null +++ b/sample/using_registers.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package + +/* This example assumes that you have a ctb configured or using the virtual ctb detector server*/ + +#include "sls/Detector.h" +#include "sls/bit_utils.h" +#include + + +void somefunc(uint32_t addr){ + std::cout << "somefunc called with: " << addr << std::endl; +} + +int main(){ + + // Config file has the following defines + // define addr somereg 0x5 + // define bit mybit somereg 7 + + sls::Detector d; + auto somereg = d.getRegisterDefinition("somereg"); + d.writeRegister(somereg, sls::RegisterValue(0)); + auto val = d.readRegister(somereg); + + std::cout << "somereg has the address: " << somereg << " and value " << val.squash() << std::endl; + + + auto mybit = d.getBitDefinition("mybit"); + std::cout << "mybit refers to register: " << mybit.address() << " bit nr: " << mybit.bitPosition() << std::endl; + d.setBit(mybit); + val = d.readRegister(somereg); + std::cout << "somereg has the address: " << somereg << " and value " << val.squash() << std::endl; + std::cout << "mybit: " << d.getBit(mybit) << std::endl; + + + //Let's define a bit + sls::BitAddress newbit(sls::RegisterAddress(0x6), 4); + d.setBitDefinition("newbit", newbit); + //This can now be usef from command line "g getbit newbit" + + + + + uint32_t addr = somereg; //I'm not sure this should compile + somefunc(somereg); //This should also not compile + + +} \ No newline at end of file