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 {
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/** Implementation of the NDRegisterAccessor which delivers always the same
* value and ignors any write operations */
template <typename UserType>
class ConstantAccessor : public ChimeraTK::SyncNDRegisterAccessor<UserType> {
public:
ConstantAccessor(UserType value = 0, size_t length = 1)
: ChimeraTK::SyncNDRegisterAccessor<UserType>("UnnamedConstantAccessor"),
_value(length, value) {
try {
ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D.resize(1);
ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D[0] = _value;
} catch (...) {
this->shutdown();
throw;
}
}
~ConstantAccessor() { this->shutdown(); }
void doReadTransfer() override {
if (firstRead) {
firstRead = false;
return;
}
// block forever
isInterrupted = false;
promise.get_future().wait();
// if we get here, interrupt() has been called
throw boost::thread_interrupted();
}
bool doReadTransferNonBlocking() override {
if (firstRead) {
firstRead = false;
return true;
}
return false;
}
bool doReadTransferLatest() override { return doReadTransferNonBlocking(); }
void doPostRead() override {
ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D[0] = _value;
}
bool
doWriteTransfer(ChimeraTK::VersionNumber /*versionNumber*/ = {}) override {
return true;
}
bool mayReplaceOther(const boost::shared_ptr<ChimeraTK::TransferElement const>
&) const override {
return false; /// @todo implement properly?
}
bool isReadOnly() const override { return false; }
bool isReadable() const override { return true; }
bool isWriteable() const override { return true; }
std::vector<boost::shared_ptr<ChimeraTK::TransferElement>>
getHardwareAccessingElements() override {
return {};
}
void replaceTransferElement(
boost::shared_ptr<ChimeraTK::TransferElement>) override {}
std::list<boost::shared_ptr<ChimeraTK::TransferElement>>
getInternalElements() override {
return {};
}
AccessModeFlags getAccessModeFlags() const override { return {}; }
void interrupt() override {
if (isInterrupted)
return;
promise.set_value();
isInterrupted = true;
}
VersionNumber getVersionNumber() const override { return versionNumber; }
protected:
std::vector<UserType> _value;
bool firstRead{true};
bool isInterrupted{false};
boost::promise<void> promise;
VersionNumber versionNumber;
};
Martin Christoph Hierholzer
committed
} /* namespace ChimeraTK */
#endif /* CHIMERATK_CONSTANT_ACCESSOR_H */