ChimeraTK-DeviceAccess 03.27.00
Loading...
Searching...
No Matches
SubdeviceRegisterWindowAccessor.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
7#include "SubdeviceBackend.h"
9
10namespace ChimeraTK {
11
12 /********************************************************************************************************************/
13
16 template<typename RegisterRawType, typename ReadWriteDataType>
17 class SubdeviceRegisterWindowAccessor : public NDRegisterAccessor<RegisterRawType> {
18 public:
19 SubdeviceRegisterWindowAccessor(boost::shared_ptr<SubdeviceBackend> backend, const std::string& registerPathName,
20 size_t numberOfWords, size_t wordOffsetInRegister);
21
22 void doReadTransferSynchronously() override;
23
24 bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override;
25
26 void doPreRead(TransferType type) override;
27
28 void doPostRead(TransferType type, bool hasNewData) override;
29
30 void doPreWrite(TransferType type, VersionNumber) override;
31
32 void doPostWrite(TransferType type, VersionNumber) override;
33
34 [[nodiscard]] bool mayReplaceOther(const boost::shared_ptr<TransferElement const>&) const override;
35
36 [[nodiscard]] bool isReadOnly() const override;
37
38 [[nodiscard]] bool isReadable() const override;
39
40 [[nodiscard]] bool isWriteable() const override;
41
42 protected:
44 boost::shared_ptr<SubdeviceBackend> _backend;
45
47 ScalarRegisterAccessor<uint64_t> _accChipSelect; // chip select register, if present
51 VoidRegisterAccessor _accReadRequest; // read request register, if present
53
54 // values needed in all transfers
56 size_t _starTransferAddress, _endTransferAddress; // in increments of _transfersize, not in bytes
58
60 std::vector<RegisterRawType> _buffer;
61
62 std::vector<boost::shared_ptr<TransferElement>> getHardwareAccessingElements() override;
63
64 std::list<boost::shared_ptr<TransferElement>> getInternalElements() override;
65
66 void replaceTransferElement(boost::shared_ptr<TransferElement> newElement) override;
67
68 enum class TransferDirection { read, write };
69 // Helper for the transfer to minimise code duplication
70 void transferImpl(TransferDirection direction);
71 std::vector<std::byte> _zeros; // _transferSize bytes with 0 to copy from for padding
72 };
73
74 /********************************************************************************************************************/
75
80
81 // Compatibility stuff
86
91
96
101
102} // namespace ChimeraTK
#define DECLARE_MULTI_TEMPLATE_FOR_CHIMERATK_RAW_TYPES(TemplateClass,...)
N-dimensional register accessor.
Accessor class to read and write registers transparently by using the accessor object like a vector o...
Accessor class to read and write scalar registers transparently by using the accessor object like a v...
The RegisterRawType is determined by the number of bytes in the SubDevice mapfile The ReadWriteDataTy...
std::vector< boost::shared_ptr< TransferElement > > getHardwareAccessingElements() override
Obtain the underlying TransferElements with actual hardware access.
void doPostRead(TransferType type, bool hasNewData) override
Backend specific implementation of postRead().
bool isReadOnly() const override
Check if transfer element is read only, i.e.
bool isWriteable() const override
Check if transfer element is writeable.
boost::shared_ptr< SubdeviceBackend > _backend
Pointer to the backend.
ScalarRegisterAccessor< ChimeraTK::Boolean > _accBusy
void doReadTransferSynchronously() override
Implementation version of readTransfer() for synchronous reads.
bool doWriteTransfer(ChimeraTK::VersionNumber versionNumber) override
Implementation version of writeTransfer().
std::list< boost::shared_ptr< TransferElement > > getInternalElements() override
Obtain the full list of TransferElements internally used by this TransferElement.
void doPostWrite(TransferType type, VersionNumber) override
Backend specific implementation of postWrite().
OneDRegisterAccessor< ReadWriteDataType > _accWriteData
ScalarRegisterAccessor< uint64_t > _accChipSelect
Pointers to the accessors.
bool isReadable() const override
Check if transfer element is readable.
OneDRegisterAccessor< ReadWriteDataType > _accReadData
void doPreRead(TransferType type) override
Backend specific implementation of preRead().
std::vector< RegisterRawType > _buffer
internal buffer
void doPreWrite(TransferType type, VersionNumber) override
Backend specific implementation of preWrite().
void replaceTransferElement(boost::shared_ptr< TransferElement > newElement) override
Search for all underlying TransferElements which are considered identical (see sameRegister()) with t...
bool mayReplaceOther(const boost::shared_ptr< TransferElement const > &) const override
Check whether the TransferElement can be used in places where the TransferElement "other" is currentl...
Class for generating and holding version numbers without exposing a numeric representation.
Accessor class to read and write void-typed registers.
TransferType
Used to indicate the applicable operation on a Transferelement.