ChimeraTK-DeviceAccess 03.26.00
Loading...
Searching...
No Matches
NumericAddressedBackendRegisterAccessor.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
8#include "RawConverter.h"
9
10#include <ChimeraTK/cppext/finally.hpp>
11
12namespace ChimeraTK {
13
14 template<typename UserType, bool isRaw>
15 class NumericAddressedBackendRegisterAccessor;
16
17 /********************************************************************************************************************/
18
22 template<typename UserType, bool isRaw>
24 public:
25 NumericAddressedBackendRegisterAccessor(const boost::shared_ptr<DeviceBackend>& dev,
26 const RegisterPath& registerPathName, size_t numberOfWords, size_t wordOffsetInRegister, AccessModeFlags flags);
27
28 void doReadTransferSynchronously() override;
29
30 bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override;
31
32 void doPostRead(TransferType type, bool hasNewData) override;
33
34 // Callback for ConverterLoopHelper, see documentation there.
35 template<class CookedType, typename RawType, RawConverter::SignificantBitsCase sc, RawConverter::FractionalCase fc,
36 bool isSigned>
37 void doPostReadImpl(
38 RawConverter::Converter<CookedType, RawType, sc, fc, isSigned> converter, [[maybe_unused]] size_t channelIndex);
39
40 void doPreWrite(TransferType type, VersionNumber versionNumber) override;
41
42 // Callback for ConverterLoopHelper, see documentation there.
43 template<class CookedType, typename RawType, RawConverter::SignificantBitsCase sc, RawConverter::FractionalCase fc,
44 bool isSigned>
45 void doPreWriteImpl(
46 RawConverter::Converter<CookedType, RawType, sc, fc, isSigned> converter, [[maybe_unused]] size_t channelIndex);
47
48 void doPreRead(TransferType type) override;
49
50 void doPostWrite(TransferType type, VersionNumber versionNumber) override;
51
52 [[nodiscard]] bool mayReplaceOther(const boost::shared_ptr<TransferElement const>& other) const override;
53
54 [[nodiscard]] bool isReadOnly() const override;
55
56 [[nodiscard]] bool isReadable() const override;
57
58 [[nodiscard]] bool isWriteable() const override;
59
60 template<typename COOKED_TYPE>
61 COOKED_TYPE getAsCooked_impl(unsigned int channel, unsigned int sample);
62
63 template<typename COOKED_TYPE>
64 void setAsCooked_impl(unsigned int channel, unsigned int sample, COOKED_TYPE value);
65
66 // a local typename so the DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE_FILLER does
67 // not get confused by the comma which separates the two template parameters
69
72
73 void setExceptionBackend(boost::shared_ptr<DeviceBackend> exceptionBackend) override;
74
75 protected:
79
81 std::unique_ptr<RawConverter::ConverterLoopHelper> _converterLoopHelper;
82
84 boost::shared_ptr<NumericAddressedLowLevelTransferElement> _rawAccessor;
85
87 boost::shared_ptr<NumericAddressedBackend> _dev;
88
89 std::vector<boost::shared_ptr<TransferElement>> getHardwareAccessingElements() override;
90
91 std::list<boost::shared_ptr<TransferElement>> getInternalElements() override;
92
93 void replaceTransferElement(boost::shared_ptr<TransferElement> newElement) override;
94
95 using NDRegisterAccessor<UserType>::buffer_2D;
96 }; // namespace ChimeraTK
97
98 /********************************************************************************************************************/
99
102
103 /********************************************************************************************************************/
104
105} // namespace ChimeraTK
#define DECLARE_MULTI_TEMPLATE_FOR_CHIMERATK_USER_TYPES(TemplateClass,...)
Macro to declare a template class with multiple template parameters for all supported user types.
Set of AccessMode flags with additional functionality for an easier handling.
Definition AccessMode.h:48
N-dimensional register accessor.
std::vector< std::vector< UserType > > buffer_2D
Buffer of converted data elements.
Implementation of the NDRegisterAccessor for NumericAddressedBackends for scalar and 1D registers.
std::list< boost::shared_ptr< TransferElement > > getInternalElements() override
Obtain the full list of TransferElements internally used by this TransferElement.
void doPostWrite(TransferType type, VersionNumber versionNumber) override
Backend specific implementation of postWrite().
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.
void setExceptionBackend(boost::shared_ptr< DeviceBackend > exceptionBackend) override
Set the backend to which the exception has to be reported.
void doPreWriteImpl(RawConverter::Converter< CookedType, RawType, sc, fc, isSigned > converter, size_t channelIndex)
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...
void doPostRead(TransferType type, bool hasNewData) override
Backend specific implementation of postRead().
bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransfer().
std::unique_ptr< RawConverter::ConverterLoopHelper > _converterLoopHelper
Converter to interpret the data.
void setAsCooked_impl(unsigned int channel, unsigned int sample, COOKED_TYPE value)
bool isWriteable() const override
Check if transfer element is writeable.
void doPreRead(TransferType type) override
Backend specific implementation of preRead().
void doReadTransferSynchronously() override
Implementation version of readTransfer() for synchronous reads.
DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE_FILLER(THIS_TYPE, getAsCooked_impl, 2)
void replaceTransferElement(boost::shared_ptr< TransferElement > newElement) override
Search for all underlying TransferElements which are considered identical (see sameRegister()) with t...
void doPostReadImpl(RawConverter::Converter< CookedType, RawType, sc, fc, isSigned > converter, size_t channelIndex)
boost::shared_ptr< NumericAddressedBackend > _dev
the backend to use for the actual hardware access
NumericAddressedRegisterInfo _registerInfo
Address, size and fixed-point representation information of the register from the map file.
DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE_FILLER(THIS_TYPE, setAsCooked_impl, 3)
boost::shared_ptr< NumericAddressedLowLevelTransferElement > _rawAccessor
raw accessor
COOKED_TYPE getAsCooked_impl(unsigned int channel, unsigned int sample)
void doPreWrite(TransferType type, VersionNumber versionNumber) override
Backend specific implementation of preWrite().
bool isReadable() const override
Check if transfer element is readable.
Converter class for conversions from raw to cooked values.
Class to store a register path name.
Class for generating and holding version numbers without exposing a numeric representation.
TransferType
Used to indicate the applicable operation on a Transferelement.