3#define BOOST_TEST_DYN_LINK
4#define BOOST_TEST_MODULE OneDRegisterAccessorTest
5#include <boost/test/unit_test.hpp>
6using namespace boost::unit_test_framework;
15#include <boost/bind/bind.hpp>
16#include <boost/date_time/posix_time/posix_time.hpp>
17#include <boost/function.hpp>
18#include <boost/lambda/lambda.hpp>
19#include <boost/make_shared.hpp>
25using namespace boost::unit_test_framework;
33 device.
open(
"(WriteCountingDummy?map=goodMapFile.map)");
42 std::cout <<
"testRegisterAccessor" << std::endl;
46 BOOST_CHECK(intRegister.
isReadOnly() ==
false);
54 device.
write<
int>(
"APP0/MODULE0", std::vector<int>({5, -77, 99}));
56 BOOST_CHECK(intRegister[0] == 5);
57 BOOST_CHECK(intRegister[1] == -77);
58 BOOST_CHECK(intRegister[2] == 99);
61 intRegister[0] = -666;
65 BOOST_CHECK(
device.
read<
int>(
"APP0/MODULE0", 3) == std::vector<int>({-666, 999, 222}));
68 int* ptr = intRegister.
data();
69 BOOST_CHECK(ptr[0] = -666);
70 BOOST_CHECK(ptr[1] = 999);
71 BOOST_CHECK(ptr[2] = 222);
75 BOOST_CHECK(intRegister[0] = 123);
76 BOOST_CHECK(intRegister[1] = 456);
77 BOOST_CHECK(intRegister[2] = 789);
82 *it = 1000 * (ic + 1);
86 BOOST_CHECK(
device.
read<
int>(
"APP0/MODULE0", 3) == std::vector<int>({1000, 2000, 3000}));
95 BOOST_CHECK(
device.
read<
int>(
"APP0/MODULE0", 3) == std::vector<int>({999, 666, 333}));
98 device.
write(
"APP0/MODULE0", std::vector<int>({1234, 2468, 3702}));
103 BOOST_CHECK(*it == 1234 * (ic + 1));
109 BOOST_CHECK(*it == 1234 * (3 - ic));
114 std::vector<int> x(3);
119 BOOST_CHECK(x[0] == 1234);
120 BOOST_CHECK(x[1] == 2468);
121 BOOST_CHECK(x[2] == 3702);
122 BOOST_CHECK(intRegister[0] == 11);
123 BOOST_CHECK(intRegister[1] == 22);
124 BOOST_CHECK(intRegister[2] == 33);
131 device.
write(
"APP0/MODULE0", std::vector<int>({-120, 2468}));
132 floatRegister.
read();
133 BOOST_CHECK(floatRegister[0] == -120. / 8.);
136 floatRegister[0] = 42. / 8.;
137 floatRegister.
write();
138 BOOST_CHECK(
device.
read<
int>(
"APP0/MODULE0", 2) == std::vector<int>({42, 2468}));
144 std::cout <<
"testWriteIfDifferent" << std::endl;
149 auto backend = boost::dynamic_pointer_cast<WriteCountingBackend>(
device.
getBackend());
150 BOOST_CHECK(backend != NULL);
154 accessor = {501, 502, 503};
156 size_t counterBefore = backend->writeCount;
158 size_t counterAfter = backend->writeCount;
159 BOOST_CHECK(counterBefore == counterAfter);
162 counterBefore = backend->writeCount;
164 counterAfter = backend->writeCount;
165 BOOST_CHECK(counterAfter == counterBefore + 1);
168 counterBefore = backend->writeCount;
170 counterAfter = backend->writeCount;
171 BOOST_CHECK(counterAfter == counterBefore);
174 counterBefore = backend->writeCount;
176 counterAfter = backend->writeCount;
177 BOOST_CHECK(counterAfter == counterBefore + 1);
180 counterBefore = backend->writeCount;
182 counterAfter = backend->writeCount;
183 BOOST_CHECK(counterAfter == counterBefore + 1);
186 counterBefore = backend->writeCount;
188 counterAfter = backend->writeCount;
189 BOOST_CHECK(counterAfter == counterBefore + 1);
Class allows to read/write registers from device.
void close()
Close the device.
boost::shared_ptr< DeviceBackend > getBackend()
Obtain the backend.
OneDRegisterAccessor< UserType > getOneDRegisterAccessor(const RegisterPath ®isterPathName, size_t numberOfWords=0, size_t wordOffsetInRegister=0, const AccessModeFlags &flags=AccessModeFlags({})) const
Get a OneDRegisterAccessor object for the given register.
UserType read(const RegisterPath ®isterPathName, const AccessModeFlags &flags=AccessModeFlags({})) const
Inefficient convenience function to read a single-word register without obtaining an accessor.
void open(std::string const &aliasName)
Open a device by the given alias name from the DMAP file.
void write(const RegisterPath ®isterPathName, UserType value, const AccessModeFlags &flags=AccessModeFlags({}))
Inefficient convenience function to write a single-word register without obtaining an accessor.
Register accessor for accessing single word or 1D array registers internally of a DummyBackend implem...
Accessor class to read and write registers transparently by using the accessor object like a vector o...
void writeIfDifferent(const std::vector< UserType > &newValue, VersionNumber versionNumber=VersionNumber{nullptr}, DataValidity validity=DataValidity::ok)
Convenience function to set and write new value if it differes from the current value.
typename std::vector< UserType >::const_reverse_iterator const_reverse_iterator
UserType * data()
Return a direct pointer to the memory buffer storng the elements.
typename std::vector< UserType >::iterator iterator
void swap(std::vector< UserType > &x) noexcept
Swap content of (cooked) buffer with std::vector.
unsigned int getNElements()
Return number of elements/samples in the register.
typename std::vector< UserType >::reverse_iterator reverse_iterator
typename std::vector< UserType >::const_iterator const_iterator
reverse_iterator rbegin()
bool write(ChimeraTK::VersionNumber versionNumber={})
Write the data to device.
bool isReadable() const
Check if transfer element is readable.
void read()
Read the data from the device.
bool isWriteable() const
Check if transfer element is writeable.
bool isReadOnly() const
Check if transfer element is read only, i.e.
Class for generating and holding version numbers without exposing a numeric representation.
void setDMapFilePath(std::string dmapFilePath)
Set the location of the dmap file.
BOOST_FIXTURE_TEST_CASE(testRegisterAccessor, Fixture)