ChimeraTK-DeviceAccess 03.20.00
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
testJsonMapFileParser.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
6#define BOOST_TEST_MODULE JsonMapFileParser
7
8#include "Device.h"
9#include "Exception.h"
10#include "MapFileParser.h"
11
12using namespace ChimeraTK;
13
14#include <boost/test/unit_test.hpp>
15using namespace boost::unit_test_framework;
16
17BOOST_AUTO_TEST_SUITE(JsonMapFileParserTestSuite)
18
19/**********************************************************************************************************************/
20/**********************************************************************************************************************/
21
22BOOST_AUTO_TEST_CASE(TestFileDoesNotExist) {
23 ChimeraTK::MapFileParser fileparser;
24 BOOST_CHECK_THROW(fileparser.parse("NonexistentFile.jmap"), ChimeraTK::logic_error);
25}
26
27/**********************************************************************************************************************/
28
29BOOST_AUTO_TEST_CASE(TestGoodMapFileParse) {
30 auto [regs, metas] = ChimeraTK::MapFileParser::parse("simpleJsonFile.jmap");
31
32 BOOST_TEST(regs.hasRegister("/SomeTopLevelRegister"));
33
34 {
35 auto reg = regs.getBackendRegister("/SomeTopLevelRegister");
36 BOOST_TEST(reg.pathName == "/SomeTopLevelRegister");
37 BOOST_TEST(reg.nElements == 1);
38 BOOST_TEST(reg.elementPitchBits == 4 * 8);
39 BOOST_TEST(reg.bar == 0);
40 BOOST_TEST(reg.address == 32);
41 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::READ_WRITE);
42 BOOST_REQUIRE(reg.channels.size() == 1);
43 BOOST_TEST(reg.channels[0].bitOffset == 0);
44 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
45 BOOST_TEST(reg.channels[0].width == 32);
46 BOOST_TEST(reg.channels[0].nFractionalBits == 8);
47 BOOST_TEST(reg.channels[0].signedFlag == true);
48 }
49 {
50 auto reg = regs.getBackendRegister("BSP.VERSION");
51 BOOST_TEST(reg.pathName == "/BSP/VERSION");
52 BOOST_TEST(reg.nElements == 1);
53 BOOST_TEST(reg.elementPitchBits == 4 * 8);
54 BOOST_TEST(reg.bar == 0);
55 BOOST_TEST(reg.address == 4);
56 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::READ_ONLY);
57 BOOST_REQUIRE(reg.channels.size() == 1);
58 BOOST_TEST(reg.channels[0].bitOffset == 0);
59 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
60 BOOST_TEST(reg.channels[0].width == 32);
61 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
62 BOOST_TEST(reg.channels[0].signedFlag == false);
63 }
64 {
65 auto reg = regs.getBackendRegister("BSP");
66 BOOST_TEST(reg.pathName == "/BSP");
67 BOOST_TEST(reg.nElements == 19201);
68 BOOST_TEST(reg.elementPitchBits == 4 * 8);
69 BOOST_TEST(reg.bar == 0);
70 BOOST_TEST(reg.address == 0);
71 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::READ_WRITE);
72 BOOST_REQUIRE(reg.channels.size() == 1);
73 BOOST_TEST(reg.channels[0].bitOffset == 0);
74 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
75 BOOST_TEST(reg.channels[0].width == 32);
76 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
77 BOOST_TEST(reg.channels[0].signedFlag == false);
78 }
79 {
80 auto reg = regs.getBackendRegister("APP.STATUS");
81 BOOST_TEST(reg.pathName == "/APP/STATUS");
82 BOOST_TEST(reg.nElements == 1);
83 BOOST_TEST(reg.elementPitchBits == 4 * 8);
84 BOOST_TEST(reg.bar == 2);
85 BOOST_TEST(reg.address == 0x8000);
86 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::READ_ONLY);
87 BOOST_REQUIRE(reg.channels.size() == 1);
88 BOOST_TEST(reg.channels[0].bitOffset == 0);
89 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
90 BOOST_TEST(reg.channels[0].width == 32);
91 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
92 BOOST_TEST(reg.channels[0].signedFlag == false);
93 }
94 {
95 auto reg = regs.getBackendRegister("APP.SomeTable");
96 BOOST_TEST(reg.pathName == "/APP/SomeTable");
97 BOOST_TEST(reg.nElements == 16384);
98 BOOST_TEST(reg.elementPitchBits == 2 * 8);
99 BOOST_TEST(reg.bar == 0);
100 BOOST_TEST(reg.address == 2048);
101 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::WRITE_ONLY);
102 BOOST_REQUIRE(reg.channels.size() == 1);
103 BOOST_TEST(reg.channels[0].bitOffset == 0);
104 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
105 BOOST_TEST(reg.channels[0].width == 14);
106 BOOST_TEST(reg.channels[0].nFractionalBits == 10);
107 BOOST_TEST(reg.channels[0].signedFlag == true);
108 }
109 {
110 auto reg = regs.getBackendRegister("DAQ.CTRL");
111 BOOST_TEST(reg.pathName == "/DAQ/CTRL");
112 BOOST_TEST(reg.nElements == 16384);
113 BOOST_TEST(reg.elementPitchBits == 64 * 8);
114 BOOST_TEST(reg.bar == 13);
115 BOOST_TEST(reg.address == 0x80000000);
116 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::INTERRUPT);
117 BOOST_TEST(reg.interruptId == std::vector<size_t>({3, 0, 1}), boost::test_tools::per_element());
118
119 BOOST_REQUIRE(reg.channels.size() == 5);
120
121 BOOST_TEST(reg.channels[0].bitOffset == 0);
122 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
123 BOOST_TEST(reg.channels[0].width == 16);
124 BOOST_TEST(reg.channels[0].nFractionalBits == -2);
125 BOOST_TEST(reg.channels[0].signedFlag == true);
126
127 BOOST_TEST(reg.channels[1].bitOffset == 2 * 8);
128 BOOST_CHECK(reg.channels[1].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
129 BOOST_TEST(reg.channels[1].width == 16);
130 BOOST_TEST(reg.channels[1].nFractionalBits == -2);
131 BOOST_TEST(reg.channels[1].signedFlag == true);
132
133 BOOST_TEST(reg.channels[2].bitOffset == 4 * 8);
134 BOOST_CHECK(reg.channels[2].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
135 BOOST_TEST(reg.channels[2].width == 32);
136 BOOST_TEST(reg.channels[2].nFractionalBits == 0);
137 BOOST_TEST(reg.channels[2].signedFlag == false);
138 }
139 {
140 auto reg = regs.getBackendRegister("DAQ.FD");
141 BOOST_TEST(reg.pathName == "/DAQ/FD");
142 BOOST_TEST(reg.nElements == 16384);
143 BOOST_TEST(reg.elementPitchBits == 64 * 8);
144 BOOST_TEST(reg.bar == 13);
145 BOOST_TEST(reg.address == 0x81000000);
146 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::INTERRUPT);
147 BOOST_TEST(reg.interruptId == std::vector<size_t>({0}), boost::test_tools::per_element());
148
149 BOOST_REQUIRE(reg.channels.size() == 2);
150
151 BOOST_TEST(reg.channels[0].bitOffset == 0);
152 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
153 BOOST_TEST(reg.channels[0].width == 16);
154 BOOST_TEST(reg.channels[0].nFractionalBits == -2);
155 BOOST_TEST(reg.channels[0].signedFlag == true);
156
157 BOOST_TEST(reg.channels[1].bitOffset == 2 * 8);
158 BOOST_CHECK(reg.channels[1].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
159 BOOST_TEST(reg.channels[1].width == 16);
160 BOOST_TEST(reg.channels[1].nFractionalBits == -2);
161 BOOST_TEST(reg.channels[1].signedFlag == true);
162 }
163 {
164 auto reg = regs.getBackendRegister("DAQ.DOUBLE_BUF.ENA");
165 BOOST_TEST(reg.pathName == "/DAQ/DOUBLE_BUF/ENA");
166 BOOST_TEST(reg.nElements == 3);
167 BOOST_TEST(reg.elementPitchBits == 4 * 8);
168 BOOST_TEST(reg.bar == 0);
169 BOOST_TEST(reg.address == 1234);
170 BOOST_REQUIRE(reg.channels.size() == 1);
171 BOOST_TEST(reg.channels[0].bitOffset == 0);
172 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
173 BOOST_TEST(reg.channels[0].width == 1);
174 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
175 BOOST_TEST(reg.channels[0].signedFlag == false);
176 }
177 {
178 auto reg = regs.getBackendRegister("DAQ.DOUBLE_BUF.INACTIVE_BUF_ID");
179 BOOST_TEST(reg.pathName == "/DAQ/DOUBLE_BUF/INACTIVE_BUF_ID");
180 BOOST_TEST(reg.nElements == 3);
181 BOOST_TEST(reg.elementPitchBits == 4 * 8);
182 BOOST_TEST(reg.bar == 0);
183 BOOST_TEST(reg.address == 1238);
184 BOOST_REQUIRE(reg.channels.size() == 1);
185 BOOST_TEST(reg.channels[0].bitOffset == 0);
186 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
187 BOOST_TEST(reg.channels[0].width == 1);
188 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
189 BOOST_TEST(reg.channels[0].signedFlag == false);
190 }
191 {
192 auto reg = regs.getBackendRegister("DAQ.MUX_SEL");
193 BOOST_TEST(reg.pathName == "/DAQ/MUX_SEL");
194 BOOST_TEST(reg.nElements == 1);
195 BOOST_TEST(reg.elementPitchBits == 4 * 8);
196 BOOST_TEST(reg.bar == 0);
197 BOOST_TEST(reg.address == 1242);
198 BOOST_REQUIRE(reg.channels.size() == 1);
199 BOOST_TEST(reg.channels[0].bitOffset == 0);
200 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
201 BOOST_TEST(reg.channels[0].width == 2);
202 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
203 BOOST_TEST(reg.channels[0].signedFlag == false);
204 }
205 {
206 auto reg = regs.getBackendRegister("DAQ.MACRO_PULSE_NUMBER");
207 BOOST_TEST(reg.pathName == "/DAQ/MACRO_PULSE_NUMBER");
208 BOOST_TEST(reg.nElements == 1);
209 BOOST_TEST(reg.elementPitchBits == 4 * 8);
210 BOOST_TEST(reg.bar == 13);
211 BOOST_TEST(reg.address == 0x8100003C);
212 BOOST_REQUIRE(reg.channels.size() == 1);
213 BOOST_TEST(reg.channels[0].bitOffset == 0);
214 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
215 BOOST_TEST(reg.channels[0].width == 32);
216 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
217 BOOST_TEST(reg.channels[0].signedFlag == false);
218 }
219 {
220 auto reg = regs.getBackendRegister("BSP.SOME_INFO");
221 BOOST_TEST(reg.pathName == "/BSP/SOME_INFO");
222 BOOST_TEST(reg.nElements == 1);
223 BOOST_TEST(reg.elementPitchBits == 40 * 8);
224 BOOST_TEST(reg.bar == 0);
225 BOOST_TEST(reg.address == 8);
226 BOOST_REQUIRE(reg.channels.size() == 1);
227 BOOST_TEST(reg.channels[0].bitOffset == 0);
228 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::ASCII);
229 BOOST_TEST(reg.channels[0].width == 32);
230 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
231 BOOST_TEST(reg.channels[0].signedFlag == false);
232 }
233 {
234 auto reg = regs.getBackendRegister("APP.SomeFloat");
235 BOOST_TEST(reg.pathName == "/APP/SomeFloat");
236 BOOST_TEST(reg.nElements == 1);
237 BOOST_TEST(reg.elementPitchBits == 4 * 8);
238 BOOST_TEST(reg.bar == 0);
239 BOOST_TEST(reg.address == 4096);
240 BOOST_REQUIRE(reg.channels.size() == 1);
241 BOOST_TEST(reg.channels[0].bitOffset == 0);
242 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::IEEE754);
243 BOOST_TEST(reg.channels[0].width == 32);
244 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
245 BOOST_TEST(reg.channels[0].signedFlag == true);
246 }
247 {
248 auto reg = regs.getBackendRegister("BSP.VOID_INTERRUPT_0");
249 BOOST_TEST(reg.pathName == "/BSP/VOID_INTERRUPT_0");
250 BOOST_TEST(reg.nElements == 0);
251 BOOST_REQUIRE(reg.channels.size() == 1);
252 BOOST_TEST(reg.channels[0].bitOffset == 0);
253 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::VOID);
254 BOOST_TEST(reg.channels[0].width == 0);
255 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
256 BOOST_TEST(reg.channels[0].signedFlag == false);
257 }
258
259 BOOST_TEST(metas.getNumberOfMetadata() == 6);
260
261 BOOST_TEST(metas.getMetadata("mapfileRevision") == "1.8.3-0-gdeadbeef");
262 BOOST_TEST(metas.getMetadata("someRandomEntry") == "some random value");
263
264 BOOST_TEST(metas.getMetadata("![0]") == R"({"INTC":{"options":[],"path":"DAQ","version":1}})");
265 BOOST_TEST(metas.getMetadata("![3]") == R"({"INTC":{"options":["MER"],"path":"MY_INTC","version":1}})");
266 BOOST_TEST(metas.getMetadata("![3,0]") == R"({"INTC":{"options":[],"path":"MY_INTC.SUB0","version":1}})");
267 BOOST_TEST(metas.getMetadata("![3,1]") == R"({"INTC":{"options":["MER"],"path":"MY_INTC.SUB1","version":1}})");
268
269 auto loi = regs.getListOfInterrupts();
270 BOOST_TEST(loi.size() == 2);
271 BOOST_CHECK(loi.find({0}) != loi.end());
272 BOOST_CHECK(loi.find({3, 0, 1}) != loi.end());
273}
274
275/**********************************************************************************************************************/
276
277BOOST_AUTO_TEST_CASE(TestInterruptIntegration) {
278 ChimeraTK::Device dev("(dummy?map=simpleJsonFile.jmap)");
279
280 dev.open();
281
282 auto int0 = dev.getVoidRegisterAccessor("/BSP/VOID_INTERRUPT_0", {ChimeraTK::AccessMode::wait_for_new_data});
283 auto int301 = dev.getVoidRegisterAccessor("/BSP/VOID_INTERRUPT_3_0_1", {ChimeraTK::AccessMode::wait_for_new_data});
284 dev.activateAsyncRead();
285 BOOST_TEST(int0.readNonBlocking() == true);
286 BOOST_TEST(int301.readNonBlocking() == true);
287}
288
289/**********************************************************************************************************************/
290
291BOOST_AUTO_TEST_SUITE_END()
Class allows to read/write registers from device.
Definition Device.h:39
VoidRegisterAccessor getVoidRegisterAccessor(const RegisterPath &registerPathName, const AccessModeFlags &flags=AccessModeFlags({})) const
Get a VoidRegisterAccessor object for the given register.
Definition Device.cc:103
void activateAsyncRead() noexcept
Activate asyncronous read for all transfer elements where AccessMode::wait_for_new_data is set.
Definition Device.cc:91
void open(std::string const &aliasName)
Open a device by the given alias name from the DMAP file.
Definition Device.cc:58
static std::pair< NumericAddressedRegisterCatalogue, MetadataCatalogue > parse(const std::string &fileName)
Performs parsing of specified MAP file, resulting in catalogue objects describing all registers and m...
Exception thrown when a logic error has occured.
Definition Exception.h:51
@ wait_for_new_data
Make any read blocking until new data has arrived since the last read.
BOOST_AUTO_TEST_CASE(TestFileDoesNotExist)