Newer
Older
Martin Christoph Hierholzer
committed
/*
* ConstantAccessor.h
*
* Created on: Jun 15, 2016
* Author: Martin Hierholzer
*/
#ifndef CHIMERATK_CONSTANT_ACCESSOR_H
#define CHIMERATK_CONSTANT_ACCESSOR_H
#include <ChimeraTK/SyncNDRegisterAccessor.h>
Martin Christoph Hierholzer
committed
namespace ChimeraTK {
/** Implementation of the NDRegisterAccessor which delivers always the same value and ignors any write operations */
template<typename UserType>
class ConstantAccessor : public ChimeraTK::SyncNDRegisterAccessor<UserType> {
Martin Christoph Hierholzer
committed
public:
ConstantAccessor(UserType value=0, size_t length=1)
: ChimeraTK::SyncNDRegisterAccessor<UserType>("UnnamedConstantAccessor"), _value(length, value)
Martin Christoph Hierholzer
committed
{
try {
ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D.resize(1);
ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D[0] = _value;
}
catch(...) {
this->shutdown();
throw;
}
}
~ConstantAccessor() {
this->shutdown();
Martin Christoph Hierholzer
committed
}
void doReadTransfer() override {
Martin Christoph Hierholzer
committed
if(firstRead) {
firstRead = false;
return;
}
// block forever
Martin Christoph Hierholzer
committed
isInterrupted = false;
promise.get_future().wait();
// if we get here, interrupt() has been called
throw boost::thread_interrupted();
Martin Christoph Hierholzer
committed
}
Martin Christoph Hierholzer
committed
bool doReadTransferNonBlocking() override {
Martin Christoph Hierholzer
committed
if(firstRead) {
firstRead = false;
return true;
}
return false;
Martin Christoph Hierholzer
committed
}
Martin Christoph Hierholzer
committed
bool doReadTransferLatest() override {
return doReadTransferNonBlocking();
}
void doPostRead() override {
ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D[0] = _value;
Martin Christoph Hierholzer
committed
bool doWriteTransfer(ChimeraTK::VersionNumber /*versionNumber*/={}) override {
Martin Christoph Hierholzer
committed
return true;
Martin Christoph Hierholzer
committed
}
bool mayReplaceOther(const boost::shared_ptr<ChimeraTK::TransferElement const>&) const override {
return false; /// @todo implement properly?
}
Martin Christoph Hierholzer
committed
bool isReadOnly() const override {return false;}
Martin Christoph Hierholzer
committed
bool isReadable() const override {return true;}
bool isWriteable() const override {return true;}
Martin Christoph Hierholzer
committed
std::vector< boost::shared_ptr<ChimeraTK::TransferElement> > getHardwareAccessingElements() override {return{};}
Martin Christoph Hierholzer
committed
void replaceTransferElement(boost::shared_ptr<ChimeraTK::TransferElement>) override {}
std::list<boost::shared_ptr<ChimeraTK::TransferElement> > getInternalElements() override {return {};}
Martin Christoph Hierholzer
committed
AccessModeFlags getAccessModeFlags() const override { return {}; }
Martin Christoph Hierholzer
committed
void interrupt() override {
if(isInterrupted) return;
promise.set_value();
isInterrupted = true;
}
VersionNumber getVersionNumber() const override { return versionNumber; }
Martin Christoph Hierholzer
committed
protected:
Martin Christoph Hierholzer
committed
std::vector<UserType> _value;
Martin Christoph Hierholzer
committed
bool firstRead{true};
Martin Christoph Hierholzer
committed
Martin Christoph Hierholzer
committed
bool isInterrupted{false};
boost::promise<void> promise;
VersionNumber versionNumber;
Martin Christoph Hierholzer
committed
};
} /* namespace ChimeraTK */
#endif /* CHIMERATK_CONSTANT_ACCESSOR_H */