![]() |
ChimeraTK-DeviceAccess 03.20.00
|
Special accessor used to test the behaviour of the NDReigsterAccessorDecorator base class. More...
Public Member Functions | |
DecoratorTestAccessor (AccessModeFlags flags) | |
~DecoratorTestAccessor () override | |
void | doPreRead (TransferType type) override |
Backend specific implementation of preRead(). | |
void | doPreWrite (TransferType type, VersionNumber versionNumber) override |
Backend specific implementation of preWrite(). | |
void | doReadTransferSynchronously () override |
Implementation version of readTransfer() for synchronous reads. | |
bool | doWriteTransfer (ChimeraTK::VersionNumber versionNumber) override |
Implementation version of writeTransfer(). | |
bool | doWriteTransferDestructively (ChimeraTK::VersionNumber versionNumber) override |
Implementation version of writeTransferDestructively(). | |
void | doPostRead (TransferType type, bool updateDataBuffer) override |
This doPostRead() implementation checks partially the TransferElement specification B.4. | |
void | doPostWrite (TransferType type, VersionNumber versionNumber) override |
This doPostWrite() implementation checks partially the TransferElement specification B.4. | |
bool | mayReplaceOther (const boost::shared_ptr< TransferElement const > &) const override |
Check whether the TransferElement can be used in places where the TransferElement "other" is currently used, e.g. | |
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. | |
void | replaceTransferElement (boost::shared_ptr< TransferElement > newElement) override |
Search for all underlying TransferElements which are considered identical (see sameRegister()) with the given TransferElement. | |
bool | isReadOnly () const override |
Check if transfer element is read only, i.e. | |
bool | isReadable () const override |
Check if transfer element is readable. | |
bool | isWriteable () const override |
Check if transfer element is writeable. | |
void | interrupt () override |
Return from a blocking read immediately and throw boost::thread_interrupted. | |
void | resetCounters () |
void | putRuntimeErrorOnQueue () |
void | putDiscardValueOnQueue () |
bool | push () |
![]() | |
NDRegisterAccessor (std::string const &name, AccessModeFlags accessModeFlags, std::string const &unit=std::string(TransferElement::unitNotSet), std::string const &description=std::string()) | |
Creates an NDRegisterAccessor with the specified name (passed on to the transfer element). | |
UserType & | accessData (size_t sample) |
Get or set register accessor's buffer content (1D version). | |
const UserType & | accessData (size_t sample) const |
UserType & | accessData (unsigned int channel, unsigned int sample) |
Get or set register accessor's buffer content (2D version). | |
const UserType & | accessData (unsigned int channel, unsigned int sample) const |
std::vector< UserType > & | accessChannel (unsigned int channel) |
Get or set register accessor's channel vector. | |
const std::vector< UserType > & | accessChannel (unsigned int channel) const |
std::vector< std::vector< UserType > > & | accessChannels () |
Get or set register accessor's 2D channel vector. | |
const std::vector< std::vector< UserType > > & | accessChannels () const |
unsigned int | getNumberOfSamples () const |
Return number of elements per channel. | |
unsigned int | getNumberOfChannels () const |
Return number of channels. | |
const std::type_info & | getValueType () const override |
Returns the std::type_info for the value type of this transfer element. | |
template<typename COOKED_TYPE > | |
COOKED_TYPE | getAsCooked (unsigned int channel, unsigned int sample) const |
DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE (getAsCooked_impl, T const(unsigned int, unsigned int)) | |
template<typename COOKED_TYPE > | |
COOKED_TYPE | getAsCooked_impl (unsigned int channel, unsigned int sample) const |
template<typename COOKED_TYPE > | |
void | setAsCooked (unsigned int channel, unsigned int sample, COOKED_TYPE value) |
DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE (setAsCooked_impl, void(unsigned int, unsigned int, T)) | |
template<typename COOKED_TYPE > | |
void | setAsCooked_impl (unsigned int channel, unsigned int sample, COOKED_TYPE value) |
boost::shared_ptr< TransferElement > | makeCopyRegisterDecorator () override |
Create a CopyRegisterDecorator of the right type decorating this TransferElement. | |
virtual boost::shared_ptr< NDRegisterAccessor< UserType > > | decorateDeepInside (std::function< boost::shared_ptr< NDRegisterAccessor< UserType > >(const boost::shared_ptr< NDRegisterAccessor< UserType > > &)> factory) |
Decorate the innermost TransferElement of the stack of decorators or decorator-like accessors. | |
![]() | |
TransferElement (std::string name, AccessModeFlags accessModeFlags, std::string unit=std::string(unitNotSet), std::string description=std::string()) | |
Creates a transfer element with the specified name. | |
TransferElement (const TransferElement &other)=delete | |
Copying and moving is not allowed. | |
TransferElement (TransferElement &&other)=delete | |
TransferElement & | operator= (const TransferElement &other)=delete |
TransferElement & | operator= (TransferElement &&other)=delete |
virtual | ~TransferElement ()=default |
Abstract base classes need a virtual destructor. | |
const std::string & | getName () const |
Returns the name that identifies the process variable. | |
const std::string & | getUnit () const |
Returns the engineering unit. | |
const std::string & | getDescription () const |
Returns the description of this variable/register. | |
AccessModeFlags | getAccessModeFlags () const |
Return the AccessModeFlags for this TransferElement. | |
void | setDataValidity (DataValidity validity=DataValidity::ok) |
Set the current DataValidity for this TransferElement. | |
DataValidity | dataValidity () const |
Return current validity of the data. | |
void | read () |
Read the data from the device. | |
bool | readNonBlocking () |
Read the next value, if available in the input buffer. | |
bool | readLatest () |
Read the latest value, discarding any other update since the last read if present. | |
bool | write (ChimeraTK::VersionNumber versionNumber={}) |
Write the data to device. | |
bool | writeDestructively (ChimeraTK::VersionNumber versionNumber={}) |
Just like write(), but allows the implementation to destroy the content of the user buffer in the process. | |
ChimeraTK::VersionNumber | getVersionNumber () const |
Returns the version number that is associated with the last transfer (i.e. | |
void | setActiveException (std::exception_ptr &setThisException) |
Set an active exception. | |
virtual void | setExceptionBackend (boost::shared_ptr< DeviceBackend > exceptionBackend) |
Set the backend to which the exception has to be reported. | |
boost::shared_ptr< DeviceBackend > | getExceptionBackend () |
Return the exception backend. | |
cppext::future_queue< void > | getReadQueue () |
Function to get a copy of the read queue. | |
void | readTransfer () |
Read the data from the device but do not fill it into the user buffer of this TransferElement. | |
bool | readTransferNonBlocking () |
Read the data from the device but do not fill it into the user buffer of this TransferElement. | |
void | preRead (TransferType type) |
Perform any pre-read tasks if necessary. | |
void | postRead (TransferType type, bool updateDataBuffer) |
Transfer the data from the device receive buffer into the user buffer, while converting the data into the user data format if needed. | |
void | preWrite (TransferType type, ChimeraTK::VersionNumber versionNumber) |
Transfer the data from the user buffer into the device send buffer, while converting the data from then user data format if needed. | |
void | postWrite (TransferType type, VersionNumber versionNumber) |
Perform any post-write clean-ups if necessary. | |
bool | writeTransfer (ChimeraTK::VersionNumber versionNumber) |
Write the data to the device. | |
bool | writeTransferDestructively (ChimeraTK::VersionNumber versionNumber) |
Write the data to the device. | |
virtual boost::shared_ptr< TransferElement > | getHighLevelImplElement () |
Obtain the highest level implementation TransferElement. | |
virtual void | setPersistentDataStorage (boost::shared_ptr< ChimeraTK::PersistentDataStorage >) |
Associate a persistent data storage object to be updated on each write operation of this ProcessArray. | |
TransferElementID | getId () const |
Obtain unique ID for this TransferElement, see TransferElementID for details. | |
template<typename QUEUE_TYPE > | |
void | interrupt_impl (QUEUE_TYPE &dataTransportQueue) |
Implementation of interrupt() | |
bool | isReadTransactionInProgress () const |
Check whether a read transaction is in progress, i.e. | |
bool | isWriteTransactionInProgress () const |
Check whether a write transaction is in progress, i.e. | |
ReadAnyGroup * | getReadAnyGroup () const |
Obtain the ReadAnyGroup this TransferElement is part of, or nullptr if not in a ReadAnyGroup. | |
Public Attributes | |
bool | _writeable {true} |
bool | _readable {true} |
TransferType | _transferType |
bool | _hasNewData |
bool | _previousDataLost {false} |
VersionNumber | _newVersion {nullptr} |
size_t | _preRead_counter {0} |
size_t | _preWrite_counter {0} |
size_t | _readTransfer_counter {0} |
size_t | _writeTransfer_counter {0} |
size_t | _postRead_counter {0} |
size_t | _postWrite_counter {0} |
bool | _throwLogicErr {false} |
bool | _throwRuntimeErrInTransfer {false} |
bool | _throwRuntimeErrInPre {false} |
bool | _throwNumericCast {false} |
bool | _throwThreadInterruptedInPre {false} |
bool | _throwThreadInterruptedInTransfer {false} |
bool | _throwThreadInterruptedInPost {false} |
Additional Inherited Members | |
![]() | |
using | SharedPtr = boost::shared_ptr< TransferElement > |
A typedef for more compact syntax. | |
![]() | |
static constexpr char | unitNotSet [] = "n./a." |
Constant string to be used as a unit when the unit is not provided or known. | |
![]() | |
DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE_FILLER (NDRegisterAccessor< UserType >, getAsCooked_impl, 2) | |
DEFINE_VIRTUAL_FUNCTION_TEMPLATE_VTABLE_FILLER (NDRegisterAccessor< UserType >, setAsCooked_impl, 3) | |
![]() | |
void | makeUniqueId () |
Allow generating a unique ID from derived classes. | |
![]() | |
std::vector< std::vector< UserType > > | buffer_2D |
Buffer of converted data elements. | |
![]() | |
boost::shared_ptr< DeviceBackend > | _exceptionBackend |
The backend to which the runtime_errors are reported via DeviceBackend::setException(). | |
std::string | _name |
Identifier uniquely identifying the TransferElement. | |
std::string | _unit |
Engineering unit. | |
std::string | _description |
Description of this variable/register. | |
TransferElementID | _id |
The ID of this TransferElement. | |
bool | _isInTransferGroup {false} |
Flag whether this TransferElement has been added to a TransferGroup or not. | |
ReadAnyGroup * | _inReadAnyGroup {nullptr} |
ReadAnyGroup this TransferElement has been added to, nullptr if not in a ReadAnyGroup. | |
AccessModeFlags | _accessModeFlags |
The access mode flags for this transfer element. | |
cppext::future_queue< void > | _readQueue |
The queue for asynchronous read transfers. | |
VersionNumber | _versionNumber {nullptr} |
The version number of the last successful transfer. | |
DataValidity | _dataValidity {DataValidity::ok} |
The validity of the data in the application buffer. | |
std::exception_ptr | _activeException {nullptr} |
Exception to be rethrown in postXXX() in case hasSeenException == true Can be set via setActiveException(). | |
Special accessor used to test the behaviour of the NDReigsterAccessorDecorator base class.
Definition at line 25 of file testNDRegisterAccessorDecorator.cpp.
|
inline |
Definition at line 27 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverride |
Definition at line 32 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
This doPostRead() implementation checks partially the TransferElement specification B.4.
It also tests specifically the TransferElement specification B.6.1 for read operations, TransferElement specification B.6.3 for read operations, and TransferElement specification B.7.4
Reimplemented from ChimeraTK::TransferElement.
Definition at line 138 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
This doPostWrite() implementation checks partially the TransferElement specification B.4.
It also tests specifically the TransferElement specification B.6.1 for write operations. TransferElement specification B.6.3 for write operations.
Reimplemented from ChimeraTK::TransferElement.
Definition at line 180 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Backend specific implementation of preRead().
preRead() will call this function, but it will make sure that it gets called only once per transfer.
No actual communication may be done. Hence, no runtime_error exception may be thrown by this function. Also it must be acceptable to call this function while the device is closed or not functional (see isFunctional()) and no exception is thrown.
Reimplemented from ChimeraTK::TransferElement.
Definition at line 34 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Backend specific implementation of preWrite().
preWrite() will call this function, but it will make sure that it gets called only once per transfer.
No actual communication may be done. Hence, no runtime_error exception may be thrown by this function. Also it must be acceptable to call this function while the device is closed or not functional (see isFunctional()) and no exception is thrown.
Reimplemented from ChimeraTK::TransferElement.
Definition at line 58 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Implementation version of readTransfer() for synchronous reads.
This function must be implemented by the backend. For the functional description read the documentation of readTransfer().
Implementation notes:
Implements ChimeraTK::TransferElement.
Definition at line 74 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Implementation version of writeTransfer().
This function must be implemented by the backend. For the functional description read the documentation of writeTransfer().
Implementation notes:
Implements ChimeraTK::TransferElement.
Definition at line 93 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Implementation version of writeTransferDestructively().
This function must be implemented by the backend. For the functional description read the documentation of writeTransfer().
Implementation notes:
Reimplemented from ChimeraTK::TransferElement.
Definition at line 111 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Obtain the underlying TransferElements with actual hardware access.
If this transfer element is directly reading from / writing to the hardware, it will return a list just containing a shared pointer of itself.
Note: Avoid using this in application code, since it will break the abstraction!
Implements ChimeraTK::TransferElement.
Definition at line 206 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Obtain the full list of TransferElements internally used by this TransferElement.
The function is recursive, i.e. elements used by the elements returned by this function are also added to the list. It is guaranteed that the directly used elements are first in the list and the result from recursion is appended to the list.
Example: A decorator would return a list with its target TransferElement followed by the result of getInternalElements() called on its target TransferElement.
If this TransferElement is not using any other element, it should return an empty vector. Thus those elements which return a list just containing themselves in getHardwareAccessingElements() will return an empty list here in getInternalElements().
Note: Avoid using this in application code, since it will break the abstraction!
Implements ChimeraTK::TransferElement.
Definition at line 209 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Return from a blocking read immediately and throw boost::thread_interrupted.
This function can be used to shutdown a thread waiting on data to arrive, which might never happen because the sending part of the application is already shut down, or there is no new data at the moment.
Note that this function does not stop the sending thread. It just places a boost::thread_interrupted exception on the _TransferElement::_readQueue, so a waiting read() has something to receive and returns. If regular data is put into the queue just before the exception, this is received first. Hence it is not guaranteed that the read call that is supposed to be interrupted will actually throw an exception. But it is guaranteed that it returns immediately. Also it is guaranteed that eventually the boost::thread_interrupted exception will be received, unless more values are written to the queue and the exception is overwritten.
See Technical specification: TransferElement B.8.6
Implementation notice: This default implementation is always doing nothing. Each TransferElement implementation that supports AccessMode::wait_for_new_data (or may need to interrupt synchronous read calls) has to override it like this (unless the TransferElement has special requirements): void interrupt() override { this->interrupt_impl(this->_myDataTransportQueue); }
Reimplemented from ChimeraTK::TransferElement.
Definition at line 218 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Check if transfer element is readable.
It throws an exception if you try to read and isReadable() is not true.
Implements ChimeraTK::TransferElement.
Definition at line 214 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Check if transfer element is read only, i.e.
it is readable but not writeable.
Implements ChimeraTK::TransferElement.
Definition at line 212 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Check if transfer element is writeable.
It throws an exception if you try to write and isWriteable() is not true.
Implements ChimeraTK::TransferElement.
Definition at line 216 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Check whether the TransferElement can be used in places where the TransferElement "other" is currently used, e.g.
to merge the two transfers. This function must be used in replaceTransferElement() by implementations which use other TransferElements, to determine if a used TransferElement shall be replaced with the TransferElement "other".
The purpose of this function is not to determine if at any point in the hierarchy an replacement could be done. This function only works on a single level. It is not used by the TransferGroup to determine replaceTransferElement() whether shall be used (it is always called). Instead this function can be used by decorators etc. inside their implementation of replaceTransferElement() to determine if they might swap their implementation(s).
Note for decorators and similar implementations: This function must not be decorated. It should only return true if this should actually be replaced with other in the call to replaceTransferElement() one level up in the hierarchy. If the replacement should be done further down in the hierarchy, simply return false. It should only return if other is fully identical to this (i.e. behaves identical in all situations but might be another instance).
Reimplemented from ChimeraTK::TransferElement.
Definition at line 205 of file testNDRegisterAccessorDecorator.cpp.
|
inline |
Definition at line 277 of file testNDRegisterAccessorDecorator.cpp.
|
inline |
Definition at line 268 of file testNDRegisterAccessorDecorator.cpp.
|
inline |
Definition at line 260 of file testNDRegisterAccessorDecorator.cpp.
|
inlineoverridevirtual |
Search for all underlying TransferElements which are considered identical (see sameRegister()) with the given TransferElement.
These TransferElements are then replaced with the new element. If no underlying element matches the new element, this function has no effect.
Reimplemented from ChimeraTK::TransferElement.
Definition at line 210 of file testNDRegisterAccessorDecorator.cpp.
|
inline |
Definition at line 235 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_hasNewData |
Definition at line 224 of file testNDRegisterAccessorDecorator.cpp.
VersionNumber DecoratorTestAccessor< UserType >::_newVersion {nullptr} |
Definition at line 227 of file testNDRegisterAccessorDecorator.cpp.
size_t DecoratorTestAccessor< UserType >::_postRead_counter {0} |
Definition at line 233 of file testNDRegisterAccessorDecorator.cpp.
size_t DecoratorTestAccessor< UserType >::_postWrite_counter {0} |
Definition at line 234 of file testNDRegisterAccessorDecorator.cpp.
size_t DecoratorTestAccessor< UserType >::_preRead_counter {0} |
Definition at line 229 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_previousDataLost {false} |
Definition at line 225 of file testNDRegisterAccessorDecorator.cpp.
size_t DecoratorTestAccessor< UserType >::_preWrite_counter {0} |
Definition at line 230 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_readable {true} |
Definition at line 221 of file testNDRegisterAccessorDecorator.cpp.
size_t DecoratorTestAccessor< UserType >::_readTransfer_counter {0} |
Definition at line 231 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwLogicErr {false} |
Definition at line 251 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwNumericCast {false} |
Definition at line 254 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwRuntimeErrInPre {false} |
Definition at line 253 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwRuntimeErrInTransfer {false} |
Definition at line 252 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwThreadInterruptedInPost {false} |
Definition at line 257 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwThreadInterruptedInPre {false} |
Definition at line 255 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_throwThreadInterruptedInTransfer {false} |
Definition at line 256 of file testNDRegisterAccessorDecorator.cpp.
TransferType DecoratorTestAccessor< UserType >::_transferType |
Definition at line 223 of file testNDRegisterAccessorDecorator.cpp.
bool DecoratorTestAccessor< UserType >::_writeable {true} |
Definition at line 220 of file testNDRegisterAccessorDecorator.cpp.
size_t DecoratorTestAccessor< UserType >::_writeTransfer_counter {0} |
Definition at line 232 of file testNDRegisterAccessorDecorator.cpp.