ChimeraTK-DeviceAccess 03.27.00
Loading...
Searching...
No Matches
NumericAddressedBackendMuxedRegisterAccessor.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3#pragma once
4
5#include "Exception.h"
9#include "RawConverter.h"
10
11#include <boost/shared_ptr.hpp>
12
13namespace ChimeraTK {
14
15 constexpr auto MULTIPLEXED_SEQUENCE_PREFIX = "AREA_MULTIPLEXED_SEQUENCE_";
16 constexpr auto SEQUENCE_PREFIX = "SEQUENCE_";
17
18 constexpr auto MEM_MULTIPLEXED_PREFIX = "MEM_MULTIPLEXED_";
19
20 /********************************************************************************************************************/
24 template<class UserType>
26 public:
27 NumericAddressedBackendMuxedRegisterAccessor(const RegisterPath& registerPathName, size_t numberOfElements,
28 size_t elementsOffset, const boost::shared_ptr<DeviceBackend>& _backend);
29
30 void doReadTransferSynchronously() override;
31
32 void doPostRead(TransferType type, bool hasNewData) override;
33
34 template<typename UserType2, typename RawType, RawConverter::SignificantBitsCase sc,
35 RawConverter::FractionalCase fc, bool isSigned>
37
38 bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override;
39
40 void doPreWrite(TransferType type, VersionNumber versionNumber) override;
41
42 template<typename UserType2, typename RawType, RawConverter::SignificantBitsCase sc,
43 RawConverter::FractionalCase fc, bool isSigned>
45
46 void doPreRead(TransferType) override {
47 if(!_ioDevice->isOpen()) throw ChimeraTK::logic_error("Device not opened.");
48 }
49
50 [[nodiscard]] bool mayReplaceOther(const boost::shared_ptr<TransferElement const>& other) const override {
51 auto rhsCasted = boost::dynamic_pointer_cast<const NumericAddressedBackendMuxedRegisterAccessor<UserType>>(other);
52 if(rhsCasted.get() == this) {
53 return false;
54 }
55 if(!rhsCasted) return false;
56 if(_ioDevice != rhsCasted->_ioDevice) return false;
57 if(_registerInfo != rhsCasted->_registerInfo) return false;
58 // No need to compare converters, since they are derived from registerInfo and UserType.
59 return true;
60 }
61
62 [[nodiscard]] bool isReadOnly() const override { return isReadable() && !isWriteable(); }
63
64 [[nodiscard]] bool isReadable() const override { return _registerInfo.isReadable(); }
65
66 [[nodiscard]] bool isWriteable() const override { return _registerInfo.isWriteable(); }
67
68 protected:
69 // Channels will be grouped such that all channels in each group can use the same RawConverter. This allows us to
70 // implement a more cache efficient demultiplexing strategy.
71 struct ChannelGroup {
72 struct Channel {
73 // Index of the channel
74 size_t index;
75
76 // Number of bytes to advance the raw iterator/pointer after a sample for the channel has been processed, so it
77 // subsequently points to the next sample of the next channel to process within this ChannelGroup. For the last
78 // channel in the group, it will contain the offset to move to the next sample for the first channel in the
79 // group.
81
82 // This iterator is needed only during doPostReadImpl/doPreWriteImpl, but to avoid frequent memory
83 // (de)allocation, we provide storage for it here.
84 std::vector<UserType>::iterator cookedIterator;
85 };
86 std::vector<Channel> channels;
87
88 std::unique_ptr<RawConverter::ConverterLoopHelper> converterLoopHelper;
89
90 // offset from beginning of the register to the first sample in the group.
91 size_t startOffset{};
92 };
93 std::vector<ChannelGroup> _channelGroups;
94
96 boost::shared_ptr<NumericAddressedBackend> _ioDevice;
97
98 std::vector<int32_t> _ioBuffer;
99
101
102 std::vector<boost::shared_ptr<TransferElement>> getHardwareAccessingElements() override {
103 return {boost::enable_shared_from_this<TransferElement>::shared_from_this()};
104 }
105
106 std::list<boost::shared_ptr<TransferElement>> getInternalElements() override { return {}; }
107
108 void replaceTransferElement(boost::shared_ptr<TransferElement> /*newElement*/) override {} // LCOV_EXCL_LINE
109
110 using NDRegisterAccessor<UserType>::buffer_2D;
112 };
113
114 /********************************************************************************************************************/
115
117
118 /********************************************************************************************************************/
119
120} // namespace ChimeraTK
#define DECLARE_TEMPLATE_FOR_CHIMERATK_USER_TYPES(TemplateClass)
N-dimensional register accessor.
std::vector< std::vector< UserType > > buffer_2D
Buffer of converted data elements.
Implementation of the NDRegisterAccessor for NumericAddressedBackends for multiplexd 2D registers.
void doPostReadImpl(RawConverter::Converter< UserType2, RawType, sc, fc, isSigned > converter, size_t channelGroupId)
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...
bool isWriteable() const override
Check if transfer element is writeable.
void doReadTransferSynchronously() override
Implementation version of readTransfer() for synchronous reads.
bool isReadOnly() const override
Check if transfer element is read only, i.e.
void doPostRead(TransferType type, bool hasNewData) override
Backend specific implementation of postRead().
bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransfer().
void doPreWriteImpl(RawConverter::Converter< UserType2, RawType, sc, fc, isSigned > converter, size_t channelGroupId)
void doPreWrite(TransferType type, VersionNumber versionNumber) override
Backend specific implementation of preWrite().
void doPreRead(TransferType) override
Backend specific implementation of preRead().
std::vector< boost::shared_ptr< TransferElement > > getHardwareAccessingElements() override
Obtain the underlying TransferElements with actual hardware access.
std::list< boost::shared_ptr< TransferElement > > getInternalElements() override
Obtain the full list of TransferElements internally used by this TransferElement.
bool isReadable() const override
Check if transfer element is readable.
boost::shared_ptr< NumericAddressedBackend > _ioDevice
The device from (/to) which to perform the DMA transfer.
void replaceTransferElement(boost::shared_ptr< TransferElement >) override
Search for all underlying TransferElements which are considered identical (see sameRegister()) with t...
bool isReadable() const override
Return whether the register is readable.
bool isWriteable() const override
Return whether the register is writeable.
Converter class for conversions from raw to cooked values.
Class to store a register path name.
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.
Definition Exception.h:51
TransferType
Used to indicate the applicable operation on a Transferelement.