8#include <boost/thread/barrier.hpp>
12#define BOOST_TEST_DYN_LINK
13#define BOOST_TEST_MODULE SubdeviceBackendTest
14#define BOOST_NO_EXCEPTIONS
15#include <boost/test/unit_test.hpp>
16using namespace boost::unit_test_framework;
17#undef BOOST_NO_EXCEPTIONS
21#define CHECK_TIMEOUT(execPreCheck, condition, maxMilliseconds) \
23 std::chrono::steady_clock::time_point t0 = std::chrono::steady_clock::now(); \
24 execPreCheck while(!(condition)) { \
25 bool timeout_reached = (std::chrono::steady_clock::now() - t0) > std::chrono::milliseconds(maxMilliseconds); \
26 BOOST_CHECK(!timeout_reached); \
27 if(timeout_reached) break; \
33BOOST_AUTO_TEST_SUITE(SubdeviceBackendTestSuite)
41 dev.
open(
"SUBDEV_REG_WINDOW_3REG_MODE");
43 target.
open(
"TARGET1");
50 std::atomic<bool> done;
65 BOOST_CHECK(done ==
false);
71 BOOST_CHECK_EQUAL(
static_cast<int32_t
>(accD), 42 * 4);
76 BOOST_CHECK_EQUAL(
static_cast<int32_t
>(accA), 0);
78 BOOST_CHECK_EQUAL(
static_cast<int32_t
>(accD), 120);
89 dev.
open(
"SUBDEV_REG_WINDOW_3REG_MODE");
91 target.
open(
"TARGET1");
97 std::atomic<bool> done;
103 t = std::thread([&] {
110 BOOST_CHECK(done ==
false);
116 BOOST_CHECK_EQUAL(
static_cast<int32_t
>(accD), 456);
130 dev.
open(
"SUBDEV_REG_WINDOW_3REG_MODE");
132 target.
open(
"TARGET1");
138 std::atomic<bool> done;
146 t = std::thread([&] {
147 acc = std::bit_cast<int32_t>(0xdeadbeef);
152 BOOST_CHECK(done ==
false);
159 BOOST_CHECK(accA == 1);
162 BOOST_TEST(accD == 0x000000de);
232 dev.
open(
"SUBDEV_REG_WINDOW_2REG_MODE");
234 target.
open(
"TARGET1");
244 auto start = std::chrono::steady_clock::now();
247 auto stop = std::chrono::steady_clock::now();
248 std::chrono::duration<double> diff =
stop - start;
249 BOOST_CHECK(diff.count() >= 1.0);
252 BOOST_CHECK(accA == 1);
254 BOOST_CHECK_EQUAL(
static_cast<int32_t
>(accD), 666 * 4);
301 "(subdevice?type=regWindow&device=TARGET1&address=APP.REG_WIN.ADDRESS&writeData=APP.REG_WIN.WRITE_DATA&busy=APP."
302 "REG_WIN.BUSY&readRequest=APP.REG_WIN.READ_REQUEST&readData=APP.REG_WIN.READOUT_SINGLE&chipSelectRegister=APP."
303 "REG_WIN.CHIP_SELECT&chipIndex=1&map=Subdevice.map)");
312 auto dummyTarget = boost::dynamic_pointer_cast<DummyBackend>(targetDevice.getBackend());
317 boost::barrier write1Reached(2);
318 boost::barrier continueWrite1(2);
321 std::condition_variable cv;
323 bool thread3Started{
false};
325 std::atomic<size_t> chipSelectCounter{0};
326 std::atomic<size_t> writeCounter{0};
328 accChipSelect.setWriteCallback([&] { ++chipSelectCounter; });
329 accWriteData.setWriteCallback([&] {
330 auto previousWriteCount = writeCounter.load();
331 if(writeCounter.compare_exchange_weak(previousWriteCount, previousWriteCount + 1) && previousWriteCount == 0) {
332 write1Reached.wait();
333 continueWrite1.wait();
337 std::thread write1([&] { acc1.write(); });
338 write1Reached.wait();
339 BOOST_REQUIRE(chipSelectCounter == 1);
341 std::thread write3([&] {
343 std::lock_guard lk(m);
344 thread3Started =
true;
351 std::unique_lock lk(m);
352 cv.wait(lk, [&] {
return thread3Started; });
359 BOOST_TEST(chipSelectCounter == 1);
361 continueWrite1.wait();
371BOOST_AUTO_TEST_SUITE_END()
Class allows to read/write registers from device.
void close()
Close the device.
ScalarRegisterAccessor< UserType > getScalarRegisterAccessor(const RegisterPath ®isterPathName, size_t wordOffsetInRegister=0, const AccessModeFlags &flags=AccessModeFlags({})) const
Get a ScalarRegisterObject object for the given register.
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.
void open(std::string const &aliasName)
Open a device by the given alias name from the DMAP file.
Register accessor for accessing single word or 1D array registers internally of a DummyBackend implem...
Exception thrown when a logic error has occured.
void setDMapFilePath(std::string dmapFilePath)
Set the location of the dmap file.
#define CHECK_TIMEOUT(execPreCheck, condition, maxMilliseconds)
BOOST_AUTO_TEST_CASE(test3regsScalar)