ChimeraTK-ApplicationCore 04.06.00
Loading...
Searching...
No Matches
ConstantAccessor.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 <ChimeraTK/NDRegisterAccessor.h>
6
7namespace ChimeraTK {
8
9 /********************************************************************************************************************/
10
24 template<typename UserType>
25 class ConstantAccessor : public ChimeraTK::NDRegisterAccessor<UserType> {
26 public:
27 explicit ConstantAccessor(
28 UserType value = 0, size_t length = 1, AccessModeFlags accessModeFlags = AccessModeFlags{});
29
30 void doReadTransferSynchronously() override {}
31
32 void doPostRead(TransferType /*type*/, bool updateUserBuffer) override;
33
34 // FIXME: https://redmine.msktools.desy.de/issues/12242
35 // NOLINTNEXTLINE(google-default-arguments)
36 bool doWriteTransfer(ChimeraTK::VersionNumber /*versionNumber*/ = {}) override { return false; }
37
38 [[nodiscard]] bool mayReplaceOther(const boost::shared_ptr<ChimeraTK::TransferElement const>&) const override {
39 return false;
40 }
41
42 [[nodiscard]] bool isReadOnly() const override { return false; }
43
44 [[nodiscard]] bool isReadable() const override { return true; }
45
46 [[nodiscard]] bool isWriteable() const override { return true; }
47
48 std::vector<boost::shared_ptr<ChimeraTK::TransferElement>> getHardwareAccessingElements() override { return {}; }
49
50 void replaceTransferElement(boost::shared_ptr<ChimeraTK::TransferElement>) override {}
51
52 std::list<boost::shared_ptr<ChimeraTK::TransferElement>> getInternalElements() override { return {}; }
53
54 void interrupt() override {
55 if(TransferElement::_accessModeFlags.has(AccessMode::wait_for_new_data)) {
56 TransferElement::interrupt_impl(this->_readQueue);
57 }
58 }
59
60 protected:
61 std::vector<UserType> _value;
62 };
63
64 /********************************************************************************************************************/
65
66 template<typename UserType>
67 ConstantAccessor<UserType>::ConstantAccessor(UserType value, size_t length, AccessModeFlags accessModeFlags)
68 : ChimeraTK::NDRegisterAccessor<UserType>("UnnamedConstantAccessor", accessModeFlags), _value(length, value) {
69 ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D.resize(1);
70 ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D[0] = _value;
71
72 if(TransferElement::_accessModeFlags.has(AccessMode::wait_for_new_data)) {
73 // This implementation does not have a data transport queue, hence _readQueue
74 // is not set up as a continuation. We directly make it a cppext::future_queue
75 TransferElement::_readQueue = cppext::future_queue<void>(3); // minimum required length is 2
76 // Push once into the queue for the initial value.
77 TransferElement::_readQueue.push();
78 }
79 }
80
81 /********************************************************************************************************************/
82
83 template<typename UserType>
84 void ConstantAccessor<UserType>::doPostRead(TransferType /*type*/, bool updateUserBuffer) {
85 // - updateUserBuffer is false for further calls to readLatest with wait_for_new_data.
86 // In this case the user buffer must not be touched.
87 // - updateUserBuffer is true for all calls without wait_for_new_data. The user buffer must
88 // be overwritten.
89 if(updateUserBuffer) {
90 ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D[0] = _value;
91 // It is OK to generate the version number just here since the read transfer is empty anyway.
92 this->_versionNumber = {};
93 this->_dataValidity = DataValidity::ok; // the constant is always valid by definiton
94 }
95 }
96
97 /********************************************************************************************************************/
98
99} /* namespace ChimeraTK */
Implementation of the NDRegisterAccessor which delivers always the same value and ignors any write op...
bool mayReplaceOther(const boost::shared_ptr< ChimeraTK::TransferElement const > &) const override
std::vector< UserType > _value
bool isReadOnly() const override
bool isReadable() const override
bool doWriteTransfer(ChimeraTK::VersionNumber={}) override
void doPostRead(TransferType, bool updateUserBuffer) override
bool isWriteable() const override
std::vector< boost::shared_ptr< ChimeraTK::TransferElement > > getHardwareAccessingElements() override
void doReadTransferSynchronously() override
std::list< boost::shared_ptr< ChimeraTK::TransferElement > > getInternalElements() override
void replaceTransferElement(boost::shared_ptr< ChimeraTK::TransferElement >) override
ConstantAccessor(UserType value=0, size_t length=1, AccessModeFlags accessModeFlags=AccessModeFlags{})
InvalidityTracer application module.