mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-12-13 08:30:04 +01:00
Merge remote-tracking branch 'origin/dev/define_cmd' into dev/define_cmd
This commit is contained in:
@@ -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
|
||||
==========================================
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3,15 +3,23 @@
|
||||
#include "sls/logger.h"
|
||||
#include <iostream>
|
||||
#include <chrono>
|
||||
|
||||
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: "
|
||||
|
||||
49
sample/using_registers.cpp
Normal file
49
sample/using_registers.cpp
Normal file
@@ -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 <iostream>
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "CmdParser.h"
|
||||
#include "HelpDacs.h"
|
||||
#include "sls/Detector.h"
|
||||
|
||||
#include "sls/bit_utils.h"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
Reference in New Issue
Block a user