16 template<
typename UserType>
20 size_t numberOfWords,
size_t wordOffsetInRegister,
AccessModeFlags flags)
26 _dev = boost::dynamic_pointer_cast<LogicalNameMappingBackend>(dev);
36 boost::shared_ptr<DeviceBackend> targetDevice;
37 if(devName !=
"this") {
38 targetDevice =
_dev->_devices[devName];
43 _accessor = targetDevice->getRegisterAccessor<UserType>(
50 " exceeds number of channels of target register,"
51 " in accesor for register '" +
52 registerPathName +
"'.");
73 "name mapping devices is not supported.");
80 if(!hasNewData)
return;
86 [[nodiscard]]
bool mayReplaceOther(
const boost::shared_ptr<TransferElement const>& other)
const override {
87 auto rhsCasted = boost::dynamic_pointer_cast<const LNMBackendChannelAccessor<UserType>>(other);
88 if(rhsCasted.get() ==
this) {
91 if(!rhsCasted)
return false;
93 if(
_dev != rhsCasted->_dev)
return false;
97 [[nodiscard]]
bool isReadOnly()
const override {
return true; }
99 [[nodiscard]]
bool isReadable()
const override {
return true; }
105 _accessor->setExceptionBackend(exceptionBackend);
112 boost::shared_ptr<NDRegisterAccessor<UserType>>
_accessor;
118 boost::shared_ptr<LogicalNameMappingBackend>
_dev;
124 return _accessor->getHardwareAccessingElements();
128 auto result =
_accessor->getInternalElements();
134 auto casted = boost::dynamic_pointer_cast<NDRegisterAccessor<UserType>>(newElement);
135 if(casted &&
_accessor->mayReplaceOther(newElement)) {
139 _accessor->replaceTransferElement(newElement);
#define DECLARE_TEMPLATE_FOR_CHIMERATK_USER_TYPES(TemplateClass)
Set of AccessMode flags with additional functionality for an easier handling.
void checkForUnknownFlags(const std::set< AccessMode > &knownFlags) const
Check of any flag which is not in the given set "knownFlags" is set.
bool isReadable() const override
Check if transfer element is readable.
void doPostRead(TransferType type, bool hasNewData) override
Backend specific implementation of postRead().
void replaceTransferElement(boost::shared_ptr< TransferElement > newElement) override
Search for all underlying TransferElements which are considered identical (see sameRegister()) with t...
void doPreWrite(TransferType type, VersionNumber) override
Backend specific implementation of preWrite().
void setExceptionBackend(boost::shared_ptr< DeviceBackend > exceptionBackend) override
Set the backend to which the exception has to be reported.
void interrupt() override
Return from a blocking read immediately and throw boost::thread_interrupted.
bool isWriteable() const override
Check if transfer element is writeable.
void doPreRead(TransferType type) override
Backend specific implementation of preRead().
boost::shared_ptr< LogicalNameMappingBackend > _dev
backend device
void doReadTransferSynchronously() override
Implementation version of readTransfer() for synchronous reads.
RegisterPath _registerPathName
register and module name
boost::shared_ptr< NDRegisterAccessor< UserType > > _accessor
pointer to underlying accessor
bool doWriteTransfer(ChimeraTK::VersionNumber) override
Implementation version of writeTransfer().
std::vector< boost::shared_ptr< TransferElement > > getHardwareAccessingElements() override
Obtain the underlying TransferElements with actual hardware access.
bool isReadOnly() const override
Check if transfer element is read only, i.e.
LNMBackendChannelAccessor(const boost::shared_ptr< DeviceBackend > &dev, const RegisterPath ®isterPathName, size_t numberOfWords, size_t wordOffsetInRegister, AccessModeFlags flags)
bool mayReplaceOther(const boost::shared_ptr< TransferElement const > &other) const override
Check whether the TransferElement can be used in places where the TransferElement "other" is currentl...
std::list< boost::shared_ptr< TransferElement > > getInternalElements() override
Obtain the full list of TransferElements internally used by this TransferElement.
LNMBackendRegisterInfo _info
register information
RegisterInfo structure for the LogicalNameMappingBackend.
std::string registerName
The target register name.
std::string deviceName
The target device alias.
TargetType targetType
Type of the target.
unsigned int channel
The channel of the target 2D register (if TargetType::CHANNEL)
N-dimensional register accessor.
Class to store a register path name.
cppext::future_queue< void > getReadQueue()
Function to get a copy of the read queue.
DataValidity _dataValidity
The validity of the data in the application buffer.
VersionNumber _versionNumber
The version number of the last successful transfer.
cppext::future_queue< void > _readQueue
The queue for asynchronous read transfers.
boost::shared_ptr< DeviceBackend > _exceptionBackend
The backend to which the runtime_errors are reported via DeviceBackend::setException().
Class for generating and holding version numbers without exposing a numeric representation.
Exception thrown when a logic error has occured.
@ wait_for_new_data
Make any read blocking until new data has arrived since the last read.
TransferType
Used to indicate the applicable operation on a Transferelement.
std::string to_string(const std::string &v)