ChimeraTK-DeviceAccess 03.26.00
Loading...
Searching...
No Matches
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 BOOST_TEST(!reg.doubleBuffer.has_value());
109 }
110 {
111 auto reg = regs.getBackendRegister("DAQ.CTRL");
112 BOOST_TEST(reg.pathName == "/DAQ/CTRL");
113 BOOST_TEST(reg.nElements == 16384);
114 BOOST_TEST(reg.elementPitchBits == 64 * 8);
115 BOOST_TEST(reg.bar == 13);
116 BOOST_TEST(reg.address == 0x40000);
117 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::INTERRUPT);
118 BOOST_TEST(reg.interruptId == std::vector<size_t>({3, 0, 1}), boost::test_tools::per_element());
119 BOOST_TEST(reg.doubleBuffer.has_value());
120 BOOST_TEST(reg.doubleBuffer->address == 0x40200);
121 BOOST_TEST(reg.doubleBuffer->inactiveBufferRegisterPath == "/DAQ.DOUBLE_BUF.INACTIVE_BUF_ID");
122 BOOST_TEST(reg.doubleBuffer->enableRegisterPath == "/DAQ.DOUBLE_BUF.ENA");
123
124 BOOST_REQUIRE(reg.channels.size() == 5);
125
126 BOOST_TEST(reg.channels[0].bitOffset == 0);
127 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
128 BOOST_TEST(reg.channels[0].width == 16);
129 BOOST_TEST(reg.channels[0].nFractionalBits == -2);
130 BOOST_TEST(reg.channels[0].signedFlag == true);
131
132 BOOST_TEST(reg.channels[1].bitOffset == 2 * 8);
133 BOOST_CHECK(reg.channels[1].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
134 BOOST_TEST(reg.channels[1].width == 16);
135 BOOST_TEST(reg.channels[1].nFractionalBits == -2);
136 BOOST_TEST(reg.channels[1].signedFlag == true);
137
138 BOOST_TEST(reg.channels[2].bitOffset == 4 * 8);
139 BOOST_CHECK(reg.channels[2].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
140 BOOST_TEST(reg.channels[2].width == 32);
141 BOOST_TEST(reg.channels[2].nFractionalBits == 0);
142 BOOST_TEST(reg.channels[2].signedFlag == false);
143 }
144 {
145 auto reg = regs.getBackendRegister("DAQ.FD");
146 BOOST_TEST(reg.pathName == "/DAQ/FD");
147 BOOST_TEST(reg.nElements == 16384);
148 BOOST_TEST(reg.elementPitchBits == 64 * 8);
149 BOOST_TEST(reg.bar == 13);
150 BOOST_TEST(reg.address == 0x81000000);
151 BOOST_CHECK(reg.registerAccess == NumericAddressedRegisterInfo::Access::INTERRUPT);
152 BOOST_TEST(reg.interruptId == std::vector<size_t>({0}), boost::test_tools::per_element());
153
154 BOOST_REQUIRE(reg.channels.size() == 2);
155
156 BOOST_TEST(reg.channels[0].bitOffset == 0);
157 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
158 BOOST_TEST(reg.channels[0].width == 16);
159 BOOST_TEST(reg.channels[0].nFractionalBits == -2);
160 BOOST_TEST(reg.channels[0].signedFlag == true);
161
162 BOOST_TEST(reg.channels[1].bitOffset == 2 * 8);
163 BOOST_CHECK(reg.channels[1].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
164 BOOST_TEST(reg.channels[1].width == 16);
165 BOOST_TEST(reg.channels[1].nFractionalBits == -2);
166 BOOST_TEST(reg.channels[1].signedFlag == true);
167 }
168 {
169 auto reg = regs.getBackendRegister("DAQ.DOUBLE_BUF.ENA");
170 BOOST_TEST(reg.pathName == "/DAQ/DOUBLE_BUF/ENA");
171 BOOST_TEST(reg.nElements == 3);
172 BOOST_TEST(reg.elementPitchBits == 4 * 8);
173 BOOST_TEST(reg.bar == 0);
174 BOOST_TEST(reg.address == 1234);
175 BOOST_REQUIRE(reg.channels.size() == 1);
176 BOOST_TEST(reg.channels[0].bitOffset == 0);
177 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
178 BOOST_TEST(reg.channels[0].width == 1);
179 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
180 BOOST_TEST(reg.channels[0].signedFlag == false);
181 }
182 {
183 auto reg = regs.getBackendRegister("DAQ.DOUBLE_BUF.INACTIVE_BUF_ID");
184 BOOST_TEST(reg.pathName == "/DAQ/DOUBLE_BUF/INACTIVE_BUF_ID");
185 BOOST_TEST(reg.nElements == 3);
186 BOOST_TEST(reg.elementPitchBits == 4 * 8);
187 BOOST_TEST(reg.bar == 0);
188 BOOST_TEST(reg.address == 1238);
189 BOOST_REQUIRE(reg.channels.size() == 1);
190 BOOST_TEST(reg.channels[0].bitOffset == 0);
191 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
192 BOOST_TEST(reg.channels[0].width == 1);
193 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
194 BOOST_TEST(reg.channels[0].signedFlag == false);
195 }
196 {
197 auto reg = regs.getBackendRegister("DAQ.FD.BUF0");
198 BOOST_TEST(reg.pathName == "/DAQ/FD/BUF0");
199 BOOST_TEST(reg.nElements == 16384);
200 BOOST_TEST(reg.elementPitchBits == 64 * 8);
201 BOOST_TEST(reg.bar == 13);
202 BOOST_TEST(reg.address == 0x81000000);
203
204 BOOST_REQUIRE(reg.channels.size() == 2);
205
206 BOOST_TEST(reg.channels[0].bitOffset == 0);
207 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
208 BOOST_TEST(reg.channels[0].width == 16);
209 BOOST_TEST(reg.channels[0].nFractionalBits == -2);
210 BOOST_TEST(reg.channels[0].signedFlag == true);
211
212 BOOST_TEST(reg.channels[1].bitOffset == 2 * 8);
213 BOOST_CHECK(reg.channels[1].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
214 BOOST_TEST(reg.channels[1].width == 16);
215 BOOST_TEST(reg.channels[1].nFractionalBits == -2);
216 BOOST_TEST(reg.channels[1].signedFlag == true);
217 }
218 {
219 auto reg = regs.getBackendRegister("DAQ.FD.BUF1");
220 BOOST_TEST(reg.pathName == "/DAQ/FD/BUF1");
221 BOOST_TEST(reg.nElements == 16384);
222 BOOST_TEST(reg.elementPitchBits == 64 * 8);
223 BOOST_TEST(reg.bar == 13);
224
225 BOOST_REQUIRE(reg.channels.size() == 2);
226
227 BOOST_TEST(reg.channels[0].bitOffset == 0);
228 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
229 BOOST_TEST(reg.channels[0].width == 16);
230 BOOST_TEST(reg.channels[0].nFractionalBits == -2);
231 BOOST_TEST(reg.channels[0].signedFlag == true);
232
233 BOOST_TEST(reg.channels[1].bitOffset == 2 * 8);
234 BOOST_CHECK(reg.channels[1].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
235 BOOST_TEST(reg.channels[1].width == 16);
236 BOOST_TEST(reg.channels[1].nFractionalBits == -2);
237 BOOST_TEST(reg.channels[1].signedFlag == true);
238 }
239 {
240 auto reg = regs.getBackendRegister("DAQ.MUX_SEL");
241 BOOST_TEST(reg.pathName == "/DAQ/MUX_SEL");
242 BOOST_TEST(reg.nElements == 1);
243 BOOST_TEST(reg.elementPitchBits == 4 * 8);
244 BOOST_TEST(reg.bar == 0);
245 BOOST_TEST(reg.address == 1242);
246 BOOST_REQUIRE(reg.channels.size() == 1);
247 BOOST_TEST(reg.channels[0].bitOffset == 0);
248 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
249 BOOST_TEST(reg.channels[0].width == 2);
250 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
251 BOOST_TEST(reg.channels[0].signedFlag == false);
252 }
253 {
254 auto reg = regs.getBackendRegister("DAQ.MACRO_PULSE_NUMBER");
255 BOOST_TEST(reg.pathName == "/DAQ/MACRO_PULSE_NUMBER");
256 BOOST_TEST(reg.nElements == 1);
257 BOOST_TEST(reg.elementPitchBits == 4 * 8);
258 BOOST_TEST(reg.bar == 13);
259 BOOST_TEST(reg.address == 0x8100003C);
260 BOOST_REQUIRE(reg.channels.size() == 1);
261 BOOST_TEST(reg.channels[0].bitOffset == 0);
262 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::FIXED_POINT);
263 BOOST_TEST(reg.channels[0].width == 32);
264 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
265 BOOST_TEST(reg.channels[0].signedFlag == false);
266 }
267 {
268 auto reg = regs.getBackendRegister("BSP.SOME_INFO");
269 BOOST_TEST(reg.pathName == "/BSP/SOME_INFO");
270 BOOST_TEST(reg.nElements == 1);
271 BOOST_TEST(reg.elementPitchBits == 40 * 8);
272 BOOST_TEST(reg.bar == 0);
273 BOOST_TEST(reg.address == 8);
274 BOOST_REQUIRE(reg.channels.size() == 1);
275 BOOST_TEST(reg.channels[0].bitOffset == 0);
276 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::ASCII);
277 BOOST_TEST(reg.channels[0].width == 32);
278 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
279 BOOST_TEST(reg.channels[0].signedFlag == false);
280 }
281 {
282 auto reg = regs.getBackendRegister("APP.SomeFloat");
283 BOOST_TEST(reg.pathName == "/APP/SomeFloat");
284 BOOST_TEST(reg.nElements == 1);
285 BOOST_TEST(reg.elementPitchBits == 4 * 8);
286 BOOST_TEST(reg.bar == 0);
287 BOOST_TEST(reg.address == 4096);
288 BOOST_REQUIRE(reg.channels.size() == 1);
289 BOOST_TEST(reg.channels[0].bitOffset == 0);
290 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::IEEE754);
291 BOOST_TEST(reg.channels[0].width == 32);
292 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
293 BOOST_TEST(reg.channels[0].signedFlag == true);
294 }
295 {
296 auto reg = regs.getBackendRegister("BSP.VOID_INTERRUPT_0");
297 BOOST_TEST(reg.pathName == "/BSP/VOID_INTERRUPT_0");
298 BOOST_TEST(reg.nElements == 0);
299 BOOST_REQUIRE(reg.channels.size() == 1);
300 BOOST_TEST(reg.channels[0].bitOffset == 0);
301 BOOST_CHECK(reg.channels[0].dataType == NumericAddressedRegisterInfo::Type::VOID);
302 BOOST_TEST(reg.channels[0].width == 0);
303 BOOST_TEST(reg.channels[0].nFractionalBits == 0);
304 BOOST_TEST(reg.channels[0].signedFlag == false);
305 }
306
307 BOOST_TEST(metas.getNumberOfMetadata() == 6);
308
309 BOOST_TEST(metas.getMetadata("mapfileRevision") == "1.8.3-0-gdeadbeef");
310 BOOST_TEST(metas.getMetadata("someRandomEntry") == "some random value");
311
312 BOOST_TEST(metas.getMetadata("![0]") == R"({"INTC":{"options":[],"path":"DAQ","version":1}})");
313 BOOST_TEST(metas.getMetadata("![3]") == R"({"INTC":{"options":["MER"],"path":"MY_INTC","version":1}})");
314 BOOST_TEST(metas.getMetadata("![3,0]") == R"({"INTC":{"options":[],"path":"MY_INTC.SUB0","version":1}})");
315 BOOST_TEST(metas.getMetadata("![3,1]") == R"({"INTC":{"options":["MER"],"path":"MY_INTC.SUB1","version":1}})");
316
317 auto loi = regs.getListOfInterrupts();
318 BOOST_TEST(loi.size() == 2);
319 BOOST_CHECK(loi.find({0}) != loi.end());
320 BOOST_CHECK(loi.find({3, 0, 1}) != loi.end());
321}
322
323/**********************************************************************************************************************/
324
325BOOST_AUTO_TEST_CASE(TestInterruptIntegration) {
326 ChimeraTK::Device dev("(dummy?map=simpleJsonFile.jmap)");
327
328 dev.open();
329
330 auto int0 = dev.getVoidRegisterAccessor("/BSP/VOID_INTERRUPT_0", {ChimeraTK::AccessMode::wait_for_new_data});
331 auto int301 = dev.getVoidRegisterAccessor("/BSP/VOID_INTERRUPT_3_0_1", {ChimeraTK::AccessMode::wait_for_new_data});
332 dev.activateAsyncRead();
333 BOOST_TEST(int0.readNonBlocking() == true);
334 BOOST_TEST(int301.readNonBlocking() == true);
335}
336/**********************************************************************************************************************/
337
338BOOST_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)