ChimeraTK-DeviceAccess 03.29.00
Loading...
Searching...
No Matches
testGetSetAsCoocked.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#define BOOST_TEST_DYN_LINK
5#define BOOST_TEST_MODULE GetSetAsCookedTest
6#include <boost/test/unit_test.hpp>
7using namespace boost::unit_test_framework;
8
9#include <Device.h>
10using namespace ChimeraTK;
11
12BOOST_AUTO_TEST_CASE(testRawAccessor) {
13 setDMapFilePath("dummies.dmap");
14
15 Device d;
16 d.open("DUMMYD3");
17
18 auto scalarRawAccessor = d.getScalarRegisterAccessor<int32_t>("BOARD/WORD_USER", 0, {AccessMode::raw});
19 scalarRawAccessor = 25;
20 // the register has 3 fractional bits
21 BOOST_CHECK(std::fabs(scalarRawAccessor.getAsCooked<double>() - 25. / 8) < 0.0001);
22
23 scalarRawAccessor.setAsCooked(31. / 8);
24 BOOST_CHECK_EQUAL(int32_t(scalarRawAccessor), 31);
25
26 auto oneDRawAccessor = d.getOneDRegisterAccessor<int32_t>("ADC/AREA_DMAABLE_FIXEDPOINT16_3", 0, 0, {AccessMode::raw});
27
28 oneDRawAccessor[0] = 12;
29 oneDRawAccessor[1] = 13;
30
31 // the register has 3 fractional bits
32 BOOST_CHECK(std::fabs(oneDRawAccessor.getAsCooked<double>(0) - 12. / 8) < 0.0001);
33 BOOST_CHECK(std::fabs(oneDRawAccessor.getAsCooked<double>(1) - 13. / 8) < 0.0001);
34
35 oneDRawAccessor.setAsCooked(0, 42. / 8);
36 oneDRawAccessor.setAsCooked(1, 43. / 8);
37
38 BOOST_CHECK_EQUAL(oneDRawAccessor[0], 42);
39 BOOST_CHECK_EQUAL(oneDRawAccessor[1], 43);
40}
41
42BOOST_AUTO_TEST_CASE(testRawAccessorBitField) {
43 setDMapFilePath("simpleJsonFile.dmap");
44
45 Device d("JDEV");
46 d.open();
47
48 // APP/STATUS/ErrorCounter is a bitField register sub-element with bitShift 2, width 3, unsigned.
49 // With raw access, buffer_2D stores the full 32-bit register word.
50 // auto errorCounter = d.getScalarRegisterAccessor<uint32_t>("APP/STATUS/ErrorCounter", 0, {AccessMode::raw});
51 auto errorCounter =
52 d.getScalarRegisterAccessor<uint32_t>("APP/STATUS/ErrorCounter/DUMMY_WRITEABLE", 0, {AccessMode::raw});
53
54 // APP/STATUS is the full 32 bit word behind ErrorCounter. The content should be identical to the raw access
55 auto status = d.getScalarRegisterAccessor<uint32_t>("APP/STATUS/DUMMY_WRITEABLE");
56
57 status.setAndWrite(0b110110); // Also bits 1 and 5 are set, but not part of ErrorCounter
58
59 errorCounter.read();
60 // Test: The complete raw word as it exists on the device is available as raw data. Reading worked.
61 BOOST_TEST(errorCounter == 0b110110);
62 // Test: getAsCooked() is extracting the correct bits [2:4]
63 BOOST_TEST(errorCounter.getAsCooked<uint32_t>() == 5);
64
65 // Test: setAsCooked on ErrorCounter should only affect bits [4:2], not the other bits
66 errorCounter.setAsCooked(2); // ErrorCounter=2 (binary 010)
67 BOOST_TEST(errorCounter == 0b101010);
68
69 status.setAndWrite(0);
70
71 // Writing writes the whole word.
72 errorCounter.write();
73 BOOST_TEST(status.readAndGet() == 0b101010);
74 BOOST_TEST(errorCounter.isWriteable());
75}
Class allows to read/write registers from device.
Definition Device.h:39
ScalarRegisterAccessor< UserType > getScalarRegisterAccessor(const RegisterPath &registerPathName, size_t wordOffsetInRegister=0, const AccessModeFlags &flags=AccessModeFlags({})) const
Get a ScalarRegisterObject object for the given register.
Definition Device.h:266
OneDRegisterAccessor< UserType > getOneDRegisterAccessor(const RegisterPath &registerPathName, size_t numberOfWords=0, size_t wordOffsetInRegister=0, const AccessModeFlags &flags=AccessModeFlags({})) const
Get a OneDRegisterAccessor object for the given register.
Definition Device.h:276
void open(std::string const &aliasName)
Open a device by the given alias name from the DMAP file.
Definition Device.cc:58
void setDMapFilePath(std::string dmapFilePath)
Set the location of the dmap file.
BOOST_AUTO_TEST_CASE(testRawAccessor)