ChimeraTK-DeviceAccess 03.27.00
Loading...
Searching...
No Matches
SubdeviceConvertingDecorator.cc
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
5
6namespace ChimeraTK {
7
8 /********************************************************************************************************************/
9
10 template<typename UserType, typename TargetUserType>
12 const boost::shared_ptr<ChimeraTK::NDRegisterAccessor<TargetUserType>>& target,
13 NumericAddressedRegisterInfo const& registerInfo)
14 : NDRegisterAccessorDecorator<UserType, TargetUserType>(target), _registerInfo(registerInfo) {
15 assert(registerInfo.getNumberOfChannels() == 1);
16 _converterLoopHelper = RawConverter::ConverterLoopHelper::makeConverterLoopHelperFixedRaw<UserType, TargetUserType>(
17 registerInfo, 0 /*channel*/, 0 /* implParameter*/, *this);
18 }
19
20 /********************************************************************************************************************/
21
22 template<typename UserType, typename TargetUserType>
24 _target->preRead(type);
25 }
26
27 /********************************************************************************************************************/
28
29 template<typename UserType, typename TargetUserType>
31 _target->postRead(type, hasNewData);
32 if(!hasNewData) {
33 return;
34 }
35
36 _converterLoopHelper->doPostRead();
37
38 this->_dataValidity = _target->dataValidity();
39 this->_versionNumber = _target->getVersionNumber();
40 }
41
42 /********************************************************************************************************************/
43
44 // Callback for ConverterLoopHelper, see documentation there.
45 template<typename UserType, typename TargetUserType>
46 template<class CookedType, typename RawType, RawConverter::SignificantBitsCase sc, RawConverter::FractionalCase fc,
47 bool isSigned>
49 RawConverter::Converter<CookedType, RawType, sc, fc, isSigned> converter, [[maybe_unused]] size_t implParameter) {
50 for(auto [itsrc, itdst] = std::make_pair(_target->accessChannel(0).begin(), buffer_2D[0].begin());
51 itdst != buffer_2D[0].end(); ++itsrc, ++itdst) {
52 if constexpr(!std::is_same_v<RawType, ChimeraTK::Void>) {
53 *itdst = converter.toCooked(*itsrc);
54 }
55 }
56 }
57
58 /********************************************************************************************************************/
59
60 template<typename UserType, typename TargetUserType>
62 _converterLoopHelper->doPreWrite();
63 _target->setDataValidity(this->_dataValidity);
64 _target->preWrite(type, versionNumber);
65 }
66
67 /********************************************************************************************************************/
68
69 // Callback for ConverterLoopHelper, see documentation there.
70 template<typename UserType, typename TargetUserType>
71 template<class CookedType, typename RawType, RawConverter::SignificantBitsCase sc, RawConverter::FractionalCase fc,
72 bool isSigned>
74 RawConverter::Converter<CookedType, RawType, sc, fc, isSigned> converter, [[maybe_unused]] size_t implParameter) {
75 for(auto [itsrc, itdst] = std::make_pair(buffer_2D[0].begin(), _target->accessChannel(0).begin());
76 itsrc != buffer_2D[0].end(); ++itsrc, ++itdst) {
77 if constexpr(!std::is_same_v<RawType, ChimeraTK::Void>) {
78 *itdst = converter.toRaw(*itsrc);
79 }
80 }
81 }
82
83 /********************************************************************************************************************/
84
85 template<typename UserType, typename TargetUserType>
87 _target->postWrite(type, versionNumber);
88 }
89
90 /********************************************************************************************************************/
91
92 template<typename UserType, typename TargetUserType>
94 const boost::shared_ptr<ChimeraTK::TransferElement const>& other) const {
95 auto casted = boost::dynamic_pointer_cast<ConvertingDecorator<UserType, TargetUserType> const>(other);
96 if(!casted) {
97 return false;
98 }
99 if(_registerInfo != casted->_registerInfo) {
100 return false;
101 }
102 return _target->mayReplaceOther(casted->_target);
103 }
104
105 /********************************************************************************************************************/
110
111 // FIXME: get rid of the signed ints!
113
114} // namespace ChimeraTK
#define INSTANTIATE_MULTI_TEMPLATE_FOR_CHIMERATK_USER_TYPES(TemplateClass,...)
void doPostReadImpl(RawConverter::Converter< CookedType, RawType, sc, fc, isSigned > converter, size_t implParameter)
void doPreWriteImpl(RawConverter::Converter< CookedType, RawType, sc, fc, isSigned > converter, size_t implParameter)
void doPostWrite(TransferType type, VersionNumber versionNumber) override
Backend specific implementation of postWrite().
std::unique_ptr< RawConverter::ConverterLoopHelper > _converterLoopHelper
bool mayReplaceOther(const boost::shared_ptr< ChimeraTK::TransferElement const > &other) const override
void doPostRead(TransferType type, bool hasNewData) override
Backend specific implementation of postRead().
void doPreRead(TransferType type) override
Backend specific implementation of preRead().
void doPreWrite(TransferType type, VersionNumber versionNumber) override
Backend specific implementation of preWrite().
ConvertingDecorator(const boost::shared_ptr< ChimeraTK::NDRegisterAccessor< TargetUserType > > &target, NumericAddressedRegisterInfo const &registerInfo)
Base class for decorators of the NDRegisterAccessor.
N-dimensional register accessor.
unsigned int getNumberOfChannels() const override
Return number of channels in register.
Converter class for conversions from raw to cooked values.
UserType toCooked(RawType rawValue)
RawType toRaw(UserType cookedValue)
Class for generating and holding version numbers without exposing a numeric representation.
TransferType
Used to indicate the applicable operation on a Transferelement.